OmniAICreator/Qiita-1.07M huggingface dataset:
ansible.cfgで書きたい設定の辿り方メモ

# はじめに
~~ansible.cfgに環境変数ベタ書きしようとした間抜けな私へ。~~

環境は以下。
- CentOS Linux release 8.0.1905 (Core)
- ansible 2.9.2

# 設定したい項目を特定する

[公式](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-configuration-settings)とか、`ansible-config list`から、お目当てのセクションを特定する。
例えば、ssh接続時のホストキーチェックを無効にしたいと思ったとき、HOSTとかKEYとかCHECKとかの
ワードで検索して、それっぽいのを探す。

```
$ ansible-config list
```

今回の場合はこれ。

```
HOST_KEY_CHECKING:
  default: true
  description: Set this to "False" if you want to avoid host key checking by the underlying
    tools Ansible uses to connect to the host
  env:
  - name: ANSIBLE_HOST_KEY_CHECKING
  ini:
  - key: host_key_checking
    section: defaults
  name: Check host keys
  type: boolean
```

# 書式を確認して設定する


セクションを特定したら、`ansible.cfg`はini形式なので、`ini`のリストに注目する。
`key`が`host_key_checking`、`section`が`defaults`、`type`が`boolean`と書いてあるので、
ini形式で下記のように記述する。

```ini:ansible.cfg
[defaults]
host_key_checking=false
```

上記から設定を足したくなった時、`section`が`defaults`なら、`key`だけ書き足してあげれば良いし、
違うなら、同じようにブラケットで囲ってセクションごと追加してあげる必要がある。

ちなみに、`env`は環境変数なので、`.bashrc`とかに記述する場合は、下記で良い。
ini形式でないので、セクションとか要らない。

```
ANSIBLE_HOST_KEY_CHECKING=false
```

# 設定が反映されているか確認する
デフォルトから変更されている設定値だけ確認できれば良いので、下記コマンドが楽。

```
$ ansible-config dump --only-changed
```

# 参考
[公式](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-configuration-settings)
[GitHub](https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg)
海外の人材についてふと考えてみた

#本「ネクストシリコンバレー」を読んで、海外の人材について考えてみた。
正月明けというものあり、タイピングの練習も兼ねてキータに投稿してみる。
####環境の力は絶大
まず、これは如何しようも無い部分もあるが、生まれた時の環境というのも大きな要因である。
中国とか、イスラエルなんて国が力を入れてIT人材に投資している。子供の時からの影響はバンバン受けているだろう。
あとは、ITの学校に入れているか、も影響してくる。イスラエルなんかは、優秀な人材は軍の秘密機関に入れて最新の先端技術をバンバン学び、その軍から半端じゃない人材が出てきている。
####自然と半端じゃない環境に入れてんのね
国や地域をバックにして力を入れている。あとは、親の学校を選ぶ力、
ただしそこからは個人各々の進路を選ぶ力だよね。
日本人でも優秀な人は多いし、数カ国の開発を経験してる人もいるくらいだから。

ということは、語学力は大事だけど、年齢とか負けず、気にせず、
自分で勉強したり、IT関連の学に自己投資して、目指す仕事を狙い続け、本気で頑張っていれば一角のIT人材になれるっていうことだよね。
もう３０近いけど、年齢に負けずに、一生かけてこの分野で成長していくことにするわ。面白い。

###本気でやるなら、やっぱり環境選びだな
もうエンジニアになっているけど、プログラミングスクールに入り直すのはめちゃめちゃ考えているし、
必要な知識には時間も金もたっぷりかけようと思う。（まだ独身だし！）
シンガポールとか、ベルリンとかみたいに政府大学企業連携で情報交換しているところは強いし、そんなようなところを見習って、情報交換できる優秀なネットワークを作っていく必要もあるようだ。
ラズパイ4にdocker,docker-composeをインストール

# Docker
```zsh
# dockerをインストールする
$ curl -sSL https://get.docker.com | sh

# pi,dockerユーザに docker コマンドが使えるように権限を与える
$ sudo usermod -aG docker pi

# ここで一度ラズパイをリブートする

# dockerがインストールされたかを確認する
$ docker -v
Docker version 19.03.5, build 633a0ea

# dockerが動くかテストする
$ docker run hello-world

# ラズパイ起動時にdockerも起動するように設定
$ sudo systemctl enable docker
```

# docker-compose
```zsh
# docker-composeをインストールするための依存関係のものを先にインストールする
$ sudo apt-get install libffi-dev libssl-dev
$ sudo apt-get install -y python3 python3-pip

# docker-composeをインストールする
$ sudo pip3 install docker-compose

# docker-composeがインストールされたかを確認する
$ docker-compose -v
docker-compose version 1.25.0, build b42d419
```

## 参考
[Installing Docker and Docker Compose on the Raspberry Pi in 5 Simple Steps - DEV Community 👩‍💻👨‍💻](https://dev.to/rohansawant/installing-docker-and-docker-compose-on-the-raspberry-pi-in-5-simple-steps-3mgl)

[Install Docker and Docker-Compose on your Raspberry Pi - Jonathan Meier](https://jonathanmeier.io/install-docker-and-docker-compose-raspberry-pi/)

[Yes, you can run Docker on Raspbian | With Blue Ink](https://withblue.ink/2019/07/13/yes-you-can-run-docker-on-raspbian.html)
Azure KinectのファームウェアUpdateメモ

いよいよ、今年の3月から日本でも待ちに待ったAzure Kinectの発売ですね。

一足早く、入手している方もいらっしゃると思います。
私もお仕事上、手元にあります。

割と驚いたのが、インストールも簡単だし、何のプログラムも書かずにサクッと動かせてしまうこと。
v1、v2に比較してもとても敷居が低いように感じました。

でも、一つだけメモしておきたいことがあります。
きっとこれは何度もやると思うので！
それは、**「ファームウェアアップデート」**

コマンドラインぽちぽちして、
待つこと数分（体感5分くらい）
すると、コマンドラインの画面にだららーっと文字が表示されます。
待っている間は上手くいっているかドキドキ。
何も反応がないので、不安に思ったりしました。
でも、ちょっとだけ我慢して待っていてみてくださいね。

↓これが、最初のコマンドを打ったところ。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310600/765f599d-a6a3-ab7d-ddcf-e6d2a244fc6e.png)
補足：
タイピングが面倒だったので、フォルダーやファイルをつまんでWindow上にぽいとしています。なので、古パスで入っていますが、cdでC:\Program Files\Azure Kinect SDK v1.3.0\toolsにディレクトリを移動したあとに、下記でOKです。
**AzureKinectFirmwareTool.exe -u firmware\AzureKinectDK_Fw_1.6.102075014.bin**

↓こちらが、**SUCCESS**したところです。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310600/6c8aff54-bd68-3ca4-96b0-4a2b52157cde.png)

そのほか、詳しく**Azure Kinect**を知りたい方はこちらの記事をお勧めします。
[『Azure Kinect SDKのインストールと各種ツールの使い方』](https://blog.kaorun55.com/entry/2019/07/19/225953)
Fedoraをアップグレードする

最初にインストール済パッケージを最新にアップグレードする

```sh
$ sudo dnf upgrade --refresh
```

* `dnf [options] upgrade` インストールされているパッケージを最新にアップグレードする。
* `--refresh` コマンドを実行する前にメタデータを期限切れにする

`dnf-plugin-system-upgrade`をインストールする。このプラグインはシステムをアップグレードする`system-upgrade`コマンドを提供する。

```sh
$ sudo dnf install dnf-plugin-system-upgrade
```

アップグレードに必要なファイルをダウンロードする。

```sh
$ sudo dnf system-upgrade download --refresh --releasever=31
```

* `dnf system-upgrade download --releasever=VERSION [OPTIONS]` アップグレードに必要な全てのファイルをダウンロードする。
* `VERSION`にはアップグレード先のメジャーバージョンを指定する。
* バージョンをスキップしてアップグレードすること (22から25にアップグレードなど) は推奨されない。メジャーバージョンがリリースされて最初の数ヶ月の間はひとつ前のリリース (N-2, Nを最新のリリースバージョンとして、最新が31の場合は29) からのアップグレードはサポートされているが、それより前のバージョンからのアップグレードはサポートされない。

アップグレードを開始する。

```sh
$ sudo dnf system-upgrade reboot
```

 * `dnf system-upgrade reboot` アップグレードの準備を行ってシステムを再起動する。このコマンドを実行するには `download` コマンドが事前に成功している必要がある。

# リンク

**DNF System Upgrade**
https://docs.fedoraproject.org/en-US/quick-docs/dnf-system-upgrade/

**DNF system-upgrade Plugin**
https://dnf-plugins-extras.readthedocs.io/en/latest/system-upgrade.html
自己語り　ネクストシリコンバレーを読んで

#「ネクストシリコンバレー」を読みながら、エンジニアとしてのキャリアパスを考えてみた

###エンジニアのスキル
日本で生きていくための土台にはなる。就職・フリーランス

###しかし、ずっとスキルに執着するのはナンセンス
世界に優秀な人たち・どんどん新しい技術の出現・若い世代の台頭

なので
まずは、日本で収入を得られるだけの稼ぐためのスキル
⇨日本では食える

###世界で働きたいなら、語学力・ビジネス力
そしてマネジメント側に回ったり、ビジネスとして回していく側にいくことが必須。
⇨じゃないと年齢とともにしんどくなる。
いつまでも現場で戦える保証があればいいけど。

###やはり、エンジニアに転職してよかったと思う
どこにでもいける。
社員としても、フリーランスとしても、起業にしても、何でも使える＝万能（どっちに進んでも食っていける）
これからもスキルを求める

###日本・世界で時代の潮流に乗っている
データ活用を中心に、データサイエンティスト、AIエンジニア、サーバーやクラウド、ネットワーク、
今やっていることは全てが時代に求められている。エンジニアを志した時点で大きな流れには沿っている。

そこからさらにどう稼いでいきたいかは人それぞれか、、？

###技術を生かす側＝「技術のプロフェッショナル」ではない
スキルは正社員やフリーランス、お金をもらう側としては必須

起業、ビジネスとして技術を生かす側なら、
技術力の高さが、成功とは相関関係は薄い？

ビジネス目線、経済の流れ、など、知の総合力が問われる。
この時点からは他業界の経営者、ビジネスマンと変わらない。


###でもまずは技術力を高める
で、途中から進路によっては

海外に行きたいならまずは英語がいるし、
日本で事業推進側に行きたいなら、SIerのようなポジにいく必要があるし、ITコンサル的な知識が必要だと感じた。

さて、２０代後半になっているし、これからにキャリアどうしようか。
コントローラー名とアクション名でSCSSを呼び出す


例えば WelcomeController の index アクションが呼ばれた場合、デフォルトの状態だとビューには welcome.css(.scss) がロードされるのだけど、これを呼ぶかどうかについて、ファイルの有無とか controller での変数で判定できたらいいのになという話。

色々方法はあるかと思うのですが、以下のようにしてみました。

assets/stylesheets/application.css

 *= require_self
 *= require_directory . 
デフォルトだと require_tree . となっている箇所を require_directory . にする。こうすることでルートディレクトリ（ assets/stylsheets/* ）の css しか自動でインポートしないようにする。

ついでにスタイルシートのディレクトリも以下のように views っぽくする。

f:id:ltcmdr927:20121209105229p:plain

HEAD タグは application.html.erb で編集しているので、そこを修正する。

views/layouts/shared/application.html.erb

  <%= stylesheet_link_tag "application", :media => "all" %>
  <%= partial_stylesheet_link_tag controller.controller_name, controller.action_name, @partial_css_disabled %>
  <%= javascript_include_tag "application" %>
stylesheet_link_tag と javascript_include_tag の間に新しい helper メソッドを追加する。引数でビューを読んだ時のコントローラ名とアクション名を指定。@partial_css_disabled は後述。

app/helpers/application_helper.rb

module ApplicationHelper
  
  def partial_stylesheet_link_tag(controller_name, action_name, disabled = true)
    if disabled == false || disabled.nil?
      if File.exist?("#{Rails.root.to_s}/app/assets/stylesheets/#{controller_name}/#{action_name}.css.scss")
        return stylesheet_link_tag "#{controller_name}/#{action_name}"
      end
    end
  end
  
end
partial_stylesheet_link_tag メソッドを書く。disabled が false かあるいは nil かを判定し、正なら scss ファイルの有無を判定し、最終的にコントローラ/アクションの stylesheet_link_tag を戻す、という感じ。

基本的にはファイルの有無で stylesheet タグが追加されるかどうかを判定するようになるので、例えばファイルは存在するけどタグは追加したくないという場合は、下記のように controller で @partial_css_disabled 変数に true を指定してやる。 true を指定するとファイルが存在していてもタグが追加されない。

app/controller/welcome_controller.rb

class WelcomeController < ApplicationController
  
  def index
    @partial_css_disabled = true
  end
  
end
若干イモっぽい感じがしなくもないですが、個人的にはこれで管理しやすくなりました。（コントローラの階層構造が深くなった場合については調査して後々追記予定。）
Nuxt.jsのasyncDataって一体なんなのか

[Nuxt.jsの公式サンプル](https://ja.nuxtjs.org/examples)を１つずつ読み解いていくとabout.vueで**asyncData**を使っているけれど、これって一体なんなのか

### asyncDataでできること

ページコンポーネントがロードされる前に呼び出され、ユーザーがページを遷移する前にも呼び出される

### asyncDataを使わない
これだと{{message}}がページをロードした時にちらつく。

```vuejs
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        message: process.browser ? 'true' : 'false'
      }
    }
  }
</script>
```

### asyncData使う
これなら、ページがロードされる前にasyncDataによって{{message}}にprocess.browserの結果が設定されるのでちらつきがない。

```vuejs
<template>
略
</template>

<script>
  export default {
    asyncData () {
      return {
        message: process.browser ? 'true' : 'false'
      }
    }
  }
</script>
```

### 第１引数に context
asyncDataの第一引数にはasyncData内で使用できるstoreなどのオブジェクトがはいってきます。
[Context](https://ja.nuxtjs.org/api/context/)

###axiosでAPIを叩いてその結果を表示する例
asyncDataの引数に$axiosを設定して、APIを叩いた結果を表示する例。

```vue.js
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
  export default {
    async asyncData ({ $axios }) {
      const { data } = await $axios.get(`https://www.land.mlit.go.jp/webland/api/CitySearch?area=13`)
      return { message: data.status }
    }
  }
</script>

```

ここでのAPIのサンプルとして、国土交通省の[土地総合情報システム](https://www.land.mlit.go.jp/webland/api.html)を仕様しています
開発関連ツール整理（メモ）

#Mac上の開発で利用しているツールのメモ
新しい、あるいは課題を解決しているものがあれば乗り換え予定

##1.テキスト関連

1. Bear（テンプレート保管、開発メモ）
〜 Markdown、シンプル、ソースコードハイライト対応、タグ付けで管理。
https://bear.app/

1. MacVim（Unix関連ファイル編集）
〜 vi系、terminalと連携、シンプル。
https://qiita.com/schroneko/items/e9cf2957531b8ad32fff


##2.IDE

1. Xcode（iOS, Mac）
〜 Mac上の開発ツールとしても必要
https://developer.apple.com/jp/xcode/

1. Android Studio（Android）
〜 Java関連, Kotlinなど、EclipseよりInteliJ系が合っているので
https://developer.android.com/studio

1. Visual Studio（.NET Core, Xamarin）
〜 C#などWindows系開発、Mac版が思ったよりも使いやすかった
https://visualstudio.microsoft.com/ja/vs/mac/

1. Visual Studio Code（Web系、Python、その他）
〜 プラグインの充実から、できるだけこれで開発
https://code.visualstudio.com/

##3.バージョン管理
基本はIDEに連動させる

1. Git
〜 CUIではXcodeデフォルトのコマンドのみ
https://git-scm.com/

1. SourceTree
〜 GUIではMac,Windows共通インターフェイスなのでSourceTree
https://www.sourcetreeapp.com/

##4.Linux関連ツール

1. iTerm2（ターミナルとして）
〜 設定の自由度、コマンド補完、検索、コピペ便利
https://iterm2.com/

1. Fish（CatalinaでデフォルトがZSHになった契機に）
〜 入力コマンドのハイライト、コマンド補完
```brew install fish```

1. FileZilla（SFTP、バックアップなどのGUIとして）
〜 サーバ情報の一括管理など便利
https://filezilla-project.org/

##5.編集関連

1. Skitch（スクリーンキャプチャ）
〜 影追加できないけれどv2.8.1で利用中。使いやすかったv1.0.12がCatalinaで動かない（2020/01現在）
https://evernote.com/intl/jp/products/skitch

1. QuickTimePlayer（画面収録→動画）
〜 MacやiOSデバイスの画面収録に、プリインストールなのでお手軽

1. GIPHY CAPTURE（画面収録→アニメーションGIF）
〜 Mac上の操作をGIFアニメーションとして収録
https://giphy.com/apps/giphycapture

1. iMovie（動画編集）
〜 動画の簡易的な編集、加工に、プリインストールなのでお手軽

1. Pixelmator（Photoshop的に）
〜 無料で利用できるので人に薦めやすい
https://www.pixelmator.com/pro/

1. Inkscape（Illustrator的に）
〜 無料で利用できるので人に薦めやすい
https://inkscape.org/ja/

##6.開発補助
1. Reflector3（MacをAirPlay,ChromeCast機器にできる。iOS,Android画面をMac上に表示）
〜 モバイル機器の画面をMac内で表示できるので、音楽系アプリなど開発、キャプチャなどにも便利
https://www.airsquirrels.com/reflector
※有料、Trial有

1. Parallels Desktop（Mac上でWindows環境同時利用）
〜 Windows関連の開発でも、Mac1台で行える。BootCamp環境も利用可能
https://www.parallels.com/jp/
※有料、Trial有

1. Wine（Mac上でWindowsOS無しでexeアプリ利用） ← Catalinaで利用不可（2020/01現在）
〜 Windowsツールを単体でMac上で動作できる（場合がある）
https://wiki.winehq.org/MacOS

1. TeamViewer（リモート操作）
〜 WindowsPC,Mac,スマホなどを相互にリモート操作可能
https://www.teamviewer.com/ja/
※個人利用無料、ビジネス有料

##7.Mac環境

1. ControlPlane（Mac各種設定自動化）
〜 Macで勝手に起動するアプリなど、気に入らない動作の制御に
```brew cask install controlplane```

1. AppCleaner（アンインストール補助）
〜 アプリ本体だけでなく設定ファイルなどを根こそぎ削除できる
https://freemacsoft.net/appcleaner/

1. CopyClip（クリップボード履歴）
〜 【⌘+C】などでコピーした情報が履歴で保存される

1. GrandPerspective（ディスク占有率チェック）
〜 お世話になっていた「Disk Inventory X」をCatalinaで使えなかったので
http://grandperspectiv.sourceforge.net/

1. iStumbler（Wifi,Bluetoothなどの電波状況チェック）
〜 出先でシグナルの強いWifiをチェックしたり、干渉チャンネルをチェックしたりできる
https://istumbler.net/

##8.その他オンラインなど
1. GoogleComputingEngine（IaaSとして）
https://cloud.google.com/?hl=ja

1. trello（タスク管理として）
https://trello.com/kmurata3/boards

1. DesignEvo（ロゴメーカー）
https://www.designevo.com/
EXCELで特定の行に一発でジャンプする方法

例えば1,000行にジャンプしたい場合
左上のアドレスバーに A1000 と打ち込みENTER
セル[A1000]が選択される。
結果的に1,000行にカーソルが移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/ca569a69-26d5-c0ad-5bb9-1c14576ccb67.png)
Railsチュートリアルメモ - 第4章・第5章

[メモの目次記事はこちら](https://qiita.com/yokohama4580/items/dedfd5510080273dc2a0)

[公式Railsチュートリアル第4章へのリンク](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#cha-rails_flavored_ruby)
[公式Railsチュートリアル第5章へのリンク](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#cha-filling_in_the_layout)

Railsチュートリアルで気づいたことのメモを記載していきます

## 4.1 動機
Rubyに関する知識を深めていく章。
手始めに条件分岐で異なる文字列を返すhelperを自作する。

## 4.2 文字列とメソッド

### ポイント
- 文字列の式展開 => Rubyはシングルクォート文字列の中では式展開を行わない（シェルスクリプトと同じ）
- putsメソッド(printメソッド + 行末の改行)
- nil
- 暗黙の戻り値 => メソッド内にreturnを明示しなくても最後に評価した式をreturnする
- mixed in => moduleをincludeすること
- Railsでは自動的にヘルパーモジュールをmixed inしてくれるため、include行を書かなくてもOK

## 4.3 他のデータ構造
たぶんここらへんで眠くなって落脱する人が多い気がする、、、
初心者は流し読みにして、後でわからないところが出てきたら戻ってくるくらいの方が良さそう

### ポイント
- Rubyの配列はゼロオリジン（ゼロ・インデックス）
- 比較演算子（==、!=）
- 破壊的メソッド（メソッドの最後が!）
- pushメソッド (または同等の<<演算子) 
- 範囲 (range)  e.g (0..9).to_a


Rubyは改行と空白を区別しない（式の途中で改行してもOK）

## 4.4 Rubyにおけるクラス

### ポイント
- リテラルコンストラクタ、名前付きコンストラクタ
- superclassメソッド
- selfキーワード
- eachメソッド
- ブロック e.g. { |i| puts 2 * i } => pythonでいうlambda？
- ハッシュとシンボル
- 以下は等価
    - { :name => "Michael Hartl" }
    - { name: "Michael Hartl" }
- 組み込みクラスの変更が可能
- attr_accessor => attributeに対しるaccessorを作成するための記法
- initialize => 初期化メソッド（pythonでいう__init__と同じ）



## 5.1 構造を追加する
html/cssについての解説の章。

### ポイント
- パーシャル(DOMの一部を_始まりのファイルに切り出せる)

## 5.2 Sassとアセットパイプライン
SASS（CSSプリプロセッサー）の説明とRailsでの指定の仕方についての章。

### ポイント
- アセットディレクトリ（*/assetsで表される静的ファイルを目的別に分類するディレクトリ）
- マニフェストファイル（アセットディレクトリにあるファイルをどのようにまとめるかを定義するファイル。実際の処理はSprocketsというgemが行う）
- プリプロセッサエンジン（.scssや.erbなどを変換して、html/css/jsに置き換えてくれるやつ。Sprocketsがアセットをまとめてくれた後にプリプロセッサエンジンが実行される）
- Sassの変数
    - $始まりで変数を定義できる
    - bootstrap lessで定義されている変数（@gray-light）なども$gray-lightと書けば使用可能

## 5.3 レイアウトのリンク
- 名前付きルート
    - config/routes.rbの中で`get  '/help',    to: 'static_pages#help', as: 'helf'`のように書くとhelp_pathやhelp_urlのような形で呼び出せるようになる
- 統合テストの作成
    - `rails generate integration_test site_layout`で統合テストを作成できる
    - `rails test:integration`で統合テストの実行

## 5.4 ユーザー登録: 最初のステップ
6章以降でユーザー登録処理を作成していくための導入。ここではこれまでの章の振り返り的な内容。
x509: certificate signed by unknown authority の対応

## 目的
Dockerfileに`go get`しようとすると、↓このようなエラーが発生してたので、解決法をメモ
`x509: certificate signed by unknown authority`

調べた結果、
`go get`や`npm`はSSLを経由して実行しています。なので、証明書をdockerに食わせないといけない。

## 解決方法
OSの`cafile.pem`を`Dockerfile`にコピーします

``` dockerfile
COPY cafile.pem /usr/local/share/ca-certificates/
RUN apk add --no-cache ca-certificates && \ 
    update-ca-certificates
```

※ `hoge.pem`はオレオレ証明書生成できると思う
参考：
http://rikuga.me/2017/12/24/oreore-ca-and-ssl-cert/
https://qiita.com/ll_kuma_ll/items/13c962a6a74874af39c6

#### コード
一応簡単なgitコードは[こちら](https://github.com/reikkk/update-ca-certificates-for-dockerfile)になります。
tail -fをカスタマイズするツールを作ってみた

`tail -f`を実行すると、ログが延々と出力されますが、出力しつつ結果をカスタマイズするツールを作った。

* 時刻表示

> ログの時刻表示形式がマチマチだったり、場合によっては時刻が出ない場合もある。1行ずつ時刻を表示させるようにしてみた。
追加でエポック時刻も表示させ、処理時間を算出しやすくしてみた。

* キーワードの色づけ

> tailすると表示が流れてしまうので、色がつくようにしてみた。

# 実装
tailの実装は https://github.com/hpcloud/tail をインポートした。引数なしで実行するとこんな感じ。

```terminal
NAME:
   decotail - decorated tail

USAGE:
   decotail [global options] command [command options] [arguments...]

VERSION:
   1.0

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   -t             (default: false)
   -k value       add color to text
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)
```

`-t`で時刻表示、`-k`で色づけするキーワードを指定する。("A B C")のようにスペース区切りで6キーワードまで色をつける。7キーワード目以降は色をつけない。
`decotail -t -k "apple syslogd" /var/log/system.log`を実行してみた。(色はわかりませんが...)

```terminal
2020-01-03 16:32:49.312 1578036769 Jan  3 00:03:46 kuritayunoiMac syslogd[124]: ASL Sender Statistics
2020-01-03 16:32:49.312 1578036769 Jan  3 00:04:21 kuritayunoiMac GoogleSoftwareUpdateDaemon[5585]: objc[5585]: Class KSPaths is implemented in both /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Frameworks/DeviceManagement.framework/Versions/A/DeviceManagement (0x106578b48) and /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/GoogleSoftwareUpdateDaemon (0x106365e50). One of the two will be used. Which one is undefined.
2020-01-03 16:32:49.313 1578036769 Jan  3 00:04:21 kuritayunoiMac GoogleSoftwareUpdateDaemon[5585]: objc[5585]: Class KSBundle is implemented in both /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Frameworks/DeviceManagement.framework/Versions/A/DeviceManagement (0x106578aa8) and /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/GoogleSoftwareUpdateDaemon (0x106366210). One of the two will be used. Which one is undefined.
2020-01-03 16:32:49.313 1578036769 Jan  3 00:04:22 kuritayunoiMac com.apple.xpc.launchd[1] (com.apple.xpc.launchd.domain.pid.mdmclient.5592): Failed to bootstrap path: path = /usr/libexec/mdmclient, error = 108: Invalid path
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:20 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: Entered:_AMMuxedDeviceDisconnected, mux-device:8
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:20 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: Entered:__thr_AMMuxedDeviceDisconnected, mux-device:8
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:20 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: tid:9e1b - Mux ID not found in mapping dictionary
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:20 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: tid:9e1b - Can't handle disconnect with invalid ecid
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:40 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: Entered:_AMMuxedDeviceDisconnected, mux-device:9
2020-01-03 16:32:49.313 1578036769 Jan  3 00:13:40 kuritayunoiMac AMPDeviceDiscoveryAgent[3028]: Entered:__thr_AMMuxedDeviceDisconnected, mux-device:9
```

https://github.com/kuritayu/infra-tools にツールをおいてます。
libopusをPlatformIO+ESP-IDFで使う

下記のコマンドをPlatformIOのプロジェクト下に置いて実行する。

```src/components/opus/download.sh
#!/bin/sh
# Download and Set libopus for ESP32

OPUS_VERSION=1.3.1

mkdir -p tmp src && cd tmp
curl https://archive.mozilla.org/pub/opus/opus-$OPUS_VERSION.tar.gz | tar xfz -
cd opus-$OPUS_VERSION

./configure --target=xtensa-esp32-elf --host=xtensa-esp32-elf || exit
cp -r include/* celt/* silk/* src/* config.h ../../src
cp -r README COPYING ../../
echo "opus-$OPUS_VERSION" > ../../VERSION

cd ../../src
rm -f opus_demo.c celt/opus_custom_demo.c opus_compare.c repacketizer_demo.c
find . -name tests -o -name arm -o -name mips -o -name x86 -o -name .deps | xargs rm -Rf
rm -Rf ../tmp
```

そして、`platform.ini`の`build_flags`に下記のように追加。

```platform.ini
build_flags =
  -I src/components/opus/src
  -I src/components/opus/src/float
  -I src/components/opus/src/fixed
```
【形式手法】形式手法、はじめました！ 

# はじめに
形式手法という技術がなにやら面白そうですので、勉強してみたいと思います。
なんか面白いことができそう、ポテンシャル高そう、エッジな技術という印象です。
れっつら形式手法！

#  形式手法とは
数理論理学等に基づき品質の高いソフトウェアを効率よく開発するための科学的・系統的アプローチです。

- 明確で厳密
- 高い信頼性が期待
- 分析・検証が可能
- 導入コストが高い（と言われる）

[引用元] http://jasst.jp/symposium/jasst17tokyo/pdf/D3.pdf

# なぜ形式手法か？
- 数理論理学を用いることで、明確で厳密なモデルを手にすることができる
- 明確で厳密であるため、自分の考えの推敲や他者との議論やコミュニーケーションが正確で効率的である

[引用元] http://jasst.jp/symposium/jasst17tokyo/pdf/D3.pdf

# 学習の動機
- 形式手法を使えば、ルールを使ったチェックや、ルールそのものの不整合をチェックしたりできるらしい。それってなんかすごくね？どんな感じでそれらがやれているのか、見てみたい。
- 形式手法はルールベースのお化けみたいな印象なので、これをAIのルールベースエンジンとして使えないかなー、みたいなアイデアを検証してみたい。ただし、汎用的な知的処理の仕組みとして使っていくことは難しそうだな、という印象はすでにあります。
- 仕事で使う（かもしれない）

# とっかかりとして興味がある点、知りたい点
- どんな風にルールを実装するの？
- どんな風にチェックできるの？
- なんかすごそうなのに、ソフトウェア開発の現場であんまり使われていないのはなぜ？（複雑すぎる？コストが高すぎる？私が知らないだけで、ミッションクリティカルな領域では結構使われていたりする？）
- これ、業務で使えるの？（機能的に、ライセンス的に、難易度的に・・・など）
- AIのルールベースエンジンとして使える？
- 普通にチェックロジックを実装しちゃえばいいんじゃないの？
CloudFormationでLambda＠Edgeをデプロイする

CloudFront + S3 + Jekyllで運用していたブログをHugoに載せ替えた際、ディレクトリインデックスを効かせないといけなかったのでCloudFormationの修正をした。

最大のつまずきポイントはCloudFrontからLambdaを指定方法。
LambdaのArnを指定すれば良いのかと思いきやバージョンも指定せよとのこと。

いちいちバージョンを手動で設定もしていられない…と思っていたらこちらの方法で解決。

[AWS CloudFront Lambda@Edge の罠たち \| d\.sunnyone\.org](http://d.sunnyone.org/2018/03/aws-cloudfront-lambdaedge.html)
[serverless\-application\-model/examples/2016\-10\-31/lambda\_edge at master · awslabs/serverless\-application\-model](https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/lambda_edge)

まずLambdaを`AWS::Lambda::Function`ではなく`AWS::Serverless::Function`として定義し、`AutoPublishAlias`を設定する。
そうすることでCloudFrontの`LambdaFunctionARN`で`!Ref (リソース名).Version`としてLambdaを指定することができるようになる。



```yaml:Lambda定義
  StgLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      AutoPublishAlias: stg
```

```yaml:CloudFront定義
          LambdaFunctionAssociations:
            - EventType: origin-request
              LambdaFunctionARN: !Ref StgLambdaFunction.Version
```

また`AWS::Serverless::Function`を使う場合はファイル先頭に`Transform: 'AWS::Serverless-2016-10-31'`が必要なことに注意。
【Swift】三項演算子をswitch文に置き換えたら読みやすくなった

三項演算子はよく使いますが、条件が増えるとわかりづらくなるという難点があります。
そこで、switch文にしたら読みやすくなったという話です。

### もともとのコード

```swift:三項演算子
let condA = true

let v = condA ? 1 : 2
```
条件が一つしかない場合は、三項演算子を使うとわかりやすいコードになります。

ところが、ここに新しい条件`CondB`が増えると、

```swift:条件が2つある場合
let condA = true
let condB = false

let w = condA ? (condB ? 1 : 2) : 3
```
このように入れ子になってしまいわかりづらくなります。

### switch文を使って書き換えてみる

上のコードを`switch`文で書き換えてみます。

```swift:switch文を使った場合
var x:Int
switch(condA, condB) {
case (true,true):
    x = 1
case (true,false):
    x = 2
case (false,true), 
     (false,false):
    x = 3
}
```
`condA`と`condB`の状態ごとにどのような値になるかが一目瞭然です。


### さらに改良してみる

上のコードをさらに改良して、代入式にまとめてみます。

```swift:改良をしたコード
let y = { condA, condB -> Int in
    switch(condA, condB) {
    case (true,true):
        return 1
    case (true,false):
        return 2
    case (false,true),
         (false,false):
        return 3
    }
}(condA, condB)
```

このようにすることで、`CondA`と`CondB`を入力として`y`の値を定める、という全体の流れを表現することができるので読みやすくなります。

### まとめ

三項演算子を使っていて条件が増えた場合、switch文を使ったら条件が直感的に表現されたので読みやすいコードになりました。また、switch文は条件のすべてを列挙する必要があるため、複数の条件があったときに考慮もれの防止にも繋がります。
CodePen + Three.js でルービックキューブ（モドキ）つくってみた

3D描画するだけならThree.jsでかなり簡単にできる。(参考サイト 1. 参照)

# つくってみた

今回、ルービックキューブっぽくするために箱を複数(8個)使っている。
箱を回転させるのは`rotation.x`,`y`,`z`を指定するだけだが、箱の位置も回転させないといけないため、`cos`,`sin`で自力で[回転](https://ja.wikipedia.org/wiki/回転行列)させている。
操作できるUIは今回実装してないので、見るだけのルービックキューブです。

※JavaScriptについては、わたしはほぼ素人です。テキトウにコード書いているのであまりマネしないようにおねがいします。


<p class="codepen" data-height="450" data-theme-id="default" data-default-tab="js,result" data-user="kob58im" data-slug-hash="VwYrPzw" style="height: 450px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="DrawCubeUsingThreeJs">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/VwYrPzw">
  DrawCubeUsingThreeJs</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# カメラの視点をマウスで操作する

ドラッグすると視点を移動します。参考サイト.4 参照。

<p class="codepen" data-height="450" data-theme-id="light" data-default-tab="result" data-user="kob58im" data-slug-hash="dyXprOK" style="height: 450px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CameraPosChangeSampleUsingThreeJs">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/dyXprOK">
  CameraPosChangeSampleUsingThreeJs</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# もともとやろうとしていたこと

11か月の時を経て、できるようになってました。
[全自動ルービックキューブ（大嘘）つくってみた - Qiita](https://qiita.com/kob58im/items/7871217b2720f7cecc72)


# 参考サイト

1. [WebGL、three.jsでワクワクしてみた](https://www.cresco.co.jp/blog/entry/7427/)
2. [Three.jsのさまざまなマテリアル](https://ics.media/tutorial-three/material_variation/)
3. [Three.jsのBoxGeometryでそれぞれの面に別々の色を指定する方法](https://yhei.hatenablog.com/entry/2014/11/27/172443)
4. [Three.jsのカメラの制御 - ICS MEDIA](https://ics.media/tutorial-three/camera_position/)
[NNabla]構築済みネットワークの中間層を削除する方法

# はじめに
　qiitaへの２回目の投稿です。(article2)
　[前回](https://qiita.com/__NJ__000/items/551e3a26980729459791)に引き続き、私がnnablaを使っていた中で「こういう情報がqiitaとかにあったらよかったのに」と思いながらなんとか気合いで[nnablaのreference](https://nnabla.readthedocs.io/en/latest/)と`dir()`(pythonの標準関数。引数のメンバ変数・関数を返してくれる)で見つけてきたことについてまとめます。
#1. 要件
・OS: macOS Catalina (バージョン 10.15.1)
・python: 3.5.4
・nnabla: 1.3.0
#2. ネットワークの構築
　サンプルのネットワークを下記で定義します。(ここまでは[前回](https://qiita.com/__NJ__000/items/551e3a26980729459791)同様)

```article2_rewire_on.py
import nnabla as nn
import nnabla.functions as F

# [define network]
x = nn.Variable()
y = F.add_scalar(x, 0.5)  # <-- (1)とおく
y = F.mul_scalar(y, 2.0)
```
単純に $y=(x+0.5)\times2$ という形になってます。
この時、変数yは上の式の結果をもつ変数となっていて、途中の計算である`F.add_scalar(x, 0.5)`の結果を(1)と呼びます。
# 3. 中間層を削除
　前述の(1)を削除し、単に$y=x\times2$とする方法を説明します。
これは、[nnablaのreference](https://nnabla.readthedocs.io/en/latest/python/api/variable.html)にあった`nnabla.Variable`のメンバ変数`rewire_on`を使用します。これはreferenceにも(比較的)わかりやすい説明があります。下記で実践しました。

```article2_rewire_on.py
h1 = y.parent.inputs[0]   # = (1)
x.rewire_on(h1)
```
動作確認は下記で行いました。

```article2_rewire_on.py
# [check func for visit]
def get_func_name(f):
    print(f.name)
print('--- before ---')
y.visit(get_func_name)
print('')

# [rewire_on]
h1 = y.parent.inputs[0]   # = (1)
x.rewire_on(h1)

print('--- after ---')
y.visit(get_func_name)
print('')
```
出力

```
--- before ---
AddScalar
MulScalar

--- after ---
MulScalar
```
###解説
* まず(1)を上記の`h1`として取得しました。これについての詳細な説明は[前回](https://qiita.com/__NJ__000/items/551e3a26980729459791)を参照してください。
* `x.rewire_on(h1)`で`h1`が消えます。正確には、計算グラフ上で`h1`が`x`で置き換えられるようです。記述はコードからわかりますが、計算グラフを、`rewire_on`するノードを始点、終点として入力に繋がる部分グラフと出力へ伝わる部分グラフで分けた際に`[入力側の終点].rewire_on([出力側の始点])`となります。(言葉だとわかりづらいからそのうち図を載せたい。)
* 確認方法として、[前回](https://qiita.com/__NJ__000/items/551e3a26980729459791)使用した`visit`を用いて、`get_func_name(f)`によって全レイヤーのレイヤー名を表示させています。その結果、`rewire_on`の後で(1)の計算をしている`AddScalar`が消えていることから、所望の動作が確認できました。

# 4. 次回予告(?)
　`rewire_on`を使用すれば、中間層を削除するだけでなく、新たなレイヤーを挟み込みこともできます。これもなんとか自分でできるようになりましたが、「qiitaとかに誰か書いといて欲しかった」と思ったので次回にでも書いてみようかと思います。
Mac において Julia で添字が豆腐にならないようにする

# 本日は

- プログラミング言語 Julia は $\alpha, \beta, \gamma,\dots ,\zeta$ のようなギリシャ文字や $x_1,x_2,x_3, x_a$ のような添字付きの文字を変数名として使うことができます. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/e1915db8-17ef-9165-e53e-74fbe1112811.png)

これにより数式とコードの解離を抑えることができます．ただし，使用フォントによっては $x_k,x_n$ などを表現する際に豆腐と呼ばれるように $\square$ のなかに ? がつくような現象が出てしまいます．

下記の図は iterm2 上で Monaco フォントを用いた場合の様子です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/d177515a-ca38-1a70-05ed-f59990b77393.png)

- 今回は Mac においてこの現象を回避するためにCica フォントを導入そして反映の方法を紹介します．
- すでにお気に入りのフォントがあって文字化けの問題ない場合は無理して変更する必要はないでしょう．

# Cica フォントの導入

https://github.com/miiton/Cica のインストラクションに従い Docker Compose を用います．
Docker Compose 自体は Julia とは別の技術なので https://docs.docker.com/compose/install/ などを見て各自導入することにします．なお Mac のターミナルが zsh がデフォルトで使うようですのでプロンプトは `%` を用いています．


```zsh
% git clone https://github.com/miiton/Cica.git
% cd Cica
% docker-compose build ; docker-compose run --rm cica
# しばらく待つ
# Finished: dist/noemoji/Cica-BoldItalic.ttf という文字列が出る
% tree dist
dist
├── Cica-Bold.ttf
├── Cica-BoldItalic.ttf
├── Cica-Regular.ttf
├── Cica-RegularItalic.ttf
└── noemoji
    ├── Cica-Bold.ttf
    ├── Cica-BoldItalic.ttf
    ├── Cica-Regular.ttf
    └── Cica-RegularItalic.ttf
```

# Font のインストール

- Apple のホームページ [Mac でフォントをインストール／削除する方法](https://support.apple.com/ja-jp/HT201749) を参考にします.
- Font Book を開きます．

Spotlight search で Font Book と打つと出てきます．（下図参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/fda9619f-b565-68a7-cbbd-a3d6c1714230.png)

- `+` マークを押して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/11db722f-c39b-da05-b894-a8b877b4d477.png)

- `クローンしたCicaディレクトリ/dist` を選択して `Open` をおす．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/d63e257c-155f-f7c9-3c91-391d6aeac137.png)

これによって User のフォントで `Cica` が追加されます.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/3cc00475-ac13-bf28-2a60-aee1db01510b.png)

# ターミナルのフォントを変更

iterm2 だと `Cmd+,` で設定に入り `Profile` -> `Text` の順に進んだ画面でフォントの変更をするところで Cica を選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/3f8b89be-72cb-1fa1-411a-0c8206eeeae1.png)

# Result

- できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/d1877817-ff02-d5ec-cf98-c8e54e616eb9.png)


# おまけ

ラズパイでJuliaを使いたい人のためにおまけで書いておきます．`sudo apt install xterm` で解決できます．

# まとめ

- Juliaにおいて文字化け，豆腐現象を回避するために Cica フォントを導入しました．
- 導入後フォントを反映する手順まで書きました．

以上
🐚【Windows PowerShell】SSH接続する際にパーミッションエラーが発生した場合の権限変更

## 環境

Windows 10
Windows PowerShell 

## やりたいこと

EC2のインスタンスに接続したいがキーファイルのパーミッションでエラーが出る
windowsなのでchmodが使えないのでファイルのプロパティから変更を行う

```PowerShell
PS C:> ssh -i C:\key\test\test\KeyFile.pem root@000.000.00.00
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\key\\test\\test\\KeyFile.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\key\\test\\test\\KeyFile.pem": bad permissions
root@000.000.00.00: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

## やったこと

先ずはキーファイルのプロパティからセキュリティタブを押下

設定が下記の様になっているはず

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/f74da39a-6e33-970a-3fe7-5bbe4cf77222.png)

「編集(E)」を押下して現状のすべてのグループ名またはユーザ名を「削除(R)」から削除し
その後に現行のアカウントを追加してフルコントロールを許可します

![delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/4dc27e89-fc1e-9bc3-1540-4cc7fcf0bb78.png)

削除の際に下記メッセージが表示された場合は一旦「OK」を押下して前画面に戻ります

```
Authenticated Users は親からアクセス許可を継承しているので、このオブジェク
トを削除することはできません。Authenticated Users を削除するには、アクセス
許可の継承を妨げる必要があります。アクセス許可の継承のオプションをオフに
して、Authenticated Users の削除を再試行してください。
```

「詳細設定(V)」を押下してセキュリティの詳細設定を開き、「継承の無効化(I)」を押下

↓

「継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します。」を選択

![inharitepng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/89f0c3af-2373-de35-a7a1-79115220b4de.png)

「継承の無効化(I)」が「継承の有効化(I)」に変わったら「OK」で画面を閉じる

↓

再度「編集(E)」を押下してすべてを削除

![alldelete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/f99f51dd-b997-1214-f2cf-6a6bda454883.png)

「追加(D)」からユーザ または グループ の選択を開き
選択するオブジェクト名を入力してくださいの枠内にログオンしているアカウント名を入力して「名前の確認(C)」押下

↓

複数表示される場合は正しい方を選び「OK」で閉じる

↓

残った現行ユーザにフルコントロールを与えて「OK」

![complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/4bafa313-a03b-3538-2235-cde706c4e61d.png)

## 結果

これでSSH可能になります

尚、フルコントロールを与えていないと下記のPermission deniedになります

```PowerShell
PS C:> ssh -i C:\key\test\test\KeyFile.pem root@000.000.00.00
Load key "C:\\key\\test\\test\\KeyFile.pem": Permission denied
root@000.000.00.00: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
Javascriptで階層を持った名前空間を定義する関数

```javascript
function namespace(ns) {
    var names = ns.split('.');
    var parent = window;

    for (var i = 0, len = names.length; i < len; i++) {
        parent[names[i]] = parent[names[i]] || {};
        parent = parent[names[i]];
        console.info(parent);
    }
    return parent;
}

// 実行確認
var aaa = namespace('Hoge.Fuga');
aaa.Piyo = function () {};
var bbb = new aaa.Piyo;
console.info(bbb instanceof Hoge.Fuga.Piyo);

```
while else

```python:1
count = 0

while count < 5:
    print(count)
    count += 1
else:
    print('終了')
```

```:1の実行結果
0
1
2
3
4
終了
```

```py:2
count = 0

while count < 5:
    if count == 2:
        break

    print(count)
    count += 1
else:
    print('終了')
```

```:2の実行結果
0
1
```


breakはwhile文全体から抜ける。

なので、
whileと組み合わされたelse以下は
breakで抜けなければ実行される。
【第1回】pythonでCPUとメモリの使用率を取得する

# 作成環境
<img width="360" alt="スクリーンショット 2020-01-03 15.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35048/ccd66acd-cbc4-b8ad-78d1-10a71421624e.png">
<img width="441" alt="スクリーンショット 2020-01-03 15.03.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35048/2e8db9b6-bfec-a91f-aeb3-72d19acc3d5b.png">

# pythonで何か作りたい。
- CPU使用率とメモリ使用率を取得したい。
- どうせならGUIで作りたい。
- ボタンを押したときに取得したい。

## プログラムを組み上げる前に考慮すること
- CPUとかメモリとかだからOSに依存するでしょ。→import sysが必要だな。
- CPUとかメモリ→import psutilも必要だな。
- GUIにしたいから→import tkinterを使おう。（多分他の方法でもできる）
- CPUの表示とメモリの表示であることのラベルが必要だな。
- 取得のきっかけになるボタンがいる。
- ボタンを押したときに値を表示するBOXがいる。

# 実際のソース
```python3
#!/usr/bin/env python
import psutil as psu
import tkinter as tk
import sys

# tkinterでwindowの作成とタイトルを作る
# windowサイズの指定
root = tk.Tk()
root.title(u"CPU&メモリ使用率")
root.geometry("600x300")

# cpu用ラベル
Static1 = tk.Label(text=u'CPU:')
Static1.pack()
# CPUの取得した値を表示する
txtcpu = tk.Entry(width=20)
txtcpu.pack()

# memory用ラベル
Static2 = tk.Label(text=u'memory:')
Static2.pack()

# memoryの取得した値を表示する
txtmem = tk.Entry(width=20)
txtmem.pack()


def btn_click():
    # テキストボックスをクリア
    txtcpu.delete(0, tk.END)
    txtmem.delete(0, tk.END)
    # メモリの利用情報を取得
    memory = psu.virtual_memory()
    txtcpu.insert(0, memory.percent)
    # debug_cpu使用率をTerminalに表示
    #print('メモリ使用率：', memory.percent)

    cpu_percent = psu.cpu_percent(interval=1)
    txtmem.insert(0, cpu_percent)
    # debug_memory用の使用率をTerminalに表示
    #print('CPU使用率：', cpu_percent)


# ボタンの生成
Button = tk.Button(root, text='使用率取得', command=btn_click)
Button.pack()

root.mainloop()

```
# 考慮不足であとから直しながら追加したもの
- テキストボックスをクリアをしないと数字がどんどん連ねられてわけがわからなくなるのでボタンが押されたら値をクリアする。

# まだ進化させたいことがあるので今回は第1回とします。
- 現時点でやりたいことが2つくらいあるので次回また進化版の記事を書く予定です。
[Vue×Firebase] SPAの雛形をつくってみた

# まずは成果物
https://vue-login-191230.firebaseapp.com/
[こちらで認証ページもみることができます]
ID: member@example.com
PW: member

![スクリーンショット 2020-01-03 14.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/167d80fd-04c1-4dc2-a4d5-5b5ad0db2dd2.png)

![スクリーンショット 2020-01-03 14.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/09103b06-4a22-3428-36c1-eb0cb1bf1600.png)

![スクリーンショット 2020-01-03 14.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/72524941-63f8-693e-cb35-dfc1a5a0c9cc.png)

![スクリーンショット 2020-01-03 14.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/18bee47e-3959-0951-5a5a-5c8d43973f0f.png)

![スクリーンショット 2020-01-03 14.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/9eedee58-5034-cfb3-b50a-f6343ef61749.png)

# 環境構築
※環境構築は[VueCLIからVue.js入門①【VueCLIで出てくるファイルを概要図で理解】](https://qiita.com/po3rin/items/3968f825f3c86f9c4e21)でできます。
|- Vue CLI
|- Vuex
|- Vue Router

# データクローン & Run
Macならターミナル、Winならコマンドラインから下記コマンドを入力してデータをクローンしてください。

```
$ git clone https://dai570415@bitbucket.org/dai570415/vuespa-sample.git
```
クローンできたら圧縮データを解凍する
その中のsrcファイルを各自のCLIにごっそり入れてください。

Vue roterとvuexを動かせる状態なら動くはずです。


# Firebaseと連動

Firebaseのコンソール
・Peoject Overview「プロジェクトの設定」
↓
・マイアプリ追加
↓「Firebase SDK snippet」のCDNを選択するとscriptが出てくるので
scriptタグに囲まれた箇所を下記ファイルにコピーする。

```js:/src/main.js
// 省略

// 認証関連
import firebase from 'firebase'
// Firebaseで新たにプロジェクトを作ったら以下を差し替え
Vue.config.productionTip = false
let firebaseConfig = {
  apiKey: "Your_code",
  authDomain: "Your_code",
  databaseURL: "Your_code",
  projectId: "Your_code",
  storageBucket: "Your_code",
  messagingSenderId: "Your_code",
  appId: "Your_code",
  measurementId: "Your_code"
};
firebase.initializeApp(firebaseConfig);
// ここまで差し替え

// 省略
```
Vue エラー解決　Module build failed

# はじめに
今回は単純な備忘録というか、確認事項です。
webpack.config.jsやBabelあたりの理解は全然追いついていませんのでご了承ください。
あくまで**確認程度の記事**であるという認識でお願いします
勉強して理解が追いついたら再度書き起こします

# Module build failed
Vueサンプルアプリ２個目を作成中、buildできなかった時のお話

```
Module build failed: ReferenceError:
 Unknown plugin "transform-vue-jsx" specified in "Users/...省略"
```

ん？１個目作成時は問題なかったのに何故かできないとな
２個目と１個目の差異を探してみる

いくつかファイルの差異がありました
順番に試していくと、".babelrc"なるファイルが２個目になかったためbuildできなかったことが判明

```.js
{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime"]
}


```
このファイルを追加することでbuildできました
モンテカルロ法でルーレットに賭け続けた場合に本当に勝てるのか調べた話

# 初めに

`モンテカルロ法` というギャンブルの戦略があることを知り、実際にこれで勝負した場合の勝率がどの程度になるのかプログラムを書いて調べてみた。

参考動画: https://www.youtube.com/watch?v=_suZM2y9wyA

# モンテカルロ法とは

勝率1/2の勝負に、以下のルールでベットを行い続ける方法

まず `[1, 2, 3]` の配列を作成する

-- loop --

1. 配列の要素数が2未満だったらループを抜ける
2. 配列の先頭と末尾の要素を足した額をベットする (初期状態では `4` )
3. 勝ったら → 配列の先頭と末尾の要素を削除し 1. に戻る。  
   負けたら → 配列の末尾に2.でベットした額と同じ値を追加し 1. に戻る

-- loop end --

# 書いたコード

https://github.com/yamazaki-sensei/montecarlo

* ルーレットで赤or黒に賭けるのと同様の場合を想定。
* 0だと赤でも黒でも外れ。
* 予算は100000単位
* プログラムでは10000ループのモンテカルロ法を行う

```swift
import Foundation

let roulette = (0...36) // 疑似ルーレット

func spin() -> Bool {
    return roulette.randomElement()! >= 19 // 0から18の数字が出たら負け
}

let n = 100
var budget = 100_000

let initialState = [1, 2, 3]

(1...100).forEach { _ in
    assert(budget > 0, "破産")
    (1...n).forEach { _ in
        var state = initialState
        while state.count >= 2 {
            if state.last! > 1000 {
                print(state)
            }
            let toBet = state.first! + state.last!

            if spin() {
                state.removeFirst()
                state.removeLast()
                budget += toBet
            } else {
                budget -= toBet
                state.append(toBet)
            }
        }
    }

    print("#################")
    print(budget)
}
```

# 所感
* 10000ループだと80%くらいの確率で勝つ気がする。
* 勝った時の儲けはだいたい10000単位くらい。
* 負けるときは大負けして最終的なbudgetが10000とかになる → このときの`state`を覗いてみると、 `state.last!` が10000以上とかになっている。怖い。
* コードを変えて100000ループ回すと、30%くらいの確率で破産する。怖い。

# 終わりに
実世界の場合一度破産したら死んでしまうので恐ろしくてなかなか出来ない。やはり必勝法などは無かった。
[kotlin] コピペでandroidに通知を出す

#今回やること
ボタンを押したら通知を出せるようにする。
アクションボタンやその他オプションは今回は触れません。
こんなやつ ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520167/6211e209-e11c-04bf-6312-73972c8df6e6.jpeg" width=400>

#さっそくコピペ
activity_main.xmlにpushBtnのIDで適当にボタンを配置
そして以下をペースト

```kotlin:MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val CHANNEL_ID = "channel_id"
        val channel_name = "channel_name"
        val channel_description = "channel_description "

         ///APIレベルに応じてチャネルを作成
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val name = channel_name
            val descriptionText = channel_description
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
                description = descriptionText
            }
            /// チャネルを登録
            val notificationManager: NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }

        /// 通知の中身
        val builder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_launcher_background)    /// 表示されるアイコン
            .setContentTitle("ハローkotlin!!")                  /// 通知タイトル
            .setContentText("今日も1日がんばるぞい!")           /// 通知コンテンツ
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)   /// 通知の優先度

        
        var notificationId = 0   /// notificationID
        pushBtn.setOnClickListener {
            /// ボタンを押して通知を表示
            with(NotificationManagerCompat.from(this)) {
                notify(notificationId, builder.build())
                notificationId += 1
            }
        }
```

これで完了！！ いやー思って以上に簡単でびっくり。

Android8.0(API26)から通知を出す際にチャネルの登録が必要になった。
notificationIDは適当に一意のものをつける。別に一意じゃなくても大丈夫だが、通知として表示される際IDが同じものは1個しか表示されないので注意。
【読書記録】世界一優しい　問題解決の授業（渡辺健介　ダイヤモンド社）

#結局何が書いてあるの？
コンサルと言われる人たちが現状分析・課題の特定・課題解決に用いる所謂フレームワークのうち本質的な幾つか（初出順・本文中の記載名に従う：分解の木、はい・いいえの木、課題分析シート、二軸マトリックス分析、実行プラン表、ギャップ分析、仮説の木、その他意思決定ツール）を平易に紹介しています。
「問題解決プロフェッショナル」
「考える技術・書く技術」
などの原典をはじめ、数多のビジネス書で課題解決フレームワークは解説されていますが、実際使いこなせそうな幾つかに絞って、ストーリー仕立てで解説されているので、フレームワークを学びたいと思った場合、現場レベルだったらこの１冊だけで十分なんじゃなかろうかと思われる非常にシンプルな内容。
薄い（厚さ１センチほど）、軽い（235g）、高くはない（¥1,200+税）ので常に持ち歩いてもいいと思うしデスクに１冊自宅に１冊とか置いておいて焦った時に読んでもいいのではなかろうか。

#こんなシーンに使えそう
・お子さんに一冊
・シビックテックのイベントで課題解決に取り組む際の基本姿勢を思い出すために
・役所や企業での「業務効率化検討会」みたいなガス抜き企画をガス抜きで終わらせないために
・人生の悩み打破に向けて

###2020読書メーター
1/2 読了　2冊目
「世界一優しい　問題解決の授業」
渡辺健介　ダイヤモンド社
初版　第1刷 2007/6/28
読んだもの：初版　第35刷 2019/7/31
ISBN978-4-478-00049-6
continue

```py
count = 0

while True
    if count == 5:
        break

    if count == 2:
        count += 1
        continue

    print(count)
    count += 1
```

```:実行結果
0
1
3
4
```

```py
if count == 2:
    count += 1
    continue
```
continueで

```py
print(count)
count += 1
```

をとばして
while内の1行目

```py
if count == 5:
```

に行く。
[Docker] laravelからmysql接続時にエラー 「php_network_getaddresses: getaddrinfo failed: Name or service not known」

DockerでLAMP環境を構築し、Laravelからmysqlに接続(php artisan migrate)しようとした際にエラーが発生。
つまづいたので、メモします。


## エラー内容
``` bash:
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = database and table_name = migrations and table_type = 'BASE TABLE')
```
エラー内容を見たところ、mysqlに接続しているホスト名が違うらしいので、laravelの.envファイルとdocker-composer.ymlを確認。

```ini:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=hoge
DB_PASSWORD=hoge
```

``` yaml:docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: hoge
      MYSQL_PASSWORD: hoge
```

## 別の方法でmysqlに接続
ホスト名は間違ってなさそうだと思い、データベースマネージャ([TablePlus](https://tableplus.com/))を使い接続を確認。
<img width="612" alt="スクリーンショット 2020-01-03 14.39.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335593/2fbb09f4-0252-ccfe-9826-97a8a90e23b0.png">

```
Ver: Mysql 5.x
Host: 127.0.0.1
Port: 3306
User: hoge
password: hoge
Database: database
```
TablePlusではつながりました。

もしや問題はDocker特有の何か、、？？

## DockerのDBコンテナ関連について調べた
[こちらの記事](https://tech.pjin.jp/blog/2018/02/27/docker%E3%81%A7php%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8Cphp_network_getaddresses-getaddrinfo-failed-name-or-service-not-known%E3%80%8D/)によるとコンテナ内からのコンテナに接続する際はホスト名がIPでは無理らしく、service名で接続だそう

Laravel内の

```ini:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=hoge
DB_PASSWORD=hoge
```

を

```ini:.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=hoge
DB_PASSWORD=hoge
```

に修正。






つながった:relaxed:

## その他 参考記事
- https://qiita.com/saken649/items/00e752d89f2a6c5a82f6
【小ネタ】Jupyterでmatplotlibのグラフを一括で保存する方法

# はじめに
matplotlibのグラフを1つ1つfigsaveしないで、一括で保存する方法についてです。
JupyterをMarkdownで保存するだけです。グラフの保存形式はpngになります。

# 方法
1. Jupyterをmarkdownで保存する。"File" -> "Export Notebook As..." -> "Export Notebook to Markdown"
2. zipで保存されるので解凍する。

# 結果
保存されたグラフは、同じpng形式でもmatplotlibのsavefig("*.png")を使ったものと違うものになります。

1. figsave("a.png")
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/082d78c5-3740-80ef-4415-aab4a89672e9.png)

2. Markdownで保存
![output_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/2fb41831-289c-36c7-ba32-81378c59a346.png)

白背景でブラウザから見ただけではわからないので、茶色の背景にグラフを貼ったものを掲示します。

1. figsave("a.png")
![figsave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/4198b386-33cf-2800-8639-c6f76703de66.png)

2. Markdownで保存
![markdown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/e5fbd154-1af2-50ee-e183-ddc2875a214e.png)

figsaveでも同じように透過させたい場合は、fig.patch.set_alpha(0)とすれば良いそうです。

参考
[Matplotlib で図の余白のみを透明にする](https://astropengu.in/blog/26/)
[python]取得したTwitterタイムラインをMeCabで形態素に分解する

#目的
Twitterのタイムラインが、txtファイルになっています。
一つのフォルダに、複数ユーザーのタイムラインが格納してあります。
これらのファイルを、MeCabを用いて全て形態素解析するのが今回のゴールです。


#背景・準備
###タイムラインの取得
タイムラインの取得は、次の記事のように行いました。
[[python]複数ユーザーのTwitterタイムラインを取得する](https://qiita.com/Yoocie/items/8d41b9b5870dabc11a31)
###MeCabの準備
形態素解析のために、形態素解析エンジン'MeCab'を使用します。macで使用する方法について、
[mecabインストール手順](https://qiita.com/yosemite2307/items/b73c24caa29fca415bba)
を参考にさせていただきました。

#実装
1. フォルダ内のファイル名一覧をpythonのリストに取得

2. ファイル名リストからタイムラインのリストを作成する関数

3. 形態素解析の関数

4. フォルダ内の全ファイルを形態素解析する
 
##1. フォルダ内のファイル名一覧をリストに取得
ファイル'timelines'に、操作したい全てのtxtファイルが入っています。
これらのファイル名（文字列）をリスト'file_names'に格納します。

```python
import glob

file_names=[]

files = glob.glob("./timelines/*")
for file in files:
    file_names.append(file)

```
取得したfile_namesは、次のような形をしています。

```
['./timelines/20191210_user0_***.txt',..,'./timelines/20191210_user199_***.txt']
```

##2. ファイル名リストからタイムラインのリストを作成する関数

```timelines.py

def timelines(file_list):
    timelines=[]
    for file in file_list:
        text=open(file).read()
        open(file).close()

        timelines.append([text])
    return timelines
```

##3. 形態素解析の関数
形態素解析の関数を定義します。
関数の引数は文字列、返り値は形態素解析結果のリストです。

```mecab_list.py
import MeCab

def mecab_list(text):
    tagger = MeCab.Tagger("-Ochasen")
    tagger.parse('')
    node = tagger.parseToNode(text)
    mecab_output = []
    while node:
        word = node.surface
        wclass = node.feature.split(',')
        if wclass[0] != u'BOS/EOS':
            if wclass[6] == None:
                mecab_output.append([word,wclass[0],wclass[1],wclass[2],""])
            else:
                mecab_output.append([word,wclass[0],wclass[1],wclass[2],wclass[6]])
        node = node.next
    return mecab_output
```
'mecab_list'関数の動作を確認しましょう。

```python

print(mecab_list('昨日飼いはじめたネコはよく食べる。'))
'''
結果
[['昨日', '名詞', '副詞可能', '*', '昨日'], ['飼い', '動詞', '自立', '*', '飼う'], ['はじめ', '動詞', '非自立', '*', 'はじめる'], ['た', '助動詞', '*', '*', 'た'], ['ネコ', '名詞', '一般', '*', 'ネコ'], ['は', '助詞', '係助詞', '*', 'は'], ['よく', '副詞', '一般', '*', 'よく'], ['食べる', '動詞', '自立', '*', '食べる'], ['。', '記号', '句点', '*', '。']]
```
問題ないようです。

##4. フォルダ内の全ファイルを形態素解析する
```python
mecab_results_list=[]
the_timelines=timelines(file_names)

for the_timeline in the_timelines:
    mecab_result=[]
    for twt in the_timeline:
        mecab_result.append(mecab_list(twt))
    mecab_results_list.append(mecab_result)
```

```python
print(mecab_results_list)
#結果
[[[['ｗ', '記号', 'アルファベット', '*', 'ｗ'], ['まだ', '副詞', '助詞類接続', '*', 'まだ'], ['亜', '名詞', '固有名詞', '地域', '亜'], ['種', '名詞', '接尾', '一般', '種'], ['？', '記号', '一般', '*', '？'], ['が', '助詞', '格助詞', '一般', 'が'],..,]]]]

```
求める結果が得られました。

#環境
macOS Catalina
Jupyter notebook
セーラー戦士

星の守護を受けた戦士たち。戦闘服はセーラー服とハイレグレオタードを基調にしている。

​水野亜美（みずの あみ）：IQ300の天才で、セーラー戦士たちのブレーン。やや癖のあるボブヘアが特徴。セーラーマーキュリーに変身する。氷や水を操る力を持つ。

火野レイ（ひの レイ）
火川神社の巫女を務める霊感少女。長い黒髪が特徴。セーラーマーズに変身する。炎や霊力を操る力を持つ。

木野まこと（きの まこと）
メンバー一の長身と、怪力の持ち主。癖のある髪をポニーテールにしているのが特徴。セーラージュピターに変身する。雷や植物を操る力を持つ。

愛野美奈子（あいの みなこ）
「セーラーV」として、セーラームーンより先に活動していた。長い髪を赤いリボンで結っているのが特徴。セーラーヴィーナスに変身する。光や愛を操る力を持つ。
https://www.kakoicos.com