OmniAICreator/Qiita-1.07M huggingface dataset:
$((算術式)) （シェル）

こんにちは。
```$((arithmetic expression))``` の記法は、Bash に限らず動くようです[^1]：

```console
$ dash -c 'x=1; echo $((x + 1))'
2
```

またこちらの方が、```expr``` コマンドを使うよりも、推奨のようです：

```console
$ echo "expr 1 + 1" | shellcheck -s sh -

In - line 1:
expr 1 + 1
^--^ SC2003 (style): expr is antiquated. Consider rewriting this using $((..)), ${} or [[ ]].
```


[^1]: "[Comparison of command shells](https://en.wikipedia.org/wiki/Comparison_of_command_shells)" (Wikipedia)
ヘッドレスRaspberryPiでIPアドレス取得状況がどうなっているか調べるTips

# 無線LANがうまくつながらない

「あれれ〜 設定間違えてないハズなのに・・！」

あいにく、ディスプレイも有線LANケーブルもUSBシリアルも持ってないとき。

母艦がUbuntuLinux 18.04なので幸いにしてEXTファイルシステムは読み書きできる。

RaspberryPiのSDカードをUbuntuLinuxで読み込んで、/etc/rc.local の最後の方

```

...
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0
```

となっている最後の方を


```

...
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

ifconfig > /var/log/ifconfig
exit 0
```

と書き換える。
RaspberryPiにSDカードを戻して起動、しばらくして電源を切ってもう一度UbuntuLinuxで中身を見てみる。

/var/log/ifconfigの中身は・・・


```

eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:30:35:56  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```

となっていてwlan0インターフェースがそもそも無い。

USBのWi-Fiドングルを刺して起動すると


```

eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:30:35:56  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.114  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 2001:a453:41:8f00:ba53:deef:d815:9c74  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::8b08:de75:fea1:f267  prefixlen 64  scopeid 0x20<link>
        ether 00:22:cf:fb:7f:e2  txqueuelen 1000  (Ethernet)
        RX packets 41  bytes 9237 (9.0 KiB)
        RX errors 0  dropped 9  overruns 0  frame 0
        TX packets 30  bytes 4870 (4.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
となり、wlan0が出現した。
ということはオンボードの無線LANインターフェースが死んでいるということですね。

やれやれ。2時間ほど悩みました。
存在しないIDでfindしたらErrorになった

## 今回の学び

Railsの思想が少しわかった気がした。

## 背景

Rails（Active Record?）を学んでいた時に、
`find(invalid_id)` したら例外が吐かれた。

```.ruby
irb > Building.find(1000000)
  Building Load (2.4ms)  SELECT  `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 1
Traceback (most recent call last):
        1: from (irb):2
ActiveRecord::RecordNotFound (Couldn't find Building with 'id'=1000000)
```

`find_by_id(invalid_id)` をすると nil が返ってきた。

```.ruby
irb > Building.find_by_id(1000000)
  Building Load (0.6ms)  SELECT  `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 1
=> nil
```

`where(id: invalid_id)` したら 空配列 が返ってきた。

```.ruby
irb > Building.where(id: 1000000) 
  Building Load (0.6ms)  SELECT  `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 11
=> #<ActiveRecord::Relation []>
```

最初は、わかりにくいなぁ。。。とも思いました。
が、理由を知ってる人に話を聞いたときに腹に落ちたので、
その時の話を残します。

## 何を聞いたのか

### findメソッド

`find` は、特定のレコードを取得するためのメソッドなんだ。
指定したIDに欲しい情報が入っていることを知っているから使えるんだ。
あるってわかってて取得したのに、それが無かったから例外になる。

### find_byメソッド

`find_by` は、条件を指定した検索メソッドなんだ。
検索結果があるかないかは、検索してみないとわからない。
だから、結果がないことは例外ではない。
検索結果が無かったからnilを返す。

### whereメソッド

`where` は、`find_by` と同様に検索メソッドなんだ。
違いは、検索にマッチするすべてのレコードを取得できるということ。
これも、検索結果があるかないかは、検索してみないとわからない。
だから、結果がないことは例外ではない。
検索結果が0件だから、0件の配列を返す。

## 最後に

なるほど、意味がわかるとわかりやすい。
そして、これはRailsの生みの親であるDHHが言っていたことらしいです。

Railsにおいて彼の言葉は絶対だ。
レールから外れてはいけない。

とも教わりました。
Python初心者がboto3を使ってDynamoDBを操作するときのメモ

# はじめに
## 環境

``` sh
$ aws --version
aws-cli/1.16.155 Python/2.7.16 Darwin/19.0.0 botocore/1.12.145
```


# Python3のprint()をPython2系で使えるようにする

``` py
from __future__ import print_function # Python 2/3 compatibility
```

Python2系からPython3へ変えたとき、一番目立つ変更はprint文の記載。
2系までは`print x`とスペースで空けて記述するが、
3系からは`print(x)`と括弧で使って記述する。

もし、2系で3系のように括弧を使ったprint文を実行させたい場合は、
ファイルの先頭に、この文を追加する。

[python - Why does using from \_\_future\_\_ import print_function breaks Python2-style print? - Stack Overflow](https://stackoverflow.com/questions/32032697/why-does-using-from-future-import-print-function-breaks-python2-style-print)

## テーブルを作成する

``` py
# 
# DynamoDBへのアクセスクラスを作成
dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
# DynamoDBローカルを構築している場合のアクセス方法
# dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1', endpoint_url="http://localhost:8000")

table = dynamodb.create_table(
    TableName='Movies',
    KeySchema=[
        {
            'AttributeName': 'year',
            'KeyType': 'HASH'  #Partition key
        },
        {
            'AttributeName': 'title',
            'KeyType': 'RANGE'  #Sort key
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'year',
            'AttributeType': 'N'
        },
        {
            'AttributeName': 'title',
            'AttributeType': 'S'
        },

    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 10,
        'WriteCapacityUnits': 10
    }
)
```

DynamoDBからデータを取り出すときは、パーティションキー、もしくはパーティションキーとソートキーを指定する必要がある。[参照](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html)

## パーティションキー（Partition Key）

* DynamoDBのデータは複数のパーティションとよばれる保管場所、に分散されて保存されます。。
* 同じパーティションキーの項目（アイテム）の場合、並びかたは決まっていない。（そのため、後述するソートキーを指定する必要がある）
* パーティションキーをプライマリーキーとして使うことができる ([参照](https://qiita.com/hshimo/items/e5ad98b21786d796f1da#プライマリキー-pk))

## ソートキー（Sort key）

ソートする順番を決めるためのキー
上記のコードでは、`title`の文字コード順に並べられる。



* [Choosing the Right DynamoDB Partition Key | AWS Database Blog](https://aws.amazon.com/jp/blogs/database/choosing-the-right-dynamodb-partition-key/)
* [DynamoDBのキー・インデックスについてまとめてみた - Qiita](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd)
* [AWS::DynamoDB::Table KeySchema - AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-keyschema.html)
* [ステップ 1: テーブルを作成する - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.01.html)

## 時刻の取り扱い

> 属性の型に、日付と時刻を表す型がない。
> 解決策として、文字列型または数値型を使って、日付・時刻型を代替する。

``` py
    AttributeDefinitions=[
        {
            'AttributeName': 'date',
            'AttributeType': 'S'
        },
```

[ここにハマった！DynamoDB - Technology Topics by Brains](https://blog.brains-tech.co.jp/entry/2015/09/30/222148#日付時刻型がない)
NuxtとFirebaseの練習で速読Webアプリをリリース

[速読家になろう](https://anyrsvp.firebaseapp.com/) という 誰でも,どんな文章でも速読できるWebアプリです.

アプリとか言ってるけどWebサイトでPWA です

ここでいう速読とはRSVP(高速逐次視覚提示)です

コピペした文章を解析し,瞬間速読ができるようになります.

[こちら](https://qiita.com/youwht/items/a1b7a843888c27490172)の記事が詳しいです

*形態素解析は使っていません.Cloud Natural Language APIを使用しているとだけ言っておきます.

# 構成

+ Nuxt フロント(SPA)
+ Vuetify
+ Firebase Hosting
+ Cloud Natural Language API(解析)
+ Cloud Functions (Python 整形)

NuxtなのにSSRじゃないのは,Nuxtを選んだ理由がSSRではなくて,素早いスタートを切れることと規約チックだからです.

そもそもコピペ前提のサービスなので,SEOに対するコンテンツが何もない状態です.

# 所感

NuxtのPWAが簡単すぎて感動した.manifestとiconを設定するだけで終わっていました.

VuetifyまじでCSS書かなかった.

FirebaseのHosting簡単すぎて感動した.

Nuxt×Firebaseの組み合わせが,爆速にとても寄与しているんだなと実感しました.

これからの個人開発のサービスもほとんどこの組み合わせでやることになると思います.

# RSVPと日本語について

[速読家になろう](https://anyrsvp.firebaseapp.com/) というタイトルのとおり,最初は某小説投稿サイトをターゲットにした速読アプリになる予定でした.

しかし,小説家になろうの文章の特徴がRSVPと相性が悪かったので,全てを対象にしています.

相性が悪い と感じた点は3点

+ セリフのカッコ｢｣が多い
+ ルビが邪魔
+ 厨ニ文字が解析できない

## セリフのカッコが多い

ラノベはそういうもんなので仕方がないのですが.

速読家になろう は現在,カッコにうまく対応できていません.

元文と比較すると,すごく崩れてしまいます.

````
# もとの文章
「おぼっちゃま？　どうかなさいましたかおぼっちゃま」

「……え？」
```
[速読家になろう](https://anyrsvp.firebaseapp.com/) が解析した結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35159/ed92df72-bc5f-e6fd-f65c-f596e54a9fab.png)

すごく中途半端なところで表示を区切ってしまっています.
これは私が対応すれば解決します.がんばります.

ここからは愚痴です

## ルビが邪魔

ルビ付きの文字をコピペすると｢漢字かんじ｣って具合に｢漢字+ふりがな｣になってしまいます.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35159/dd6b3acc-2648-953f-228a-cfe620c62889.png)


```
このダンジョンのダンジョンボス──孫悟空そん ごくうだ。
```

[速読家になろう](https://anyrsvp.firebaseapp.com/) はコピペされた文章を読み取るので,コレは解決が難しい気がしています.
漢字を発見したら,平仮名に変換して隣接する一致した文字列を削除 とかですかね?

と思っていたら次の問題にブチ当たりました.

## 厨ニ文字が解析できない

星光連流撃（スターバーストストリーム） とかいくらGoogleでも解析できない

中二病乙



RSVPと日本語はただでさえ,英語よりもハンデがあります.
そこに現代文ときて,厨ニ文字とくると厳しい印象がありました.

法律とか,新聞のような記事だと相性いいと思います.

小説家になろうに特化できないなら,全てに対応してしまえという投げやりコンセプトです.


# スマホでコピペめんどくさい問題

スマホでテストしてみたんですが,読みたい長い文章を見つけたとして,コピーするのがめんどくさいんですよね.スクロールするのがめんどくさい.

全選択って手もありますが,記事や文章以外のサイト文言とかも入ったりしてノイジーです.

URLコピペしてもらってArticleとからへんのタグで検討つけてスクレイピング とかを検討しています.

# まとめ

+ Nuxt × Firebase は爆速のスタートが切れる
+ Google Cloud API つよい
+ 中二病乙
PreferenceBundleで右上にRespringボタンをつける。

#PreferenceBundleで右上にRespringボタンをつける。
初めまして、Minazukiと申します。

Profile
Name :  Minazuki_dev
Twitter : @Minazuki_dev
Repo : https://minazukidev.github.io
Age : 14

まだ中学生なので言葉がおかしいところがありますが許してください…🙏

#はじめに
必要なもの

theos (Macでも単体でもなんでも)
Newterm2
Filza
やる気


$THEOS/bin/nic.plでTweakを作成してそのTweakのPreferenceBundleをまた$THEOS/bin/nic.plで作成しておいてください。
#本題
さぁ、右上にリスプリングボタンをつけていきましょう。上手くいくとこうなります。
<img width="375" alt="5C0630C5-9DA5-41CD-93F0-E6BB082B2CB3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501522/d2af5ce7-7fa1-9949-cbd3-8427c70151da.png">
"Respring"とボタンが表示されていますね。

まず初めにTweakの方のMakefileを開いてください。

```ruby:Makefile
$(TWEAK_NAME)_EXTRA_FRAMEWORKS = Cephei
```

を記述します。記述するところは
TWEAK_NAME = XXXの下あたりがわかりやすいでしょう。
$(TWEAK_NAME)の部分をTweakの名前にしてもいいと思いますが今回はこの記述でいきます。Cepheiをインストールしてない場合はPackixリポジトリからインストールしておきましょう。

次にPreferenceBundleの方のMakefileを開いてください。そこにも新たに記述するものがあります。

```ruby:Makefile
$(TWEAK_NAME)_EXTRA_FRAMEWORKS = Cephei CepheiPrefs
```

CepheiPrefsが加わっただけですね！！
BUNDLE_NAME = XXXから下のわちゃわちゃしたところの1番下に追加記述でいいでしょう。

そして次に"XXXRootListController.m"
にこれを追加記述します。

```ruby:XXXRootListController.m
@synthesize respringButton;

- (instancetype)init {
    self = [super init];

    if (self) {
        HBAppearanceSettings *appearanceSettings = [[HBAppearanceSettings alloc] init];
        appearanceSettings.tintColor = [UIColor colorWithRed:0.1f green:0.1f blue:0.1f alpha:1];
        appearanceSettings.tableViewCellSeparatorColor = [UIColor colorWithWhite:0 alpha:0];
        self.hb_appearanceSettings = appearanceSettings;
        self.respringButton = [[UIBarButtonItem alloc] initWithTitle:@"Respring" 
                                    style:UIBarButtonItemStylePlain
                                    target:self 
                                    action:@selector(resp)];
        self.respringButton.tintColor = [UIColor redColor];
        self.navigationItem.rightBarButtonItem = self.respringButton;
    }

    return self;
}
```

@implementation XXXRootListControllerの下(specifiersとか書いてあるところとの間)に記述しましょう。

そして次にrespringさせるコードを書くのですがこれは調べたらゴロゴロ出てくるので省略させていただきます🙏
注意点としてこのカードを丸々コピーする場合
"-(void)resp"と(void)の先がrespになるようにしていただければ大丈夫です。

そして最後にXXXRootListController.hにこれを追加記述します。

```ruby:XXXRootListController.h
#import <Preferences/PSListController.h>
#import <Preferences/PSSpecifier.h>
#import <CepheiPrefs/HBRootListController.h>
#import <CepheiPrefs/HBAppearanceSettings.h>
#import <Cephei/HBPreferences.h>

@interface NSTask : NSObject
@end

@interface XXXRootListController : PSListController
    @property (nonatomic, retain) UIBarButtonItem *respringButton;
    - (void)resp;
@end
```

追加記述というよりは初期の状態なら全消ししてこれをコピペすれば大丈夫です。
これで完成なのでビルドしてインストールしてみましょう。
#まとめ
とりあえずこれで右上にRespringボタンのつけ方は終わりです。なにか質問があったら(誤字脱字も！)TwitterのDMに来てください。

今回はボタンの色を赤としましたが他の色にすることも可能です。また、応用編としてRespringする前にアラートを表示させたり、RespringではなくTwitterに飛ばしたりすることもできます。需要があればまた何か応用編を投稿するかもしれません。

追記
使用しているtheosのバージョンによってエラーが出る可能性があります。
Windowsの隠し機能「God Mode」

Windowsの設定は通常「設定」や「コントロールパネル」から行いますが、求める設定値がどこにあるか探すのが大変ですよね。
実はWindowsには"God Mode"なる隠し機能があり、これを使うと多数の設定項目を一覧化することができます。便利ですね。
God Modeが正式名称なのかどうかはわかりません。

![god2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215103/79835c3b-d5f6-ea53-fc33-9e8fd96c8eeb.png)

この機能を使う方法はいくつかあります。

##方法1 ファイル名を指定して実行

`Win+R`で以下のコマンドを実行することで起動可能です。

`shell:::{ED7BA470-8E54-465E-825C-99712043E01C}`


##方法2 ショートカットを作る

ショートカット先の場所に指定することでもアクセス可能です。
上のコマンドそのままではファイル名が見つかりませんと言われるので、頭にexplorer.exeを付けましょう。

`explorer.exe shell:::{ED7BA470-8E54-465E-825C-99712043E01C}`


##方法3 特殊フォルダを作る

どこでもいいので、以下のような名前のフォルダを作ってみましょう。

`.{ED7BA470-8E54-465E-825C-99712043E01C}`

入力して確定すると、自動的にGodModeアイコンに変わります
自分の環境の場合、ファイル名はブランクから変更することはできませんでした。

![god.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215103/a15f8d81-7e50-5c86-6bb6-815b642acfa8.png)
DynamoDB CLIから使うときに知りたくなるコマンド


# 環境

``` sh
$ aws --version
aws-cli/1.16.155 Python/2.7.16 Darwin/19.0.0 botocore/1.12.145
```

## テーブル一覧を表示

``` sh
$ aws dynamodb list-tables
{
    "TableNames": [
        "Forum", 
        "Movies"
    ]
}
```

## テーブル情報を知る

``` sh
$ aws dynamodb describe-table --table-name Movies
{
    "Table": {
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:470824059488:table/Movies", 
        "AttributeDefinitions": [
            {
                "AttributeName": "title", 
                "AttributeType": "S"
            }, 
            {
                "AttributeName": "year", 
                "AttributeType": "N"
            }
        ], 
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0, 
            "WriteCapacityUnits": 10, 
            "ReadCapacityUnits": 10
        }, 
        "TableSizeBytes": 0, 
        "TableName": "Movies", 
        "TableStatus": "ACTIVE", 
        "TableId": "f487b461-41df-41da-aaed-557a60291da8", 
        "KeySchema": [
            {
                "KeyType": "HASH", 
                "AttributeName": "year"
            }, 
            {
                "KeyType": "RANGE", 
                "AttributeName": "title"
            }
        ], 
        "ItemCount": 0, 
        "CreationDateTime": 1569596682.931
    }
}
```

## データを挿入する
``` sh
$ aws dynamodb put-item --table-name Movies --item '{"title":{"S":"Titanic"},"year":{"N":"1997"}}'
$ aws dynamodb put-item --table-name Movies --item '{"title":{"S":"The Godfather"},"year":{"N":"1972"}}'
```

## テーブルの全てのデータを表示

``` sh
$ aws dynamodb scan --table-name=Movies
{
    "Count": 2, 
    "Items": [
        {
            "year": {
                "N": "1997"
            }, 
            "title": {
                "S": "Titanic"
            }
        }, 
        {
            "year": {
                "N": "1972"
            }, 
            "title": {
                "S": "The Godfather"
            }
        }
    ], 
    "ScannedCount": 2, 
    "ConsumedCapacity": null
}
```


# 参考

[aws cli で DynamoDB を使う - Qiita](https://qiita.com/ekzemplaro/items/93c0aef433a2b633ab4a)
[DynamoDBをlocal環境で動かしてみる - Qiita](
https://qiita.com/Hiroki11x/items/756797b45d4461784013)
void* から 関数ポインタ へ

メモ

```c++
int func(float f)
{
    return f;
}
int main()
{
    void* f = func;
    ((int(*)(float))f)(1.f);    //void* からキャストして使用
    int(*foo)(float) = (int(*)(float))f;    //コピー
    foo(0.1f);

    return 0;
}
```
【Docker】MySQLに接続してDB情報を確認したい

##開始タグ
Rails学習中な自分がDB情報を見たくなってもがいた結果をメモ。
Dockerを使用しています。
mySQLに関して無装備すぎたことを実感しました。

##やりたいこと
先っちょだけでいいので、データベースを見させてください・・・。

##やろうとしたこと
mySQLを操作してデータベース一覧を表示すればいいんじゃない？と思い立ち試行開始。

##道中
とりあえず調べてみて、まずアプリ開発環境のルートディレクトリで以下を試す。

```
mysql -u root -p
```

すると以下のエラー文を突きつけられる。

```
RROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

what?
色々調べてみると、そもそも起動中のMySQLコンテナへ入らなければいけなかったよう。

まずはコンテナ名を確認するために以下を実行。

```
docker ps
```

MySQLのコンテナ名を確認したら、ターミナルで以下を実行。

```
docker exec -it mySQLのコンテナ名　bash
```

そうすると`root@~`となるので、ここで最初に試した以下を実行。

```
mysql -u root -p
```
パスワードを入力してMySQL接続に成功したようで以下の文が。

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

ここまできたらあとはSQL文でデータベース一覧を確認するため、以下を実行。

```
mysql> show databases;
```

```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| app_development    |
| app_test           |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
7 rows in set (0.00 sec)
```

無事表示できました！長かった・・・。

##閉じタグ
mySQL、Docker関連をもっと理解しなければ。
知らないことが多すぎて逆に楽しくなってきました！

##参考リンク
[Docker で MySQL コンテナを起動しました - Qiita](https://qiita.com/pugiemonn/items/b17288494e4b627f4475)
[【Docker入門】５分でMySQLのDB、テーブル作成 - フリーランス　チャレンジ！！](https://www.ksakae1216.com/entry/2016/12/05/063000)
[Dockerのコマンドでよく使うものまとめ | 大阪市天王寺区SOHOホームページ制作 | デザインサプライ-DesignSupply.-](https://designsupply-web.com/knowledgeside/3325/)
HoloLens のデバイスポータルに USB ケーブル経由で繋がらない時にチェックする項目。

#ハマったこと
HoloLens を USB ケーブルで Windows PC に接続して、デバイスポータルを見るときに使う URL は以下の通り。
[https://127.0.0.1:10443/](https://127.0.0.1:10443/)
~~[http://127.0.0.1:10080/](http://127.0.0.1:10080/)~~

:::note info
（2021/10/29 追記)
HTTP 経由の URL は、セキュリティの観点から非推奨のようです。
（OS のバージョンによってはこちらの URL だとつながらないかもしれません。）
:::

…なのですが、なぜかブラウザーからアクセスしようとすると Connection Refused で接続ができない。
Visual Studio からアプリケーションをデプロイしようとしても、"Error DEP6957 : Failed to connect to device..." となってしまう。

HoloLens 側もホスト側の PC も、開発者モードは有効化されている…。

という感じでハマって 2 時間ほどあーだこーだとやった顛末。

#結論
Windows SDK に含まれる "Windows IP Over USB" がインストールされていない時に、このような状態になります。

#解決策
1.「プログラムの追加と削除（アプリと機能）」から、インストールされている Windows SDK の最新版を探して「変更」をクリック。
2. 開いた画面で "Change" をクリック。
![2019-10-17 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/e47e86f3-48bc-1500-bde3-0edcede69684.png)
3. 次の画面で "Windows IP Over USB" にチェックを入れて "Change" をクリック
![2019-10-17 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/e4999e39-78b7-a601-79e3-a511057b4267.png)
4. インストールが終わったら、HoloLens を USB 接続して [https://127.0.0.1:10443/](https://127.0.0.1:10443/) もしくは、[http://127.0.0.1:10080/](http://127.0.0.1:10080/) にアクセスしてチェックしてみる。

#まとめ
こんなところで 2 時間ハマるとは…。
しかも最初 HoloLens 側を疑って、デバイスの初期化までやってしまった。。。

誰かが同じことにハマった時に、すぐに役立つ情報になれば何より。。。
Pythonでファイル探索＆プログラム識別コードを抽出する

#目次
  ・目的
　・手順
　・コード
　・解説
　・課題

#目的
 自社のプログラムはディレクトリで保管され、ファイル1行目に識別コードでバージョン管理しています。
開発フェーズで使うプログラムかどうかは、その識別コードと仕様書を照らし合わせる作業が出てきています。
その作業がとても面倒なので、ファイル名と識別コードを抜き出したものをテキストファイル出力させて単純化したい。

#手順
　1. 指定したパス配下・拡張子ファイルを探索する
　2. ファイル1行目の文字列を抽出する
　3. "ファイル名:文字列"という中身のテキストファイルを出力する　

指定したパス配下は、以下のようなファイル構成になっています。
ファイル名はプログラムでランダムな文字列です。

![2019-10-21 221347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432868/80acd51e-1688-0fb8-c939-d331ee725a37.png)

![コメント 2019-10-21 221525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432868/feac263c-f1a3-918a-a255-758954a37603.png)

↓ファイルの中身
![コメント 2019-10-21 221646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432868/c0773f85-35d6-b095-8102-e335491863e5.png)




#コード
```python:File_Finder.py

import os
from pathlib import Path
import re

Output_path = r"OUTPUT_PATH"
Search_path = r"SEARCH_PATH"

folder = []


# .c,.hファイルを探してリスト型データにする
def file_finder(_path):
    os.chdir(_path)
    temp = Path(_path)
    file_list = [p for p in temp.glob("**/*") if re.search(".(c|h)", str(p))]

    for path in file_list:
        if not os.path.isdir(path):
            folder.append(os.path.relpath(path, Search_path))
    return folder


# リストから全ファイルを開き、1行目だけを抜き出して閉じる。辞書型にして{相対path:"1行目"}となるようにする
def file_read(*folder_list):
    read_data = {}
    for j in folder_list:

        if os.path.isdir(j):
            with open(j, "r") as f:
                read_data[j] = f.readline()
            f.close()
        else:
            with open(j, "r") as f:
                read_data[j] = f.readline()
            f.close()
    return read_data


#  一つのテキストファイルとして出力する
def file_list_generator(**dictionary):
    os.chdir(Output_path)
    with open("soft_list.txt", "w") as f:
        for k, i in dictionary.items():
            temp = str(i).replace("/* ", "")
            temp = temp.replace(" */", "")
            f.write("{}  : {}\n".format(k, temp))
    f.close()


file_list = file_finder(Search_path)
file_dict = file_read(*file_list)
file_list_generator(**file_dict)

```

出力されたテキストファイルはこんな感じです。
![2019-10-17 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432868/c77dab39-c259-6c06-41fd-04f2f8a6387a.png)


#解説
　関数毎に説明していきます。
  
　・file_finder() 　　　　　　　　
　・file_read(*list)　　　　　　　 
　・file_list_generator(**dict)

####file_finder()  #パス配下の.c/.hファイルを抽出,リストで返す
　
####file_read(*list)　　　　　　　 
####file_list_generator(**dict)
Reactで非同期処理が可能な副作用フックを作成する

# 1. 背景
Reactの比較的新しい機能であるフック(hooks)を用いると、以下のように関数コンポーネント(function component)の内部で副作用を扱うことが可能になる。

```jsx:useEffectの例
const Hello = () => {
  useEffect(() => {
    console.log("hello, effect!");
  });

  return <div>Hello, World!</div>
};
```

この内部で`await`をしたいとしよう（例えば、外部のAPIからデータを取得したい場合など）。
`await`を実行する関数は`async`でなければならないので、単純に以下のように修正してみると、Warningが表示されてしまう。

```jsx:うまくいかない例
const Hello = () => {
  useEffect(async () => {
    const data = await fetch("http://qiita.com/");
  });

  return <div>Hello, World!</div>
};
```

# 2. 解決策
`useEffect()`に非同期関数を渡すのではなく、`useEffect()`に渡される関数の中で非同期関数を定義し、呼び出すようにすれば良い。

```jsx:
const Hello = () => {
  useEffect(() => {
    const asyncFunc = async () => {
      const data = await fetch("http://qiita.com/");
    };
    asyncFunc();
  });
  return <div>Hello, World!</div>
};
```

## 解決策に対応するカスタムフックの作成
さらに、以下のようなカスタムフック`useAsyncEffect()`を作成することで上記解決策のロジックを抽出できる。

```jsx:カスタムフックuseAsyncEffec()の作成
export function useAsyncEffect(asyncFunc, deps) {
  useEffect(() => {
    (async () => {
      asyncFunc();
    })();
  }, deps)
}
```

これを用いると、先述の解決策は以下のように簡単に書き換えることができる。

```jsx
const Hello = () => {
  useAsyncEffect(async () => {
    const data = await fetch("http://qiita.com/");
  });

  return <div>Hello, World!</div>
};
```

# 3. 追記：クリーンアップを要する副作用の場合
上記の`useAsyncEffect()`では[クリーンアップを有する副作用](https://ja.reactjs.org/docs/hooks-effect.html#example-using-hooks-1)を上手く扱うことができない。
通常の`useEffect()`のように`useAsyncEffect()`内でクリーンアップ関数をreturnできるようにしたかったが、厳しそうなので、ひとまず以下のように`useAsyncEffect()`の引数として渡す形をとることにした。

```jsx
export function useAsyncEffect(asyncFunc, deps, cleanup=() => {}) {
  useEffect(() => {
    (async () => {
      asyncFunc();
    })();
    return cleanup;
  }, deps);
}
```

cleanupを渡すときのスコープが変わってしまうため、このままでは上手くいかないケースも考えられる...
Rubyの基本箇所についての復習①(puts)

#はじめに

[JavaScriptについての記事](https://qiita.com/Moon1126Snow/items/cc71950a1a2c824bedd8)を書かせて頂いてますが、同じようにRubyについての記事を復習をかねて書いていきたいと思います。

#終わりにまで読むと？

最終的には簡単なクイズアプリを作れる記事にしていきたいですが、
その第一歩目の、”文字の出力”について学んでいただきたいです。

#実行

Rubyでは、1,2,3のような数字や、朝、昼、夕のような文字列、[2,4,6]のような配列など様々なデータが存在し、それに対してメソッドを実行することで色んな表現を行っていきます。

###文字列を表示する
まずは、基本的なメソッドである"putsを利用して、好きな文字を入力することにします。

```ruby
puts "Hello world"
```
このプログラムを実行すれば「Hello world」と出力します。
今回のように文章を出力する場合は、出力したい文章をダブルクォーテーションで囲んでください。

###変数を使う
次に変数を使った表現を見ていきます。

```ruby
word = "Hello world"
puts word
```

"Hello world"を変数wordに代入し、それをputsすることによって、先ほどと同じ結果が得られます。
この時、```puts "word"```としてしまうと、wordが変数としてではなく、そういう文字と判断されて、"Hello world"ではなく"word"と出力されてしまうので注意が必要です。

#終わりに
本記事では基本的な部分についてのみ書かせていただきました。
[次の記事](https://qiita.com/Moon1126Snow/items/d2c0896ea076587eccc0)では、もうちょっと複雑なputsの使い方や、数字・配列についても触れようと思います。
Composerってすごいなぁ

Composerまわりで，知ったことを簡単にまとめてみた。
### Composerとは
- パッケージ依存管理ツール 
    - 参照するライブラリが，参照する他のライブラリもまとめてとってきてくれる。
- phpの心の友。
    - phpでは，クラスファイルを呼ぶとき，requireとか使うけど，composer.jsonに必要な情報を記述すれば，それが必要なくなる。
- Laravelでもバリバリ使われてる。
    - Laravelでは，すでにcomposer.jsonが用意されている。

### composer.lockとは
- composerで何かインストールしたときなどのログが記述される。
    - Gitなどで，チーム開発する際に，同じバージョンを共有できる。
仙台CTF 2017 [Mal03] マルウェアの通信先（LNK編） 100

#問題

http://ctf.sectanlab.jp/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0218c748-5580-7464-b746-bd1c052e6f20.png)

#解いてみた

問題のファイルを見てみるとショートカットファイルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c6ccf1e1-6fc2-0151-183d-2889244ba4e0.png)

プロパティを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bda8f028-8065-9d01-2fed-d133525a95b0.png)

怪しげな文字があるので、テキストにコピペしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5f908222-3832-e465-07c9-015fd15d0ebf.png)

URLがそのまま載ってました。
仙台CTF 2017 [Mal02] マルウェアの通信先（JS編） 100

#問題

http://ctf.sectanlab.jp/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7011a641-2386-dde8-e9b2-a32ad9d3af37.png)

#解いてみた

問題のファイルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/96df4f88-3780-291b-3d2f-7d6d5300b021.png)

1行目の数字の羅列が何なのかっていう問題のようです。

cyberchefを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/effda97d-36e5-01f5-b353-6bc2e6814475.png)

これが答え。
pandas-profilingによるデータの概観

#pandas-profilingとは
pandasのデータフレーム型のオブジェクトに関して、そのデータに関する概要を基本的な観点から確認することを容易にするレポートを生成できるライブラリ。機械学習モデルの検討の初期段階における探索的データ解析（Exploratory data analysis、EDA)にて役立ちそう。

###インストール


```
pip install pandas-profiling
```
※ condaでインストールすると、pandas-profiling-1.4がインストールされ、このバージョンではエラーが吐かれてしまったため、避けました。

###実行

データはお馴染みの、kaggle タイタニック号の生存者予測のデータを使います。

```python
import pandas as pd
import pandas_profiling as pdp

X = pd.read_csv('input/train.csv')
profile = pdp.ProfileReport(X)
profile.to_file(output_file="titanic.html")
```

ディレクトリにtitanic.htmlというレポートが生成されました。
私のマシンでは20秒程度かかりました。

##結果の見方
レポートは5つのセクションに分かれています。

1. Overview
2. Variables
3. Correlations
4. Missing values
5. Sample

###Overview

文字通りデータの概要の情報を確認できます。
![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310218/94246f93-d5e0-c58f-0e4d-8f985b3b659f.png)

- Dataset infoでは、列数、行数、メモリ上でのデータサイズ、一行あたりの平均メモリ上データサイズなどを確認できます。
- Variables typesでは、変数タイプ毎に特徴量（列）数を集計しています。
- Warningsでは、注意が必要な列に関して示しています。ここでは、欠損値やゼロが含まれる列に関して教えてくれます。
- Cabin列に関して、「Cabin has a high cardinality: 148 distinct values」とありますが、cardinalityとは「カラムの値の種類の絶対数」を指し、「カラムの値の種類がレコード数に比べて多い」ことを意味しています。

###Variables
このセクションでは、各特徴量の情報を確認できます。
![variables.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310218/58580be3-0b35-f085-1be7-65d54327b114.png)

- 変数タイプがNumericの場合にはヒストグラム、categoricalの場合にはラベル毎の頻度を示す棒グラフが表示されます。
- 注意が必要な個所が赤で示されます。
- 右下のToggle detailsをクリックすると、各変数についてさらに詳細な情報が確認できます。
    - 個人的にはToggle detailsで異常値（extreme values）が表示されるのが便利と感じました。

###Correlations
変数間の相関を確認できます。
![correlations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310218/dcea2f48-d836-ee74-421e-cb0a4228d7e1.png)

- ピアソンの積率相関係数に加え、タブを切り替えてスピアマンの順位相関係数、ケンドールの順位相関係数などのマトリクスを表示します。


###Missing values
欠損値に関する情報を確認できます。
![missing values.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310218/40959555-2af8-667f-6707-dd939614f377.png)

- Countタブで各列の欠損値数の棒グラフを表示
- Matrixでは欠損有無をセルの塗りつぶしで示した行列のマトリクスを表示
- Heatmapでは欠損がある列同士の欠損有無の相関を表示
- 欠損傾向が類似している列グループを示すデンドログラムを表示

###Sample
データの最初と最後の10件を表示できます。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310218/567445ed-6481-a37e-c6d9-99722e89a569.png)


非常に便利そうなライブラリなので、ぜひ活用したいと思います。
Laravelのプロジェクトをローカル環境で作成してみた

# Laravelのプロジェクトを作成

Virtual Boxで仮想環境を作成し，その上にプロジェクトを作るのが普通かもしれないが，いろいろ面倒だったので，ローカルで環境を作成することに。
## 環境
- Windows10 Home 1809
- php 7.2.12
- Composer 1.8.6

## 手順
### 1. phpのインストール
- phpが適切にインストールできたかは，コマンドプロンプトから確認できる。

```
php --version
```

### 2. composerのインストール
- phpのインストール先を聞かれるので，phpをインストール後に作業する。

### 3. Laravelのプロジェクトの作成
- コマンドプロンプトで，プロジェクトを作成したい場所に移動する。
- 下記を実行すれば，HogeHogeProjectという名前で，最新版をとってこれる。

```
composer create-project --prefer-dist laravel/laravel HogeHogeProject
```
- アバストとかいう無料のウイルス対策ソフトを入れてると，プロジェクトの作成にめっちゃ時間かかる（ウイルスバスターの方は早かった印象）。

### 4. プロジェクトの実行
- コマンドプロンプトで，作成したプロジェクト内に移動する。
- 下記を実行して，LaravelのWelcomeページを，ローカルサーバーで起動。

```
php artisan serve --host localhost
```
- localhostの部分は，IPアドレスでもいける。
- http://localhost:8000 でWelcomeページにアクセスできる。
- ローカルサーバーをとめるときは，Ctrl + C

## 参考記事
- [PHP入門](https://webkaru.net/php/windows-php-instal/)
- [【PHP】Composerは絶対必要!インストール方法と解説で完全攻略](https://www.sejuku.net/blog/82454)
仙台CTF 2017 [Mal01] マルウェアの通信先（EXE編） 100

#問題

http://ctf.sectanlab.jp/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0ab4d132-3212-1220-323d-3c6e4123e777.png)

#解いてみた

添付ファイルをダウンロードして開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b1039de2-926a-5df0-dafc-d8c56abb2bb4.png)

サクラエディタで開いて「http」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ca85b61b-cc7f-e9e3-160b-7d437d087219.png)

そのまま書かれているのがそのまま正解。
[決算]株価収益率(PER)を計算する機能を設計 & 実装してみた

[前回](https://qiita.com/whity/items/e66b54760100ba297b3a) EPSの実装をしたので
今回はEPSと株価で算出できるPERという値をクラス化してみた

# 株価収益率(PER: Price Earnings Ratio)の計算方法

```
PER(倍) = 株価 / EPS
```

PERをざっくり説明すると「低いほど割安、高いほど割高」らしい

## 実装方針

EPSが株価をもらってPERを計算できるようにしてみる

## まず株価クラスを作成

```ruby:stock_price.rb
class StockPrice < NumericalValue
  # @param [BigDecimal] value (単位:円)
  def post_initialize(value)
    raise TypeError, '株価は1以上で指定してください' unless value.positive?
  end
end
```

## 次にPERクラスを作成

```ruby:per.rb
class PER < NumericalValue
  # @param [BigDecimal] value (単位:倍)
  def post_initialize(value)
    # 特に無し
  end
end
```

## 最後にPERを返すメソッドをEPSに追加

```ruby:eps.rb
class EPS < NumericalValue
  # 省略

  # @param [StockPrice] stock_price 株価
  # @return [PER]
  def per(stock_price)
    raise TypeError, 'StockPriceを指定してください' unless stock_price.kind_of?(StockPrice)

    PER.new(stock_price.to_d.div(to_d))
  end
end
```

## EPSのテスト

```ruby:eps_spec.rb
RSpec.describe EPS do
  describe 'PERを計算' do
    it do
      eps = described_class.new(23.11)
      stock_price = StockPrice.new(2620.0)
      per = eps.per(stock_price)
      expect(per.to_d).to be_within(0.01).of(113.37)
    end
  end
end
```

## todo

本筋と関係ないがpost_initializeが不要なクラスには実装しなくて良い気がしてきた
仙台CTF 2017 [ForX-2] FAT32フォーマット日時（確認問題） 300

#問題

http://ctf.sectanlab.jp/2017/challenges
ドメイン変わりましたか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6a73fe65-8964-3b44-48a1-00d2ca175ca8.png)

#解いてみた

確認問題？

[仙台CTF2017 [ForX] FAT32フォーマット日時 300](https://qiita.com/CTFman/items/1b9a98d855cf9b912f1b)
と同じように解いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fd46f45d-9c80-b530-3f1a-f7a3c96e293e.png)

これが答えかなと思ったら、なんと違いました！
なるほど私の解き方は実は正しくないということですね。。。

方針としては

1. どこかにフォーマットした日時が残っている
2. 日本以外のタイムゾーンでフォーマットしていて、日時を変換する必要がある

のどちらかを考えたい。

1はgoogle検索してみましたが、見つからなかったのでいったん保留。
2をやります。
タイムゾーンよくわかりませんけど、とりあえず1時間ずつずらしてみる。

結局　2017/12/02-17:48:08　から　2017/12/03-19:48:08まで全部やってみたけど、全部違いまいした。

1をもう一度調べてみるものの、それっぽいものに行きあたらない。

ここで3を思いつく。

3 「System Volume Information」は削除できるから、フォーマット後に一度削除してるのではないか。

ということで復元ソフトを使ってみたいところ。

ネットで検索して出てきたRecuvaをインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/df4009d7-a076-9cc6-55e5-f768be822220.png)

ん！これ割といい感じに進んでる気がしません？
とりあえず3つとも復元してみます。

本編と関係ないけどExcelが気になるので開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3a79c215-e589-67e4-1895-ea55b869c97b.png)

謎の家計簿。

WPSettings.datのファイル作成日時を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6a597a1f-8f96-963f-9c46-dcf49e1b0f75.png)

作成日時が答えだろうと思って入力してみましたが、外れでした。
更新日時も同様でした。
アクセス日時も同様でした。

IndexerVolumeGuidのファイル作成日時を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/58bda445-e3ed-0a55-7bd1-1829efc1153e.png)

どれもダメでした。

Excelに戻って

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fe216551-8d64-0fad-7c0b-73ff3421a1f4.png)

前回保存日時は秒がないけどとりあえず00でやってみたものの不正解。
コンテンツ作成日時は2015年になってるのでこれは違うでしょう。
といいつつ一応入れてみる。不正解です。

Excelはzipだから、拡張子をzipに変えて解凍してみる。
そして「2017」でgrep。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/89caefc3-8786-748d-7c8d-336778dfb237.png)

そうするとファイル作成日時と更新日時の秒まであるものが抽出できました。
UTCで記録されていたのでこれに9時間足したものを入力してみましたが、不正解でした。
一応9時間足す前の状態でも入力してみましたが、不正解でした。

よくわからんので、この問題は後回し。
sbtのprojectディレクトリについて

今までなんとなくでやってきたので、自戒を込めてメモです。

sbtでサブプロジェクトを定義する方法を調べている最中に見つけたものです。

### 初期状態
`sbt`でプロジェクトを作成すると、だいたいこんな構成になります。

```
app
  /project
    build.properties
  /src
    /main
      /scala
  build.sbt
```

`build.sbt`の中身はこんな感じです。

```scala:build.sbt
name := "app"
version := "0.1"
scalaVersion := "2.12.8"
```

初期だと、アプリ名とバージョン指定するものに見えるので、役割が分かりづらいです。

###  build.sbtの役割
ビルド定義のルートファイルとしての役割を持ちます。

ビルド定義として記述するのは、おおむねこのようなものになります。

* 参照するライブラリ定義
* 警告やエラーの定義
* 特定のコマンドを拡張

`build.sbt`の中に、すべてのプロジェクトのビルド定義を記載することも可能です。

### projectディレクトリ

[sbtの文書](https://www.scala-sbt.org/1.x/docs/ja/Organizing-Build.html) によれば、

> project ディレクトリは、ビルドをビルドする方法を記述したビルドの中のビルドだ。

と記載されています。要するに、ビルド定義を分割して記述できる、ということです。

なお、最初から格納されている`build.properties`は、ビルドに使うsbtのバージョンを指定します。

参考：[sbtバージョンの指定](https://www.scala-sbt.org/1.x/docs/ja/Basic-Def.html#sbt+%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E6%8C%87%E5%AE%9A)

#### よくある分割
依存関係のライブラリを管理する場合、`Dependencies.scala`という名前が良く使われるようです。


sbtのページで紹介されている

```
sbt new sbt/scala-seed.g8
```

コマンドで作成できるプロジェクトでは、以下のように定義されています。

```scala:Dependencies.scala
import sbt._

object Dependencies {
  lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5"
}
```

そして、build.sbtはこのように記述されています。

```scala:build.sbt
import Dependencies._

ThisBuild / scalaVersion     := "2.12.8"
ThisBuild / version          := "0.1.0-SNAPSHOT"
ThisBuild / organization     := "com.example"
ThisBuild / organizationName := "example"

lazy val root = (project in file("."))
  .settings(
    name := "Hello",
    libraryDependencies += scalaTest % Test
  )
# 以下省略
```
このように、`import Dependencies._`で、`project`ディレクトリ配下のファイルを参照できます。

#### ファイル名など
慣例的に、依存ファイルの管理には`Dependencies.scala`というファイルが使われるようです。ただ、sbtの仕様としては、

> ファイル名は何でもよい

となっています。`project`ディレクトリ以下に、拡張子が`.scala`または`.sbt`のファイルが格納されていればよい、と記載されています。

### ファイル分割が必要なケース

>  build.sbt において、トップレベルで object や class を定義することはできない。 それらが必要なら project/ 配下にScala ソースファイル (.scala) を置くべきだろう。

とのことです。どうしてもclassが必要な場合、というのが、私には思いつかないです。いろいろなプロジェクト調べてみると、何かわかるかもしれません。

とはいえ、

> また .scala ファイルを使うかどうかの判断には、君や君のチームがどれくらい Scala に慣れているかということも関係するだろう。

という記述もあるので、慣れるまでは無理に使わないほうが良いのだろうと思います。

sbtの文書を読まないと、と思い始めたあたりが、使い始める良い頃合いなのかもしれません。


### 参考
[sbt - ビルド定義](https://www.scala-sbt.org/1.x/docs/ja/Basic-Def.html)

[sbt - ビルドの整理](https://www.scala-sbt.org/1.x/docs/ja/Organizing-Build.html)

[sbt - Hello World!](https://www.scala-sbt.org/1.x/docs/ja/Hello.html)
PC周りの記憶領域について

インフラ周りを勉強した際に，知ったこと（今回は記憶領域について）を簡単にまとめてみた。

### メインメモリ
- CPUが何かしらの処理をする上で，一時的に使用する記憶領域。
- CPUを仕事をする人に例えるなら，メモリは仕事机みたいなもの。

### ストレージ
- 長期的にデータを保存するためのものの総称。
- HDD，SSD，USBは，ストレージの一種。
- CPUを仕事をする人，メモリを仕事机とするなら，ストレージは引き出し。

### キャッシュメモリ
- メモリより，高速に動く記憶領域。
    - キャッシュメモリは，CPU内部にあり，メモリよりもCPUコアに近い位置にいるため高速。
    - メインメモリは，CPU内部のメモリコントローラーを挟むため，レイテンシーが高い。
- メモリより，保持できる情報が少ない。
    -  キャッシュメモリの領域を大きくしようとすれば，「メモリなんていらない！」と思ってしまうが，そもそも物理的に大きな領域を持つキャッシュメモリを作れない。

### レジスタ
- CPUが求める結果の途中で出した計算結果を，一時的に保持しておく記憶領域。
    -  1+2+3を計算する。この計算の途中で，1+2=3とし，3+3を計算する。この1+2=3という計算結果を一時的に覚えておく場所。
- 次の処理をするものの場所を覚えておくもの。
    -  処理A，処理Bがあって，処理Aをしている間に，「次は処理Bをしなきゃ！」って思う時がある。この処理Bをするためのものの場所を覚えておくこともできる。
PostgreSQL12にpgBadgerをインストールしたときのメモ

# はじめに

pgBadgerはPostgreSQLのログファイルを解析しレポートを出力するツールです。

- [v8.x sample reports](http://pgbadger.darold.net/samplev7.html)

上の公式サイトにサンプルがあり、次のようなレポートを表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/1ec6bee0-50ca-9c7c-7a55-9f012c1ff057.png)

今回はPostgreSQL12にpgBadgerをインストールしてみます。
特に新しい情報はなく、以下のサイトを参考に実施しただけのメモです。

- [pgBadger (PostgreSQL のログ解析ツール)](https://www.sraoss.co.jp/tech-blog/pgsql/pgBadger/)
- [pgBadgerでログファイルを解析し、統計レポートを作成する](https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgre/pgbadger/?article-index)


# pgBadgerのインストールと設定

PostgreSQL12はRPMでインストールしたので、pgBadgerもRPMからインストールします。

```
# yum install -y pgbadger
～省略～
Installed:
  pgbadger.noarch 0:11.1-1.rhel7                                                                                                       

Dependency Installed:
  perl-Text-CSV_XS.x86_64 0:1.00-3.el7  
```

postgres.confの設定は以下のように変更しています。

```
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 0 # 0にすると全てのクエリが保存されるので、1000(ms)にしても良い
log_line_prefix = '%t [%p]: [%l-1] user=%u, db=%d'
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
lc_messages = 'C'
log_autovacuum_min_duration = 0
log_error_verbosity = default
```

# Apache HTTPDのインストール

レポートはHTMLファイルで出力されるので、Webサーバもたてておきます。

```
# yum install -y httpd
# systemctl start httpd
# systemctl enable httpd
```


# レポートの出力

以下のコマンドでレポートを出力します。

```
# /usr/bin/pgbadger -f '%t [%p]: [%l-1] user=%u, db=%d' -I -q /data/log/postgresql*.log -O /var/www/html/
```

出力したレポートは次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f51e4d49-815b-9a4a-8145-e93bf6eb704d.png)

毎日自動でレポートを出力するには、次のようにcronに登録しておきます。

```
0 4 * * * /usr/bin/pgbadger --retention 2 -I -q /data/log/postgresql.YYYY-mm-dd-HHMMSS -O /var/www/pg_reports/
```


# 参考

- [PGBADGER DOCUMENTATION](http://pgbadger.darold.net/documentation.html#REQUIREMENT)
- [pgBadger (PostgreSQL のログ解析ツール)](https://www.sraoss.co.jp/tech-blog/pgsql/pgBadger/)
- [pgBadgerでログファイルを解析し、統計レポートを作成する](https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgre/pgbadger/?article-index)
Azure WebApp から Azure Blob Storage にデータを読み書きする

この前作成した おさかな判別アプリは単純にアップロードしてフロントサイドのみで処理をするものでした。
次の段階として、画像をデータベースにアップロードしたことをトリガーとして、Azure Functions から Custom Vision を呼び出すようにしたいです。その前段階として、Azure WebApp から Azure Blob Storage に画像を読み書きする方法を整理します。

#サンプルを Git する
Microsoft が公開している良いサンプルがありましたので、こちらのコードを見て整理したいと思います。自分の開発環境で、Git Clone します。

```
git clone https://github.com/Azure-Samples/storage-blob-upload-from-webapp.git
```

サンプルの中の Controller を見てみます。

```c#

 public class ImagesController : Controller
    {
        // make sure that appsettings.json is filled with the necessary details of the azure storage
        private readonly AzureStorageConfig storageConfig = null;

        public ImagesController(IOptions<AzureStorageConfig> config)
        {
            storageConfig = config.Value;
        }

```

この ImageController で BlobStorage への画像のアップロードを行っています。この中に Storage の String 等を取っているであろう config があります。実際に Storage Account につなぐための Key などは「appsetting.json」に入れます。

```json
{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },

    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "AzureStorageConfig": {
    "AccountName": "",
    "AccountKey": "",
    "ImageContainer": "images",
    "ThumbnailContainer": "thumbnails"
  }
} 
```

この AccountName / AccountKey に Azure Portal で Blob Storage を作成した際の値を入れるみたいですね。

#Azure Blob Storage を作成し Key 取得する
Azure Portal から　Blob Storage を作成する方法は超簡単です。以下 Document に従って作成します。

Azure portal を使用して BLOB をアップロード、ダウンロード、および一覧表示する
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-portal

#Visual Studio で Deploy してみる
Account Name と Access Key を入力して Deploy すると、ローカルIIS で Web Page が立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/49870b45-abc3-3f6f-172d-0df9fdd675fa.png)

ここに実際に画像をアップロードしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/dd05bb55-6698-2b8e-d8ad-06f1353f5627.png)

こちらの画像をアップロードすると、Azure Blob Storage に 画像がアップロードされます。
アップロードされた画像はAzure Portal から簡単に見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/c90501b5-bf27-6dda-5a16-06dce720d264.png)

これでアップロードが完了したことが分かります。
Blob Storage にアップロードされたことは、Azure Functions でトリガーとした扱うことができます。それをトリガーとして Custom Vision API を 読みだすことができれば Azure Blob / Azure Functions / Azure Custom Vision を連携させたアプリケーションの開発が可能です。次回の記事では Azure Functions で Blob をトリガーとして Custom Vision API を読みだすデモを作成したいと思います。
Pythonでユニットテスト書いてみよう－１

## 概要
Pythonのユニットテストの手法について、下記の３つのライブラリを用いて、3回に分けて紹介します。
1. [unittest](https://docs.python.org/ja/3/library/unittest.html)
2. [doctest](https://docs.python.org/ja/3/library/doctest.html)
3. [pytest](https://pypi.org/project/pytest/)
初心者向けの内容であり、どのようにユニットテストを実装するか基礎の基礎を紹介します。


今回は、unittestについて紹介します。

## UnitTest
[公式サイト](https://docs.python.org/ja/3/library/unittest.html)によると、「unittest は元々 JUnit に触発されたもので、 他の言語の主要なユニットテストフレームワークと同じような感じです。」と書いてあります。**Pythonをインストールした時点で利用可能**になっているので、第三者のライブラリをインストールする必要がありません。Pythonの環境さえあれば、簡単に検証ができます。

基本的にunittestは、以下の順に書きます
1. unittestライブラリをインポートする
2. unittest.TestCaseを継承したクラスを作る
3. 上記で作ったクラスに、テストケースを記述したメソッドを作る
4. 上記で作ったメソッドの中にテストケースを書く
5. unittest.main()でテストを実行する

```python
# 1. unittestのインポート
import unittest

# 2. クラスの作成
class TestXxx(unittest.TestCase):
    # 3. テストケースを記述したメソッド
    def test_xxx(self):
        # 4. テストケースを記入
        self.assertEqual(xxx(2),4)

if __name__ == '__main__':
    # 5. 実行
    unittest.main()
```


#### Let's Code
それでは、二つの数字を引数として受け取り、その足し算を返す関数を作り、ユニットテストを実装してみましょう。
足し算する関数を以下のようにしましょう。

```python
def add(x, y):
    '''
    引数として受けた数字を足し算し、
    その結果を返す
    '''
    return x + y
```

続いて、上で紹介した5つの順に沿ってテストケースを書きましょう。
「add」関数に引数として「２」と「３」を渡した時に「５」が返ってこなければならないの意味を持ったテストケースを書きます。

```python
# ①unittestのインポート
import unittest

# ②unittest.TestCaseを継承したクラスの作成
class TestMyClass(unittest.TestCase):
# ③テストケースを記述したメソッド
    def test_add(self):
        # ④テストケースを記述
        self.assertEqual(add(2,3),5)

# ⑤unittest.main()でテストを実行
if __name__ == '__main__':
    unittest.main()
```

個人的にはクラスの名前は***TestXxx***そして、メソッドの名前は***test_xxx***にするの好きです。
例えば、Calculatorというテスト対象のクラスがあった場合は以下の名称をつけます。
テストクラス名：TestCalculator
メソッド名:test_add, test_minus, test_product

補足：
上記のテストケースでは、assertEqualを使っていますが、assertNotEqual、assertTrueなど他にたくさんあるので、[こちらを見てください。](https://docs.python.org/ja/3/library/unittest.html#assert-methods)


#### 実行
本来は、テスト対象の関数とテストケースを別々のファイルに書きますが、今回は、基礎を理解する目的ですので、全処理を一つのファイルに記述します。上で書いたコードをまとめますと以下のようになります。

```python

# unittestのインポート
import unittest

def add(x, y):
    '''
    引数として受けた数字を足し算し、
    その結果を返す
    '''
    return x + y

class TestMyClass(unittest.TestCase):
    def test_add(self):
        '''
        上記の「add」関数に対してのテストケースを記述
        '''
        self.assertEqual(add(2,3),5)


if __name__ == '__main__':
    unittest.main()
```
こちらの内容をtest_sample.pyとして適当な場所に保存してください。そして、タミナルからファイルを保存したフォルダーに移動し、**python test_samply.py**を実行してください。

```bash
$ python test_sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
```
こちらの出力の意味は、一つのテストケースが成功したという事です。


## 最後に
テストケースを色々書いて、どのような結果が得られるか見てみて下さい。
また、[こちらを参考](https://docs.python.org/ja/3/library/unittest.html#assert-methods)にassertEqual以外のメソッドを使ってみてください。

[続いてdoctest](https://qiita.com/_dakc_/items/6330bd56bdaae80c1cca)についても書いておりますので、違いを比較してみてください。
Elmで int -> 3桁区切り文字列 の変換をする

### やりたいこと
elmで 1234567890 みたいなintを 1,234,567,890 のように、読みやすく,を打ったStringに変換したい

### コメントでコードを紹介いただきました
(2020-03-21 追記)
コメントで @SuzumiyaAoba さんに書いていただいたコードの方が綺麗なので、こちらを利用いただいた方が良いかと思います。確かに割り算する意味なかった。。。
https://qiita.com/miyatsuki/items/1db2540c118ea0d1b3cd#comment-e9f244959b0566ec1a6a

また、メモリ消費量（スタックフレーム）の観点でもこちらの方が有利とのことです。
参考・末尾再帰の最適化: https://qiita.com/pebblip/items/cf8d3230969b2f6b3132

(2020-03-21 追記2)
さらに話が進み、より汎用的なパターンとして下記2つを提示いただきました。
https://qiita.com/miyatsuki/items/1db2540c118ea0d1b3cd#comment-d3785141a58867d02cbb

* String-Extraのライブラリを使ったパターン(ただし2回reverseする必要があるのでエレガントではないかも）

``` one-line.elm
String.join "," (List.reverse (String.Extra.break 3 (String.reverse)))
```

* ↑でも使っているString-Extraのbreakと同じ感じで実装したパターン <br>
https://package.elm-lang.org/packages/elm-community/string-extra/latest/String-Extra

``` impl.elm
breakRight : Int -> String -> List String
breakRight width string =
    if width == 0 || string == "" then
        [ string ]

    else
        breakerRight width string []


breakerRight : Int -> String -> List String -> List String
breakerRight width string acc =
    case string of
        "" ->
            acc

        _ ->
            breakerRight width
                (String.dropRight width string)
                (String.right width string :: acc)


thousandSeparator : Int -> String
thousandSeparator num =
    String.join "," (breakRight 3 (String.fromInt num))
```



### 定義 (もともとこの記事で解として記載していたコード)

（多分使わない方がいいと思いますが、一応残しておきます）

```elm
--- 追記(20191020): 公式でpadleft関数が用意されてたのでそちらを使うようにする

--- zeroPadding 0埋めしたい数字 桁数
-- zeroPadding : Int -> Int -> String
-- zeroPadding num digit =
--    String.right 3 ("000" ++ String.fromInt num)


--- toIntString 桁区切りしたい数字 False
--- 第二引数にTrueを渡すと一番最後にも,がついてしまう
toIntString : Int -> Bool -> String
toIntString num addsLastComma =
    let
        comma : String
        comma =
            if addsLastComma then
                ","

            else
                ""
    in
    if num >= 1000 then
        toIntString (num // 1000) True ++ (String.padLeft 3 '0' (String.fromInt (modBy 1000 num))) ++ comma
    else
        String.fromInt (modBy 1000 num) ++ comma
```


### 使い方

```elm
--- 桁区切り: 1234567890 -> 1,234,567,890
toIntString 1234567890 False

--- 0埋め 12 -> 0012
zeroPadding 12 4
```

### 動きの例

入力として、`1234567890` が与えられたとすると、次のような処理が再帰的に動く

toIntString 1234567890 False
= (toIntString 1234567 True) ++ (padLeft 3 '0' "890")
= ((toIntString 1234 True) ++ "," ++ (padLeft 3 '0' "567")) ++ (padLeft 3 '0' "890")
= (((toIntString 1 True) ++ (padLeft 3 '0' "234")) ++ "," ++ (padLeft 3 '0' "567")) ++ (padLeft 3 '0' "890")
= (((String.fromInt 1) ++ "," ++ (padLeft 3 '0' "234")) ++ "," ++ (zeroPadding 567 3)) ++ (padLeft 3 '0' "890")
= "1,234,567,890"
Apache + phpで大きいサイズのファイルをアップロードしたい

# 大きいファイルをアップロードしたい
## 前提環境
* Apache + php
* DNS解決にnginxのSSLProxy

## 事象
413(Pay Load Too Large)が表示された
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/413

## 原因
サーバーまでのどこかしらでアップロードサイズ制限に引っかかっている

## 調査
### アクセスログ
```
[root@venusDev41 ~]# tailf /var/log/httpd/dev.xxxxx-access.log | grep " 413 "

```
何もでない

### php設定
#### /etc/php.ini
```
post_max_size = 8M
upload_max_filesize = 8M
```
問題なさそう

### Apache設定
#### /etc/httpd/conf/httpd.conf
```
LimitRequestBody 0
```
いれてみたが解決せず

## ここまで仮説
### そもそもアクセスログが出てない＝開発サーバーまで来ていない
### SSLProxy側のnginxで殺されている

## nginx設定
/etc/nginx/nginx.conf

```
client_max_body_size 1m
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
```
↓

```
client_max_body_size 10m
proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
```

無事にアップロードできた。
メモ：bootstrapモーダル上でselect2を動かす

この記事は
===

* メモ以外の何者でもないのでスルーしてください

やりたかったこと
===

* [select2](https://github.com/select2/select2)っていう高機能プルダウン部品があって便利です
* なぜかbootstrapのモーダル上にこのselect2を配置すると動かなかったので動かしたかったです

やり方
===

* 下記のようなhtmlだとします

```html
<div id="select-wrapper">
  <select id="select2">
    <option>....
  </select>
</div>
```
* 下記のような感じで```dropdownParent```というオプションをつけると解決です

```js

$('#select2').select2({
  dropdownParent: $("#select-wrapper"),
})
```

終わりに
===

* なんとなくzIndex系の問題な気はするけど追ってない
見ているサイトのタイトルをコピーするブックマークレット

記事を書いているときに参考にしたウェブページを掲載しますが、タイトルのコピーが厄介です。

そんなときのために、表示しているページのタイトルをコピーするブックマークレットをご紹介します。

```ts
(() => {
  // タイトルを参照
  const title = document.title;

  // コピーの元にするtextareaを作成
  const textarea = document.createElement('textarea');
  textarea.textContent = title;

  // bodyタグの最後にtextareaを追加
  document.body.appendChild(textarea);
  
  // textareaの内容をクリップボードにコピー
  textarea.select();
  document.execCommand('copy');

  // 最初に作成したtextareaをbodyから削除
  document.body.removeChild(textarea);

  console.log(`Copyed this website title "${title}"`);
})();
```

Minified:

```ts
(()=>{const e=document.title,t=document.createElement("textarea");t.textContent=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),console.log(`Copyed this website title "${e}"`)})();
```

使い方：

冒頭に`javascript:`をつけてブックマークに保存してください。あとは、登録したブックマークを実行したらタイトルがコピーできるようになります。

```ts
javascript(()=>{const...});
```