OmniAICreator/Qiita-1.07M huggingface dataset:
sbclで(quicklisp-quickstart:install)でエラーになる

最初はsbclでcaveman2をインストールしたいのですが
その前に(quicklisp-quickstart:install)で
エラーになってしまいます。

実行した内容とエラーは以下の通りです。
## quicklisp.lispのload
```
* (load "~/bin/lisp/quicklisp.lisp")

  ==== quicklisp quickstart 2015-01-28 loaded ====

    To continue with installation, evaluate: (quicklisp-quickstart:install)

    For installation options, evaluate: (quicklisp-quickstart:help)

T
```

## quicklisp/setup.lispのload
```
* (load "~/quicklisp/setup.lisp")
WARNING: redefining QL-SETUP:QMERGE in DEFUN
WARNING: redefining QL-SETUP:QENOUGH in DEFUN
WARNING: redefining QL-SETUP::IMPLEMENTATION-SIGNATURE in DEFUN
WARNING: redefining QL-SETUP::DUMB-STRING-HASH in DEFUN
WARNING: redefining QL-SETUP::ASDF-FASL-PATHNAME in DEFUN
WARNING: redefining QL-SETUP::ENSURE-ASDF-LOADED in DEFUN
T
* (quicklisp-quickstart:install)

debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {1000518083}>:
  Quicklisp has already been installed. Load #P"/Users/js/quicklisp/setup.lisp" instead.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [LOAD-SETUP] Load #P"/Users/js/quicklisp/setup.lisp"
  1: [ABORT     ] Exit debugger, returning to top level.

(QUICKLISP-QUICKSTART:INSTALL :PATH NIL :PROXY NIL :CLIENT-URL NIL :CLIENT-VERSION NIL :DIST-URL NIL :DIST-VERSION NIL)
   source: (WITH-SIMPLE-RESTART (LOAD-SETUP "Load ~S" SETUP-FILE)
             (ERROR "Quicklisp has already been installed. Load ~S instead."
                    SETUP-FILE))
0] 1
```

「Quicklisp has already been installed」と出てますが
sbclを落としてから、起動し直して
quicklisp/setup.lispをloadしなくてもエラーが出ます。

### .sbclrcは下記の通りです。
```
(require 'asdf)

;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))
```

quicklisp.lispのloadがうまくいってるので
quicklispのインストールはできるんじゃないかと思ったのです
quickstart installがうまくいかない理由が分かりませんでした。

以上、ご教示のほどよろしくお願いします。


＜追記＞
roswellでインストールしたら
とにかくquicklispとcaveman2のインストールはできました。
その後簡単なウェブアプリを作ろうとして環境をいじってたら
なぜかJavaVMのエラーが出るようになってしまい
Mac上でのセットアップは断念しました。
Ubuntuにセットアップできるか試してみます。
Xcodeでnib(xib)のロードが劇遅だった話

##はじめに
昔は速かったXcode、数年前からnibのロードが劇的に遅くなった。
１ファイル１０秒とかかかる。
なんだそれー！！！

ありえねー
Appleふざけんなー

色々試行錯誤の結果、劇的に改善できたー:kissing_closed_eyes:

##やってみた

その方法は

~/Library/Caches/以下を全部削除。
一応Xcodeは再起動した。

のみ。他にも色々試したけど、多分これで決まり。
macOSをセーフブートすると、キャッシュも削除されるって話なので、多分それでもいける。

##まとめ

よかったー
作業効率が劇的に良くなった。
でもたまにxcodeは１０秒程度フリーズするのは直らず:sob:
まあたまになので、問題無い。

短か。
でもこれで全部。

##その後
その後、Xcode12.5.1で再度遅くなり、キャッシュを消してもダメだった。以下を行ったら速くなった。

・Xcode13入れてて使ってなくてパスが変わってるので、xcode-selectでパスを指定
・macOSを再起動。２ヶ月ほど再起動してなかった。

たまにはOS再起動が必要:yum:
Flaskチュートリアル#1 ~GETリクエスト編~

# Flaskとは
FlaskとはPythonのWebアプリケーションフレームワークです
Djangoと同じ働きをします。
しかし、マイクロフレームワークと呼ばれ最小限で実装されている点がDjangoと異なります。
Djangoのチュートリアルをしていていきなりデータベース接続だったりテンプレートやビューだったりとたくさんの要素が出てきてついて行けなかった人もいるんじゃないでしょうか？

# 実装のゴール
今回はビューもテンプレートも使わずJSON形式のレスポンスを返すAPIサーバを構築していきます。
[こちら](https://qiita.com/channel-techtok/items/6204705cffbf46e3a5d2)の記事が最終ゴールです

[こちら](https://youtu.be/xsiUT-HlmLI)で詳細に紹介しています


# 準備
flaskをインストールします。

```
pip install flask
```

これだけです。簡単！

# HelloWorld

まずはhelloworldからやってみましょう。app.pyを作って

```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    return 'hello world'
```

アプリのインスタンスを作って、routeを定義します。routeの定義の下には指定したURLにリクエストがきた場合の処理を書いていきます。
これは、ルートにGETリクエストがきたらhello worldが返却されるという意味の文です。

```python:app.py
if __name__ == '__main__':
    app.debug = True
    app.run()
```

さっきの文の下にメインの処理を書きます。debugモードをTrueにしておくことでプログラムが書き換えられた場合に自動で再起動してくれます。
ここまでできたら

```terminal:terminal
python app.py
```
で実行です。
ブラウザで`localhost:5000`にアクセスしたらhello worldが現れると思います。

# GETリクエスト
次にGETリクエストに対する処理を書いていきます。これは主にデータの取得に利用されます。今回はブログアプリを仮定していきます。なお、DB接続は#3でやるのでここではグローバル変数に記事一覧を定義します。記事内容は簡単にtitleとbodyだけとします。
それでは実装していきます。

```python:app.py
from flask import Flask, jsonify, request # <= jsonify, request追加

db_data = [
    {'title': 'タイトル1', 'body': '本文1'},
    {'title': 'タイトル2', 'body': '本文2'},
    {'title': 'タイトル3', 'body': '本文3'},
    {'title': 'タイトル4', 'body': '本文4'},
    {'title': 'タイトル5', 'body': '本文5'},
]

app.config['JSON_AS_ASCII'] = False 

@app.route('/posts', methods=['GET'])
def get_all_posts():
    limit = request.args['limit']
    return jsonify(db_data[:int(limit)])
```

これは`/posts`にGETリクエストが来た時に記事全件取得するという意味の文です。URLにクエリを渡してあげた場合にrequest.args['クエリ名']で対応するクエリの値を取得できます。
今回はlimitで取得する記事の個数を指定します。
レスポンスの形式はjson形式にしたいのでjsonifyという関数を使います。

完成したのでブラウザで確認してみましょう。
`localhost:5000/posts?limit=3`でアクセスしてみると、3件の記事が表示されるはずです。

# パラメータ指定
次はIDを指定して個別記事を取得していきます。
flaskのコードはこんな感じになります。

```python:app.py
@app.route('/post/<id>', methods=['GET'])
def get_post(id):
    return jsonify(db_data[int(id)])
```

flaskでは`/<パラメータ名>`でURLにパラメータを指定出来ます。指定したパラメータは関数で受け取ることが出来ます。今回はDBがわりに配列を使ってるので配列のインデックスを指定します。

ブラウザで`localhost:5000/post/0`でアクセスすると0番目の記事が取得できると思います。

# まとめ

いかがだったでしょうか？今回はFlaskで主にGETリクエストに対する処理を試してみました。[#2](https://qiita.com/channel-techtok/items/ea8e903fa755f78c57cb)ではPOST, PUT, DELETEリクエストに対する処理を実装しています。
UIViewControllerの全面にUITableViewを設置する場合、`UITableView`を基底viewにしてしまえばよさそう

## 概要
- `UIViewController`の全面に`UITableView`を設置する場合、`UITableView`を基底viewにしてしまえばよさそう
- `UIViewController`の`view`インスタンス（基底view）が`UITableView`のインスタンスになる

### メリット
- 管理するviewが一つ減る
- AutoLayoutの制約が不要になる

### デメリット
- `UITableView`以外にViewを追加したいようなケースでは使えない
  - その場合は`UIView`を基底viewにする必要がある

## スクリーンショット

![スクリーンショット 2020-02-14 16.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5497/241701fc-6ace-427f-4a08-2a79b06418c7.png)

### 手順
1. Storyboardに`UIViewController`を設置
2. `1.`で設置した`UIViewController`の基底ViewをStoryboard上で削除する
3. `UITableView`を選択しドラッグアンドドロップで基底Viewとして`UIViewController`に設置
![スクリーンショット 2020-02-14 16.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5497/40a717ea-d535-9b1a-f8a9-08d9479467d9.png)


### その他
- 基本的にどんなViewも基底viewに設定できる
    - `UITableViewCell`や`UINavigationItem`など、他のView上に設置されるようなViewも設定できる
Linux で, 複数 .a, .so のどこに C++ シンボルが定義されているか調べる 

## 背景

llvm や tensorflow など, たくさん .so, .a などがあるプロジェクトで, どのライブラリにどのシンボルが定義されているか調べたい(リンクで必要なライブラリをリストアップするなど用).

環境は Linux とする.

## 方法

こんな感じになりました.

```
$ find ./ -name "*.a" -print | xargs nm -A | c++filt | grep -e 'tensorflow::GraphDef::~GraphDef' | grep T
```

* find でまずはファイルを列挙
* xargs でそれぞれのファイルに対して nm をよぶ. このとき `-A` をつけておくとファイル名を表示してくれる
* c++filt でシンボルのデマングルを行う
* あとは grep し, シンボルが `T` になっているものを探す(`T` = 実体が定義されている)
 
## TODO

* [ ] シンボルが strip された .a or .so だと動かない. この場合readelf あたりでいけるか?
ファイルの読み込み

```py:1
s = """\
AAA
BBB
CCC
DDD
"""

with open('test.txt', 'w') as f:
    f.write(s)

with open('test.txt', 'r') as f:
    while True:
        line = f.readline()
        print(line, end="")
        
        if not line:
            break
```

```:1の実行結果
AAA
BBB
CCC
DDD
```

```py:
with open('test.txt', 'w') as f:
    f.write(s)
```
でtest.txtという中身が
AAA
BBB
CCC
DDD
であるテキストファイルが作成される。

そして、

```py:
with open('test.txt', 'r') as f:
```
でtest.txtの中身をfとして読み込み、

```py:
while True:
        line = f.readline()
        print(line, end="")

        if not line:
            break
```
で、
変数lineにtest.txtの中身を一行ずつ格納して出力。
lineの中身がなくなるなでループさせて、
なくなったらブレイク。


```py:2
s = """\
AAA
BBB
CCC
DDD
"""

with open('test.txt', 'w') as f:
    f.write(s)

with open('test.txt', 'r') as f:
    while True:
        chunk = 2
        line = f.read(chunk)
        print(line)
        
        if not line:
            break
```

```:2の実行結果
AA
A

BB
B

CC
C

DD
D
```

二文字ずつ出力させたもの。

A2つ
Aと改行
B2つ
Bと改行
C2つ
Cと改行
D2つ
Dと改行
Ansible メモ

ansible は全体を理解するまで、どこが起点になるのかがわかりにくい。

最も代表的な名前であろう `ansible` コマンドは、最も使わないコマンド。おそらく `ansible-playbook` が一番使うコマンド。`ansible` コマンドは task 一つを実行する。`ansible-playbook` は task を束ねた playbook を実行する。なんだかんだで `Makefile` の代わりに使うことが多くなった。

あまり使わないけれども、困ったときに立ち戻る場所としては、`ansible` コマンドは次の例から出発するのがよいと思う。task 一つの実行なので、コマンドライン引数で全て渡す。

```:/bin/bash
ansible -m debug -a "msg=hello" localhost
```

`ansible-playbook` コマンドは次の例から。こちらは YAML で playbook ファイルを書いて実行します。

```:playbook.yml
---
- hosts: localhost
  tasks:
  - debug:
      msg: hello
```

上の起点から手を広げていくと、感覚がつかみやすい

- サーバ内でプロビジョニングとして実行したい場合
  - localhost の部分を変える
  - host 名か group 名
  - host 名や group 名の定義は別途 inventory で指定する
  - ざっくりやりたい場合は特殊なグループ名 `all` を使う
- 別の task を実行したい場合
  - debug module の代わりに別の module を指定する
  - 引数は module ごとに異なる
  - あるいは task をグループ化した role を使う
  - tasks と roles は両方指定できるが、実行順に制限があるので注意
  - 困ったら tasks を基本として、import_role で role を取り込むとよい

`ansible-galxy` は role を複数分割して使い始めると便利になってくる。

## その他雑多な気が付いたこと

when, tag, connection, become など、いくつかの task でまとめて条件を切り替えたい場合は、block を使うと少し整理できる。

group に host を定義することはできるが、host に group を定義することはできない。
`/etc/group` と同じといえば同じなので諦める。諦めきれない場合は inventory script を自作すると良い。
RSpecでFactoryBotから複数のインスタンスをまとめて作成する【create_listを使用】

RSpecテストを書いているときに、複数のインスタンスをまとめて作れる便利メソッド`create_list`をご紹介します。

---

例えば下記のように`note`のファクトリが定義されているとします。

```factory/notes.rb
FactoryBot.define do
  factory :note do
    title { 'sample-note' }
    description { 'sample-description' }
  end
end
```

テストで`note`インスタンスを5つ作りたいと思ったとき、下記のように1つずつ作るのは大変です。

```spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  let(:note1) { create(:note) }
  let(:note2) { create(:note) }
  let(:note3) { create(:note) }
  let(:note4) { create(:note) }
  let(:note5) { create(:note) }
  ...
end
```

ここで登場するのが`create_list`です。
これを使えば、まとめてnoteインスタンスを作成することが可能です。

```spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  notes = create_list(:note, 5)
  ...
end
```

第1引数に元になるファクトリ、第2引数に作成する数を指定します。
（`notes = `の部分は無くても可）

ちなみに属性の一部を上書きして作成することも可能です（下記参照）。

```spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  notes = create_list(:note, 5, title: 'Hello, World')
  ...
end
```

---

以上です。
Databricks上でPysparkデータフレームからRデータフレームに変換する

#はじめに
Databricks上で、Pyspark データフレーム->SparkRデータフレーム->Rデータフレーム　へ変換する方法のメモ


#コード

##Pyspark データフレーム作成
``` :notebook
%python
# データフレーム作成
spark_df = spark.createDataFrame([('a01', 150),('a02', 160)], ["item", "price"])
print(type(spark_df))
spark_df.show()

# Tempviewを作成
spark_df.createOrReplaceTempView("tempview_sparkr")

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d41c235e-94b0-4ba2-97ab-526f235b67a7.png)

##SparkR データフレーム作成

``` :notebook

%r
# テーブルからSparkRデータフレームを作成
library(SparkR)
sparkr_df <- sql("select * from tempview_sparkr")
print(class(sparkr_df))
head(sparkr_df)

```
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/27215678-556c-0232-fa57-92b6760e2a1b.png)

##R データフレーム作成
 
``` :notebook



%r
# SparkRデータフレームから Rデータフレームに変換
library(SparkR)

r_df <- collect(sparkr_df)

print(class(r_df))

head(r_df)

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/440b96ad-8407-8009-6ccb-1492a7b6174e.png)

# 各種ダウンロードリンク
## Databricksに直接インポートしたい方はこちら
[GitHub Pagesに飛びます](https://ryoma-nagata.github.io/MyDatabricks/samples/html/transform_r_df.html)
## dbcをダウンロードしたい方はこちら
[dbcファイルがダウンロードされます](https://github.com/ryoma-nagata/MyDatabricks/blob/master/samples/dbc/transform_r_df.dbc?raw=true)
Middlemanでコマンド 打っていたらiTerm2が止まった

`$ bundle exec middleman server
== The Middleman is loading `

ここまで来て、止まりました。5分くらいこのまんま。
他はサクサク動いていたのに。

Middleman関連ではない時にコマンドを使っていたときもこんなことがあったので、おそらく私の使っているパソコンが遅いからだと思います。

早くパソコン新しいのに買えましょう・・・・・。高いw
mPDFでfloat:leftを使って画像を並べると高さがずれてしまう問題を解決する

PHPと書いたけどHTMLのことしか書いてません。すみません。

mPDFで下記のHTMLをPDF化すると二段目以降が画像1つごとに高さがズレてしまう問題が発生する。

```html
<head>
<style type="text/css">
	@page {
	  margin: 0;
	}
	body {
	  margin: 0;
	}
	div.imagebox {
	   width: 46mm;
	   height:46mm;
	   float: left;
	   margin-left: 2mm;
	   margin-right: 2mm;
	   margin-top: 1mm;
	   margin-bottom: 1mm;
	}
	div.wrapper {
		width:100%;
		margin-top:4mm;
		margin-left:6mm;
	}
	img {
	   width: 46mm;
	   height:46mm;			
	}
</style>
</head>
<body>
<div class="wrapper">
	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>

	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>

	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>
</div>

</body>
```

どうやら各画像を囲っているdivタグごとにmarginの指定をするのが影響するらしいので、下記のように書き換える

```html
<head>
<style type="text/css">
	@page {
	  margin: 0;
	}
	body {
	  margin: 0;
	}
        div.image-col {
           margin-top:1mm;
           margin-bottom:1mm;
        }
	div.imagebox {
	   float: left;
	   width: 46mm;
	   height:46mm;
	   margin-left: 2mm;
	   margin-right: 2mm;
	}
	div.wrapper {
		width:100%;
	}
	img {
	   width: 46mm;
	   height:46mm;			
	}
</style>
</head>
<body>
<div class="wrapper">
    <div class="image-col">
	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>
    </div>
    <div class="image-col">
	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>
    </div>
    <div class="image-col">
	<div class="imagebox">
	   <img src="images/photo1.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo2.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo3.jpg">
	</div>
	<div class="imagebox">
	   <img src="images/photo4.jpg">
	</div>
    </div>
</div>

</body>
```

これで段差ができてしまう問題が解決できた。
最適化手法って？パラメータ更新との関係

「最適化手法を用いてパラメータを更新する」
**最適化手法とはパラメータを更新するための方法のこと**
#最適化手法とは？
深層学習においてニューラルネットワークを学習させるには，損失関数の値をできるだけ小さくするようなパラメータ(重み，バイアス)を求める必要があります．**損失関数の値を小さくする最適なパラメータを求める問題を解くこと**を最適化と言います．そして，いくつか存在しているその問題の解き方，公式のようなものを最適化手法と言います．高校の数学の授業で勉強した二次関数の最小値を求める方法の発展ver.みたいなものです．損失関数は，高校数学のようにxとyの二つのパラメータからなる関数ではなく，もっと多くのパラメータからなる関数なので，簡単に最適解を求めることはできません．そこで，最適化手法を使って，できるだけ最適な解を求めよう！ってなるわけです．

##勾配に着目して最適解を求める
y = x^2のような二次関数におけるパラメータxの勾配とは，傾きのことです．傾きはyをxで微分したy' = 2xとなり，x = 0の時は傾きが0, x = 1の時は傾きが2のようになりますよね．傾きは，任意の点xにおいて，xを少しだけ大きくしたら，yがどれだけ変化するのかを表しています．深層学習で考えるべきは最小値です．つまり損失関数がy = x^2だとすると，傾きが正ならxを少し小さく，傾きが負ならxを少し大きくすれば，yの値が小さくなります．このようにxの値を少しずつ変化させながら最適な解を見つけていきます．損失関数が複雑でパラメータすうが膨大になっても基本的な考え方は同じです．ただし，実際は最適解ではなく，局所最適解(極小値)を求めてしまう問題などもあるため難しい．![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391974/f851c128-baa4-ac4e-52a8-69c932d714f7.png)
損失関数は推測したパラメータの値の精度を示している．
つまり，学習すべきパラメータは推測後にはある特定の値をもっている．
例えば，損失関数がy = x^2とすると，一回目の推測でパラメータxはx = 4という特定の値になったとする．損失関数におけるx = 4のときの勾配を求め，損失関数を小さくする方向へ少しｘを進めることがパラメータ更新である．パラメータを何度も更新することでx = 0という最適解へ近づくことができる．

#最適化手法の種類

+ 最急降下法(勾配降下法)
    + バッチ学習(全データまとめて学習)
+ 確率的勾配降下法(SGD: stochastic gradient descent)
    + ミニバッチ学習(ミニバッチごとに学習)
        + 確率的に無作為に選び出したデータ(ミニバッチ)に対して勾配降下法を適用
+ Momentum
+ Adam
+ AdaGrad
　

など
ホバーすると押下できるボタン

## 前置き
昔 https://codepen.io/parcon/pen/obEReY/
これの一番右のボタンを作ってくれと言われたのですがテキストをHTMLではなく:beforeのcontentに入れないといけないのがめんどくさかったのでCSSをいじらないでいいものを作りました。


## 簡単バージョン
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sphenisc" data-slug-hash="OJVMzmM" 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="OJVMzmM">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/OJVMzmM">
  OJVMzmM</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
JavaアプリケーションのMBeanの情報一覧を取得する

Scala 2.12

```scala
import java.lang.management.{ManagementFactory, PlatformManagedObject}

import javax.management.{MBeanInfo, ObjectName}

import scala.collection.JavaConverters._

val mbeanInterfaces: Seq[Class[_ <: PlatformManagedObject]] = ManagementFactory.getPlatformManagementInterfaces.asScala.toSeq
val mbeanObjects: Seq[_ <: PlatformManagedObject] = mbeanInterfaces.flatMap(ManagementFactory.getPlatformMXBeans(_).asScala.toSeq)
val mbeanObjectNames: Seq[ObjectName] = mbeanObjects.map(_.getObjectName)
val mbeanInfos: Seq[MBeanInfo] = mbeanObjectNames.map(ManagementFactory.getPlatformMBeanServer.getMBeanInfo(_))
```

`MBeanInfo`と`ObjectName`をつかって`MBeanServer`(`ManagementFactory.getPlatformMBeanServer`)経由で情報を取得する。
php7.4からimplode関数の引数順序の推奨について

``implode()``は配列の要素を文字列により連結する関数ですが、
explode()とは違ってimplode()は引数のarrayと連結文字のstringの指定順が逆でも動作していました。

それがphp7.4から非推奨になります。
php7.4で``E_DEPRECATED``となり、php8で削除される予定です。
なので現状そのようなコードがあったら、あまり使わない方が好ましいでしょう。

> implode()は、歴史的な理由により、引数をどちら の順番でも受けつけることが可能です。

https://www.php.net/manual/ja/function.implode.php

いっつもこの**歴史的な理由**というのが気になって、どっちだったかごっちゃになるんですよねー。。
AzureのWebAppsでAzure Blob StorageのjsonをAPI的に返却

WebAppsでBlobストレージのデータにアクセスしてデータを返すメモ

###ストレージへのアクセスをTASK化

````C#
static async Task<string> GetJsonData()
{
    //storageAccountの作成（接続情報の定義）
    var accountName = "ストレージのアカウント名";
    var accessKey = "accessKey文字列";
    var credential = new StorageCredentials(accountName, accessKey);
    var storageAccount = new CloudStorageAccount(credential, true);
    //blob
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    //container
    CloudBlobContainer container = blobClient.GetContainerReference("demo");
    //data
    CloudBlockBlob blockBlob_download = container.GetBlockBlobReference("demo.json");
    string text;
    using (var memoryStream = new MemoryStream())
    {
        await blockBlob_download.DownloadToStreamAsync(memoryStream);
        text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
    }
    return text;
}
```

###HttpGetの処理

```C#
[HttpGet]
public ActionResult<string> Get()
{
    var task = GetJsonData();
    var result = task.Result;
    return result;
}
```


###参考サイト

Azure Storage (blob)を使う
https://qiita.com/zaburo/items/ed2f5ee1224ab40bd7b1

Azure Blob Storage と Visual Studio 接続済みサービスの概要 (ASP.NET)
https://github.com/MicrosoftDocs/azure-docs.ja-jp/blob/master/articles/visual-studio/vs-storage-aspnet-getting-started-blobs.md

ASP.NET で Azure Blob Storage を操作してみる
https://qiita.com/komiyasa/items/f69dc1ab773bfc3115bd
[メモ]数値を1から順番に、ただしある数値で割り切れる時のみ特定の文字列を出力するプログラム(Kotlin)

※2020/2/17 追記しました

以下のような課題に触れる機会があったので、備忘録として解決方法を残しておきます。

```
課題： 
指定した数値まで1から順番に出力するプログラムを以下の条件を守った上で作成せよ。

① 3で割り切れる数字の時は文字列「A」を出力せよ
② 5で割り切れる数字の時は文字列「B」を出力せよ
③ 3と5で割り切れる数字の時は文字列「AB」を出力せよ
```

### 咄嗟に作成したプログラム

```kotlin

fun outNum(maxNum: Int) {
    var result = ""
    for(i in 1..maxNum) {
        if(i % 3 == 0 && i % 5 != 0) {
            result += "A\n"
        } else if(i % 5 == 0 && i % 3 != 0) {
            result += "B\n"
        } else if(i % 3 == 0 && i % 5 == 0) {
            result += "AB\n"
        } else {
            result += i
        }
    }
    println(result)
}

```

#### う〜ん、これはひどい！

我ながらひどい。
このままでは

**「7で割り切れる時と11で割り切れる時も別の文字列を出力するよう改修せよ」**

とか言われた時に目も当てられないif文になってしまいます。


### それを踏まえた上で冷静に作成し直したプログラム

```kotlin

fun outNum(maxNum: Int) {
    var result = ""
    for(i in 1..maxNum) {
        if(getDisivleNumber(i).isEmpty()) {
            result += i
        } else {
            getDisivleNumber(i).forEach { disivle ->
               result += when(disivle) {
                    3 -> "A"
                    5 -> "B"
                    else -> ""
                }
            }
        }
        result += "\n"
    }
    
    println(result)
}

/**
* 指定した数値の約数をリスト化して返す
*/
fun getDisivleNumber(num: Int): MutableList<Int> {    
    val list = listOf(3,5)
    val arrays:MutableList<Int> = mutableListOf()
    list.forEach { i ->
        if(num % i == 0) {
            arrays.add(i)
        }
    }
    return arrays
}
```

こんな感じです。
これなら後々文字列出力する約数が追加された時でも楽に対応できます。

### 2020/2/17 追記

頂いたコメントから、上記のコードではまだ問題があることがわかりました。

**例：約数をgetDisivleNumber関数とoutNum関数の中でそれぞれ指定しているので、追加や修正があった場合、両方を修正しないとエラーになる 等**

ほとんど頂いたコメントのソースコードの転載になりますが、問題を修正したプログラムを以下に記載いたします。

```kotlin

fun main(args: Array<String>) {
    printlnDivisorNum(100)
}

fun printlnDivisorNum(maxCount: Int) {
    val divisorList = listOf(
        3 to "A",
        5 to "B",
        7 to "C",
        11 to "D"
    )
    // 拡張関数を使い文字列を生成し、順番に出力する
    for(num in 1..maxCount) {
        println(num.toDivisorText(divisorList))
    }
}

/**
* Intの拡張関数
* 引数の数値リストに自身を割り切れる数値が含まれている場合は
* それに対応する文字列を、（※複数含まれる場合は文字列を連結する）
* 含まれない場合は自身を文字列として返す
*/
fun Int.toDivisorText(divisorList: List<Pair<Int, String>>): String = 
    buildString {
        divisorList.forEach { (num, text) ->
            if(this@toDivisorText % num == 0) {
                append(text)
            }
        }
    }.takeIf { it.isNotEmpty() }
        ?: toString()
```
※約数に7と11を追加しています

上記コードの出力例

```
1
2
A
4
B
A
C
8
A
B
D
A
13
C
AB
16
17
A
19
B
AC
D
23
A
B
26
A
C
29
AB
31
32
AD
34
BC
A
37
38
A
B
41
AC
43
D
AB
46
47
A
C
B
A
52
53
A
BD
C
A
58
59
AB
61
62
AC
64
B
AD
67
68
A
BC
71
A
73
74
AB
76
CD
A
79
B
A
82
83
AC
B
86
A
D
89
AB
C
92
A
94
B
A
97
C
AD
B
```

拡張関数やbuildString, takeIfの使い方などとても勉強になりました。
ありがとうございます。
Vue v2.6.11のバグを発見

Vueのバグを発見しました。

PR: https://github.com/vuejs/vue/pull/11107

## 事象

async componentでv-if="false"を使うと、vueのvdom処理でエラーになる。

詳細はPRのテストコード参照。

## 原因

vdomでは、async componentはasyncPlaceholder(コメントノード + 補助データ)として扱われる。
v-if="false"はコメントノードとして扱われる (参考: https://github.com/vuejs/vue/issues/5117 )。

patch.jsのsameVNodeでは、async componentとコメントノードが同じと判定されてしまう(これが誤り)。

sameVNodeで同じと判定されると、patchVNode処理に入り、その中のasyncFactory.resolvedで、asyncFactoryがundefinedでエラーになる。

## 修正

sameVNodeでasync componentとコメントノードが同じと判定されないようにする。

## メモ

data-server-renderedはルートにのみつくらしい。
hydrationするときに取り除くので、hydrationは一回のみ実行される。
hydrationのときにロードできないasync componentはasyncPlaceholderにされる(つまり、async component内部はhydrationの対象外になる)。

コードを見た感じ、hydrationのときにすでにresolveされているasync componentは通常のコンポーネントとほぼ同様に処理されるみたい。

## 感想

nuxtでパフォチューをやっているときに遭遇した。

セキュリティ懸念(誤ってキャッシュされるとか、リクエスト間で情報が漏れるとか)から、SSRでは認証が必要なデータは取得しないようにしている。
非ログインユーザーはSSRで完結するのでクライアント側でデータ取得しなくて良い。
ログインユーザーはクライアント側でデータ取得するが、今まではmount後にリクエストを開始していて遅かったので、mount前にリクエストを開始するようにした。
それでこのバグが発生。

最初、hydrationが行われる前にリクエストが返ってきて、SSRとクライアントのdom不整合かなと思ったが、データ更新を強制的にmount後や、mount後のnextTick後にしても発生する。

vue内部のresolvedでエラーになっていることがわかったので、vueのコードを検索したらpatch.jsを発見。

async componentがresolveされる前に、v-if="false"でvdom更新されるとエラーになることを発見。

結局、パフォチューで速くなったせいで、async componentのロードとデータ更新のタイミングが逆転してバグが発生したみたい。

自分のコードが原因だと思って1日くらいかかった。
これでvueのコントリビューターの肩書を得た。
【Rails】wicked pdfの導入方法、ハマったところと対応

##導入方法
```rb:Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
```
```terminal
$ bundle install
$ rails g wicked_pdf
```
```config/initializers/wicked_pdf.rb
WickedPdf.config = {
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
```
ここで一度サーバーを再起動

```pdfs_controller.rb
def bill
  respond_to do |format|
    format.pdf do
      render pdf: '請求書', # 出力されるpdfのファイル名
             layout: 'application', # レイアウトファイル
             encording: 'UTF-8',
             show_as_html: params[:debug].present? # デバッグ用。url末尾に`debug=1`をつけるとHTMLで表示できる
    end
  end
end
```
```erb:views/layouts/application.pdf.erb
<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8' />
  </head>
  <body>
    <div id="content">
      <%= yield %>
    </div>
  </body>
</html>
```
```erb:views/pdfs/bill.pdf.erb
<p>請求書</p>

<style>
p { font-size: 20px; }
</style>
```
```routes.rb
get 'pdf/bill' #pdf/bill.pdfにアクセスすると動く
```
##ハマったところと対応
###フォントサイズが全部小さい
普段のノリでフォントサイズを指定すると、全部小さく表示されます。
フォントサイズを大きい数値に変更して対応。

###本番環境のみ、AssetPilelineのコンパイルエラー
レイアウト内のCSS、JS、mysite.jpg読み込み部分を全て削除。
CSSは全部インラインで記述。（別プロジェクトを作り、Sassで書き、コンパイルしたものをコピペする）

### Docker環境で日本語が表示されない
`Dockerfile`を編集して、日本語フォントをインストール

```Dockerfile:Dockerfile
RUN apt-get install -y fonts-ipafont-mincho
```

###本番環境で日本語が表示されない
本番のサーバーに日本語フォントをインストールして対応

```terminal
$ yum install -y ipa-gothic-fonts
$ yum install -y ipa-mincho-fonts
```

##その他注意点
- flexboxが使えない
- 画像、CSS、JS等のパスの指定方法が特殊
  
|  | 通常 | wicked_pdf |
|:--|:--|:--|
| cssファイル | stylesheet_link_tag | wicked_pdf_stylesheet_link_tag |
| jsファイル | javascript_include_tag | wicked_pdf_javascript_include_tag |
| imageファイル | image_tag | wicked_pdf_image_tag |

##参考
- [Rails で Wicked PDF 使って PDF を出力してみた ( 日本語もバッチリ ) - Qiita](https://qiita.com/yutackall/items/a41d2f70cbeca2fe8a0a#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AF%BE%E5%BF%9C)
- [railsでwicked_pdfの使い方 - Qiita](https://qiita.com/hogehoge1234/items/f9775573458304eedaf5)
- [wicked pdfで生成したpdfを自動ダウンロード - Qiita](https://qiita.com/kon_yu/items/62eceb2d36fbb51d4891)
AWSCLI Version2 実行環境

# AWS CLI V2 リリース
AWSCLIのV2がリリースされていたので試してみました。

# 環境構築
Dockerコンテナを作成して、AWS CLI V2が使用できる環境にしています。

## Dockerfile作成
まずは、Dockerfile作成します。

```Dockerfile
# OS Debian GNU/Linux 10 (buster)
FROM python:latest

# aws help を使用できるようにする為
RUN apt-get update && apt-get install -y \
    less \
    groff-base

# awscli v2 インストール
RUN python -m pip install git+https://github.com/boto/botocore.git@v2
RUN python -m pip install git+https://github.com/aws/aws-cli.git@v2

# jq インストール
RUN cd /bin && wget http://stedolan.github.io/jq/download/linux64/jq && chmod 755 jq

ENV PATH $PATH:/root/.local/bin
```

## 起動シェル作成
次は、毎度dockerコマンドを打つのも面倒なので、シェルを作成します。
:warning:このファイルはクレデンシャル情報を直接、記述しているので間違ってもgitとかにはプッシュいないようにしてください。

```run.sh:
#!/bin/sh
docker build -t aws-cli-v2 .

AWS_ACCESS_KEY_ID="[自分のアクセスキー]"
AWS_SECRET_ACCESS_KEY="[自分のシークレットキー]"
AWS_DEFAULT_REGION="ap-northeast-1"

docker run -it \
    -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
    -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
    -e AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION \
    -v $(pwd):/data \
    aws-cli-v2 /bin/bash
```

## 実行コマンド
あとはシェルを叩き、数秒待てばawscliV2の環境が完成すると思います。

```bash:
$ cd [任意のディレクトリ]
```

```bash:
$ sh run.sh
```

# AWS CLI V2で追加機能
#### わかる範囲の追加機能
- クレデンシャルのインポート
- リソース名の補完
- 自動プロンプト
- ウィザード
- YAML 形式の出力

適宜、更新しようかなと思います。
今のところ、この人の記事見れば、なんとなくわかります。
- [[アップデート] リソース名の補完など強力な機能追加！AWS CLI v2 が GA されました！](https://dev.classmethod.jp/cloud/aws/aws-cli-v2-is-now-generally-available/)
- [AWS公式はこちら](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html)
PL/SQLを触らないといけなくなったので基本文法まとめてみた

# 1. 基本となる３つのブロック
```sql
/* 基本となる３つのブロック */
DECLARE
  -- 宣言部
  -- 変数・定数・型・カーソルなどを定義します
BEGIN
  -- 処理部
  -- 処理を記述します
EXCEPTION
  -- 例外処理部
  -- BEGINの中で例外が発生した場合の例外処理を記述します
END;
```
## 宣言部`DECLARE`
宣言部では、変数・定数・型・カーソルなどの定義を行います。
キーワード`DECLARE`を使用して宣言部を記述します。
## 処理部`BEGIN`
この中に処理を記述します。
キーワード`BEGIN`を使用して処理部を記述します。
この処理部内にて**カーソルを１レコードずつLOOPさせ処理**していく形になります。
## 例外処理部`EXCEPTION`
処理部で例外が発生した場合の例外処理を記述します。
キーワード`EXCEPTION`を使用して例外処理部を記述します。
## ブロックの終わり`END`
ブロックの終わりには、キーワード`END`を使用します。
# 2. よくある処理の流れ
PL/SQLは、バッチ処理にて利用される事が多いと思いますが、
その際の処理の流れは、基本的には以下のパターンになるかと思います。

1. 必要な情報を元となるテーブル群から取得し、カーソルを作成。
2. 取得したカーソルを1レコードずつ処理しデータを加工。
3. 加工したレコードを任意の形式で出力（任意のテーブルへINSERT･UPDATEするなど）
4. カーソルの全てのレコードに対して2･3を繰り返す。

私が触る必要のあったバッチも上記の様に、
元となるテーブル群をJOINした結果からカーソルを作成して1レコードずつ加工した後、出力用テーブルへINSERTする形式となっていました。

# ＃おまけ
## PL/SQLは何の略？
PL/SQLの「PL」は「Procedural Language」のことらしい。
SQLを手続き型言語（Procedural Language）に拡張した言語であることからそのように命名されたとのこと。
## ベースとなった言語
PL/SQLは、Adaという言語をベースとして作られたらしい。
ちなみに、Adaの読み方は「エイダ」。
https://ja.m.wikipedia.org/wiki/Ada

おわり
pyreboxの作法 その2

#概要

pyreboxの作法、調べて見た。
pluginを作って見た。

#サンプルコード

リムーブされたプロセスの表示。

```
from __future__ import print_function
from ipython_shell import start_shell
from api import CallbackManager
from api import BP

cm = None
pyrebox_print = None

def remove_proc(params):
	pid = params["pid"] 
	pgd = params["pgd"]
	name = params["name"]
	pyrebox_print("Process removed! pid: %x, pgd: %x, name: %s" % (pid, pgd, name))

def clean():
	global cm
	print("[*]	Cleaning module")
	cm.clean()
	print("[*]	Cleaned module")

def initialize_callbacks(module_hdl, printer):
	global cm
	global pyrebox_print
	pyrebox_print = printer
	pyrebox_print("[*]	Initializing callbacks")
	cm = CallbackManager(module_hdl, new_style = True)
	cm.add_callback(CallbackManager.REMOVEPROC_CB, remove_proc, name="vmi_remove_proc")
	pyrebox_print("[*]	Initialized callbacks")

if __name__ == "__main__":
	print("[*] Loading python module %s" % (__file__))


```

以上。
【Unity】standardAssetsの車のタグ付けについて(ど忘れすると沼にハマる系)

Carの親に『Player』とかタグ付けしても、
『Player』に対するオントリガーエンターなどは反応しない。
子オブジェクトのコライダー３つに対してタグ付けしたほうが良い。
<img width="537" alt="e01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/c2028ab9-8bb1-da82-d2b1-025d40445254.png">
<img width="235" alt="e02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/b929fe19-bfa8-987f-6e34-a12afe4d06ef.png">
<img width="247" alt="e03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/276152ce-9a25-96dd-7176-8d94f0ece51a.png">
【Python】任意の座標点が多角形の内側か外側か判定

#はじめに
仕事で任意の座標点が多角形の内側か外側かどちらに存在するか判定するアルゴリズムを作る必要があったので、記事にします。
今回の場合、内側にあれば、OK、外側にあればNGというような情報を知らせることに用います。

#考え方
座標点が内側 or 外側かを判定する方法はいくつかありますが、今回はベクトルの外積を用います。

##例
以下の図のように、多角形があるとします。
今回は、九角形を例として、青線で囲っています。
赤い点は任意の点として、この点が多角形の内側 or 外側どちらに存在するかを判定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512194/22e6b297-16d6-5b16-7e38-5bd8c1717894.png)

##実装
とりあえず、この多角形のコードを示します。

```python


import numpy as np
import copy
import pandas as pd
import matplotlib.pyplot as plt


#多角形の端の座標点を決める
(x,y)>(0,0)
c1 =np.array([2,1])
c2 =np.array([1,3])
c3 =np.array([1,7])
c4 =np.array([3,6])
c5 =np.array([4,8])
c6 =np.array([6,9])
c7 =np.array([9,6])
c8 =np.array([8,3])
c9 =np.array([6,1])

#求めたい任意座標点の入力
#(X,Y)>(0,0)
point =np.array([6,3])

#多角形と任意座標の可視化
x = []
y = []
for i in range(1,10):
    exec('x_num = c{}[0]'.format(i))
    x.append(x_num)
    exec('y_num = c{}[1]'.format(i))
    y.append(y_num)
x.append(c1[0])
y.append(c1[1])
plt.plot(x, y, label="test")
plt.plot(point[0], point[1],marker="o",linestyle='None',markersize=6, color='red')
plt.show()


#全てのベクトル計算
for i in range(1,10):
    if i < 9:
        kakomi = 'vector_c{}c{} = (c{}-c{})'.format(i,i+1,i+1,i)
        exec(kakomi)
        uchigawa = 'vector_c{}point = (point-c{})'.format(i,i)
        exec(uchigawa)
    if i == 9:
        kakomi2 = 'vector_c{}c1 = (c1-c{})'.format(i,i)
        exec(kakomi2)
        uchigawa2 = 'vector_c{}point = (point-c{})'.format(i,i)
        exec(uchigawa2)
        
#全ての外積計算
for i in range(1,10):
    if i < 9:
        get = 'outer_product_c{}c{}_point = np.cross(vector_c{}c{}, vector_c{}point)'.format(i,i+1,i,i+1,i)
        exec(get)
    if i == 9:
        get2 = 'outer_product_c{}c1_point = np.cross(vector_c{}c1, vector_c{}point)'.format(i,i,i)
        exec(get2)

#外積結果をリストに内包する
        list =[]
for i in range(1,10):
    if i <9:
        s = eval('outer_product_c{}c{}_point'.format(i,i+1))
        list.append(s)
    if i == 9:
        t = eval('outer_product_c{}c1_point'.format(i))
        list.append(t)
print(list)

#リスト内に1つでも正数があれば、Trueで外側
#なければ、Falseで内側
if any((x >= 0 for x in list)) == True:
    print('座標点は多角形の外側')
else:
    print('座標点は多角形の内側')
```

コードはかなり汚いのですが、悪しからず。
やっていることとして、
①各辺と任意座標点のベクトルを計算する
（今回の場合、辺の数は、9本なので、9つの辺のベクトルを計算します。）
②また各頂点から任意座標点へのベクトルも計算する
③それらのベクトルのそれぞれの外積を求める
④求めた外積の値をlistに内包し、確認する。

#総括
ひとまず、内側 or 外側の判断はできたのでよしとしました。
今後は、3次元に拡張して内外判定を行います。
少しでも皆様の参考になれば幸いです。


#参考
下記サイトにおける図2を参考に、ベクトル計算を行いました。
https://gihyo.jp/dev/serial/01/as3/0055
Haskellで外部モジュールを使いたいとき（モジュールimportとパッケージinstall）

# モジュール名とパッケージ名
Haskellにおいて外部モジュールを使用するには`import`でモジュール名を宣言する。

``` import.hs
import System.Random
```
`Data.Char`のような代表的な幾つかのモジュールは、環境構築時にあらかじめローカル環境に導入されているので`import`するだけで、すぐ使えるようになる。
しかし、ローカル環境に導入されていないパッケージを使用するには`import`の前に`install`が必要になる。

このとき`install`コマンドに指定しなければならないのは、**モジュール名ではなくパッケージ名**である。

たとえば、乱数を扱うモジュールの名称は`System.Random`であるが、パッケージの名称は`random`なので、`install`時は`random`を指定する必要がある。

``` install.hs
> :t random
<interactive>:1:1: error: Variable not in scope: random
-- random関数を使いたい。が、そんなものはないと言われる

> :m System.Random
<no location info>: error:
    Could not find module ‘System.Random’
    It is not a module in the current program, or in any known package.

-- random関数の含まれるSystem.Randomモジュールをimportしようとしたが知らないと言われてしまう

> stack install random
random> configure
random> Configuring random-1.1...
random> build
random> Building random-1.1...
random> Preprocessing library random-1.1...
random> [1 of 1] Compiling System.Random    ( System\Random.hs, .stack-work\dist\ca59d0ab\build\System\Random.o )
random>
random> C:\Users\xx\AppData\Local\Temp\stack3120\random-1.1\System\Random.hs:43:1: warning: [-Wtabs]
random>     Tab character found here, and in 74 further locations.
random>     Please use spaces instead.
random> copy/register
random> Installing library in
random> C:\sr\snapshots\47914953\lib\x86_64-windows-ghc-8.0.2\random-1.1-9tceXaeYIMZ4JrKq20Egog
random> Registering random-1.1...
-- パッケージ名randomを指定してinstall

> :m System.Random
> :t random
random :: (RandomGen g, Random a) => g -> (a, g)
-- random関数が使えるようになった
```
Haskellを始めてから、しばらくコレが分からなくて苦労した。（何てったって、これが分からないと乱数すら使えない）

モジュールとパッケージの関係は、こんな感じで確認できる。

# 使いたい関数名等からパッケージ名を調べる
今使いたい乱数を生成する関数`random`をHoogleなどでサーチして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60888/4f9e66c9-e741-2b94-37ff-f33a87276ab9.png)

モジュールのドキュメントに遷移する。今回は`System.Random`である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60888/9cd8f3df-cf2e-68b7-5aac-dc2c681f374b.png)

その上部にある囲みの部分がパッケージ名。
したがって`install`するときには`cabal install random`なり`stack install random`とする。

# パッケージ名からモジュール名を調べる
逆にパッケージ名のドキュメントからモジュール名を確認するには、同様にパッケージ名からパッケージのドキュメントに遷移して![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60888/0e0255f1-d3b2-d7ba-b6da-d88e039b1b7d.png)

`Modules`を確認する。
AWS CDKで既存VPCと既存Subnetを名指しで使う

今日も元気にビルドを失敗していくスタイル。

前回、「[AWS CDKでVPC作ろうとしたら作れなかったとき](https://qiita.com/mira_cocoa/items/52adf98237af49ee604c)」ではSubnetがうまく作れなくて泣いてたじゃないですか。
今度は既存のVPCと既存のSubnetを使いたかったんですよ。本当にそれだけなんです、CloudForamtionなら三秒で出来るじゃないですか？？？？？

### やりたいこと

既存のVPCと既存のSubnetを使いたい。


### CloudForamtionで書くとき

例えばALBとセキュリティグループの設定に使う時とか、こういう感じでできるじゃないですか。
なんかこう、VpcIdとSubnetsにはそれぞれのIDをそのまま書けばさらっと設定してくれるじゃないですか。

``` YAML
Resources:
  SecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: !Sub ${AWS::StackName}-alb
      SecurityGroupIngress:
        - CidrIp: "0.0.0.0/0"
          IpProtocol: "TCP"
          FromPort: 80
          ToPort: 80
      VpcId: !Ref VpcId

  LoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref SecurityGroup
```

### CDKで既存のVPCをSubnetを指定しつつ取り込む

~~真剣に一週間くらい悩んでしまったんですけど、結論だけ書くとこうです。~~

__～2020/02/21 追記～__
SubnetをID指定で取り込む方法を知ったので追記しました。

<details><summary>このセクションは過去の未熟な私の導き出した不完全な解答。</summary>
<div>
`from_vpc_attributes`を使って既存のVPCを取り込みます。このときSubnetを指定しておくと、指定したSubnetだけ取り込んでくれます。
既存VPCだけ取り込むなら`fromLookup`でもいいんですが、Subnetを指定する方法が`subnetGroupNameTag`しかなさげな感じ。（ID指定できるやろって情報あれば教えてください）
今回はSubnetもIDで指定したいのでこんな感じになります。

``` python
from aws_cdk import (
    aws_ec2 as ec2,
)

VPCID='vpc-xxxxxxxx'
vpc=ec2.Vpc.from_vpc_attributes(
    self, f"vpc{id}",
    vpc_id=VPCID,
    availability_zones=['ap-northeast-1b', 'ap-northeast-1c'],
    publicSubnetIds=['subnet-xxxxxxxx', 'subnet-xxxxxxxx'],
    private_subnet_ids=['subnet-xxxxxxxx', 'subnet-xxxxxxxx']
)
```

で、Subnetを実際に使用するにはこの記述で引っ張ってこれます。
ドキュメントで`ISubnet`で指定しろって書いてあるとこに使うといいです。

``` python
# パブリック
ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC, one_per_az=True)
# プライベート
ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE, one_per_az=True)
```

</div>
</details>

### 顧客が本当に求めていた正解

こうして我々は無事にSubnetを名指しで使う正しい術を手に入れたのである。

``` python
from aws_cdk import (
    aws_ec2 as ec2,
    aws_elasticloadbalancingv2 as elb,
)

# IDから既存のVPCを取得する
VPCID='vpc-xxxxxxxx'
vpc=ec2.Vpc.from_lookup(self, 'vpcId', vpc_id=VPCID)

# IDから既存のSubnetを取得する
subnets = [
    ec2.Subnet.from_subnet_attributes(
        self, "some_id_string", 
        availability_zone='ap-northeast-1b', # 指定したいSubnetのアベイラビリティーゾーン
        subnet_id='subnet-xxxxxxxx' # 指定したいSubnetのID
    ),
    (以下略)
]

# 既存のVPC・Subnetを設定したALBを新規作成する
elb.ApplicationLoadBalancer(
    self, f"elbId", 
    vpc=vpc,
    vpc_subnets=ec2.SubnetSelection(subnets=subnets, one_per_az=True)
)
```

～HAPPY END～

### 参考URL

AWS CDK（class Vpc）
https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ec2.Vpc.html#static-from-wbr-lookupscope-id-options

CDKのドキュメントはTypeScriptのが一番読みやすいのでTSの方でざっくり確認してからPythonのドキュメント読むんですが、Pythonのドキュメントどうして読みづらいんですかね。慣れですかね。
boto3のドキュメントもだいぶ読みづらい。



### おわり

CDK面白いのでもっと流行ってほしいですね！！私はPythonが好きですよ！！
16進数文字列から画像に変換する方法（Kotlin）

https://so-wh.at/entry/20041012/p1
上記のページを参考にしました。もしかしたら他の方が書いているかもしれませんが自分用メモとして。


前提として、画像を16進文字列に変換したテキストファイルをアセットに保管してあります。


```kotlin

fun hextoBitmap(file: String): Bitmap {
        val openfile = assets.open(file)
        var imagetext = ""
        try {
            val inst = InputStreamReader(openfile)
            val br = BufferedReader(inst)
            var line = br.readLine()
            while (line != null) {
                imagetext += line
                line = br.readLine()
            }
            inst.close()
            br.close()
        }catch (e:IOException) {
            Log.e("IOException", e.toString())
        }

        val bytes = mutableListOf<Byte>()
        for(index in 1..imagetext.length/2) {
            val byte = Integer.parseInt(imagetext.substring((index - 1) * 2,index * 2),16)
            bytes.add(byte.toByte())
        }
        println(bytes)

        val byteArray = bytes.toByteArray()

        val bitmap = BitmapFactory.decodeByteArray(bytearray, 0, byteArray.size)

        return bitmap
    }


```
pyreboxの作法

#概要

pyreboxの作法、調べて見た。
pluginを作って見た。

#サンプルコード

プロセスを表示する。

```
from __future__ import print_function
from utils import get_addr_space
from api import CallbackManager
import volatility.win32.tasks as tasks

cm = None
pyrebox_print = None

def new_proc(params):
	global cm
	pid = params["pid"]
	pgd = params["pgd"] 
	name = params["name"]
	pyrebox_print("Process %x started with pgd: %x. Name: %s" % (pid, pgd, name))
	addr_space = get_addr_space(pgd)
	procs = [t for t in tasks.pslist(addr_space)]
	for p in procs:
		pyrebox_print("Process %s PID:%x" % (p.ImageFileName, p.UniqueProcessId))

def clean():
	global cm
	pyrebox_print("[*]	Cleaning module")
	cm.clean()
	pyrebox_print("[*]	Cleaned module")

def initialize_callbacks(module_hdl, printer):
	global cm
	global pyrebox_print
	pyrebox_print = printer
	pyrebox_print("[*]	Initializing callbacks")
	cm = CallbackManager(module_hdl, new_style = True)
	cm.add_callback(CallbackManager.CREATEPROC_CB, new_proc, name="vmi_new_proc")
	pyrebox_print("[*]	Initialized callbacks")

if __name__ == "__main__":
	print("[*] Loading python module %s" % (__file__))

```

以上。
curl command show http status code in response ( #Linux #Shell )

```bash
curl -s --head http://example.com | grep HTTP
HTTP/1.1 200 OK

curl -s --head -X POST https://yahoo.com | grep HTTP
HTTP/2 301
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2983








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
curl コマンドで HTTP ステータスコードの レスポンスを確認する ( #Linux #Shell )

```bash
curl -s --head http://example.com | grep HTTP
HTTP/1.1 200 OK

curl -s --head -X POST https://yahoo.com | grep HTTP
HTTP/2 301
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2984








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Python] Pythonとセキュリティ - ①Pythonとは

#概要
Pythonは1991年に発表されたインタプリタ形式のプログラミング言語で、オランダ出身のプログラマ「Guido van Rossum(グイド・ヴァンロッサム)」によって開発された。
2020年1月を基準として最新バージョンは、Python2「2.7.17」、Python3「3.8.1」である。2008年の末から、Pythonは「バージョン2」と「バージョン3」に分かれて使用されている。Python2とPython3はお互いに互換ができないところも多いため、プログラムを作る際に、二つのバージョンのうち、一つ選ぶ必要がある。Python2は2020年4月に「2.7.18」が公開された後は公式な技術サポートは終了される。また、Python3から新たにサポートされるライブラリや脆弱性なども修正されているため、Pythonを習い始めようとしているのであれば、Python3をお勧めする。

#Pythonのメリット

###容易性
Pythonの一番のメリットは簡単で、だれでもすぐプログラムが作れる容易性である。下記で「Hello World」を出力する例を、CとPython言語で作ってみた。

```hello_world.c
#include <stdio.h>
int main() {
    printf("Hello World");
    return 0;
}
```
```hello_world.py
print("Hello World")
```
このようにCは5行で表現するコードが、Pythonでは1行で表現できる。また、文法的に括弧({,})やセミコロン(;)などが不要で、インデント(字下げ)でシンタックスを区別するため、ソースコードがより分かりやすい。

###強い連携性(glue)
Pythonはシステムプログラミングや複雑な演算が多いプログラムには合わない。だが、Pythonは連携性があるため、他の言語で作られたプログラムにPythonが含められる。例えば、複雑な演算や、早い処理速度が必要な部分はCで作り、そこにPythonを含めることも可能である。もちろんCだけではなく、C++やJAVA, JavaScriptなど多様な言語とPythonを並行で使うことができる。

###様々なライブラリ
個人的には一番のメリットだと考えてるのは厖大なライブラリの数である。GUIを開発するためのTkinterまたはPyQTや、ゲーム作成のためのPygame, Pythonで作成されたプログラムを実行ファイルとして作ってくれるPyInstaller、ウェブのクローリングのためのBeautiful Soupなど、記述したライブラリ以外にも厖大なライブラリが存在しているため、効率的に開発ができる。

###クロスプラットフォーム開発
前述の通り、厖大なライブラリを提供しているため、OSの環境にかかわらず開発ができる。例として、WindowsでPythonを利用してGUIを開発する場合、ライブラリとしてTkinterまたは、PyQTライブラリを使用する。このライブラリをLinuxでも同じライブラリを使い、開発と実行ができる。このようにPythonのライブラリは厖大で、各OSもサポートしている。

###ツールが作りやすい
数多いライブラリとオープンソースまた、簡単な文法ですぐプログラムが作れるPythonはシステム担当者などがツールを作ることに適している。

**上記のメリット以外にもPythonでの開発で得られるメリットはたくさんある。その代わりインタプリタ言語であるため、速度の問題や、モバイルプラットフォームでは合わないなどもちろんデメリットもある。**

#まとめ
Pythonは開発の容易性をメリットとして多角的な開発で使用している。今回はPythonの概要
また、Pythonを使うことのメリットに対して学んでみた。次回は、実際Pythonを利用してセキュリ
ティに役に立つツールを作ってみよう。
office の管理について

# officeの管理について

今年のWindows7のサポート終了に従って社内でPCの入替を行いました。

その際にofficeの新規購入したときに起きたインシデント・解決した方法を書き残しておきます。

###　経緯
Windows10のPCを計7台購入し、各PCにoffice 2019を入れるために
**Microsoft Office Home & Business 2019 2PC** を4枚購入しました。
office2016以降からmicrosoftアカウントとの紐づけが必要なため、会社の資産管理用アカウントを作成し4枚とも紐づけを行いました。

カード上に付箋を貼り、誰のPCがどのカードでインストールしたか分かるように管理を行っていました。
この段階で1PC分余っていたんですね。

無事Windows10への入替が完了し、その時は特に問題はありませんでしたが、この度新規メンバーが増え余っていたカードでインストールしようとしたところ下記メッセージが・・
![SnapCrab_NoName_2018-12-12_11-38-26_No-00-644x528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514148/ff98e7e9-ec79-50b0-5d39-9e995e2c99d3.png)

###調査
色々調べたところ
Microsoftの管理上でどのプロダクトキーがどのPCに割り振っているかわからない、officeアプリケーション上からもプロダクトキーが確認できないという・・・

何か紐づくものがないか、とアプリケーション上で見れる値を調べたところ
![プロダクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514148/1270b672-4e38-d6eb-f528-4bca33ff483c.png)

officeアプリケーション上で
ファイル　→　アカウント　→　[アプリケーション]のバージョン詳細

にて確認できるこちらのプロダクトIDの1～15桁目が
同じカードで認証した場合、同じ番号になるという事がわかりました。

※画像はエクセルの365で、プロダクトキーは編集してあります。

###解決

以上の情報を元に誰のPCにどれが入っているかを突き止め、
一つ余っていたのが別のカードであることがわかりました。

管理って大事ですね
[学習11日目]PHP初級編　〜関数・フォーム〜

#学んだこと

##既存の関数の呼び出し方
###カウント系：strlen()は文字数、count()は配列の要素数を数えてくれる

カウント系で似ているなと思ったこの2つだが、
strlen()は何かの文字列or変数を、
count()は配列を、
引数に入れるものっぽい。

###rand()
これも便利な関数。

```index.php
echo rand(1,4);
```
こうすると、1〜4のランダムな整数を返してくれるみたい。

##関数の定義
関数定義の書き方はそんなに難しくない。
戻り値がいらない場合は

```index.php
function 関数名(引数1,引数2){
  /*処理*/
}
```
こんな感じ。
で、
```関数名(引数1,引数2);```
の形式で呼び出せばOK

戻り値が必要な場合は、

```index.php
function 関数名(引数1,引数2){
  /*処理*/
  return 戻り値;
}
```

って感じで書けばOK。
呼び出し方は戻り値がない時と同じ。

ちなみに引数がなくてもOK
```関数名();```
みたいに。

##フォーム

###formタグ
```index.php
<form action="url" method="post">
//フォームの内容を書く
</form>
```
こんな感じでかく。タグの書き方覚えちゃえばHTMLと同じ感じだ。

methodは送信方法で、
送信先("url")に表示したい場合はgetを。

###テキストボックス：一行文なら```<input>```でtype="text"、改行を含む大きいフォームは```<textarea>```を使う

よく、問い合わせフォームとかで
名前とかEmailを入力する時がある。
それはだいたい一行だから```<input>```を使う

よく、問い合わせフォームとかで、
フリー記入欄がある。備考とか。
それは```<textare>```をつ会う

その作り方は、inputタグでtypeをtextに指定すればできる。


まず、一行のテキストボックス。

```index.php
<form action="sent.php" method~"post">

  Emailを入力してください
  <input type="text" name="email">

</form>
```

こうすると、
「Emailを入力してください」
という文字の下に一行分の入力フォームが表示される。


一方、広めの改行ありのテキストボックスは、

```index.php
<form action="sent.php" method~"post">

<textarea name="content"></textarea>

</form>

```


★ここで注意したいのは、
``<input>``は閉じなくていい。
``<textare>``は閉じないといけない。
ってこと。

``<input>``
~~``<input></input>``~~

~~``<textarea>``~~
``<textarea></textarea>``


ややこし。。。
”inputが例外だな”って覚えるしかないか。

###送信ボタンの書き方はHTMLと同じ。

送信ボタンは``<form>``の中で

```index.php
<input type="submit" value="送信">
```
と書けばOK

###フォームのデータの受け取りは``$_POST['データ名']``で受け取る

フォームで

```index.php
<form action="sent.php" method="post">

Emailを入力してください
<input type="text" name="email">

....

</form>

```

となっていた時、
formタグで送信urlに指定したsent.phpの方では、

```sent.php
echo $_POST['email'];
```
とすると、フォームで入力された情報が受け取れる。

###セレクトボックスの作り方も基本HTMLと同じ

```index.php
<select>
<option value="apple">りんご</option>
<option value="banana">ばなな</option>
<option value="orange">みかん</option>
</select>
```

★ここで理解したいのは、
``<option></option>``で挟まれた文字（ここではひらがなの「りんご」や「」ばなな」や「みかん」）は、
プルダウンの選択に表示される文字にすぎない。

実際にデータとして送信されるのは、valueで指定した、「apple」「banana」「orange」である。

##応用
###for文などのループを使ってもかける

書き方はこんな感じ

```index.php
for($i=1; $i<4; $i++){
  echo '<option value='{$i}'>{$i}</option>';
}
```

★ポイント
・echoで表示させるので、option全体を`'` で囲う。
・変数は{}で囲って`{$i}`で表現
・タグ内の変数は、{$i}をさらに`'`で囲う。`'{$i}'`こんな感じ。


#progateメモ
現在**Lv. 18**
bbpnuts21
ハッシュタグで検索するWEBデザイン検索サービス「Lplove」をリリースしました

初めて投稿します。普段はQiitaをよく見ていて、つまづいた時にとても助かっています。ありがとうございます。

先ほどハッシュタグで検索するWEBデザイン検索サービス「LPlove」をリリースしました。リンクはこちらです(https://lp-love.com/)

![temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300500/be4abe6a-2980-af9f-6923-00737735f600.png)


昨年11月から本格的に作り始めて、ほぼ３ヶ月で作りました。メインはFirebaseとNuxt。SSRで作っています。ドメインがroute53なのを除いて、残りは全部FIrebaseでできています。

仕事の合間を縫って一人で作りましたが、正直大変でした。たまに一人で全部作る方を見かけますが、こんなに大変なのかと思い知らされました。

このサービスは、普段デザインの仕事をしていて「デザインまとめサイトじゃ探すのが大変！」「かといってPinterestじゃ誰がこのデザインを良いと思っているのか分かりづらい」「もっとデザイン共有できないかな」と思って、ピンタレストとインスタの間を目指して作りました。

これから大きくしていく中で、デザイナーさんが探しやすい、共有しやすいサービスになれば良いと思います。

とりあえず、リリース直後なので不具合がたくさん出るだろうな、と不安でいっぱいですが、不具合見つけたらコメントでどんどん言ってもらえると本当に助かります！またデザイナーさんも「こんな機能が欲しい」などあったらどんどんください。めちゃくちゃ励みになります！

またちょっと休んだらこのサービスの作った過程やソースなどを随時公開していけたらと思います。

とりあえず、
Lplove(https://lp-love.com/)
をよろしくお願いします！
Macユーザー向け Terminalから外部記憶装置（USBメモリ・HDD）にアクセス

## 以下の人向け(Macユーザを前提)
- USBメモリやHDDにターミナルからアクセスしたい
- 外付け記憶装置のデータをscpコマンドで送信したい

## 外付け記憶装置のPath
###Volumesディレクトリに存在する
USBメモリなどは**Volumes**ディレクトリに現れます。
**Volumes**にはMacの内蔵ハードディスクであるMacintosh HDなども含まれています。

```
$ cd /Volumes/記憶装置の名前
```
で記憶装置先に移動できます。

記憶装置の名前がわからないときは、Tabを押して候補一覧を見るか、lsコマンドで確認してください ↓。

```
$ ls /Volumes
```

## scp コマンドでデータを送信

```
$ scp -r /Volumes/記憶装置の名前 ユーザ名@IPアドレス:保存先
（例） $ scp sample.txt User@xxx.xxx.xxx.xxx:~/
```


## 勘違いポイント
デスクトップにUSBメモリのアイコンが表示されるからといって、デスクトップ経由のパスを探しても見つかりません...
モデリング・UML

#ソフトウェア開発とモデリング

共同開発におけるコミュニケーションで重要なこと
・誤解や勘違いを生じさせないこと
・情報が伝わりやすくなるよう図を用いて簡略化すること（モデリング）

###モデリング
ソフトウェアの開発から廃棄までのライフサイクルの中で問題となるのがコミュニケーション。

このコミュニケーションを円滑にするために現場で多用されるのが「図」です。

多くの情報を一度に伝えることができ、共通認識を持ちやすくなるからです。

伝えたい情報をできるだけ簡略化して表現する作業のことを「モデリング」と言います。

###UML

・現代のソフトウェア開発でモデリングと表記法のデファクトスタンダードとして扱われている
・１３種類の「図」が定義され、ソフトウェアのモジュール構成を表す構造図と、動作を表す振る舞い図の２つに大別される

######構造図
・クラス図
・コンポーネント図
・コンポジット図
・配置図
・オブジェクト図
・プロファイル図
・パッケージ図

######振る舞い図
・アクティビティ図
・コミュニケーション図
・シーケンス図
・状態図
・タイミング図
・ユースケース図


※各々の図については別途ググること
###クラス図

オブジェクト指向ソフトウェアを構成する最小の部品であるクラスの関係性を表現するための図。
クラス単位で表記するのだが、１つのクラスを名前（クラス名）、属性、操作の３つの区画で区切って表記する。

属性はJavaで言うフィールドのこと。
操作はメソッドのこと。


###オブジェクト図

インスタンス同士の関係性を表現するための図。
オブジェクト名には下線を引き、オブジェクトであることを明示する。
クラス図とオブジェクト図を併用することで、クラスの関連がわかりやすくなる。

クラス図を補うための図として多用される。


###シーケンス図
インスタンス同士の動的な関係性を表現する。
インスタンスがどのインスタンスのどのメソッドを呼び出すのかを記述する。
UMLの中でも特に重要な図。