OmniAICreator/Qiita-1.07M huggingface dataset:
[個人用]MAMPでエラーが出た時の対処方法：Apacheの場合

MAMPが急にエラーを起こした時の対処方法を自分用に

# エラー内容
Apache couldn't be started because port 番号 is in use by some other software.
「番号のポートがソフトウェアで使われているため起動できない」と書いてあったため、解決方法を残しておく。

※番号にはそれぞれ使用しているportの番号が書いてある。

# 手順
1.
terminalを開いてMAMPのbinまで移動する。

```terminal
cd /Applications/MAMP/Library/bin/
```


2.
ポートの状態を確認する

```terminal
sudo lsof -i -P | grep "LISTEN"
```

3.
自分のpasswordを入力




4.
ポートの状態が一覧で出るため、エラーの番号と同じ物を探す。


５.
同じ番号をコマンドで消していく

```terminal
kill -9 〇〇〇〇
```
〇〇〇〇は該当する物を入れる

例）kill -9 ７４０９１

６.
MAMPを確認で終了
メタプログラミング理解の覚書

メタプログラミングとは、「プログラミングするためのプログラムを書くこと」らしい。
実務で遭遇した例としては、「任意の数の変数を作成し、その変数を利用する」場面。

```ruby
[*1..3].each do |count|
  # user_1のような変数を作成し、値を「ユーザー1」と設定する
  instance_variable_set("@user_#{count}", "ユーザー#{count}")
  # evalを使って文字列をRubyプログラムとして評価させてputsする
  puts eval("@user_#{count}")
end
# 実行結果：
# ユーザー1
# ユーザー2
# ユーザー3
```

eval使うと、Rubocopに警告もらうので推奨されたやり方ではないのですが、こういうのがメタプログラミングというものだそうです。

もう少し実践的なメタプログラミングの概念は「オープンクラス」。
あるクラスを拡張しようと思ったら継承が必要ですが、継承せずに実行できること。
例えば、「このプロジェクトでは、足し算をするときに、足した結果にさらに1をプラスする必要がある」という要件を満たそうとする場合。

```ruby
class Integer
  def plus_one(v)
    self + v + 1
  end
end

puts 1.plus_one 1
# 実行結果：
# 3
```

Integerクラスを継承することなく、plus_oneというメソッドを追加できました。
追加だけではなく、既にあるメソッドと同名を定義すれば上書きできます（これがモンキーパッチ）。

先程の要件を、メソッドの拡張ではなくモンキーパッチでやってみます。
`def +(v)`を上書きするわけです。
けれど以下の書き方だと+の定義が無限ループに陥るのでダメです。

```ruby
class Integer
  def +(v)
    self + v + 1
  end
end
# 実行結果：
# `+': stack level too deep (SystemStackError)
```

こういう場合は、`alias_method`を使用します。
alias_methodとは「メソッドに別名を定義する」というもの。

```ruby
class Integer
  alias_method :plus, :+
  def +(v)
    self.plus(v).plus(1)
  end
end
puts 1 + 2 #=> 4
```

※この問題は、お仕事の面接の時に問題として出題されたものです。
当時はRubyを触って半年でメタプログラミング自体分かってなかったので答えられなかったのですが、最近勉強を始め、「これについて聞いていたのか！」と分かりました。
すごくすっきりした……！
HTTP Live Streaming再生

先の記事[テスト用のHTTP Live Streamingの環境構築](/yoshua/items/1799f85bd327792867e2)の続き。

# 目的

今回の主目的はこちら。

- AndroidやiOSのプレイヤーでHLSの視聴時のアクセスログを確かめたい。

前回の作業で以下はほぼ完了。

- そのためのHLSの配信環境をmacOS上で構築する。
- ローカルネットワークでの確認のため、CDNへの配置は行わわない。
- macOS上のファイルストレージにHLSのファイルを書き出し、それをApacheでStreamingできるようにする。

# アプリを作る（できるだけ作らない）

作るのは面倒・・・なので、

- AndroidはExoPlayerのdemoを使う
    - media.exolist.jsonに再生したいHLSのURLを加えて完了 
- iOSは・・・AVFoundationを使ったデモを作る

## iOSのデモアプリの環境

- Xcode 11.2.1
- 動作確認はSimulator (iOS 13.2.2を使用)

おおよその実装は[Media Playback Programming Guide 
- Exploring AVFoundation](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/ExploringAVFoundation/ExploringAVFoundation.html) の「Playing Media」の章を見れば書いているような気がする。
と思ったけど、過去に書いた適当な実装があったのでそれをそのまま使う。

特に特別なこともしていないと思うので、説明は省略。

```swift
import UIKit
import AVKit

class AVPlayerViewExample: UIViewController {
  private var playerViewController: AVPlayerViewController!

  init() {
    super.init(nibName: nil, bundle: nil)
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("Not implemented")
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    playerViewController = AVPlayerViewController()
    view.addSubview(playerViewController.view);
    let urlString = "..."
    let url: URL? = URL.init(string:urlString)
    playerViewController.player = AVPlayer(url: url!)
    playerViewController.player?.play()
  }

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    playerViewController.view.frame = self.view.bounds
  }
```

とりあえずひとまずこれで、iOSでも再生環境ができた。

あとは先日の記事で作成したHLSのストリーム `http://127.0.0.1:8080/streaming/hls.m3u8` のhostをLANのIPに変えてあげれば再生できた。

今回はここまで。
svgをコーディングに組み込む際によく使うツール

- **[SVGOMG](https://jakearchibald.github.io/svgomg/)**
    - Illustratorで書き出したsvgとかについてくる不要な記述を削除して容量を圧縮してくれる
    - 圧縮済みのsvgはダウンロードできる他、markup用の記述をそのままコピペ出来る点が便利
    - 後述のcssのbackground-imageエンコードツールと合わせて使うこともよくある

- **[SVGをCSSのbackground-imageで使えるようにエンコードするツール](https://blog.simmon.design/svg-to-css-background-image-encoder/)**
    - 本当にtitleのまんまのツール
    - 手作業でやると地味に面倒な作業を秒で終えてくれる
    - 使い方はsvgのmarkup用記述をそのままコピペするだけ
    - （追記）生成されるコードの値の部分（「：」以降のurl()の部分）はそのまま疑似要素等で用いられるcontentの値としても利用できます。要はCSS側にsvgを埋め込むとき一般に用いられる。

- **[unDraw](https://undraw.co/illustrations)**
    - 商用自由のオープンソースなsvgイラストライブラリー
    - オープンソースであるにも関わらず、イラスト感のテイストの整合性も高く、もちろん個々のクオリティも高い
    - 自分はここから落としてきたsvgをIllustratorで開いて色味だけ「オブジェクトの再配色」をゴリッと回してサイト全体の世界観に合わして使うことが多い
    - これぐらい複雑なイラストレーションになると、構造が複雑なせいか、前述SVGOMGにぶち込むとかえって容量が大きくなるパターンがある（それはそれで必要な記述が抜けていたのではないかという疑念はあるが…）
For Else文

```python:for-else.py
for fruit in ['banana','apple','orange']:
    #途中でループから抜ける場合はelseは実行されない
    #if fruit ==apple:
        # break
        
    print('I ate ' + fruit)
else:
    print('I ate all!')
```

このelseはif-elseよりtry-exceptの関係に似ている。
ただし他言語から来た人間には理解しづらいためEffective Pythonなど非推奨としている文献が存在している。
「GitとAzure DevOpsの開始方法：究極のガイド」 をなぞる

ニコールスティーブンスさんによる、Git と、Azure DevOpsの究極のガイド！がこちらに公開されています。＞　https://cloudskills.io/blog/git-azure-devops

3部構成のガイドだそうで、第1部では、GitおよびAzure DevOpsを使用して、ソース管理に使用するリポジトリをセットアップします。 

ざっくり。

## Azure DevOpsのメリットは

- コラボレーション-チームは、コードの同じセクションでさえも同時に作業でき、それらは一緒にマージされます。
- ワークフロー-チームは互いのコードの品質をチェックし、コーディング標準への準拠を保証します。
- バージョン管理-ソースコードにタグを付けて、リリースされたバージョンのコードを参照できるようにします。
- 履歴-コードリポジトリの完全な履歴が維持され、ユーザーの資格情報にリンクされます。 変更が十分にコメントされている場合、これは問題の解決に役立ちます。
- 自動化-コード変更のチェックインなどのバージョン管理システム内のアクションは、コンパイルやテストなどの他の操作をトリガーするように設定できます。



## 前提条件
このガイドを使用する前に、次のものが必要です。

- Azureサブスクリプションでは、無料のアカウントを作成できます。

- Azure DevOps Organizationの基本プランは、最初の5人のユーザーから無料で開始します。

- GitHubアカウント、無料プランにサインアップすると、無制限のリポジトリが提供されます。

- Visual Studio Code（VSCode）のローカルインストール



Windowsを使用している場合、[ Git Credential Managerを有効にする]チェックボックスがオンになっていることを確認します。

![image.png](https://csprodstorage001.blob.core.windows.net/blog/prereqs-gitcredentialmanager.png)




Git Credential Managerを有効にする

Gitの前にVSCodeをインストールした場合、次のオプションも表示されます。



![image.png](https://csprodstorage001.blob.core.windows.net/blog/prereqs-gitvscode.png)


デフォルトのエディターの選択






これにより、コマンドラインでgitから直接VSCodeをデフォルトのコードエディターまたは差分ツールとして起動できます。 





## Azure Devopsでリポジトリをセットアップ

この手順では、Azure DevOps内でプロジェクトをセットアップします。 Azure DevOpsプロジェクトはパブリックまたはプライベートのいずれかです。プライベートプロジェクトでは、プロジェクトを表示、複製、または投稿する前にユーザーを招待する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/5e51d050-dcb0-3b1d-0602-789e0534acbb.png)


http://dev.azure.com/
docker-machine: command not found

先日まで使えていたはずのdocker-machineコマンドが急に今日使えなくなっていた。

```
$ docker-machine ls
-bash: docker-machine: command not found
```

使えなくなった原因は分かっていないですが、[Install Docker Machine](https://docs.docker.com/machine/install-machine/)を参考に以下のコマンドを実行してインストールし直して無事docker-machineコマンドを使用できるようになりました。

```
$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
>   curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
>   chmod +x /usr/local/bin/docker-machine

$ docker-machine
Usage: docker-machine [OPTIONS] COMMAND [arg...]

Create and manage machines running Docker.

Version: 0.16.0, build 702c267f

Author:
  Docker Machine Contributors - <https://github.com/docker/machine>

Options:
  --debug, -D						Enable debug mode
  --storage-path, -s "/Users/shinichi/.docker/machine"	Configures storage path [$MACHINE_STORAGE_PATH]
  --tls-ca-cert 					CA to verify remotes against [$MACHINE_TLS_CA_CERT]
  --tls-ca-key 						Private key to generate certificates [$MACHINE_TLS_CA_KEY]
  --tls-client-cert 					Client cert to use for TLS [$MACHINE_TLS_CLIENT_CERT]
  --tls-client-key 					Private key used in client TLS auth [$MACHINE_TLS_CLIENT_KEY]
  --github-api-token 					Token to use for requests to the Github API [$MACHINE_GITHUB_API_TOKEN]
  --native-ssh						Use the native (Go-based) SSH implementation. [$MACHINE_NATIVE_SSH]
  --bugsnag-api-token 					BugSnag API token for crash reporting [$MACHINE_BUGSNAG_API_TOKEN]
  --help, -h						show help
  --version, -v						print the version

Commands:
  active		Print which machine is active
  config		Print the connection config for machine
  create		Create a machine
  env			Display the commands to set up the environment for the Docker client
  inspect		Inspect information about a machine
  ip			Get the IP address of a machine
  kill			Kill a machine
  ls			List machines
  provision		Re-provision existing machines
  regenerate-certs	Regenerate TLS Certificates for a machine
  restart		Restart a machine
  rm			Remove a machine
  ssh			Log into or run a command on a machine with SSH.
  scp			Copy files between machines
  mount			Mount or unmount a directory from a machine with SSHFS.
  start			Start a machine
  status		Get the status of a machine
  stop			Stop a machine
  upgrade		Upgrade a machine to the latest version of Docker
  url			Get the URL of a machine
  version		Show the Docker Machine version or a machine docker version
  help			Shows a list of commands or help for one command

Run 'docker-machine COMMAND --help' for more information on a command.
```
Blenderのアドオン開発をするときに地味に便利な「ソース編集」

Blenderのアドオン開発をするときに地味に便利な機能が「ソース編集」です。

たとえば自作アドオンをシェイプキーのこの部分に登録したければここを右クリックして「ソース編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/a8a276a1-76bf-7871-99ef-f2661223ac38.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/a4df50b0-b150-6be1-8924-084a35799284.png)

するとTextEditorにこのメニューを登録している部分のソースが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/1639cc3a-e309-6a82-711f-7e167997f33c.png)



この場合はMESH_MT_shape_key_specialsを使って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/65c69937-fed5-407a-3761-f5e09ccd62f1.png)
とすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/6508988b-d4e8-316f-78c4-74593a38289c.png)
この部分に登録されます。

Blender2.8ではデフォルトでは右クリックしても表示されません。
編集 > プリファレンス > インターフェイスの「開発者オプション」のチェックをONすることで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/013de5d5-50a8-b231-8922-28397357e97d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/c61bf5a5-ca73-2d4f-9fa7-f46df371e6c1.png)


ちなみに2.7xの「MESH_MT_shape_key_specials」は2.8では「MESH_MT_shape_key_context_menu」に変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165205/9bbaa522-5ff3-a8f3-596a-928953012e70.png)
【初Qiita】プログラミング2ヶ月目でリリース、3ヶ月間使われ続けるWebアプリ『SHISHA Log』

#1　プログラミングを初めて4ヶ月が経過しました。
はじめまして、赤岸叶恵です（Twitter@KKKEAS）
初めてQiitaに投稿します。当記事への訪問ありがとうございます！

私は現在G's Academy TOKYOで未経験からプログラミングを学習しています。
ありがたいことに開発した『SHISHA Log』にユーザー投稿が50件集まり、形になってきたので備忘録としてこの記事を書いています。


#1.5　前提＿シーシャ（水煙草）とは
シーシャ（水煙草）とは、イスラム圏を発祥とする喫煙具の一種です。
##仕組み
シロップ漬けしたタバコの葉をハガルという専用の容器に入れ、その上に熱した炭を置く。
炭で熱された味のついた煙を、ボトルに入っている水を通してホースから口に入れるという吸い方をします。ボトルに入っている水は紙巻き煙草でいうところのフィルターにあたります。
1台のシーシャで2時間ほど楽しめます。
![ezgif.com-resize (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510183/568751d4-588a-2d0a-ca67-a69e56b1813c.jpeg)


##シーシャの魅力
**①煙が美味しい！**
**②コミュニケーションツールとして優秀！**
**③シーシャ屋ってサードプレイスとして最高！**
の３本柱です。これ。

###①煙が美味しい！
フレーバーは何百種類もあります。たとえば一部ですが
フルーツ系：グレープフルーツ、ライチ、ブルーベリー、キウイ
ハーブ系：ミント、ジャスミン、ローズ
スパイス系：アールグレイ、カルダモン、パンラズナ（白檀）
これらのフレーバーを単品やミックスして吸うことができます。**そう、楽しみ方は無限大！**

###②コミュニケーションツールとして優秀！
シーシャは1台で2時間ほど楽しめます。煙をゆっくり深呼吸するので気分が落ち着きます。
お酒がテンション上がるアッパー系だとしたら、シーシャはダウナー系です。
心の緊張が解けて会話が捗ります。友人恋人等プライベートで過ごす時間に最適。仕事のミーティングにも最適。コミュニケーションツールとして優秀。

###③シーシャ屋ってサードプレイスとして最高！
家でも職場でもない自分の居場所って、社会人になると減りがちですよね。
そこでシーシャ屋。
気に入ったシーシャ屋に通っているうちに店員さん、常連さんと自然と仲良くなります。程よい距離感で安心できる場所。夜に行けば「おかえり」などと声をかけてくれる。サードプレイスがあるっていいなあ。


まだシーシャを体験したことのない方、百聞は一呼吸に如かずということで一度シーシャに行ってみてください！
![ezgif.com-resize (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510183/ac2fec9a-2063-1cba-f025-e9ce10b78c5b.jpg)



#2　『SHISHA Log』 ＝ シーシャの美味しいミックスをメモするだけのアプリ
**動作環境：モバイルGoogle Chrome**
[SHISHA Log](https://shishalog.jp/ "SHISHA Log") リンク：https://shishalog.jp/

![SHISHA Logデモ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510183/6c40f723-87cb-a5a9-9516-7af5c1cfc71d.gif)

###① なぜ開発したのか
私は一時期週8でシーシャ屋に行っていたほどシーシャ（水煙草）が好きです。
シーシャは複数のフレーバーをミックスして吸うことができるのですが、それゆえ中に何が入っていたか忘れます。
＜アンブロシア+ジャスミン+赤林檎+ココナッツ+パーティーアニマル＞とか何もしないと100%忘れます。
その結果「この前吸ったミックス美味しかったな。またやりたいけど何のフレーバーが入ってたか忘れちゃった。再現できない:sob:」
という問題が発生します。

そこで！

* **美味しいミックスを思い出すため**
* 他ユーザーの投稿をみて**「このミックス美味しそう」→シーシャ屋訪店→シーシャ界が活性化**するといいなと考え

シーシャの美味しいミックスをメモするだけのアプリ『SHISHA Log』を開発しました！



###② 仕様した技術

* HTML5
* CSS3
* JavaScript
* PHP
* Firebase


###③ 実装した機能／工夫した点

* ホーム画面＝タイムライン。自分の投稿のみ＜編集／削除＞アイコンを表示
* マイページ。「自分の投稿一覧はよ」というユーザーの要望に応える形で実装


#3　今後実装したい機能／使いたい技術
現時点ではフロント_JavaScript、サーバー_PHPで動いていますが
今後はフロント_**Vue.js or Nuxt.js**、サーバー_**Laravel**に移行し、以下の機能を 実装していきます。
目指せ週1アップデート！


* ユーザー情報（名前・アイコン等）登録
* 投稿のブックマーク機能
* あいまい検索
* 投稿をTwitter連携でシェア機能



#4　自戒を込めて。1番ハマった、データベース接続の構文
どハマりしました。3時間溶かしました。


**動かない構文**

```
 PDO('mysql:dbname= mydb;charset=utf8;host=localhost','root','root');
```

**動く構文**

```
 PDO('mysql:dbname=mydb;charset=utf8;host=localhost','root','root');
```
mysql:dbname= mydb　←問題はこの半角スペースでした。
正しいデータベース名は「mydb」ですが「 mydb」というデータベース名で接続しにいってたので
「そんなデータベースないよ〜」とPHPは思っていたようです。


#5　今後どんなエンジニアを目指すのか

事業会社のWebエンジニアとしてサービスのグロースハックに取り組みたいと考えています！

フロントサイドかサーバーサイドかでいうと、まだ決められません。
つい最近まではずっとフロント志望だったのですが、「どのサービスも情報を送受信して、表示するだけ。データベースに強くなりたいな」などと考えはじめています。

ひとまずVue.js or Nuxt.js／Laravelで開発を進めながら、何エンジニアになるのか決めようと思います！

**そしてインターン先を探しています。インターンさせてください！**

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

最後まで読んでくださりありがとうございます！
【Salesforce】リストビューに複数オブジェクトのレコードを表示したる！

こんにちは！こんにちは！

Salesforceを使っていると、オブジェクトのリストビューに複数オブジェクトにマタガッてレコードを表示したい欲求に駆られることがありませんか？

なかったらすみません。。。

Salesforceの公式ドキュメントでは、標準機能では、リストビューは一画面一オブジェクトやで・・・となっています。

★公式ドキュメント：[カスタムオブジェクトのリストの表示](https://help.salesforce.com/apex/HTViewHelpDoc?id=co_view.htm&language=ja)

ちょっとカスタマイズすれば表示できるようになるようです！

以下、メモ程度に。

#apex:enhancedListを表示させたいオブジェクトで指定
```
<apex:page showHeader="true" tabstyle="Favorite__c">
　<apex:enhancedList type="Favorite__c" height="300" rowsPerPage="10" id="Favorite__c" />
　<apex:enhancedList type="Broker__c" height="300" rowsPerPage="10" id="Broker__c" />
　<apex:enhancedList type="Bot_Command__c" height="300" rowsPerPage="10" id="Bot_Command__c" />
</apex:page>
```
上記のようなVisualforceを新規でつくり、apex:enhancedListに任意のオブジェクト指定してあげると下記のようになる。
![FireShot Capture 009 - Salesforce - Developer Edition_ - cunning-otter-vd6vo8-dev-ed--c.visualforce.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242499/61e31356-c459-ff7f-affa-b45cd40bacfb.png)

apex:enhancedList を　apex:listViewに変えれば、拡張リストでなくなり、普通のリストビューにもなります。

メリットとしては、一覧性の高い画面（つまり1ページで）で、複数オブジェクトにまたがる
絞り込みができる点かなと・・・。

ニーズがあるかわかりませんが、自分的には発見だったので、メモ。

さよなら！さよなら！
herokuにデプロイするときの単純ミス

Railsで作成したアプリをHerokuでデプロイしようとした時のミス
![スクリーンショット (318).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/d709570d-9cd2-e88e-6dfa-534705784150.png)

```terminal.
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
```

###結論
Gitリポジトリにデプロイするためgemを変更した修正を上げていなかった。。。
githubのリポジトリからデータがHerokuに送られているため、githubのコードを更新しなければならない！！！！！(そう言えばそうだった笑)

```terminal.

$ git add *
$ git commit -m 'add to gemfile(メッセージは何でもいい)'
$ git push
$ git push heroku master
```

###解決方法
HerokuにデプロイするときはたいていRails Tutorialを参考にしています。
・[Rails Tutorial "1.5デプロイする"](https://railstutorial.jp/chapters/beginning?version=5.1#sec-installing_rails)

```Gemfile.

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :production do
  gem 'pg', '0.20.0'
end

```
・gem 'sqlite3'
・gem 'pg'
を挿入してgit push する！

```terminal.

remote: Verifying deploy... done.
```
無事デプロイできました！

簡単なミスしないようにしたい。。。:sob:
これからも頑張ろう！
プロキシ環境下でSelenium(Chrome)を使う

社内からseleniumを使った自動テストをやろうとしたら、プロキシのユーザー認証で殺された。

それをなんとか突破しようというお話。

※ 社内ルールを破ることを推奨してるわけではないです｡｡｡｡ルールの範囲内で適切に行動しましょう｡｡｡

※ この方法を試すときは、自己責任でお願いします｡｡｡

# 0. 環境
・OS：Windows 10
・社内からインターネットへのアクセスは社内プロキシ経由。
・プロキシの認証はユーザー名とパスワードを入力するやつ。
・プロキシはPACファイルで設定されている。

# 1. 頑張った結果
結論から言うと、プロキシを突破して自動テストができました。

使ったのは、Proxomitron。

こいつをインストールしていろいろ設定すると、プロキシ認証を肩代わりしてくれる。んで、ブラウザにアクセスしても認証ダイアログが出なくなる。

# 2. プロクソのインストール

以下のサイトが日本語で情報をまとめてくれてるっぽい。

http://proxomitron.sakura.ne.jp/

かなり古いので、使っててなんか起こっても正直文句言えないなぁ｡｡｡｡

でも気にせずダウンロードして、インストール。

デフォルト設定のままインストールしていく。デスクトップにショートカットができる。

Windows 10でも動作するようだ。

# 3. プロクソの設定
まず「Proxy」をクリックして、プロキシのアドレスとポート番号を入力する。「Add」は選択しなくてOKです。

右クリックして「Advanced Proxy setting」的なやつを選択。

「Send username and password to proxy」にチェックを入れて、プロキシ認証で使用するユーザー名とパスワードを入力。

次に、最初の画面に戻って「Config」を選択。「HTTP」のタブを選択して、ポート番号に適当な番号を選択。(マジでテキトーでいい。テキトーに30000番台とかでいいんじゃないですかね)

※ ここで指定したポート番号を、IEのプロキシの番号に使用します。

最後に、最初の画面で「Use Remote Proxy」にチェックを入れます。

これでプロクソの設定はOK。

ちなみに、プロキシのアドレスはChromeとかにアクセスしたときに出る「XXXが認証を要求しています」的なメッセージのうち、アドレスっぽいものを取り出して指定したらうまくいった｡｡｡。

ここらへんはよくわかんない｡｡｡｡たまたまうまくいったとしかいえない｡｡｡｡僕プロキシってよく知らないし｡｡｡

あと、Testはいまいち信用できないので別にやらなくていいと思います。僕の環境では、プロクソのテストは失敗してたけど、自動テストは普通に動作しました。

# 4. IEの設定
IEのブラウザを立ち上げて、右上のほうにある歯車のアイコンを選択して

「インターネットオプション」→「接続」→ 「LANの設定」→ 「LANにプロキシサーバーを使用する」にチェック。

アドレスは「localhost」、ポートはさっきプロクソで設定した番号。

※ 自動構成のチェックは、たぶん外したほうがいいかと｡｡｡｡よくわからないけど、僕は外した｡｡｡

これでOKですね。

Chromeでテキトーなページにアクセスして、認証ダイアログが出なかったらOKです。

#5. 油断してはいけない 
Windowsのファイアウォールで動作が妨害されることがあります。

もし動かなかったら、プロクソをファイアウォールで許可してあげてください････

※ すでに許可している場合はもうわかりません。ごめんなさい。

#6. 最後に

認証突破したくていろんなサイト探したけど、あんまりピンとくるものが載ってなかったというか、試してもうまくいかないのがほとんどでしたね。

特に、コードでプロキシの設定をする類のやつ｡｡｡｡

ぼく、C#なんだけど、Pythonとかばかりで全然わからないし、PythonのコードをC#に直して実行してみてもうまくいかないし、それはそもそもC#に直せてないのか、コード自体が動かないのかも検証できないし｡｡｡｡

でも、これからはプロキシ環境下でも自由にテスト自動化が試せそうで、嬉しいです。

まあXPathとか勉強して、使いこなせるようにならないといけないんだけどね｡｡｡｡

あとはデザインパターンの勉強･･･？
Unity 2019.3 でJDK、NDK、SDKが無いエラーが出る場合の対応方法

Unity でAndroid開発、あるいはOculus開発しようとしたら、 `UnityException: JDK not found` が出ましたか？
自分は同じミスを二度ほどして学びました。

# エラー内容
```
UnityException: JDK not found
Java Development Kit (JDK) directory is not set or invalid. Please, fix it in Preferences -> External Tools
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) (at /Users/builduser/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:187)
```

Preferences を見ると、JDK周りに警告が出ている。
<img width="1008" alt="スクリーンショット 2020-02-11 1.15.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/d6bdae75-9e0b-0e02-381b-44a7c83186e0.png">


# 対応方法
Unity の Andorid ビルドをインストールした時に、JDK周りのツールがオプションのため、インストールされていないことが原因なので、UnityHubから追加します。

1. Unity Hub を起動して、該当のUnityのバージョンの・をクリックします。  
![スクリーンショット 2020-02-11 1.35.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/1bef9dfb-91d9-0fef-7150-7a1b22bf47a9.jpeg)
2. モジュールを加えるを選択します。  
<img width="228" alt="スクリーンショット 2020-02-11 1.35.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/09e2c2ba-4cbf-97e9-2949-a92b2c8f3c50.png">
3. `Android SDK & NDK Tools` と `OpenJDK` の両方にチェックを入れて、実行。  
<img width="667" alt="スクリーンショット 2020-02-11 1.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e1f22291-b978-edfe-74df-086bbce15649.png">

概ねこれで対応完了です。Preferences をみてまだ警告が出ているようであれば、手動で設定すれば解消できるはずです。

# 参考
https://qiita.com/akiya/items/d3921bf7321e3488548f
Laravelの「There is no existing directory at "/Users/hoge/workspace/SamplePrpject/storage/logs" 」の解決方法

##はじめに
Laravelのconfigファイルを修正後に`php artisan config:cache`を実行したら、表題のエラーが出たのでその際の解決方法を忘備録として残しておきます。

##開発環境
| 言語・FW     　　　 |   バージョン      |    
|:-----------------|---------------:|
| Laravel          |        6.14.0  |
| PHP              |        7.2.26  |


##エラーの内容
```
UnexpectedValueException

There is no existing directory at "/Users/hoge/workspace/SamplePrpject/storage/logs" and its not buildable: Permission denied

Monolog\Handler\StreamHandler::createDir:171
vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:171
```


##解決方法

初めにエラーログで指摘されている箇所が存在するか確認

```
＄ cd storage/logs
```

存在する場合は、`logs`ディレクトリの権限を確認
今回の場合は権限が`777`になっている

```
$ ll
drwxrwxrwx 4 user_name staff 128B 2 6 22:39 logs
```

キャッシュクリアの実行

```
$ php artisan cache:clear
$ php artisan route:clear
$ php artisan config:clear
```

自分の場合はキャッシュクリアを実行したら直りました。
Prestoで単回帰分析を行う

## はじめに
PrestoとはFacebookが開発している分散型SQLクエリエンジンです。[^1] Prestoはもう一つの分散型SQLクエリエンジンであるHiveに比べインテラクティブにビッグデータに対してアクセスできるため、簡単なデータの分析や出力にはPrestoが用いられることが多いです。しかしHiveはHivemallという豊富な機械学習ライブラリが存在しており、Prestoに比べ機械学習などの複雑なクエリの実行が容易に行えます。

しかしPrestoでも簡単な単回帰予測ぐらいであれば実装ができてしまうことがわかったのでその方法について書きます。

## そもそも単回帰分析とは
単回帰分析に関しては僕が書くよりももっとわかりやすい記事や文献がたくさんあると思うので省きます。
簡単にいうと、単回帰分析とは一つの入力と出力結果を複数学習させることで、それらのデータの関係を導き出し、ある入力に対して出力を予測するための手法です。

一般的に直線（$y = ax + b$）をモデルにして学習を行い、$a$と$b$の値を導き出すパターンが多いです。

これ以上かいても粗が多いと思うのでやめます。
とにかく今からやりたいのは、関係がある二つのパラメータ（部屋の広さと家賃のデータなど）を学習させてもっとも精度の良い直線式$y = ax + b$の$a$と$b$を見つけることです。

これらの$a$(傾き)と$b$(切片)をPrestoで計算します。

## データセット

具体的なデータは以下のようなものを用意しました。このクエリの後に後述するクエリを記述すれば全て動きます。
基本的に書くクエリは全てTreasureDataで実行しています。（おそらくPrestoであればどの環境でも動くと思います）

```sql
WITH data AS (
  SELECT *
  FROM (
    VALUES
      (1, 20),
      (2.1, 30),
      (2.9, 39)
  ) AS t (x, y)
) 
```

## 傾きの計算
Prestoでは`regr_slope`という関数だけで$a$（傾き）を計算することができます。

使い方はhttps://prestodb.io/docs/current/functions/aggregate.html にかいてある通り

```sql
SELECT regr_slope(y, x) AS slope FROM data
```
みたいな感じで書くだけです。ここで注意なのが、引数の順番です。
第一引数が出力(y)で第二引数が入力(x)です。

実際にデータに対して実行すると値は`9.95`になりました。

### 切片の計算
切片の計算も簡単で`regr_intercept`という関数を使うだけです。
使い方もhttps://prestodb.io/docs/current/functions/aggregate.html にかいてある通り。こちらも引数の順番に注意。

```sql
SELECT regr_intercept(y, x) AS intercept FROM data
```

ちなみに今回のデータに対する切片の値は`9.78`でした。

## 結論

```sql
SELECT  regr_slope(y, x) AS slope, regr_intercept(y, x) AS intercept FROM data
```
と書けば傾きも切片も計算できます。あとはこの値を使って予測したい入力に対して計算を行うだけです。

```sql
WITH data AS (
  SELECT *
  FROM (
    VALUES
      (1, 20),
      (2.1, 30),
      (2.9, 39)
  ) AS t (x, y)
), predict AS(
  SELECT  regr_slope(y, x) AS slope, regr_intercept(y, x) AS intercept FROM data
)

SELECT slope * 2 + intercept FROM predict /* => 29.67 */
```

[^1]: 今はコアメンバーはFacebookを退職しており、Facebookとは枝分かれしてPrestoの開発を行っています。Treasure Dataも枝分かれした方を参照しているらしいです[GitHub](https://github.com/prestosql/presto) (Thanks! @ebyhr)
敢えてRubyで学ぶ「ゼロから作るDeep Learning」第3章のニューラルネットワークのMNIST推論処理

PyCallで取り込んだNumPyのデータを無理やりNumo::NArrayに変換してRubyで行列計算をする。

```ruby
require 'numo/narray'
require 'numo/gnuplot'
require 'datasets'
require 'mini_magick'
require 'pycall/import'
require './neuralnet'
include PyCall::Import

def init_network
  pyimport :numpy
  pyimport :pickle
  pkl = open("sample_weight.pkl", "rb")
  pickle.load(pkl)
end

# 独自適当メソッド
# 無理やりnumpy形式をlist -> Ruby標準Array -> NArrayに変換する荒業
def numpy_to_narray(w)
  row = w.shape[0]
  return Numo::NArray.concatenate(Array(w.tolist).flatten) if w.shape.length == 1
  col = w.shape[1]
  Numo::NArray.concatenate(Array(w.tolist).flatten).reshape(row, col)
end

def predict(network, x)
  w1 = numpy_to_narray(network['W1'])
  w2 = numpy_to_narray(network['W2'])
  w3 = numpy_to_narray(network['W3'])
  b1 = numpy_to_narray(network['b1'])
  b2 = numpy_to_narray(network['b2'])
  b3 = numpy_to_narray(network['b3'])

  a1 = x.dot(w1) + b1
  z1 = sigmoid(a1)
  a2 = z1.dot(w2) + b2
  z2 = sigmoid(a2)
  a3 = z2.dot(w3) + b3
  softmax(a3)
end

# MNISTデータ取り込み
# train = Datasets::MNIST.new(type: :train)
test = Datasets::MNIST.new(type: :test)
x = Numo::NArray.concatenate(test.map{|t| t.pixels }).reshape(10000,784)
t = Numo::NArray.concatenate(test.map{|t| t.label })
network = init_network
# とりあえず一気に変換
y = predict(network, x)
accuracy_cnt = 0
10000.times do |i|
  p = y[i,true].to_a.index(y[i,true].max)
  accuracy_cnt += 1 if p == t[i]
end

p "Accuracy:#{Float(accuracy_cnt/10000.to_f)}"
```

* 参考文献
https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch03/neuralnet_mnist.py
Utf8JsonのDeserialize

## はじめに
Unity(C#)でJsonを使用したくてUtf8Jsonを導入したのですが、
Utf8JsonのDeserializeでつまづいた箇所がありましたので記事にしてみました。
~~つまづいたのはちゃんと私が調べられてないだけですが~~

## 簡単な例
シンプルなJsonのDeserializeを実行してみます。
Unity上からなのでDebug.Logで出力しています。

エスケープ前のJson(コード上はエスケープしている状態のため)
{"type": "Apple", "size": "small"}

### コード例

出力はUnityのDebug.Logを使用しています。
通常のC#ならDebug.LogをSystem.out.printlnに置き換えればいいかと思います。

```
// テストデータ
string json = "{\"type\": \"Apple\", \"size\": \"small\"}";

// Deserializeを実行
Dictionary<string, object> deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
// Key,Valueのデータとして取り出す
foreach (KeyValuePair<string, object> pairData in deserializeData) {
    Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
}
```
### 出力結果(余計な部分は排除)

いたって普通に取り出せました。

```
key=type value=Apple
key=size value=small
```

## つまづいた例
シンプルなJsonですと使い勝手が悪いのでオブジェクトと配列を使いたかったのです。
ただ、配列の取り出し方がよくわからなかったのでつまづいてしまいました。

フォーマットしたJson
stock_dataというオブジェクトの中に配列を持っています。

```
{
    "stock_data": [
        {
            "type": "apple",
            "size": "small"
        },
        {
            "type": "pear",
            "size": "large"
        }
    ]
}
```

### コード例

```
// テストデータ
string json = "{\"stock_data\":[{\"type\":\"apple\",\"size\":\"small\"},{\"type\":\"pear\",\"size\":\"large\"}]}";

// Deserializeを実行
var deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);

// stock_dataオブジェクトからデータを取り出す
List<object> stockData =  deserializeData["stock_data"];

// List<object>として格納されているので取り出す
foreach (object dictionaryData in stockData) {
    // objectをDictionary<string, object>に変換
    Dictionary<string, object> dictionary = dictionaryData as Dictionary<string, object>;

    // Key,Valueのデータとして取り出す
    foreach (KeyValuePair<string, object> pairData in dictionary) {
        Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
    }
}
```

### 出力結果(余計な部分は排除)

無事に取り出す事ができました。
配列データはList\<object\>型で取り出すという事がポイントでした。

```
key=type value=apple
key=size value=small
key=type value=pear
key=size value=large
```

## 余談

調査している時にC#は型が文字列で取得できるという事で

```
Debug.Log(deserializeData["stock_data"].GetType().FullName);
```

というコードを追加したのですが、

```
System.Collections.Generic.List`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
```

という形で出力されてよくわかりませんでした。(今見ると丸わかりですが…)
習熟している人ならList\<object\>型で取り出すだろうという発想が出たと思いますが、
C#をたまにしか触らないのでずいぶん手間がかかってしまいました…
Invoke-WebRequestとInvoke-RestMethodの違い

# はじめに
「PowerShell API」 と検索すると多く出てくるのは **Invoke-RestMethod**
しかしさらに調べてみると **Invoke-WebRequest** なんてものも出てくる…
どう違うのか？しかしサッと調べてもあんまり出てこず…
本腰（言うほどでもないですが）入れて調査してみました。

# 結論：出力方法が違うため、向き不向きがある
参考にしたのは[こちら](https://www.it-swarm.dev/ja/windows/invokewebrequest%E3%81%A8invokerestmethod%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/944432281/)の記事

> Invoke-RestMethodはXMLとJSONの結果を扱うのがはるかに優れていますが、Invoke-WebRequestは単純なHTML結果を扱うのが優れています。

なるほど？しかし何故かという話がまだわからず…
と思ったら上記引用コメントの近くにブログへの[リンク](https://www.systemcenterautomation.com/2018/05/invoke-restmethod-vs-invoke-webrequest/)が

なるほど、そもそも応答が違うのか。
とりあえず自分でやってみる。

```
$rest = Invoke-RestMethod "https://yesno.wtf/api"
$web = Invoke-WebRequest "https://yesno.wtf/api"
```

APIはいつもの yes か No かを返すだけの API
ひとまず **RestMethod** をば。

```
$rest

answer forced image
------ ------ -----
yes     False https://yesno.wtf/assets/yes/2-5df1b403f2654fa77559af1bf2332d7a.gif
```

次に **WebRequest**。

```
$web

StatusCode        : 200
StatusDescription : OK
Content           : {"answer":"yes","forced":false,"image":"https://yesno.wtf/assets/yes/1-af11222d8d4af90bdab8fc447c8cfe
                    bf.gif"}
RawContent        : HTTP/1.1 200 OK
                    Transfer-Encoding: chunked
                    Connection: keep-alive
                    Status: 200 OK
                    Cache-Control: must-revalidate, max-age=0, private
                    Access-Control-Allow-Origin: *
                    ETag: "d5d1109b6aaeee4be8ce60e5846156…
Headers           : {[Transfer-Encoding, System.String[]], [Connection, System.String[]], [Status, System.String[]], [Cac
                    he-Control, System.String[]]…}
Images            : {}
InputFields       : {}
Links             : {}
RawContentLength  : 109
RelationLink      : {}
```

前述の通り、応答がガッツリ異なるようですね。
前者（**RestMethod**）は PowerShell 特有の PSObject という形ですね。
後者（**WebRequest**）はこのコマンドレット特有のものですね。

では、**RestMethod** のほうが何故 XML や JSON を扱いやすいのか？
とりあえずやってみようということで、先程の **answer** の値を取得してみましょう。
まずは **RestMethod**

```
$rest.answer

yes
```
次は **WebRequest**

```
$hoge = ConvertFrom-Json $web
$hoge.answer

yes
```

単純に手間が一つ少ないというだけではありますが、Json を扱うなら **RestMethod** が良さそうですね。
また、構造としてはどちらも同じらしく、出力のデータ形式が異なる以外の相違点はないそうです。

# 〆
というわけで結論は前述のとおりではありますが、ぶっちゃけどちらもあまり変わらない、というのが落としどころでしょうか。
ただどうなんでしょう、Content 以外を見るなら **WebRequest** のが良いとも取れます。
そこは使用目的によるとしか言えませんね。
それでは！
【Unity】型指定でPrefabをインスタンスできるようにする

# 概要
シングルトンをシーンに配置しなくても使えるようにしたいと思い、作成中のゲームで実装した方法です

- ScriptableObjectにシングルトンを持ったPrefabを事前登録
- SingletonMonoBehaviourを継承 [^1]
- 外部から呼ばれた際、継承先の型から一致するPrefabを見つけ、インスタンスする

# コード
```C#:Prefabs.cs
    [CreateAssetMenu(fileName = "Prefabs")]
    public class Prefabs : ScriptableObject
    {
        [SerializeField]
        private GameObject[] _prefabs;

        private static Prefabs _instance;
        public static Prefabs Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = Resources.Load<Prefabs>("Prefabs");
                }

                return _instance;
            }
        }

        public static GameObject GetPrefabFromType<T>()
        {
            GameObject result = null;

            foreach (var prefab in Prefabs.Instance._prefabs)
            {
                if (prefab.GetComponent<T>() != null)
                {
                    result = prefab;
                    return result;
                }
            }

            Debug.LogError(typeof(T) + " は登録されていないPrefabです");
            return null;
        }
    }
```

# 使い方
- ResourcesフォルダにこのScriptableObjectを作成
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301995/81d068b9-5589-c054-7cbe-1f240ffb06f0.png)

- [SingletonMonoBehaviour](https://kan-kikuchi.hatenablog.com/entry/SingletonMonoBehaviour)内で、instanceがない時にGetPrefabFromTypeを呼ぶようにする

```C#:SingletonMonoBehaviour.cs
public class SingletonMonoBehaviour<T> : MonoBehaviourWithInit where T : MonoBehaviourWithInit
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = (T)FindObjectOfType(typeof(T));

                if (_instance == null)
                {
                    _instance = GameObject.Instantiate(Prefabs.GetPrefabFromType<T>().GetComponent<T>());
                }

                _instance.InitIfNeeded();
            }
            return _instance;
        }
    }

中略...

}
```

# まとめ
これでシングルトンをシーンに配置せずとも、必要なときにインスタンスしてくれるようになります。
参照先をScriptableObjectで一元管理しているので、クラスごとにPrefabへの参照を持つ必要がありません。
また、シングルトン以外の用途でも、Prefabさえ登録しておけばどこからでも型指定で呼べるので、いろんな使い方ができます。

[^1]: [MonoBehaviourを継承し、初期化メソッドを備えたシングルトンなクラス【Unity】](https://kan-kikuchi.hatenablog.com/entry/SingletonMonoBehaviour)
Raspberry PiにインストールしたmariaDBをVSCodeから操作する

# VSCodeからRaspberry Pi内のmariaDBを操作したい
SQLの勉強のためRaspberry PiにmariaDBをインストールしたけど、ターミナルからSQLを入力するのが面倒になり、VSCodeから操作するための環境を構築してみました。忘れないようにメモしておきます。

## mariaDBにてユーザー作成と権限付与

```shell:RaspberryPi
# root権限でログイン
$ mysql -u root -p

# ユーザーを作成
CREATE USER 'testuser'@'%' IDENTIFIED BY 'hogehoge';

# データベースを作成する
MariaDB [(none)]> CREATE DATABASE testdb;

# データベースへの権限を与える
MariaDB [(none)]> GRANT ALL PRIVILEGES ON testdb.* TO testuser@'%';

# 一度ログアウトする
MariaDB [(none)]>exit
```

新規ユーザーでログインしてみる

```shell:RaspberryPi
$ mysql -u testuser -phogehoge
MariaDB [(none)]> 
```
リモートでログインしてみる

```shell:RaspberryPi
$ mysql -h IP Address -u testuser -phogehoge

-- ERROR 2003 (HY000): Can't connect to MySQL server on 'IPアドレス' (111 "Connection refused")
```

エラー発生。いろいろ調べていたらこのような[素敵なサイト](http://nort-wmli.blogspot.com/2019/06/raspberry-pi-mysqlmariadb.html)に遭遇。
こちらを参考にRaspberry Piにて設定していく。

```shell:RaspberryPi
# nmapで確認（インストールされていないときはpipでインストール）
$ nmap IPアドレス

Starting Nmap 7.70 ( https://nmap.org ) at 2020-01-03 15:45 JST
Nmap scan report for IPアドレス
Host is up (0.00037s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds
```
FTPとSSHしかポートが開いてない事を確認。

```shell:RaspberryPi
# データベースの設定が書かれたコンフィグファイルを検索する
$ sudo grep bind-address /etc/ -r -n --color
/etc/mysql/mariadb.conf.d/50-server.cnf:28:#bind-address            = 127.0.0.1

# エディターで開いて、bind-addressをコメントアウトする
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
（修正前）bind-address         = 127.0.0.1
（修正後）#bind-address         = 127.0.0.1

# mariadbを再起動
$ sudo systemctl restart mysql

# 再度ポート確認
# nmapを確認
admin@raspberrypi:~ $ nmap IPアドレス
Starting Nmap 7.70 ( https://nmap.org ) at 2020-01-03 15:45 JST
Nmap scan report for IPアドレス
Host is up (0.00037s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds
```
これで接続できるようになったはずなので確認してみる。

```shell:RaspberryPi
# リモートアクセスでログインしてみる
$ mysql -h IPアドレス -u testuser -phogehoge
MariaDB [(none)]>
```
Raspberry Pi側の設定はこれでOKなはず。

## VSCode側の設定
①VSCodeを立ち上げてExtensionsを選択
②MySQLを選択
③インストールをクリック（画像のアンインストールの場所に表示されます。）
<img width="1440" alt="スクリーンショット 2020-02-09 13.25.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521159/5b3db3a7-ceaa-a631-87f1-7e8396f49bca.png">
④エクスプローラーをクリック
⑤下部にMYSQLが表示されるのでクリック
⑥＋ボタンが表示されるのでクリック
⑦画面上部にウィンドウが表示されるので下記の順に入力
　1. The hostname of the database：DBのIPアドレス
　2. The MySQL user to authenticate as ：接続したいユーザー名
　3. The password of the MySQL user：選択したユーザーのパスワード
　4. The port number to connect to：DBのポート
　5. SSL certificate path.Leave empty to ignore.：何も入力しなくてOK
⑧エクスプローラーのMYSQLにDBのIPアドレスが表示されるのでクリック
⑨権限のあるDBやテーブルの一覧が表示される。

これでセッティング完了。これでSQLの勉強が捗ります.
Node12系 AWS LambdaでHTMLをPDFに変換しようとしたらいろいろハマった

Node8系でwkhtmktopdfを使ってHTMLをPDFに変換するLambdaを使っていたのだが、Node8系で動いていた。
Node8系がサポートされなくなるということで、12系にそのままあげたら動かなくなってしまったのでNode12系でHTMLをPDFに変換するLambdaを作り直す必要が出てきた。

HTMLをPDFに変換するLambdaについては結構多くの記事が見つかったが、なかなか上手くいかなかった。

# やりたかったこと
Lambdaで日本語を含むHTMLをPDFに変換し、S3に保存する

#試したが上手くいかなかった方法
* wkhtmlpdf
    * 自分が見つけられなかっただけかもしれないが、Node12系でも問題なく動くソースを見つけられなかった
* html-pdf
    * phantomjsの128エラーでちっとも動かなかった
* puppeteer
    * 動きそうな気配はあったが、node_modulesのサイズが大きすぎてLambdaの最大ソースサイズをオーバーしてしまった

# 上手く行った方法
## 使用モジュール
[chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) を使った。
puppeteer-coreもnpm installする必要があるが、puppeteerだと大きすぎるから必要なcoreだけ使ってるっぽい。

## 注意点
* Lambdaのメモリ設定を512MBにする必要があった
    * 最初256MBにしていて、browserがlaunchできなかったいうようなエラーが出て、chrome-aws-lambdaもダメかあと思っていたところBUG報告で512MBにしたらできたで、って書いてあった
* `.fonts`をちゃんとzipファイルに含める
    * Lambda環境に日本語フォントはない。自分で.fontsとして読み込ませる必要があるが、日本語が反映されへんな〜と思ったら.fontsをzipファイルに含むのが漏れていたというオチだった

## コード

### 構造

```
┣ pdfGenerator.js
┣ package.json
┣ package-lock.json
┣ .fonts
  ┣ ipaexg.ttf
  ┣ ipaexm.ttf
```

### コード
```pdfGenerator.js
/* Lambda環境でも日本語フォントを使えるようにするには.fontsを読み込ませるためにHOMEを設定する必要ある */
process.env['HOME'] = "/var/task";
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

const AWS = require("aws-sdk");
const S3 = new AWS.S3({ signatureVersion: "v4" });
const chromium = require("chrome-aws-lambda");

exports.handler = async function(event, context, callback) {
    try {
        if (!event.html) {
            callback("unable to get html");
            return;
        }

        const fileName = event.filename,
            tmpFileName = `/tmp/${Math.random().toString(36).slice(2)}.pdf`,
            bucket =  event.bucket,
            pageSize = event.pageSize || "A4",
            html = event.html;

        const executablePath = await chromium.executablePath,
            browser = await chromium.puppeteer.launch({
                args: chromium.args,
                defaultViewport: chromium.defaultViewport,
                executablePath,
                headless: chromium.headless,
                ignoreHTTPSErrors: true
            });

        const page = await browser.newPage();
        await page.setContent(html);
        const pdf = await page.pdf({
            path: tmpFileName,
            format: pageSize
        });

        browser.close();

        S3.putObject({
            Bucket: bucket,
            Key: fileName,
            Body: pdf,
            ContentType: "application/pdf"
        }, (error) => {
            callback(error);
        });
    } catch(e) {
        callback(e);
    }
};
```

## 参考リンク
https://github.com/alixaxel/chrome-aws-lambda/issues/82
unityとサーバーで連携してネツエンエンジニアもどきをしてみる


2020/02/10 記事の動作構成だけ作成

こんにちは、コロナです。

今回はネットで「ネツエン」という単語が目に入っていいなーとおもったので、いろいろ考えたりしたいと思ってテーマにしました

# 元ネタ
https://cloud.watch.impress.co.jp/docs/special/1221923.html

ここから、ネットワークのケーブルとかつながっているのいいなーという軽率な思い付きです。

# アプリ構成(予定)
unity →　コンピュータの見た目で、つながっているときにかっこいいエフェクトをだしたかっただけ

サーバ →　これから、ネットワーク構成情報がとれるものを調査して作っていく

# 今後の課題
サーバーを決めて、仮ネットワークを組んだりする

ネットワーク構成図を張り付ける

アプリを組んだ時のスクショを張り付けたりする
配送システムのMR版を想像して、アプリ化


2020/02/10 

こんにちは、ころなです

今回の構想

# 配送システムは、個人的にMRと相性がいいと考えている理由
位置情報がメインであること
    店舗→車での位置情報（速度や動く情報がある）→配送完了

# 実装内容

管理画面側
　　移動情報のロギングを可視化したもの
倉庫から、車の移動までの滞留時間について移動状況などを確認できるシステム

位置情報の簡易投入プログラム(azure spatial anchorsへ投入)

課題
　　RFIDを使っての実際に連携してみたときの連携
   MR用機材の入手

# システム構成図を書く
WindowsでグローバルIPアドレスを確認する方法

# 確認したい理由
Azure で `Azure Database for MySQL` を立てたのだが、接続するためにファイアウォール規制に許可サービスとして自IPアドレスを登録する必要があった。  

# 環境
Windows10 Home
XAMPP 7.3.11
Azure Database for MySQL 5.7

# ipconfig /all ではわからない
`ipconfig /all` 叩けばわかるだろうと思ったのだが、載っていなかった。  

# Webサービスで調べる
以下のサイトで調べる。アクセスすれば載っている。
アクセス情報【使用中のIPアドレス確認】
https://www.cman.jp/network/support/go_access.cgi

# 結果
無事にわかり接続できた

# 余談
ちなみにコマンドラインからMySQLで接続しようとしたら、、、

```
C:\xampp\mysql\bin>mysql --host mysql-hogehoge.mysql.database.azure.com --user hogehoge@mysql-hogehoge -p
Enter password: ********
```

あなたのグローバルIPは許可されてないよ！と出るのでこれでもわかる。

```
ERROR 9000 (HY000): Client with IP address 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server.
```
Coverageではまった箇所を調査

# はじめに
やりたいこと
(1) カバレッジを出力させる
(2) constructorのsuperでBranch not coveredが発生するのを何とかしたい


## 参考サイト
◆【Angular6】Jasmine + Karma で単体テストを書いてみた
　https://dev.classmethod.jp/testing/unittesting/angular6-jasmine-karma-unittest/

## 変更めも
(1) とりあえず、以下でcoverageファイルが出力された

```json:package.json
　※変更前
    "test": "ng test",
　※変更後
    "test": "ng test --code-coverage",
```
自分のアカウントで、最新のWeb3jsを叩いてみる adventcalender記事として投稿


2020/02/10 簡易サンプルまで作成して記載する(日中に再投稿予定)

こんにちは、コロナです。

今回はBlockChainのフロント側ライブラリであるWeb3js(2020/02/10時点)の
試しをしていきます('◇')ゞ

# 主な対象
ブロックチェーンやWebシステム、バックエンド側です。

# スマートコントラクトのサンプロをデプロイ

フロントからブロックチェーンへ接続をする先であるスマートコントラクトの
サンプルをデプロイします

手順は割愛をして、完了した時のスクショを張る

# 仮想通貨って嘘くさいんだが？

嘘くさいのは「物を作らないでお金を集めているプロジェクト」であって、
仮想通貨自体は嘘くささはないものです

取引所などは国側で定義したライセンスに
基づいて作業をしているので以下の文献が広まってうさん臭さがなくなるといいなと思います

金融庁
https://www.fsa.go.jp/common/law/guide/kaisya/16.pdf

## メリットあるの

主な要点
・国際決済がすんなりできる
・一代のサーバーがクラッシュしても、動いてはくれる
・ログとか自力でやらなくて済むようになる

# 接続情報の設定

abiのjsonファイルと、コントラクトアドレスを設定する

# web3jsの組み込み作業をする

組み込んで動いた結果について、スクリーンショットを張り付ける

# 動作確認作業

仮想通貨のethを消費するメソッドを実行して、
テストネット上で数値が減っているのを確認して解説とかスクショを掲載する

次回以降の課題

# クラウド側にあるブロックチェーンサービスを利用してみる

azureとか
https://azure.microsoft.com/ja-jp/services/blockchain-service/

aws
https://aws.amazon.com/jp/blockchain/

ibm
https://www.ibm.com/jp-ja/blockchain
眼球疲労には気をつけよう

先日眼球疲労？で頭痛が酷くやむなくプログラミング学習を中断しました...
プログラミング学習でパソコンは必須かと思いますが、画面を見れる状況ではなかったので(とにかく吐き気がヤバイ)単語とかRailsの仕組みの流れとかを頭でイメージしたりとかしてましたが、結局頭痛であまり集中できませんでした。
人によって耐性が違うと思いますが、予め自分の限界を予測して定期的に画面から目を離すことを意識した方が良いなぁと身をもって体験しました；；
ちなみに無理やり学習を継続しようと思いましたが、効率悪すぎて無理ゲーだったのでまずそういう状況に陥らないように気をつけましょう＼(^^)／
Android Studio ボタンクリックでトーストを表示する

# やりたいこと

ボタンクリックのイベントをトリガーとして何らかの処理をさせたい。
取り急ぎトーストを表示する。

# layout/activity_main.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="このボタンをクリックするとトーストを表示する"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```


# MainActivity.java

```java

package com.example.yamato200210a;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import static android.view.View.*;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = getApplicationContext();
                CharSequence text = "トーストが表示されました。";
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }
        });
    }
}



```





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/056697b9-07ee-d53e-7927-5690bc087a5f.png)
adventcalender 音楽ミドルウェアチャレンジ＋動画ソフト 12/18分として投稿

2020/02/09 記事の構成を投稿

こんにちは、コロナです。
今日は音楽ミドルウェアと動画ソフトにチャレンジするという記事になります。

# どうして、こんなお題

直近に以下の本を購入していて消化したいなと思ったのがきっかけです。

Unityサウンドエキスパート養成講座という本です。
[https://criware\.info/adx2book/](https://qiita.com/drafts/85740feedc065a586dbb/edit)

issue 今後の課題

# ADX2を操作してみて、音楽を作成してみる

第４章周辺を進めていく

# 動画や各種ソフトで音楽の組み込み作業をしてみる
[Google Analytics]異常に低い直帰率ならnon_interactionを設定しているか確認しましょう


#Overview

Google AnalyticsにユーザーのIPアドレスをイベントとして送信するようにしたら、直帰率が20%程度から1%台にまで激減。
上記を含めた多数のアップデートにユーザーの満足度が劇的に向上したんだ！と思ったら、意図しない不正の直帰率になっていた話です。:joy:
私はGoogle Analyticsのドキュメントを大して読み込んでないため、初心者向けの記事になります。

gtag.jsのnon_interactionパラメータをご存知の方は読む必要ありません。

#Target reader

- 運営サイトの直帰率が異常に低い方。
- non_interactionを知らない方。

#Prerequisite

- gtag.jsを利用します。

検索してみると、@konyさんがanalytics.jsの方で記事を書かれていました。
analytics.jsを利用されている方は、こちらでいいと思います。
https://qiita.com/kony/items/84360e0af8849eaa56e1

#Body

##どうしてIPアドレスを送信したイベントが直帰率を劇的に低下させたのか？


https://support.google.com/analytics/answer/1033068#NonInteractionEvents

>
「直帰」は、インタラクション ヒットが 1 つしか含まれないセッションとして定義されます。イベントヒットは既定ではインタラクション ヒットと見なされ、直帰率の計算に含められます。しかし、ここでパラメータの値を true に設定すると、このようなイベントヒットがインタラクション ヒットとは見なされなくなります。この法則を利用することで、イベントを含むページの直帰率の計算を調整できます。値を true に設定した場合は、非インタラクションのイベントがタグ設定された 1 ページのセッションは、ユーザーがセッション中に当該イベントをトリガーした場合でも、直帰にカウントされます。逆に、このオプションを省略すると、イベント測定が設定された 1 ページのセッションは、同じセッション中にユーザーがイベントをトリガーした場合は直帰にカウントされなくなります。

簡単に言うと、イベントはデフォルトでは重要なイベントとされており、イベントが送信された時点で非直帰扱いになるということですね。


##解決方法

https://developers.google.com/analytics/devguides/collection/gtagjs/events#send_non-interaction_events

>
```javascript
gtag('event', 'video_auto_play_start', {
  'event_label': 'My promotional video',
  'event_category': 'video_auto_play',
  'non_interaction': true
});
```

non_interactionをtrueに設定することで、このイベントは直帰を打ち消すレベルのイベントではないと伝えることができるということですね。

#Conclusion

gtag.jsのAPIリファレンスにはnon_interactionパラメータの解説もないようなので気を付けたいところです。
Google Analyticsのドキュメントしっかり読んでいれば回避できるものなのかもしれませんが:dizzy_face:
もし高い直帰率に遭遇したらイベント送信している個所をチェックしてみてください。

Have a great day!
TextMeshProを使ったVCIをファイル経由で別プロジェクトへ取り込んだ場合にExportできない場合の対策

#概要
TextMeshProを使ったVCIを出力できないことがあったので共有します。

#Version
Unity 2019.3.0f6
UniVCI-0.24

#現象
TextMeshProを使ったVCIをファイル出力して、別のプロジェクトに取り込んでprefabを配置してから、改めてExportすると出力できません。

#原因1
別プロジェクトでVCIのファイルを取り込み、prefabが生成された時点で、TextMeshProの子に作った覚えのないオブジェクトが含まれています。これが何故生成されるかまでは調べていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/c0b85173-5e67-1467-ed08-6160b9b4ae19.png)
※画像がUnity 2019.3.0f6ではないがですが許してください。

#対策1
作った覚えのないオブジェクトを削除します。

#原因2
UnityEditorを再生すると、再生した時点でこの覚えのないオブジェクトが生成されます。

#対策2
TextMeshProに日本語表示用のフォントをアタッチします。
https://virtualcast.jp/wiki/doku.php?id=vci:sdk:text:introduction

#備考
日本語使ってなければ起きない？
【Unity】iOSでセーブデータを読み書きする

#概要
UnityでiPhoneの実機テストをした時に
ファイルの読み書きにつまづいたのでメモを残します。
#環境
Unity 2019.2.10f1
Xcode ver.11.3.1
iOS 13.2
#サンプル
###データ
```C#
[System.Serializable]
public class SaveData
{
    public int stageNum = 3;
    public int[] score = new int[stageNum];
}
```
jsonなので配列も扱えますね。
###セーブ
```C#
    public void Save(SaveData data){
        StreamWriter writer;
        string jsonData = JsonUtility.ToJson(data);
        
        writer = new StreamWriter(Application.persistentDataPath + "/savedata.json", false);
        writer.Write (jsonData);
        writer.Flush ();
        writer.Close ();
```
```C#
    Save(data);
```
pathにはApplication.persistentDataPathを使います。
StreamingAssetsは読み込み専用なのでセーブデータには適しません。
逆にアプリから書き換えることのないステージ情報などはStreamingAssetsを使うのが良いと思います。
[・参考](https://qiita.com/consolesoup/items/19fed212d4ef2bd1e1dd)
StreamWriterの第二引数はtrueで追記、falseで上書きとなります。
###ロード
```C#

    public SaveData Load(){
        string data = "";
        StreamReader reader;

        reader = new StreamReader(Application.persistentDataPath + "/savedata.json");
        data = reader.ReadToEnd ();
        reader.Close ();

        return JsonUtility.FromJson<SaveData>(datastr);
    }
```
```C#
    SaveData data = Load();
    print(data.score[0]);
```
###リセット
```C#

    public void ResetData(){
        // 初期状態のデータをセーブ
        SaveData data = new SaveData();
        Save(data);
    }
```
```C#
    ResetData();
```
###初回起動のとき
```C#
    void Start() {
        if (System.IO.File.Exists(Application.persistentDataPath + "/savedata.json") == false) {
            ResetData();
        }   
    }
```
jsonデータがないときにデータを作成します。
開発の段階であらかじめpersistentDataPathにjsonファイルを置いておくことはできません。
#終わりに
iOS以外のプラットフォームでは処理を分ける必要がある場合があります。
間違い等あればご指摘願います。
divに対してconsole.logのようなことをする

CodePen で出力結果を貼るとき、コンソールの代わりに div に出力したかったので簡易的に実装しました。簡易的なので `%d` などのフォーマットは利用できません。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="7shi" data-slug-hash="yLNNJoX" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="output for &amp;lt;div&amp;gt;">
  <span>See the Pen <a href="https://codepen.io/7shi/pen/yLNNJoX">
  output for &lt;div&gt;</a> by 七誌 (<a href="https://codepen.io/7shi">@7shi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

↑ エラーになる場合は直接開いてください: <https://codepen.io/7shi/pen/yLNNJoX>

# コード

出力関係のコードを JavaScript 側に入れたくなかったので、HTML 側に入れました。

```html:HTML
<!-- CC0 http://creativecommons.org/publicdomain/zero/1.0/ -->
<div id="result"></div>
<script>
  function log(...args) {
    let str = "";
    for (let i = 0; i < args.length; i++) {
      if (i > 0) str += " ";
      let arg = args[i];
      if (typeof arg == "string") str += arg;
      else str += JSON.stringify(arg);
    }
    result.appendChild(document.createTextNode(str));
    result.appendChild(document.createElement("br"));
  }
</script>
```

`console.log()` を置き換えてはいないので、`log()` として使います。

```javascript
log("hello");
```

# 文字列化

単純に `.toString()` とするだけでは配列や連想配列がうまく出力されません。

```javascript:ブラウザのコンソール
> [1,2,[3,4]].toString()
"1,2,3,4"
> ({a:1, b:2}).toString()
"[object Object]"
```

`.toSource()` というのを見掛けましたが、残念ながら Firefox の独自仕様でした。

```javascript:Firefoxのコンソール
> [1,2,[3,4]].toSource()
"[1, 2, [3, 4]]"
> ({a:1, b:2}).toSource()
"({a:1, b:2})"
```

[JSON.stringify()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) で文字列化するのが手軽で良いようです。

```javascript:ブラウザのコンソール
JSON.stringify([1,2,[3,4]])
"[1,2,[3,4]]"
JSON.stringify({a:1, b:2})
"{\"a\":1,\"b\":2}"
```

# 参考

* [Qiitaで記事にCodePenが埋め込めるようになりました](https://qiita.com/Qiita/items/edae7417214c8e957f54)
* [javascriptのデバッグでobjectの中身を文字列として展開する方法 | infoScoop開発者ブログ](https://www.infoscoop.org/blogjp/2012/05/17/javascript%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%A7object%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B/)
* [Show console.log() in an HTML element in JavaScript - Stack Overflow](https://stackoverflow.com/questions/36342437/show-console-log-in-an-html-element-in-javascript)