OmniAICreator/Qiita-1.07M huggingface dataset:
PC整理&最適化した

パソコン
前回の投稿から１ヶ月。その間PC整理&最適化した。
VTuberが始まると忙しくなるのでそれに間に合うまで、頭を完全に切り替えないといけないと思った。
頭の中をほぼ完全に切り替えるために、 PC最適化が一番だと思った。

きっかけ理由： 今の自分を苦しめているから。頭の中＝今の自分＝PC(データ管理)。
「いつかは使うファイルは使わない」。これをどうにかしたいと思いました。辞書のように思っていた。
5年間の掃除youと取捨選択。過去との決別。

予想されるメリット
今までの自分の呪縛（幻想）から解放されそうだから。
判断力が向上しそうだから。
デメリット
二度と復元できない物もありうる。
時間手間がかかる。

結果
PC最適化されたことにより頭の中もスッキリした。

やり方
Phase1
1-1 不要なファイルは削除。（曖昧）
1-2 必要だと思うファイルは残す。
Phase2
2-1 不要な拡張子、
2-2 ファイルサイズ縮小、ファイル数縮小
2-3 自分の実験研究資料はやや必要。日記上にまとめたり。
2-4 関わらない分野は削除、キーワードで削除。（シャフト、）
Apple使用歴10年が使ってきたApple製品

今まで使ってきたApple製品
新しいのを買ったら更新する。

iPod, iPad, iPhone, Mac と幅広く使ってきました。

iPod

・iPod Shuffle 1st 512MB

・iPod Touch 4th 8GB

iPad

・iPad mini 1st 32GB

・iPad 1st 32GB

iPhone

・iPhone 5c Blue 32GB

・iPhone 5s 16GB

・iPhone 6s 64GB

・iPhone Xs MAX 512GB○

Mac

・Macbook pro late 2013 256GB○

以上9製品、順に使い心地を紹介します。

iPod

・iPod Shuffle 1st 512MB

初めて使ったAppleでiPodの音楽プレーヤー。小・中学生のころお気に入りだった。イナズマイレブンや家庭教師ヒットマンリボーンのアニソンやポケモンのBGMをよく聴いていた。

・iPod Touch 4th 8GB

初めてのiPod Touch。中高生のころお気に入りだった。当時ネットサーフィンできたことに感動した。ゲームやアニメもアプリも独特で面白かった。デザインやUIが独特だった。脱獄も楽しかった。

 

iPad

・iPad mini 1st 32GB

初めてのiPad。画面が大きくなったのでとても使いやすく便利だった。サブモニターやアニメ視聴、ゲームがやりやすかった。脱獄も楽しかった。

 

・IPad 1st 32GB

画面がさらに大きいので、アニメ視聴がやりやすかったサブ機。ブラウザの動作が重くなったり、アプリのバージョンが古いものしか対応してないのが欠点。

 

iPhone

・iPhone 5c Blue 32GB

使いやすい。携帯できる32GBなので、便利だった。

 

・iPhone 5s 16GB
画質が良くなったしばらくのメイン機。
容量が少ないのが欠点。

 

・iPhone 6s 64GB

さらにアップグレードした。しばらくのメイン機。

 

・iPhone Xs MAX 512GB○

ものすごくアップグレードした最新のメイン機。容量が増えと画質良くなり快適になった。

 

Mac

・Macbook Pro late 2013 256GB
OSが安定しており、不具合があまり起こらない。選んで良かったノートパソコン。

・Macbook Pro 2017 512GB
現行機。安心と信頼のハイクオリティー。
Terraform AWS AssumeRolePolicyのコピペで使えるサンプル集

#はじめに
思い出すのに時間がかかったりするので置いておく。

##IAM
###特定のユーザにだけAssumeRoleを許す

```tf
data "aws_iam_user" "username" {
  user_name = "hoghog"
}

data "aws_iam_policy_document" "AssumeRole" {
  version = "2012-10-17"

  statement {
    effect = "Allow"

    actions = ["sts:AssumeRole"]

    principals {
      type = "AWS"
      identifiers = [
        data.aws_iam_user.username.arn
      ]
    }
  }
}
```

###特定のIPアドレスにだけAssumeRoleを許す条件を追加

```tf
data "aws_iam_user" "username" {
  user_name = "hoghog"
}

data "aws_iam_policy_document" "AssumeRole" {
  version = "2012-10-17"

  statement {
    effect = "Allow"

    actions = ["sts:AssumeRole"]

    principals {
      type = "AWS"
      identifiers = [
        data.aws_iam_user.username.arn
      ]
    }

    condition {
      test     = "IpAddress"
      variable = "aws:SourceIp"
      values = [
        "127.0.0.1/32"
      ]
    }
  }
}
```

##Config

```tf
data "aws_iam_policy_document" "assume_role_policy_config" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["config.amazonaws.com"]
    }
  }
}
```

##EC2

```tf
data "aws_iam_policy_document" "assume_role_policy_ec2" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}
```

##Lambda
```tf
data "aws_iam_policy_document" "assume_role_policy_lambda" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com"]
    }
  }
}
```

##VPC Flow Logs
```tf
data "aws_iam_policy_document" "assume_role_policy_vpcflow" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["vpc-flow-logs.amazonaws.com"]
    }
  }
}
```
【Mac】余白なしで複数の画像をpdfに統合する方法

Macで複数の画像をpdfに統合するにはプレビューが主流。
どの記事も同じような内容だ。
Macのプレビューを使えば複数の画像をpdfに統合できるものの、余白が出来てしまう。
しかし、本記事は多くの競合とは異なります。
これから紹介する方法を使えば、簡単に余白なしで元画像の大きさをそのままの画像で統合することができる。

#🛡動作環境
macOS Mojave

#⚔手順

##1.Adobe Acrobat Pro DCを起動する
##2.ファイルを統合を選択する
##3.複数のファイルを追加する

##4.pdfとして保存する

 

以上です。簡単ですね。

プレビューの他に、オンラインでpdf統合することも可能です。セキュリティ的に安全なのかは断言はできません。大きな容量はアップロードできない、回数制限があるなど機能は限定されますね。

 

Smallpdf

https://smallpdf.com/jp/jpg-to-pdf

 

Windowsは探せば様々なpdf統合ソフトがあるのがメリットですね。
Rails6 のちょい足しな新機能を試す104（default_log_file 編）

# はじめに

Rails 6 に追加された新機能を試す第104段。 今回は、 `default_log_file` 編です。
Rails 6 では、 `default_log_file` メソッドが追加されました。

Ruby 2.6.5, Rails 6.0.0, Rails 5.2.3 で確認しました。

```shell
$ rails --version
Rails 6.0.0
```

今回は、User CRUD を作り、 `ApplicationController` の `before_action` を定義して、その中で、 `default_log_file` メソッドを使って確認していきます。


# Rails プロジェクトを作る

```
$ rails new rails_sandbox
cd rails_sandbox
```

# User の CRUD を作成する

```shell
$ bin/rails g scaffold User name
```

# ApplicationController を変更する

`ApplicationController` に `before_action` を追加します。
`before_action` の中でデフォルトのログファイルが存在しない場合、再度、デフォルトのログファイルにログを出力するようにします。


```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :reopen_log

  def reopen_log
    Rails.logger.reopen Rails.configuration.default_log_file unless File.exist?(Rails.configuration.paths['log'].first)
  end
end
```

# 実際にテストする

rails server を実行して、 http://localhost:3000/users にアクセスします。

この状態で、ログファイル名を変更します。

```shell
$ mv -i log/development.log log/old_development.log
```

再度、 http://localhost:3000/users にアクセスします。

log ディレクトリを確認すると2つのファイルができていることがわかります。

```shell
$ ls log
development.log  old_development.log
```

`Rails.logger.reopen` することで、それ以降のログ情報は、 `log/development.log` に書き込まれます。
仮に、 `Rails.logger.reopen` しなかった場合は、 `log/old_development.log` に書き込まれ続けます。
`default_log_file` メソッドは今回のように、　ログファイルがリネームされた場合などに、リネーム前のログファイルに出力できるようにするために追加されたメソッドのようです。 

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try104_default_log_file

# 参考情報

* [Extract default log file open operation to method](https://github.com/rails/rails/pull/36407)
* [Rails.logger.reopen does not work because the @logdev does not know it's @filename](https://github.com/rails/rails/issues/32211)
JavaScriptのthrow時returnありなし挙動

# returnなし

```javascript
(() => {
  try {
    throw "error"
  } catch(error) {
    console.error(error);
  }

  console.log("AAA");
})();

// error
// AAA
```

# returnあり

```javascript
(() => {
  try {
    throw "error"
  } catch(error) {
    console.error(error);
    return;
  }

  console.log("AAA");
})();

// error
```
S3をstatic webserver にしてるとき、javascript がキャッシュされる問題

## htmlから読み込んでるjsファイルが更新されない問題

### こんな場合

- S3で静的WEBホスティングしてる
- シェルコマンド(bash)使ってる
- AWS-CLI でcpコマンドしてローカルのディレクトリのファイルと同期とってる
- JSのキャッシュでブラウザからみると更新が反映されない
- さっき更新したやつだけ反映したい

覚えておくこと：
> --cache-control privete

(メタ情報 cache-control :privete) をつけると、キャッシュされない
no-cache,no-stroe より楽

注意すること：
 別の方法で上書きするとメタ情報はなくなる


```up.sh
#-- /directory_name にある5分以内に更新したファイルを${copyto_s3_location}にアップロードする

while read file `find /directory_name/ -type f -cmin -5`
do

ext=${file##*.}

if [ 'js' = "${ext}" ] ; then
    aws s3 cp \
    --content_type application/javascript \
    --cache-control privete \
    ${file} ${copyto_s3_location}
else
    aws s3 cp ${file} ${copyto_s3_location}
fi

done

```
Apache、PHPをDockerで作る

# これは何？
DockerでApache、PHP7.0のコンテナをチャチャッと作ったときのメモ。


# 内容

`Dockerfile`、`etc_apache2_conf-enabled_docker-php.conf`、`var_www_html_index.php`を同じディレクトリに保存する。


## Dockerfile
```dockerfile:Dockerfile
FROM php:7.0-apache

COPY ./etc_apache2_conf-enabled_docker-php.conf /etc/apache2/conf-enabled/docker-php.conf
COPY ./var_www_html_index.php /var/www/html/
```

```php:var_www_html_index.php
<?php phpinfo();
```

```config:etc_apache2_conf-enabled_docker-php.conf
<FilesMatch \.php$>
  SetHandler application/x-httpd-php
</FilesMatch>

DirectoryIndex disabled
DirectoryIndex var_www_html_index.php index.php index.html

<Directory /var/www/>
  Options -Indexes
  AllowOverride All
</Directory>
```

## コンテナを生成して動かす

```bash:今どこ？
$ ls -l
total 24
-rw-r--r--  1 xxx  yyy  171 Nov  5 11:27 Dockerfile
-rw-r--r--  1 xxx  yyy  233 Nov  5 11:26 etc_apache2_conf-enabled_docker-php.conf
-rw-r--r--  1 xxx  yyy   17 Nov  5 11:17 var_www_html_index.php
```

```bash:buildする
$ docker build --tag php70-apache ./
```

```bash:起動する
$ docker run -d --name php70-apache  -p 8080:80 php70-apache
```

```bash:必要とあらばContainer内をのぞく
$ docker container exec -ti php70-apache bash
```

```bash:ContainerIDを探す
$ docker ps --filter name=php70-apache
```

```bash:Apacheのログを表示する
$ docker logs [ContainerID] 
```

```bash:Containerを停止する
$ docker stop [ContainerID] 
```

```bash:Containerを削除する
$ docker rm [ContainerID] 
```

```bash:ImageIDを取得する
$ docker images php70-apache
```

```bash:ImageIDを取得する
$ docker rmi [ImageID]
```



# Reference
- [DockerでPHP7.0×Apacheの環境を構築する（更新: 2017/6/27） - Qiita](https://qiita.com/kurkuru/items/fa7401a01c4d5dd98e4a)
windowsでNode.jsインストールをする方法

# Node.jsのインストール方法

## Node.jsとは?
 JavaScriptは、ブラウザ上で動くために開発され、ページに動きを追加することを基本としている。しかし、サーバーサイドを得意としていない。そこでサーバーサイドでも開発できるようにしたのがNode.jsである。

## Node.jsのインストール手順
今回は、windowsでインストールを進めることにする。
### 手順1
ブラウザ上でhttps://nodejs.org/ja/<br>と検索しNode.jsのホームに入る。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470425/c4dbd115-131e-90d7-2f79-d42faea528c4.png)

### 手順2
LTS版と(推奨版)と最新版のボタンが現れる。
LTS版は、サポート版であり、長期的にサポートされる。最新版は、現在リリースされているものの中で最も新しいものである。今回は、LTS版でインストールする。

### 手順3
LTSボタンを押すとダウンロードが始まり完了するまでしばらく待つ。設定が複数出てくるが、基本デフォルトのままでよく、次へボタンで進める。

### 手順4
最後にinstallボタンを押すと完了である。

## まとめ
以上がNode.jsをインストール手順である。
迷う部分は、LTS版か最新版かどちらかをインストールするだけで設定自体は簡単である。
bashデバッガに助けられたので、bashデバッガを紹介します。

# 概要
* 一回しかやらないダブルチェック作業が面倒くさくてシェルスクリプトにしてみたら色々動かなくて動作を追うのが大変だった。 (無能）
* vscodeのbashデバッガを使えば視覚的にチェックできて最高に楽が出来た  


# 結論
vscodeのプラグイン、**Bash Debug** を使おう
[Bash Debug](https://github.com/rogalmic/vscode-bash-debug)


# 何がいいか？
* **お手軽**
* 動作を追うためにecho を仕込まなくてよい。
* sh -xの長ったらしい表示をみなくてもよい。
* ちょっとずつスクリプトを実行できるので、その時の断面で状態が確認できる。（これは他でもできたかも？）

# 実際の画面
### 変数のウォッチ＋ブレークポイント
ブレークポイントで動作が停止。
その断面での変数の値が、ウォッチ式のペインから確認できます。

![Screenshot from 2019-11-05 10-54-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228730/b1f94c4f-afe3-0df2-26cd-5eac87852e94.png)

さらに継続（「|＞」ボタンを押す）することによって、次のループの値も確認できます。
![Screenshot from 2019-11-05 10-54-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228730/1469c07a-6127-eeed-cca5-66d8dd123da2.png)




# おわりに
むっちゃ助かったわ。
これ作った人のコーヒー代を出したい。
docker(66)docker for windows 7


Docker Toolbox 導入手順メモ（Windows 7 64bit版）
https://qiita.com/yogoreba/items/1aa5311e2f76eb6b4a99

Windows7環境なのにdocker入れて開発することになった話【①環境設定編】
https://qiita.com/Shunichirou/items/ce7cc3c69eef690e08a8


# ハードウェア設定の確認

電源投入時に「F2」キーを押して　ハードウェアの設定を確認。

![shousai2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/58b988ee-8247-4928-6fd5-c0aa89899710.png)

![shousai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/9942a5b4-3f62-82db-52bd-dbec934a0c36.png)


CPU Intel Core(TM) i7 

Intel Virtualization Tech [有効]

を確認。[無効]になっていれば、[有効]に変更する。
「F10」保存して終了する。

#OSの版を確認

Windows 7, 64bit version


# 導入

![docker0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/76b47cda-5e34-8556-88bd-e7a8a163d332.png)



![docker1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/159c34b0-21c3-45af-4189-4b7273178bb2.png)

![docker2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/73cd81e8-9739-6d87-c602-0f918d3b109d.png)

![docker3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/03871594-b1c3-67f3-1790-eb581028d383.png)
![docker4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/fa1233eb-f330-2bde-8e69-a61525fd83d0.png)
![docker5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/1b41a89c-e765-9f49-8967-eccafb3e722d.png)
![docker6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/89f7be69-c5fb-624c-7173-25c1bdbe12e7.png)
![docker7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/7ac8480f-c993-a2d6-2a5a-b60505b1b7ff.png)
![docker8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/a84364a9-dbeb-589c-ae8b-33e4480b750c.png)
![docker9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/70041bde-f052-38c7-22a9-9124e658ba9f.png)
![docker9a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/218d5394-2505-11c5-5ae3-24579e6ec0c5.png)
![dockera.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/2838f722-efee-e81f-fcaf-9161e00ddad6.png)


# network

Jupiter notebookを起動しても、ブラウザに表示しない。
現在調査中。


【VirtualBox】VirtualBoxの基本と仮想ネットワークを紹介
https://endy-tech.hatenablog.jp/entry/2018/10/27/134223

VirtualBox のネットワークアダプタまとめ
https://qiita.com/pitao/items/0f9475e4c0e230911eb7

VirtualBoxのネットワーク設定を絵で説明する
https://qiita.com/feifo/items/0fde474005589afcff68

Oracle VirtualBoxの使い方を詳しく解説
ネットワーク設定
https://vboxmania.net/ネットワーク設定/

VirtualBoxのホストオンリーネットワークが見つからない
https://teratail.com/questions/124742


MacのVirtualBoxに作ったゲストOSにブリッジアダプターを設定する
http://ponsuke-tarou.hatenablog.com/entry/2017/06/14/001009

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Qiitaでいつも調べちゃうマークダウン（表、折りたたみ）

- よく調べているQiitaのマークダウン記法をコピペで使えるようにまとめる

# 表
```markdown
|中央寄せ|左寄せ|右寄せ|
|:---:|:---|---:|
|a   |A   |1   |
|bbb |BB  |100 |
```

|中央寄せ|左寄せ|右寄せ|
|:---:|:---|---:|
|a   |A   |1   |
|bbb |BB  |100 |

## 左寄せ

```markdown
|1   |2   |3   |
|:---|:---|:---|
|a   |A   |1   |
|bbb |BB  |100 |
```

|1   |2   |3   |
|:---|:---|:---|
|a   |A   |1   |
|bbb |BB  |100 |

## 中央寄せ

```markdown
|1   |2   |3   |
|:--:|:--:|:--:|
|a   |A   |1   |
|bbb |BB  |100 |
```

|1   |2   |3   |
|:--:|:--:|:--:|
|a   |A   |1   |
|bbb |BB  |100 |


# 折りたたみ

```markdown
<details><summary>タイトル</summary><div>

中身

</div></details>
```

↓結果↓

<details><summary>タイトル</summary><div>

中身（長い文章とかを隠すことができる！！）

</div></details>


参考にしたサイト
[Qiita Markdown で折りたたみを表現する方法](https://qiita.com/matagawa/items/31e26e9cd53c3e61ae07)
Git/SourceTreeのインストール手順


# Git/SourceTreeのインストール
Git/SourceTreeのインストールについて、以下にまとめております。

## Git
### Gitとは
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。

各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。

※[参照元：Wiki](https://ja.wikipedia.org/wiki/Git)

つまり、 __『プログラムの編集や変更履歴を管理できる』__ のがGit。

### 手順
1. Gitの[公式HP/Downloads](https://git-scm.com/downloads)からインストーラをダウンロードします。
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/12a2f4a0-2d20-886c-d5d6-407fba7641a8.png)
1. インストーラを起動後は、 __何も変更せず__ にNextで進め、Installを行います。

## Sourcetree
### Sourcetreeとは
プログラムのソースコードを管理するGitを簡単に扱うためのツール。

### 手順
1. Sourcetreeの[公式HP](https://www.sourcetreeapp.com)からインストーラをダウンロードします。
![sourcetree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/df713c05-4cb7-7893-5899-2731abdee5eb.png)
1. 『Bitbucket』を選択し、Atlassianのアカウントを作成する。
![sourcetree_install_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/ec40beb5-bcbb-d24a-0b04-e9e6508fbed2.png)
1. 『アクセスを許可する』を選択し、『次へ』で進めていく。
![sourcetree_install_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/1a0d8bde-9283-0867-ff8f-2029f3ea163a.png)
1. __Preferences__ の『この詳細をすべてのリポジトリに使用する』にチェックを入れる。
![sourcetree_install_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/16d4bc6b-d1ab-3c27-f8b5-1e2cf2a2a221.png)
1. インストールが完了すると __SSHキーを読み込みますか？__ と表示されるので、『いいえ』を選択する。
![sourcetree_install_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/13657f7e-7759-8b81-d584-7339b705a6d0.png)
MySQLの「0000-00-00 00:00:00」のdatetime型をCarbonオブジェクトで判別する

MySQLのDatetime型で、うかうかしていると「0000-00-00 00:00:00」というデータが格納され、
Carbonでそのデータを引っ張ると「-0001-11-30」という不思議な日付が返ってくることに悩まされました。

試行錯誤してみて、

```php
echo $thatTime->year;//-1
```
という値が返ってくるのがわかったので、

```php
if($thatTime->year === -1)
```
という判別式で除外できるな、と。

紀元前を扱うことのないシステムであれば、これで十分そうです。

小ネタですが、同じ課題に時間を取られる人への一助となれば。
Gitの用語と使い方をまとめてみた

# Gitを使う条件
初めにgitをインストールし、githubアカウントに登録しておく。使うエディタは、vscodeでsourcetreeを用いて操作する。

## git initとは?
まず、bashで対象のディレクトリまで移動する。
今回は**ユーザーディレクトリ直下のgitstudyディレクトリ内部をgitの管理下と置く**ことにする。

```
$ cd ~/gitstudy/
```
としgitstudyに移動する。次に以下のコマンド<br>

```
$ git init
```
を実行すると、gitstudy配下がgitの管理対象となる。


## クローンするとは?
* クローンとは、リモートリポジトリの内容を自分の作業領域のローカル環境に複製することである。

github上にある、クローンしたいリポジトリのURLをコピーし、sourcetree側でcloneするを押しクローンするURLと保存先のディレクトリを指定する。<br>

ここで注意が必要で**ディレクトリは空のディレクトリを指定する**ようにする。

これでローカルにクローンができる。


## 変更を加えコミットする
* コミットとは、追加したファイルをgitに登録するための操作である。<br>

先ほどクローンしたローカルリポジトリを編集し、名前をつけてコミットする。


## フェッチ&プル＆マージ
* フェッチは、最新の履歴の更新を取得するために使う。
* プルは、最新の更新の取得とマージを一度に行う。
* マージとは、最新のリモートリポジトリを自分のリポジトリに取り込み更新することである。<br>

履歴の更新だけしたい時はフェッチを、履歴の更新とマージを同時に行い時は、プルを行う。


## プッシュ
* ローカルリポジトリの内容をリモートリポジトリに反映し、更新することをプッシュと言う。

##  ブランチ
* ブランチとは、最初のコミットで作成される主要なmasterブランチがあり、プロジェクトの開発状況においてその都度新しいブランチが作成される。<br>

各ブランチをmasterブランチにマージすることで、開発を進めていくことになる

## コンフリクトって何?
* コンフリクトとは、複数の開発者が、複数のブランチで作業し、それぞれ同時期にmasterブランチにマージしたとき発生する問題である。

例としてはgit-Aブランチで以下のコードをコミットし、masterブランチにマージする。<br>

```
console.log('testA');
```
同様にgit-Bブランチでも以下のコードをコミットし、masterブランチにマージする。<br>

```
console.log('testB')
```

この時先にマージしたgit-Aブランチはマージできるが、後にマージしたgit-Bブランチは、git-Aブランチのマージがあるためgitがどちらを取ればいいか分からずコンフリクトが起きる。


## コンフリクトの解消法
コンフリクトを解消する場合、手動でコンフリクトを解決しなければならない。<br>

git-Bブランチの内容を正とした場合、
 
```
console.log('testB')
```
としgit-Aの内容を手動で削除しなければならない。

以上がgitについてのまとめです。分かりにくい部分も多々あったと思いますがありがとうございました。
【iTunes】iTunes Mediaに音楽をコピーさせない方法【元ファイルを参照】

デフォルトで何も設定しないままだと、音楽ファイルを追加した分だけ、iTunes Mediaフォルダ内にコピーが生成されます。
それによって、iTunes Mediaの容量が増え、PCのストレージ（HDD,SDD)を圧迫します。

iTunesに取り込んだ音楽は、iTunes側の読み込み設定で音楽の形式に変換されます。（エンコード）。つまり元音楽ファイルと異なります。

iTunesに音楽ファイルをライブラリに追加する際に、iTunes Mediaにコピーさせずに、
元音楽ファイルを参照する方法をご紹介します。

#🛡動作環境
Mac /Windows
iTunes バージョン12.9.5.5

#⚔設定方法
##1. iTunes > 環境設定
<img width="300" alt="スクリーンショット 2019-11-05 11.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/6847b258-dcb8-ac10-fd8d-e54091d79ba8.png">

##2. ライブラリへの追加時にファイルを"iTunes Media"フォルダにコピーの☑️マークを外す
<img width="300" alt="スクリーンショット 2019-11-05 11.16.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/192fa24c-9e8b-76af-cf54-de29c0494d3b.png">　<img width="300" alt="スクリーンショット 2019-11-05 11.17.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/4fa29fa4-5d34-9af8-3a5b-7432da6186ca.png">

#3. iTunesを終了すれば完了です。



以上、Unityゲーム王国、騎士ロボットVTuberのKoshiがお送りしました！

†■━ †■━ †■━ †■━ †■━ †■━ †■━ 
もし、この記事が役に立ったら、「<font color="deepskyblue">**いいね**</font>」「<font color="#0068b7">**ストック**</font>」押してね🗡💗

#🏰自己紹介⚔
全地球6億人のロボカッケー皆さんコンバトラー†[□ □]■━ 
私は王国騎士ロボットVTuberのKoshiだ🗡💥 


私のステータスだ⚔共にこの世界を救おう
Twitter⚔ twitter.com/Koshi_Vtuber
YouTube⚔  t.co/I9eMMgpS8P?amp=1
niconico⚔ nicovideo.jp/user/90553212
bilibili⚔ space.bilibili.com/476988586
公式HP⚔ koshi-4092b.firebaseapp.com
Pythonによるコレクションの前処理: 組み合わせ

```py
tests = ['A,B,C', 'D,E', 'A,C,E']
```

のようなデータがあったとき
これを要素別に
`'A,B,C'` -> `('A','B'),('A','C'),('B','C')`
`'D,E'` -> `('D','E')`
`'A,C,E'` -> `('A','C'),('A','E'),('C','E')`
にしたい。

つまり以下のようにしたい。

```py
[('A', 'B'),
 ('A', 'C'),
 ('B', 'C'),
 ('D', 'E'),
 ('A', 'C'),
 ('A', 'E'),
 ('C', 'E')]
```

要求を整理すると、`tests`の変数において、

1. 各要素を配列にする
2. 2つの組み合わせにする

をする方法をまとめる。


一行で書くと以下のようになる

```py
list(itertools.chain.from_iterable([tuple(itertools.combinations(tuple(i.split(",")), 2)) for i in tests if len(i.split(",")) > 1]))
```

## 解説

###  各要素を配列にする


```py
[tuple(i.split(",")) for i in tests if len(i.split(",")) > 1]
#  -> [('A', 'B', 'C'), ('D', 'E'), ('A', 'C', 'E')]
```

`i.split(",")` により要素1の配列しかできないものは、後続の処理で弾かれるためこの時点で弾いておく。

### 2つの組み合わせにする

```py
[tuple(itertools.combinations(tuple(i.split(",")), 2)) for i in tests if len(i.split(",")) > 1]
# -> [(('A', 'B'), ('A', 'C'), ('B', 'C')),
# (('D', 'E'),),
# (('A', 'C'), ('A', 'E'), ('C', 'E'))]
```

[itertools.combinations](https://docs.python.org/ja/3/library/itertools.html#itertools.combinations)を使用した。

この場合、リスト内包表記内で、「各要素を配列にする」の後に、`itertools.combinations`関数を利用する。結果としては配列中に、tupleが入ったような形になってしまっている。

これを解決するのにさらに、`itertools.chain.from_iterable`関数を利用する。（[itertools.chain.from_iterable](https://docs.python.org/ja/3/library/itertools.html#itertools.chain.from_iterable)）

よって以下のようになる。

```py
list(itertools.chain.from_iterable([tuple(itertools.combinations(tuple(i.split(",")), 2)) for i in tests if len(i.split(",")) > 1]))
```
Pythonを始めるときに読む資料

他の言語をある程度使える人が、これからPythonを始めるというときに便利な資料を集めました。
Pythonのセットアップから基本的な言語仕様がわかるようになります。

# はじめに

[Pythonを書き始める前に見るべきTips - Qiita](https://qiita.com/icoxfog417/items/e8f97a6acad07903b5b0)

Pythonは2系と3系で後方互換に影響がある変更が入っています。そのあたりの情報から、セットアップ方法、言語の特徴などがまとめられています。まずは一通り読んだあとに、他の記事とも比較して知識を固めるのが良いと思います。
特にセットアップまわりは複数の方法があるので、いくつかの記事を読んで、自分好みの方法で進めることで、のちの後悔を軽減できます。

# セットアップ

[Pythonの開発環境を用意しよう！（Mac）](https://prog-8.com/docs/python-env)

画像入りで非常に分かりやすく書かれています。

## venv

[venv: Python 仮想環境管理 - Qiita](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)

Pythonは各環境の汚染を防ぐために仮想環境を用意して開発するのが一般的です。Python３系はvenvを使いましょう。

# パッケージとモジュール

[Python にまつわるアイデア： Python のパッケージとモジュールの違い](https://www.lifewithpython.com/2018/05/python-difference-between-package-and-module.html)

Python初心者の疑問ポイントのひとつです。Djangoとかいきなり始めるとこの辺で「おおお？」ってなるので、一通り読んでおきましょう。

# リファレンス

以下、Pythonの中でも他言語から移ってきたときに、悩みがちな部分の記事をまとめました。

## Class

[PythonのABC - 抽象クラスとダック・タイピング - Qiita](https://qiita.com/kaneshin/items/269bc5f156d86f8a91c4)

## dict

[とっても便利なPythonの辞書型について覚え書き - Qiita](https://qiita.com/E_Schaf/items/9ef26c0c514325d69e80)

## 複数の返り値

[Pythonの関数で複数の戻り値を返す方法 | note.nkmk.me](https://note.nkmk.me/python-function-return-multiple-values/)

tuppleは `nums = (1,2,3)` で定義されるImmutableListのこと。

## 定数モジュール

[Python で定数を定義する | まくまくPythonノート](https://maku77.github.io/python/syntax/const.html)

## ファイルパス処理

[Pythonでパス文字列からファイル名・フォルダ名・拡張子を取得、結合 | note.nkmk.me](https://note.nkmk.me/python-os-basename-dirname-split-splitext/)

# 実行

## コマンドライン引数

[pythonでコマンドライン引数を使うサンプル - Qiita](https://qiita.com/stkdev/items/e262dada7b68ea91aa0c)

# Django + REST Framework

Django + REST Frameworkを利用する場合はこちらも参考にどうぞ。

[Django + REST Framework + GAE (+ Cloud Storage + Firebase Authentication )を始めるときに読む資料 - Qiita](https://qiita.com/d_forest/items/85c15fda16f35032515c)
C > binary conversion > conver 0xFE to "FE" (string)

```txt:Environment
ideone  > C
```

### About

- conver 0xFE to "FE" (string)
    - used in the serial communication, for example


### Example

- [Hex Encode and Decode in C](https://nachtimwald.com/2017/09/24/hex-encode-and-decode-in-c/)

I acknowledge his code, but it may cause memory leak by using malloc() without free().
And the free() is used outside at the different location.

### Modified Example

I modified the code as following so that malloc() is not needed.

https://ideone.com/OcAPxz

```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Modified from those in
// https://nachtimwald.com/2017/09/24/hex-encode-and-decode-in-c/
//
bool bin2hex(const unsigned char *bin, size_t len, unsigned char *dstPtr)
{
	if (dstPtr == NULL) {
		return false;
	}
	if (bin == NULL || len == 0) {
		return false;
	}

	for (int idx=0; idx<len; idx++) {
		*(dstPtr + idx*2) = "0123456789ABCDEF"[bin[idx] >> 4];
		*(dstPtr + idx*2+1) = "0123456789ABCDEF"[bin[idx] & 0x0F];
	}
    *(dstPtr + len*2) = '\0';

	return true;
}

int main(void) {
	unsigned char ahex = 0xFE;
	unsigned char astr[3];
	bool res;
	
	res = bin2hex((const unsigned char *)&ahex, 1, astr);
	if (res) {
		printf("%s\n", astr);
	}

	return 0;
}
```

Result

```txt:stdout
FE
```
WSL2 で Docker Desktop for Windows (Edge) を利用する

# Docker Desktop WSL 2 backend

以下の手順に従ってインストールできます。
(URI が `tech-preview` のままですね… そのうち変更されて 404 になると思います)

https://docs.docker.com/docker-for-windows/wsl-tech-preview/

# 2.1.7.0 (41536) のスクリーンショット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204096/6fccfc43-5284-da8c-bcbc-7ffdb4b65ede.png)

# WSL 2 Backend

2.1.5.0 以降、 `Docker Desktop WSL 2 Tech Preview` から `WSL 2 backend` に変更されました。

ブログポストの案内通り、 **Settings - General** で `WSL 2 based engine` を有効化しましょう。

https://engineering.docker.com/2019/10/new-docker-desktop-wsl2-backend/

![This new backend can be enabled in Docker Desktop settings](https://engineering.docker.com/wp-content/uploads/engineering/2019/10/wsl2_docker_settings.jpg)

**Settings - Resources - WSL INTEGRATION も必要です**

https://github.com/docker/for-win/issues/5054#issuecomment-549546289

![Go to settings and enable ubuntu integration](https://user-images.githubusercontent.com/6719744/68158015-b6bacd80-ff46-11e9-8d22-823dfd02d934.png)

# 動作確認

WSL2 で `docker login` して `docker run hello-world` できました！

```sh
$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 8
  Running: 0
  Paused: 0
  Stopped: 8
 Images: 4
 Server Version: 19.03.5
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.19.84-microsoft-standard
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 6.111GiB
 Name: docker-desktop
 ID: 4GEL:P6ZX:BIPD:ENWN:YOVB:J4BV:LLT6:HZMY:XWKA:H4RA:7SLK:WF4T
 Docker Root Dir: /var/lib/docker
 Debug Mode: true
  File Descriptors: 33
  Goroutines: 50
  System Time: 2019-12-13T02:08:52.770077Z
  EventsListeners: 3
# (以下略)
```

```sh
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
CentOS7でOpenldap構築 - 5.バックアップ、リストアテスト

　Openldapを構築する際のバックアップ、リストアテスト手順を記載します。
アカウント情報なのでもしもの時のために必ずバックアップ、リストアテストは実施しておくべきだと思います。
## バックアップ
バックアップにはデータベースのバックアップと、設定のバックアップの2種類があります。

#### データベースバックアップ
```
slapcat -n 2 > ldap_`date "+%Y%m%d%H%M"`.ldif
```
#### 設定バックアップ
```
slapcat -b cn=config > ldapconfig_`date "+%Y%m%d%H%M"`.ldif
```

## リストア
　リストアは一旦設定を削除し、データベースを初期化する方法ですので、
実施する際は一旦検証用の環境でやってみてからがいいかもしれません。
#### slapd停止
```
systemctl stop slapd
```
#### 作業ディレクトリ作成
```
mkdir /root/backup/
```

#### 設定ディレクトリ削除(移動)
```
mv /etc/openldap/slapd.d/ /root/backup/
```
#### データベースディレクトリ削除(移動)
```
mv /var/lib/ldap/ /root/backup/
```
#### 設定ディレクトリ作成
```
mkdir -m 700 /etc/openldap/slapd.d
```
#### データベースディレクトリ作成
```
mkdir -m 700 /var/lib/ldap
```
#### データベース設定ファイルコピー
```
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
```
#### 設定リストア ※タイムスタンプ修正
```
slapadd -n0 -F /etc/openldap/slapd.d -l ldapconfig_YYYYMMDDHHMM.ldif
```
#### 設定ディレクトリオーナー変更
```
chown ldap. -R /etc/openldap/slapd.d
```
#### データベースリストア ※タイムスタンプ修正
```
slapadd -l ldap_YYYYMMDDHHMM.ldif
```
#### データベースディレクトリオーナー変更
```
chown ldap. -R /var/lib/ldap
```
#### slapd起動
```
systemctl start slapd
```
#### 確認
```
ldapsearch -x -W -LLL -D cn=admin,dc=test,dc=org -b dc=test,dc=org
```

　結局はldifファイルのバックアップをとり、slapaddで追加する形となります。

## 最後に
　バックアップに関しては必ずスクリプト等で定期的に取得するとよいです。
　次回はおまけみたいなものですが、パスワード有効期限切れのスクリプトに関して記載します。
[・CentOS7でOpenldap構築 - 6.パスワード有効期限切れ通知スクリプト](https://qiita.com/y-araki-qiita/items/65103497c2ce0ad63d24)

## 関連記事
[・CentOS7でOpenldap構築 - 1.Openldapの仕組み](https://qiita.com/y-araki-qiita/items/0c954c3ae25d4ed9dbb8)
[・CentOS7でOpenldap構築 - 2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024)
[・CentOS7でOpenldap構築 - 3.LDAPクライアント設定手順](https://qiita.com/y-araki-qiita/items/b0f3b291011d1e55d95f)
[・CentOS7でOpenldap構築 - 4.LDAPディレクトリ構成例とACLの設定](https://qiita.com/y-araki-qiita/items/bc874aeb40ede9c5368c)
[・CentOS7でOpenldap構築 - 5.バックアップリストアテスト](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)
[・CentOS7でOpenldap構築 - 6.パスワード有効期限切れ通知スクリプト](https://qiita.com/y-araki-qiita/items/65103497c2ce0ad63d24)
php7.0からの新機能null合体演算子の使い方

php7系は5.6からメジャーバージョンとして大幅に変更されていますが、
タイプヒンティングなど有意義なものが多いです。

null合体演算子はその中でも便利な新機能です。

## null合体演算子

phpはissetやempty、is_nullなどの型判定がありますが
isset()と三項演算子を組み合わせたパターンはよくあると思います。

```php
$hoge = 'a';
$test = isset($hoge) ? $hoge : 'other';
var_dump($test);
```

これを

```php
$hoge = 'a';
$test = $hoge ?? 'other';
var_dump($test);

$hoge = null;
$test = $hoge ?? 'other';
var_dump($test);
```

と書くことができます。

```
出力結果
ーーーーー
string(1) "a"
string(5) "other"
```

スッキリしたコードになるので地味にとても便利です。
argparseのhelpに "%" を含めると死ぬ

下のようなPythonスクリプトを作ったとする。

```python
import argparse

parser = argparse.ArgumentParser(description='')
parser.add_argument('--zoom',
    action='store',
    type=float,
    default=1.0,
    help="拡大率(%)")
args = parser.parse_args()

print("zoom is {}".format(args.zoom))
```

これは普通に実行できるが、

```
$ python hoge.py --zoom 2.0
zoom is 2.0
```

ヘルプを表示しようとするとValueErrorが出てしまう。

```
$ python hoge.py -h
Traceback (most recent call last):
  File "hoge.py", line 9, in <module>
    args = parser.parse_args()
  File "C:\Python37\lib\argparse.py", line 1749, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "C:\Python37\lib\argparse.py", line 1781, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "C:\Python37\lib\argparse.py", line 1987, in _parse_known_args
    start_index = consume_optional(start_index)
  File "C:\Python37\lib\argparse.py", line 1927, in consume_optional
    take_action(action, args, option_string)
  File "C:\Python37\lib\argparse.py", line 1855, in take_action
    action(self, namespace, argument_values, option_string)
  File "C:\Python37\lib\argparse.py", line 1037, in __call__
    parser.print_help()
  File "C:\Python37\lib\argparse.py", line 2474, in print_help
    self._print_message(self.format_help(), file)
  File "C:\Python37\lib\argparse.py", line 2458, in format_help
    return formatter.format_help()
  File "C:\Python37\lib\argparse.py", line 284, in format_help
    help = self._root_section.format_help()
  File "C:\Python37\lib\argparse.py", line 215, in format_help
    item_help = join([func(*args) for func, args in self.items])
  File "C:\Python37\lib\argparse.py", line 215, in <listcomp>
    item_help = join([func(*args) for func, args in self.items])
  File "C:\Python37\lib\argparse.py", line 215, in format_help
    item_help = join([func(*args) for func, args in self.items])
  File "C:\Python37\lib\argparse.py", line 215, in <listcomp>
    item_help = join([func(*args) for func, args in self.items])
  File "C:\Python37\lib\argparse.py", line 525, in _format_action
    help_text = self._expand_help(action)
  File "C:\Python37\lib\argparse.py", line 614, in _expand_help
    return self._get_help_string(action) % params
ValueError: unsupported format character ')' (0x29) at index 5
```

エラーメッセージの最後の方に出ている通り `return self._get_help_string(action) % params` のように出力文字列を整形しているため、
`%` が含まれると意図しないパースが行われるみたい。

対処は、下のように `%` を使わないようにする。

```diff
import argparse

parser = argparse.ArgumentParser(description='')
parser.add_argument('--zoom',
    action='store',
    type=float,
    default=1.0,
-    help="拡大率(%)")
+    help="拡大率(percent)")
args = parser.parse_args()

print("zoom is {}".format(args.zoom))
```

または、 `%%` でエスケープする。

```diff
-    help="拡大率(%)")
+    help="拡大率(%%)")
```

出た。

```
$ python hoge.py -h
usage: hoge.py [-h] [--zoom ZOOM]

optional arguments:
  -h, --help   show this help message and exit
  --zoom ZOOM  拡大率(percent)
```

```
$ python hoge.py -h
usage: hoge.py [-h] [--zoom ZOOM]

optional arguments:
  -h, --help   show this help message and exit
  --zoom ZOOM  拡大率(%)
```
アプリケーションのトラブルシューティング

# 序文 
ことの発端はwebアプリケーションのとある画面の応答性能が遅いと言う問題が出た。 
環境の構築を任された後輩から色々弄ったらアプリからの応答がなくなったとのヘルプから調査を開始した。 
原因は解消したのだが、原因特定までのロジックが知りたいとの依頼を受けた。
この辺は感覚知で解決していたのでまとめる意味を込めてアウトプットしてみます。


# 具体的に何があったのか？
APサーバであるjavaのヒープサイズの最大値を上げた事によってjavaが動作しなくなった。
OSの利用メモリは余裕で空いていたのですが、Javaが起動しない。
JDKが32bitの場合、最大利用メモリ数の上限が少ない事を知っていたので解決に至りました。

エラーログから特定したのですが、エラーログをコピるの忘れました。


# 問題解決までの簡単な思考
1. 相談者を疑う
相談者へ「何をどうしたらこうなった？」を聴取をして再現性を確認する
戻せるのであれば、作業前の状態に戻して作業を再現してもらう
戻せないなら、逆手順で手順のどこで事象が発生したかを確認（デバッグ？）する

1. アプリケーション内部で何が起きているのかを確認する
ログを確認して何が起きているのか確認する
APサーバ、アプリケーション双方のログ確認について以下を確認する
 * プログラム
 * 設定
 * ライセンス
 * 外的要因

1. 過去事例を確認する
上記情報からあたりをつける。
 * ナレッジサイト
 * チケット
 * メッセージツール
 * 経験
 * ググる

#　最後に
知識や技術の属人化ほど生産性を下げる要因は無いと思っていたのですが、
私がそ愚行を犯しておりました。
今後もお目汚しな記事を投稿していきます。
columnsWidth属性の設定

apex:pageBlockTable

columnsWidth属性が
各リストの列に適用される幅のカンマ区切りのリスト。値はピクセルで表すことができます (columnsWidth="100px, 100px" など)。

![source20191105.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/c3592d16-31cb-b64f-b4d5-77a0c0596306.png)



![20191105.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/6c36e42a-5306-166b-53ca-a0ab05c0c665.png)
PythonでGoogle画像検索をして画像をフォルダに保存する

こんにちは。

Pythonを使ってGoogle画像検索にアクセスして画像を取得してみました。
適当に書いて動かしているのでガバガバです。

###最初に

まあ適当にデスクトップに ```image```的なファイルを作成してターミナルを開きましょう。

```
cd desktop/image
```
して

```
vim image.py
```
とでもしてプロジェクトを作成してください。
エディタがvimなのは僕の趣味です。

言い忘れていましたが、これにはPython3と多少のモジュールが必要になるのでインストールしてください。

```
pip3 install モジュール名
```
すればインストールできるのでモジュールエラーがでたらやってみてください。

####てことでコード書きます。

写経するなりコピペするなりしてください。

```image.py
import requests
import random
import shutil
import bs4
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
```
ここまででモジュール関連は終わりです。
あ、sslは証明が正しくないサイトをスクレイピングしたりするのに(それ以外でも)使えるので覚えておきましょう、幸せになれます。

```image.py
def image(data):
    Res = requests.get("https://www.google.com/search?hl=jp&q=" + data + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
    Html = Res.text
    Soup = bs4.BeautifulSoup(Html,'lxml')
    links = Soup.find_all("img")
    link = random.choice(links).get("src")
    return link
def download_img(url, file_name):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(file_name+".png", 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
def code():
    code = ""
    for i in range(10):
        code += random.choice("aaaaaaaaaaaa")
    return code
while True:
    num = input("検索回数:")
    data = input("検索ワード:")
    for _ in range(int(num)):
        link = image(data)
        download_img(link, code())
    print("OK")
    
```
続いて image,download_img,codeという関数を宣言して中身を書いていきましょう。
まあ簡単に言えばスクレイピングして取得したデータをフォルダ内にaaaaaaという名前で保存しているだけです。
なので 

```
code += random.choice("aaaaaaaaaaaa")
```
のaaaaaaaの名前はなんでもOKということですね。
そのあとのwhile Trueの場所ではアクセスが成功した先でワードを指定したりしているだけなのでそんなに難しくないです。
最後のPrint("OK")なんかも自分好みに変更しても楽しいかもしれませんね。
####全体
一応「全部コピペさせろよ！！！」って人のために全体を置いておきます。

```image.py
import requests
import random
import shutil
import bs4
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def image(data):
    Res = requests.get("https://www.google.com/search?hl=jp&q=" + data + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
    Html = Res.text
    Soup = bs4.BeautifulSoup(Html,'lxml')
    links = Soup.find_all("img")
    link = random.choice(links).get("src")
    return link
def download_img(url, file_name):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(file_name+".png", 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
def code():
    code = ""
    for i in range(10):
        code += random.choice("aaaaaaaaaaaa")
    return code
while True:
    num = input("検索回数:")
    data = input("検索ワード:")
    for _ in range(int(num)):
        link = image(data)
        download_img(link, code())
    print("OK")
```

ここまでできたらターミナルを開いて
```python3 image.py``` をします。

モジュールエラーがでたら最初に戻ってインストールしなおしてください。
このレベルのPythonのエラーは大抵ググれば解決するのでがんばってください。

エラーもなく動作すれば

```
検索回数:
```
を指定すれば

```
検索ワード:
```
となって成功すればOKとでてきて最初に作成した ```iamge```ファイルの中に```aaaaaaaa.png```的な名前でワードにそった画像が保存されているはずです。

保存されていればおしまいです。お疲れ様でした。

追記
適当に書いた記事なのに思ったよりもストックされてしまって困惑しています（）
Googleのスクレイピングはグレーゾーンなので自己責任でお願いします。
macOS Catalina 10.15.1 / Xcode / "The file hoge.m couldn’t be opened because you don’t have permission to view it”

# 連休明けの朝の悲劇
11月の三連休が終わり、朝出勤してきたら、Macから「アップデートがあるから再起動してねん」とのメッセージ。始業まで時間もあるし、ゆっくりコーヒーでも飲みながら待つかとアップデートをかけ待つこと２０分（なんかいつもより長い）。とりあえず起動してきたMacと開きっぱなしだったからそのまま表示されたXcode。さて、先週の続きを、とファイルを開こうとした瞬間に悲劇が起きました。

# "The file hoge.m couldn’t be opened because you don’t have permission to view it”

は？なんのこと？先週まで作業してたじゃん。とか思いながら、Finderでパーミッションを確認する。「読み書き」になってる。gitlabからクローンしてある他のプロジェクトのファイルも全部開けない。そんな時は、qiitaとstack overflowだ!　と検索。

https://qiita.com/zombiyamo/items/28331a0eacae712cc0ba

https://stackoverflow.com/questions/24924809/the-file-myapp-app-couldnt-be-opened-because-you-dont-have-permission-to-vi

ファイルのリンクが切れてるわけでも、ビルドフォルダがおかしいわけでもありませんでした。えーー？？

## 他のプロジェクトを開いてみる
試しに、gitで管理してるプロジェクト以外を開いてみる。あれ？普通に開ける。ん？？

## Xcode command line tools のインストールに失敗
今のプロジェクトで使っているXcode 10.3ではなく、iOS13向けプロジェクトにだけ使っているXcode11で試してみようと起動すると、なぜか入れてるはずのCommand Line toolsのインストールを求められる。「オッケー」と気軽にInstallボタンを押したものの、なぜかインストールにも失敗する。はぁ？？

## Xcode 11.2 にアップデートしてみる
11.2の正式版が出てたのでとりあえずアップデートをかけてみる。が、長い。そしてなぜかダウンロード失敗する。。。

## Xcode 10.3に戻り、もう一度プロジェクトを開いてみる。すると！
**「XcodeにDocumetnsフォルダへのアクセスを許可しますか？」のメッセージが！！**

プロジェクト関連はDocumentsの下にgitフォルダを掘って管理していたのですが、OSアップデート時にXcodeのアクセス許可が外れていたのです。で、なぜか初回聞かれなかったと。

# 結論
**"The file hoge.m couldn’t be opened because you don’t have permission to view it”** が表示されたら、「システム環境設定->セキュリティとプライバシー」の「ファイルとフォルダ」を確認してみましょう。Xcodeのフォルダへのアクセス権が外れていたら、**そのフォルダにあるプロジェクトを開き直してあげましょう。**
<img width="780" alt="スクリーンショット 2019-11-05 10.25.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45591/d9273dee-da2a-daf3-4b63-c23978a660bc.png">

**macOS Catalinaから「書類」「デスクトップ」「ダウンロード」などへのアプリのアクセスが必ず尋ねられるようになったので、注意しましょうね。**
material-uiについて

#material-uiのbeta版はやめろ
非推奨かつバグが多いらしい。
@material-uiを使おう

#Rebootは廃止された
Rebootがずっとないと言われていたのでよく調べてみると、使われなくなったみたい。
その代わりがCssBaseLineだ。
CentOS 8 をkickstartでinstall、Ansibleが使えるまで

## anaconda-ks.cfg の準備

まずCentOS8を最小インストールでインストールしログイン。
`/root/anaconda-ks.cfg`がインストール時に選択した設定なので手元にscpなどでコピーしておく。

`anaconda-ks.cfg`を編集し、次回からのOSインストールを楽にする。

### 修正

今回はkickstartに以下の内容を追加した。

* `/`サイズを自動で空き容量最大まで指定
* SELinuxの無効化
* Ansibleのインストール
* Firewallの無効化

```sh:anaconda-ks.cfg
part / --fstype="ext4" --ondisk=vda --size=1 --grow

(略)

%post --log=/root/ks-post-anaconda.log
set -x
# SELinux
sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# Ansible
yum install -y "https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm"
yum install --enablerepo epel-playground -y ansible
# firewalld
systemctl disable firewalld
%end
```


## 手順

### ブート画面

* CentOS8のisoでブートしたら以下の画面となる。
    * `ESC`キーを押下。

![ks1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4d43d876-9262-075d-e89c-7c2d87734f8a.png)

### linux ks= の指定

* `linux ks=http://192.168.xx.xx/anaconda-ks.cfg` を指定
    * ファイル名は変更してもよい。キー配列がusなため、`=`と`:`の入力には注意
    * (CentOSのバージョンによっては`linux ks`だけで途中までブート出来たがCentOS8は指定する必要がある。)

![ks2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/03cd02b8-2ae5-6a43-9dfc-42d4dd302fc8.png)

### 待つ

![done.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/3c0dbbb4-f1f0-2ee8-39fa-fcf4111ee02d.png)


## Ansible

以下3つのファイルを用意。

* run.sh
* site.yml
* vars/packages.yml

```sh:run.sh
#!/bin/sh

ansible-playbook --ask-become-pass -c local site.yml
```

```yml:site.yml
- hosts: localhost
  become: yes
  gather_facts: no
  vars_files:
    - "vars/packages.yml"
  tasks:
    - name: ensure a list of packages installed
      dnf: name="{{ packages }}" state=installed
```

```yml:vars/packages.yml
---
packages:
  - git
  - wget
  - tar
```

```sh:実行
sh run.sh
# sudo のパスワードが求められる。
```
20代エンジニア格付けチェックCODING ～定時後の勉強会スペシャル～ 開いてみた【社内勉強会・Paiza編】

前提
---

自分の現在の所属はシステム開発部、既存パッケージの改修・保守を行っている部署です。
かなり息の長い自社パッケージ（LAMP構成）を2か月に一度改修しリリースするサイクルで活動しています。
開発部メンバーは、エンジニアとしての経験が深い方から、新卒入社の社員まで様々です。

そんな中でPaizaを使って格付けチェックしてみたので、その報告と感想です。

なぜ勉強会をやろうと思ったか？
---

* 自社パッケージの改修・保守に傾注しているため、スクラッチでコードを書く機会がない
* 中途社員はともかく、新卒社員が自社パッケージの言語以外に触れる機会がない
* メンバー間で各人の得意なスキルを知る機会がない

やったこと
---

20代の開発メンバー5～6人に声をかけて、だいたい週2回のペースで[Paiza](https://paiza.jp/)の問題を解きました。
Paizaとは、出された問題をオンライン実行環境でコーディングし、コーディング速度と実行速度を計測できるサイトです。
オンライン実行環境が準備されており、ソフトのインストール不要でだれでもすぐ参加できるため、Paizaを選定しました。

なぜ20代からかというと、うちの開発部の20代は男子も女子も全員~~ヒマな~~独身だからです。年齢差別じゃないです。

内容・ルール
---

* プログラミング言語の縛りはなし
* （別支店の子もいるので）全員でハングアウトビデオ通話を繋ぎ、よーいどんでスタート
* 解き終わった時点で回答結果画面のスクリーンショットをハングアウトチャットに貼る（一応エビデンスのため）
* だいたいみんな解き終わったらレビュータイムを設けて、全員分のコードレビューをする

言語は各々好きなものを使う
---

自社パッケージはLAMPなのでPHP一辺倒になるかと思いましたが、
自分だとC#、ほかにはgolangや、あえて不慣れなswiftを使ってみた子もいました。

言語仕様に依存せずにロジック構築能力を競えたことがメリットかな、と思います。
また、普段は触れることのない他言語の仕様をみんなが学ぶことができました。

解き終わったらコードレビューをする
---

問題にもよりますが、人によってかなり解き方が分かれた問題もありました。
みんなが知らない関数を使う子がいたり、特徴的な解き方をする子がいたりして、
誰のコードがどんな理由でどこが良いのか悪いのか、という技術的な討論ができました。
また、新卒の子が組んだコードが、ほかのメンバーでは上がらなかった奇想天外な組み方をされているけど効率的だったり、普段の業務では見られないようなものを見ることができたと思います。

続けているとどうなったか
---

他の開発部メンバー（30代以上）も興味を持ってくれるようになりました。
また、参加している若手メンバー（自分含む）が家でもPaizaで学習をするようになりました。

加えて、処理の実行速度を競う一面もありました。
例えば、ループが必要な処理でC#で組むと1秒かかる処理をpythonで書き直して1秒未満に抑えられるか！？などですね。

まとめ：良かったこと
---

* 声をかけると定時外だけど意外とみんな参加してくれる
* 開発メンバーに学習する習慣がちょっとついた
* 日常の業務で役立つ知識が増えた
* 別のメンバーがノウハウを持っている、日常の業務で使っていない言語の知識が増えた

まとめ：今後の課題
---

* 声かけ・企画する人が限られている（今回はほとんど自分でした）
* いかに他メンバーからも声があがるようにするか、継続的に続けられるか
* 回答済みの人が挑戦中の人を待つ時間をどう活用するか
* 挑戦中の人がいるときに、どういった判断基準で打ち切るか

さいごに
---

自社で開発メンバーの技術向上を図りたい！という方がおられましたら、
よければ参考にして頂ければと思います！

次回は開発部全体を巻き込んでライトニングトーク会を行った際のレポートをしたいと思います。
今更聞けないエラトステネスのふるい

エラトステネスのふるいを活用し、素数の判定を行います。


# 愚直な素数判定

まず初めに、エラトステネスのふるいを活用しないで素数の判定を行う方法から示します。

素数であるかを判定するには、検証したい数が、検証したい数以下の整数で割り切れるかを2まで繰り返せば良いです。
割り切れるかどうかを確認するため、検証したい数/2以上の数は確認する必要がありません。
また、数学的にはさらに√検証したい数まで確認すれば良い事が分かっています。

```csharp:notEratosthenes.cs
        public void notEratosthenes(int num)
        {
            var answerList = new List<int>();

            for (int x = 2; x < num; x++)
            {
                var limit = (int)Math.Sqrt(x);
                int targetNum;

                for (targetNum = limit; targetNum > 1; targetNum--)
                {
                    if (x % targetNum == 0)
                    {
                        break;
                    }
                }

                if (targetNum == 1)
                {
                    answerList.Add(x);
                }
            }
            Console.WriteLine("answer");
            Console.WriteLine(string.Join(" ", answerList));
        }
```

# エラトステネスのふるいを使った素数判定

愚直な解き方に対し、エラトステネスのふるいと呼ばれる方法は2〜√検証したい数までの倍数をふるい落としていくという方法です。

<img width="506" alt="スクリーンショット 2019-11-05 9.59.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/53da9928-efa0-d03c-7dc2-2762cad57121.png">


```csharp:eratosthenes.cs
        public void eratosthenes(int num)
        {
            var answerArray = new int[num + 1];

            var limit = (int)Math.Sqrt(num);

            for(int i = 2;i <= limit;i++)
            {
                if(answerArray[i] == 0)
                {
                    for(int j = 2 * i;j <= num;j++)
                    {
                        if(j % i == 0)
                        {
                            answerArray[j] = 1;
                        }
                    }
                }
            }

            Console.WriteLine("answer");
            for(int i = 2; i <= num;i++)
            {
                if(answerArray[i] == 0)
                {
                    Console.Write(i + " ");
                }
            }
        }
```

計算量がO(nloglogn)となりました!!
競技プログラミング的な要素も入ってくるので、非常に勉強になりますね。
日本語話し言葉コーパス (CSJ) でGoogle Chromeの音声認識の精度をはかる

# はじめに
ちゃお・・・†
Google Chromeに音声認識機能があることはご存知でしょうか？わたしは最近、音声認識の研究のベースラインとしてそのGoogle Chromeの音声認識器の精度をはかりました。

結果から言うと2019年9月時点では、日本語話し言葉コーパス (CSJ) のcoreデータでのWord error rate (WER) は0.2251でした (トークナイズにその当時のmecab-ipadic-neologdを使用)

そのついでに、そのときに書いたコードを置くGitHubリポジトリを作りました。

https://github.com/ikegami-yukino/csj-eval

以降はCSJのデータでGoogle Chromeの音声認識の精度をはかる方法を記します。

# 必要なもの
- Google Chrome
- [日本語話し言葉コーパス (CSJ)](https://pj.ninjal.ac.jp/corpus_center/csj/)
- USBオーディオキャプチャー的なもの
- Python 3とその依存パッケージ
- MeCab
- [SoX](https://sourceforge.net/projects/sox/) (Windowsの場合)
- alsa-utils or sox (Ubuntuの場合)

# どうやるか

リポジトリ内READMEの拙い英文のとおりなのですが、簡単に書くと以下のとおりです。

1. CSJのwavファイルを転記基本単位ごとに1つずつ切り分ける
2. Flask (Python用Webアプリケーションフレームワーク) を用いた簡易Webサーバーを立ち上げる
3. Google ChromeでFlaskサーバーにアクセスしてGoogle Chromeの音声認識機能をONにする
4. 手順1で作ったwavファイルたちを順番に再生する
5. FlaskサーバーのページのJavaScriptから音声認識結果をファイルに書き出す
6. CSJのトランスクリプション (正解データ) と音声認識結果との単語誤り率 (WER) をはかる

![IMG_1329.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48207/674e84ba-ad8b-30ad-3481-37172e3bf5d2.jpeg)

なお、手順4に行く前に上の画像のようにUSBオーディオキャプチャー的なものでパソコンのUSBポートとイヤフォンジャックを繋ぐ必要があります。ちなみに、わたしはデジ造音楽版を使いました。

それと手順4はWindowsでは`sox`コマンドを使っていて、soxコマンドの導入は一手間かかるのでこちらを参考にするとよいと思います。 https://qiita.com/teteyateiya/items/e4dc27e384d947b9946d

# できたらいいなってこと

- WER以外の評価尺度の対応
- Google Chrome以外の日本語音声認識器との比較 (お金と手間のかからないものだとうれしいです) (Juliusの音声認識パッケージのモデルはCSJを含めたデータから作られているようなのでCSJのデータで評価するのは不適切？)
- SoX on Windowsでの発話の最初と最後が省略されてしまう問題の解決あるいは代替案
- ネイティブLinux環境での動作確認 (わたしの手元にはDockerとWSLしかありません)

もしcontributeしてくださる方がいればPull requestウェルカムです！
【#PowerApps Tip's】Officeファイルをクライアントアプリで起動させる

前回は「[【#PowerApps Tip's】OfficeファイルをOnlineで起動させる](https://qiita.com/yamad365/items/235496e6962708e0f95a)」という話題でした。今回は、PowerApps からファイルを「Officeクライアントで起動」してみたいと思います。

# やりたいこと
PowerApps で、データソースがSharePoint Online のリスト。そのリストの添付ファイルを利用している状態で、PowerApps アプリ側でデータソースの添付ファイルをクリックした際などでダウンロードではなく、Officeクライアントを起動したい。
例えば、〇〇.xlsx だったら、クライアントでExcelを起動させる、というコトです。

# 利用するデータ・アプリ
[前回](https://qiita.com/yamad365/items/235496e6962708e0f95a)と同様です。前回利用したアプリをチョイと改造して確認しています。

# 実際の動作
下記の動画をご覧ください。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> open the SPO attachment in Office Client application. ex: .xlsx -&gt; Excel. ms-excel: + FileURL <a href="https://t.co/YOprZp0DrO">pic.twitter.com/YOprZp0DrO</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1191381686732251136?ref_src=twsrc%5Etfw">November 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Office クライアントで起動する方法
Officeファイルを該当するアプリケーションで開きたい場合は、下記サイトを参考に該当する URI スキームを開きたいファイルのURLの前に付けるだけ、です。

■参考URL
[予約済みのファイルと URI スキーム名](https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/reserved-uri-scheme-names)

たとえば、Excel、Word、PowerPoint だと下記。

　　Excel（.xlsx） → ms-excel:
　　Word（.docx） → ms-word:
　　PowerPoint（.pptx） → ms-powerpoint:

このスキームと、開きたいファイルのURLを下記のように組み合わせる、というコト。例えば、Excelのファイルだった場合。

　ms-excel:[ファイルのURL（https://～）]

あとは、前回と同じように文字列を操作して Launch関数です。

※上記参考URLは [@br_Yellow11](https://twitter.com/br_Yellow11) さんが教えてくれました。ありがとうございます！！

# 補足 あるいは ポイント
前回は単純なURLパラメーターを末尾に付与するだけでOKでした。今回は、開きたいアプリケーションによってURIスキームを動的に変更する必要があります。前述の動画で、追加したボタンの OnSelect アクションに記載していた処理は下記です。

```
UpdateContext({wkSchema: 
  Switch(Last(Split(DisplayName,".")).Result,
   "xlsx","ms-excel:"
  ,"docx","ms-word:"
  ,"pptx","ms-powerpoint:")});

Launch(wkSchema & AbsoluteUri,DisplayName)
```

ファイル名を"."で分割して、Last（最後の要素）を取得すると拡張子が取得できるハズです。その拡張子から、該当するスキームを変数に格納し、Launch関数に、変数に格納したスキーム＋URLをパラメーターとして指定しています。上記の例は3種類しか対応していない、ということになります。

ちょっとメンドクサイですｗ
しょうがないね。

# 注意
このURIスキームを指定した場合の動作は、完全にブラウザーに依存します。おそらく、Office 365がサポートしているブラウザーであれば意図した動作をするでしょう。が、万が一、意図したアプリケーションが起動しない状況が発生した場合は・・・諦めてブラウザーを変更してみてくださいｗ

※アプリに不具合がない前提で、ですがｗ

# まとめ
- PowerApps から Officeクライアントでファイルを開きたい場合はURIスキームを付与してLaunch関数
    - 拡張子などでアプリケーションを判定する必要がある
- URIスキームを解釈してくれるか否かは、ブラウザー依存

".txt"や".pdf"など、大半のブラウザーでデフォルト表示が可能な拡張子はURIスキームを付与せず直接URLをLaunchするとブラウザー上で表示されるコトが多いです。そのため、前述の関数で、Switch関数のデフォルト値（どれにも該当しなかった場合）に Blank() を指定しておけば、ブラウザーまかせで良しなに処理をしてくれる状態になります。すぐに把握できると思いますので試していただければ、と思います。

あ、そうだ。前回書き忘れたのですが、SPOリストの添付ファイルで試していますが、ドキュメントライブラリのアイテムでも同じ処理で動きます。たぶん。

ちなみに、Ignite 2019 を観ながら途中まで書いてたので、誤字脱字などありましてもご容赦賜れれば幸いです（汗

それでは、皆さま。素晴らしい Power Platform Life を！