OmniAICreator/Qiita-1.07M huggingface dataset:
すべてのコミットメッセージからプレフィックスを削除する

# はじめに

コミットメッセージにプレフィックスを付けたら生産性があがった！とかいう記事を読んだことはないだろうか。確かにプレフィックスをつけると効率が上がるかもしれない

ただなんとなくすべてに fix をつけろというわけでもない。プログラマがやることなんて殆どが修正なんだからそれをしたらプレフィックスをわざわざ書いている意味がなくなる

結局のところ本当の問題なのはコミットメッセージだけで何をしたコミットかわかればいいので、極論を言えば、[情報量の多いコミットメッセージ](https://qiita.com/magicant/items/882b5142c4d5064933bc)が書ければプレフィックスなんて必要ないし、そもそもコミット内容が伝わるコミットメッセージを書けない人はプレフィックスを付けても意味がない

ということで、書いてしまった過去のコミットメッセージからプレフィックスを取り除く方法です！

# 方法

まず注意として、この方法はすべてのコミットを修正するため歴史を改ざんすることになります。すでにGitHubなどに公開して複数人で作業している場合はやめておきましょう。また初心者はやらかしてしまっても自力で解決するのは難しいのでやめておきましょう。__責任は取りません__

gitで歴史操作というとrebaseなどが一般的ですが、今回のように多くのコミットを手作業で修正するのは大変なので、機械的に書き換えることができる`git filter-branch --msg-filter`を使います

そしてメッセージの置換には`sed`を使います。`sed`の使い方は調べれば詳しい記事があるので割愛しますが、`sed -e "s/正規表現/置換する文字/"`のようにして使う。そのまま実行すると対話的に変換することができるので実行する前に正しく置換できるか確認してみてください

以下に一般的なプレフィックスの置換コマンドを乗せます。fixとしている部分は英数字の最長一致なのでコミットメッセージ中に同じ記号が含まれてると誤ってすべて削除してしまうのでなるべく確認してから使ってください。またいろんなスタイルに対応できるような正規表現を書こうとしたのですが*を使うと変換ができなかったのでスペースなどの置換についても各自で入れてください

- `fix:` `sed -e "s/.*://"`
- `[fix]` `sed -e "s/.*\]//"`

```bash
git filter-branch --msg-filter 'sed -e ""'
```

# 参考

- [filter-branchで指定した範囲のコミットログを修正する - Qiita](https://qiita.com/toshi0383/items/f760f09ae4b921af0e9b)
- [Gitで不適切なコミットメッセージを削除した公開リポジトリを作る - ククログ(2012-01-05)](https://www.clear-code.com/blog/2012/1/5.html)
ProgateでSQLを学習してみた(3)

#ProgateでSQLを学習してみた(3)
SQL学習の続き

・WHEREで条件設定する（レッスン1）
・比較演算子、LIKE、NOT、NULL・IS　NOT　NULL,AND・OR（レッスン1）
・ORDER BY、LIMITで加工（レッスン1）
・DISTINCT、四則演算（レッスン2）
・集計関数（SUM、AVG、COUNT,MAX・MIN）（レッスン2）
・グループ化（GROUP BY、HAVING)　（レッスン2）

今回はここから↓
**・サブクエリ（レッスン3）**
**・複数テーブルの使用（JOIN、LEFT JOIN）（レッスン3）**
##サブクエリ
いよいよ実務でよく使う部分に近づいてきました！

販売管理システムだと
・受注ヘッダー
・受注明細
・商品マスタ
さらには
・顧客マスタ　etc...

テーブルだらけですよね～( ;∀;)

「サブクエリ」と「JOIN（結合）」は重要！と気を引き締めます('Д')
###サブクエリで動的な「WHERE」条件を設定

```SQL
SELECT 名前,得点
FROM 選手
WHERE 得点　>　←平均点よりも点数が高い選手を表示する
(SELECT AVG(得点)　←平均点を求める
  FROM 選手);
```
WHERE条件に指定するSELECT文は「()」で囲みます

実務では「固定の条件」を使うことはほぼ無いかな…
この条件文を書くことが出来れば、メンテナンスも少なくてすみます

##複数テーブルの使用（JOIN、LEFT JOIN）
いよいよ複数テーブルの結合！
実務を意識すると、ここは確実に外せない！！

実際のデータベースでは「商品マスタ」や「顧客マスタ」が
必ず存在します
むしろ、この「マスタ」が無いとデータベースのメリットが半減します

>テーブルを紐づけるために、外部キーと主キーを使います。
外部キーで他のテーブルにある主キーを指定することで、
テーブル同士を紐付けることができます。

「主キー」がマスタのID、「外部キー」が受注データなどの主でないカラム
こんな覚え方を私はしています('Д')

###JOINで結合すると外部キーがNULLのデータは表示されない！

```SQL
SELECT players.name AS "選手名",teams.name AS "前年所属していたチーム"
FROM players
JOIN teams
ON players.previous_team_id=teams.id;
```
上記SQLの結果だと「previous_team_id」の値がNULLの場合
結果に表示されなくなります

これは理解できてなかった！(;O;)
今まで「ダメダメなSQL文」を作成していた自分を呪います！
大丈夫だったのだろうか…？

##LEFT JOINを使って外部キーがNULLの値も表示する
「外部キーがNULLだったって表示してほしい！」
もちろんです！あるあるです！

```SQL
SELECT players.name AS "選手名", teams.name AS "前年所属していたチーム"
FROM players
LEFT JOIN teams　←移籍経験が無い選手はNULLが前のチーム_idに入っている
ON players.前のチーム_id=teams.id;
```
###３つ以上のテーブルを結合させる
これも実務では多いと思います
ACCESSでクエリを作成する時はSQL文を意識しないでも処理できるけど
Webプログラミングをマスターしたい人はそうもいかないですね

```SQL
SELECT *
FROM players
JOIN countries　←「JOIN」は複数回使用できる（１）
ON players.country_id=countries.id
LEFT JOIN teams　←「JOIN」は複数回使用できる（2）
ON players.previous_team_id=teams.id;
```
良いテストとは？ 『リーダブルコード』-テストと読みやすさ-メモ

テストを書く機会が多くなったので、『リーダブルコード』の「テストと読みやすさ」という章を読んだメモです。

リーダブルコード p.179~

## テストを読みやすくて保守しやすいものにする

> #### 鍵となる考え
> 他のプログラマが安心してテストの追加や変更ができるように、テストコードを読みやすくする

#### だめなテストで起きること

- 本物のコードを修正するのを恐れる
- 新しいコードを書いたときにテストを追加しなくなる

#### 設計原則

> 「大切ではない詳細はユーザから隠し、大切な詳細は目立つようにする」べき

## テストの最適な入力値を選択する

> #### 鍵となる考え
> コードを完全にテストする最も単純な入力値の組み合わせを選択しなければならない。

たとえば、

> テストには最もキレイで単純な値を選ぶ。
> マイナス数値を削除する機能のテストならば、`-9994.2`ではなく`-1`でよい。極大な数値をテストしたいのなら、`-1e100`のような簡潔な値にしたほうがいい

### １つの機能に複数のテスト

コードを検証する「完ぺき」な入力値を１つ作るのではなく、小さなテストを複数作るほうが、簡単で、効果的で、読みやすい。

>テストのトップレベルはできるだけ簡潔にする。入出力のテストはコード1行で記述できるといい。

```
CheckScoreBeforeAfter(input,expected)
```

## テストの機能に名前をつける

>テスト関数に説明的な名前をつけて、何をテストしているのかを明らかにする。Test1()ではなく、Test_<関数名>_<状況>のような名前にする。
Phoenix 1.4rcを試す① アップデート紹介編

[fukuoka.ex](https://fukuokaex.connpass.com/)代表のpiacereです
ご覧いただいて、ありがとうございます:bow:

つい先日10/10、待望の[Phoenix 1.4.0-rc.0がリリース](https://twitter.com/elixirphoenix/status/1049724968521662464)されました、やっほー:laughing:

革新的なアップデートが幾つも盛り込まれたPhoenix 1.4の紹介とインストール、動作確認を数回に分けて試してみようと思います

なお、Phoenixは、ElixirのWebフレームワークです

内容が、面白かったり、気に入ったら、「いいね」よろしくお願いします :wink:

# Phoenix 1.4のアップデート内容

Phoenixメインコミッター、[Chris McCordさん](https://github.com/chrismccord)の[「ElixirConf 2018」](https://elixirconf.com/)登壇動画で紹介されていた機能は、こんな感じです

https://www.youtube.com/watch?v=Z2DU0qLfPIY
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/26c99771-f1ae-4fc8-19c8-7be1db928f85.png)

とうとうCowboy 2系がPhoenixで使えるようになる、というのが、最も注目するアップデートと思います

Cowboy 1系と比べた性能比較は、3倍程度スピードアップするようなので、よりサクサク動く期待大ですね

また、HTTP/2による性能向上も試してみたいところです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/703d38a1-e947-957c-3350-90a288f7bd77.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3266db7e-7d18-6ca5-6f87-85c4ba3400c9.png)

「Telemetry」は、[動的関数呼出のライブラリ](https://github.com/elixir-telemetry/telemetry)を標準機能化する感じですかね

既存処理をフックするライブラリやDIっぽい実装が、これからガンガン進みそうな予感です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/128f7488-3516-c6aa-498e-55f13aa2b2b4.png)

「LiveView」という、サーバサイド主体のフロントリアルタイムレンダリングの機能は、けっこう注目しています

Vue.jsのようなフロントサイドとどう使い分けるか、とか、フロント側の状態をAPI通信無でアクセスできるメリットをどう活用するか、といったネタ、盛り沢山です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/7c2dcdb7-efa7-b9d4-a005-0731ac79602d.png)

上記動画の41分過ぎ頃の挙動をぜひ見ていただきたいのですが、フロントアニメーションの制御を、サーバーサイドから行うこの技術は、Elixir／Phoenixという文脈を超えた、エポックメイキングな存在になるのでは無いかと捉えています

それと、登壇では出ていないフィーチャですが、フロントモジュール管理ツールが、BrunchからWebpackに変更されているのも、地味に大きく変更されたポイントです

# Phoenix 1.4.0-rc.0に含まれているアップデート

[elixir forum](https://elixirforum.com/t/phoenix-1-4-0-rc-0-released/17182/1)にアップされているアップデート一覧は、こんな感じです（もし内容が間違ってたらお知らせくださいませ）

アップデート  | 登壇と同じ？
---|:-:
HTTP2 with Cowboy 2 | ○
Local SSL development | × NEW
Faster Development Compilation | ○
New Development 404 Page | × NEW
UserSocket connection info | ？（Overhauled Transport Layerの範疇？）
Deprecated Transport macro | ？（Overhauled Transport Layerの範疇？）
New Presence JavaScript API | ？（Improved Presence APIと異なる？）
webpack | ×

# 終わり

[次回は、Phoenix 1.4.0-rc.0のインストール](https://qiita.com/piacere_ex/items/f4fb3fecb359e798ef01#_reference-9dcfd04a56c4f1119da7)について書きます

その後、追って、Phoenix 1.4.0-rc.0の上記リストの動作確認を試していこうと思います

# p.s.「いいね」よろしくお願いします

よろしければ、ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックをお願いしますー:bow:
【HTML】button要素をクリックした時にフォームが送信されないようにする方法

form内にbutton要素を置くと、クリックした時にformがsubmitされてしまいます。
submitさせたくない場合は下記のように`button`要素に`type="button"`を付けましょう。

```html
<form>
    <button type="button">ボタン</button>
</form>
```
【2019/02/25更新】Centos7でMozc(Google日本語入力)を使う方法

Linuxで使える日本語入力としては「かな漢字」がありますが、予測変換などお世辞にも
優秀であるとは言いがたい…　~~というかマジで使えない~~

ネットで探しても、古い情報が多く使えないものが多かったので
現在利用できるものを紹介する。

# How to user Mozc

## 環境
- CentOS Linux release 7.5.1804 (Core)
 

## ディレクトリの作成（任意）
どこのディレクトリでも構わないが、ややこしくなるのを避けるため
今回は ~/App/Mozc の中でインストールすることにした。

```bash
 $ mkdir ~/App
 $ cd ~/App/
 $ mkdir Mozc
 $ cd Mozc/
```

## 必要なパッケージをダウンロードする。
Centos用には、Mozcのパッケージは用意されていないようなのでfedora 19 のものを利用した。
（fedora 20 のものでは上手く行かなかった）

```console
 $ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/19/Everything/x86_64/os/Packages/i/ibus-mozc-1.10.1390.102-1.fc19.x86_64.rpm
 $ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/19/Everything/x86_64/os/Packages/m/mozc-1.10.1390.102-1.fc19.x86_64.rpm
 $ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/19/Everything/x86_64/os/Packages/p/protobuf-2.5.0-4.fc19.x86_64.rpm
 $ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/19/Everything/x86_64/os/Packages/z/zinnia-0.06-16.fc19.x86_64.rpm
 $ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/19/Everything/x86_64/os/Packages/z/zinnia-tomoe-0.06-16.fc19.x86_64.rpm
```


2019/02/25現在、すべてのリンクが生きていることを確認した。

## yumでインストールする
ここからの作業は**すべて依存関係があり、順序を守らないと上手く行かない**ので注意。

#### インストールの順序
 
1. protobuf
2. zinnia
3. zinnia-tomoe
4. mozc
5. ibus-mozu

の順番でインストールしなければならない。すなわち、

```console
 $ sudo yum localinstall -y protobuf-2.5.0-4.fc19.x86_64.rpm
 $ sudo yum localinstall -y zinnia-0.06-16.fc19.x86_64.rpm
 $ sudo yum localinstall -y zinnia-tomoe-0.06-16.fc19.x86_64.rpm
 $ sudo yum localinstall -y mozc-1.10.1390.102-1.fc19.x86_64.rpm
 $ sudo yum localinstall -y ibus-mozc-1.10.1390.102-1.fc19.x86_64.rpm
```

と、順番に行う必要がある。

## インストールが終わったら

必要に応じて再起動をすることで、Mozcが追加できるようになっている。

## デバッグ（おかしいな？と思ったら）

### `yum update`できない
fedora 19のzinniaをインストールすると、epelにもより新しいzinniaあるんだけど!！って言って
アップデートさせてくれないことがある。
このためyumをアップデートする際は`--skip-broken`オプションをつける必要がある。

```console:example
 $ yum update --skip-broken
```

### 再起動後英語しか入力できなくなる

自分の環境では毎回これが発生していて、
設定の言語からMozcを一旦消去→もう一回追加すると治る


## FYI: Mozcとは
 > Mozcとは、Google 日本語入力のオープンソース版である。これは2010年5月11日にGoogle日本語入力をGoogle Chrome OSに移植するために必要な部分をオープンソースしたものである。
オープンソース版のMozcとGoogle 日本語入力との大きな違いは、Mozcは日本語変換エンジンでありこれを用いて日本語入力を行うにはibus、uim、Fcitxのようなインプットメソッドを別途インストールする必要がある点である。またGoogle 日本語入力の売りであるインターネット上の語句を収集して生成される変換辞書を使わず、代わりにMozcプロジェクトが作成した変換辞書を使う点も異なる。変換辞書などを含めた完全にオープンソース化に対応しないのは、インターネットから収集してきたデータが変換辞書として使われている関係上、SEO対策に悪用されないようにするためであるという。(wikipedia)cとは、Google 日本語入力のオープンソース版である。これは2010年5月11日にGoogle日本語入力をGoogle Chrome OSに移植するために必要な部分をオープンソースしたものである。 (Wikipediaより)

## 終わりに
Ubuntuはなんか`apt-get mozc`とかでインストールできるらしいんで帰ってどうぞ。
Athena で CloudFront ログ解析


streampack の Tana です。
# 概要

今回は Athena によるログ解析です。
動画を扱っていると、CDN(CloudFrontなど)で配信するので CloudFront のログから再生状況を確認することがたまにあります。
ローカルに s3 からアーカイブされたログをダウンロードして grep, sort, uniq  してやるのも楽ではありますが、みにくく解析しにくい時があります。
その際に AWS Athena を使うとSQLクエリで条件を絞ったり、ソートしたりできるので便利です。

## S3 に CloudFront のログ置く

<img width="1327" alt="s3-cf-logs-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/081996e3-9346-f772-82e7-02461f7039b0.png">


## Athena にてテーブルを作成

今回はすでに準備している下記のクエリからテーブルを作成します。

- テーブル名: app_log
- s3 bucket & path: s3://xxxxxx-sandbox/cf-logs/app

https://ap-northeast-1.console.aws.amazon.com/athena/home?force&region=ap-northeast-1#query
下記のクエリを　Query Editor にてセットし、"Run query" を実行します。

```
CREATE EXTERNAL TABLE `app_log`(
  `request_date` string, 
  `request_time` string, 
  `x_edge_location` string, 
  `sc_bytes` int, 
  `client_ip` string, 
  `cs_method` string, 
  `cs_host` string, 
  `cs_uri_stem` string, 
  `sc_status` string, 
  `cs_referer` string, 
  `user_agent` string, 
  `uri_query` string, 
  `cookie` string, 
  `x_edge_result_type` string, 
  `x_edge_request_id` string, 
  `x_host_header` string, 
  `cs_protocol` string, 
  `cs_bytes` int, 
  `time_taken` decimal(8,3), 
  `x_forwarded_for` string, 
  `ssl_protocol` string, 
  `ssl_cipher` string, 
  `x_edge_response_result_type` string, 
  `cs_protocol_version` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '\t',
    'input.regex' = '\t'
)
LOCATION
  's3://xxxxxx-sandbox/cf-logs/app'
TBLPROPERTIES (
  'has_encrypted_data'='false')
```

## クエリを投げる

シンプルに取得するなら、下記の SQL を実行します。

```
SELECT * FROM app_log;
```

フィルターや順序を変更したい場合はSQLと同様なクエリを実行するだけです。

```
WHERE request_time >= '17:00:00' AND request_time < '18:00:00'
AND time_taken > 1          # 1秒以上のレスポンスでかかったもの
AND sc_status = '200'       # 200 のもの
ORDER BY request_time ASC   # 処理時間順に表示
LIMIT 10                    # 10件のみ
```

<img width="1621" alt="athena-query.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/a1159f35-a089-d499-21f9-a7050f1d5f5c.png">

## おまけ

AWS-CLI でも生成したり取得したりできるので、オペレーション的には便利そうです。(下記は取得だけ)

> $ aws athena get-query-results --query-execution-id xxxxxxxxxx --output table


## 終わり

実戦で使うようにするには、パーティション設計が必要です。さもなければ、フルスキャンすることになるのでコスト増や時間がよりかかります。Lmabda などで出力されるログにてs3のパスをyear=YYYY/month=mm/day=dd/ などの日付ごとに分割するようにし、対象日付のものだけスキャンするような仕掛けが必要そうです。(まだやれてないですが。。)
Active Record のプレースホルダー付き条件を知る

# 前提
- 生の SQL 文に引数として値を複数渡したいなと思った時に知ったメソッドです。

# 環境
- Ruby On Rails 5.1.6
- Ruby 2.4.4p296

# TL;DR
以下のように、 ActiveRecord の where メソッドにおいて、SQL 文にシンボルで値を複数渡すことができます。これは、 where だけじゃなく、 find_by_sql メソッドでも使えることは確認できています。他のメソッドはどうなんだろう…。

```ruby
Users.where("created_at >= :start and created_at <= :end",
  {start: '2018-01-01', end: '2018-03-31'})
# "SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Users') AND (created_at >= '2018-01-01' and created_at <= '2018-03-31')"

Users.find_by_sql(['select * from users where created_at between :start and :end', { start: '2018-01-01', end: '2018-03-31' }])
# select * from users where created_at between '2018-01-01' and '2018-03-31'
```

# 参考文献
- https://guides.rubyonrails.org/active_record_querying.html#placeholder-conditions
人生の日付をPythonが教えてくれたのだ。

# はじめに
人生は有限なので、己が有意義に思うことで生きましょう。
皆そう言いますよね。

というわけで
- 何日生きたのか？
- あと何日生きるのか？
のスクリプトを書きました。
簡単です。

# スクリプト
```python:your_lifetime.py
# coding:utf-8

import datetime

birthday = datetime.date(1992, 2, 5) #自分の生年月日。お好みで変更下さい。
today = datetime.date.today()
finalday = datetime.date(2092, 2, 5) #人生百年の時代ですからね。
elapsed0 = finalday - today
elapsed1 = today - birthday
days0 = elapsed0.days
days1 = elapsed1.days
print("{0} 日で天に召されますよ".format(days0))
print("あなたは {0} 日生きましたよ".format(days1))

```
# 結果

```bash
/usr/bin/python /Users/Desktop/your_lifetime.py
26779 日で天に召されますよ
あなたは 9746 日生きましたよ

Process finished with exit code 0
```

# 結論
簡単ですが、考えさせられることが多いスクリプト。
テーブルにカラムを追加する(Rails)

##既に作成されているテーブルにカラムを追加するには？

**カラムを追加するマイグレーションファイルを作成する。**

```ruby:ターミナル
$ rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型
```

例えば、

```ruby:ターミナル
$ rails g migration AddIntroductionToUsers introduction:text
```

その後作成されたマイグレーションファイルを確認して、

```ruby:qiita.rb
$ rake db:migrate
```

を実行する。
コマンドラインでJSONファイルを整形して表示させる

## やりたいこと

ちょっとしたJSONファイルを確認する時に役立ちます。

## 環境

* Mac OS X 10.14

> jqコマンドをhomebrewでインストールするのでbrew installが使えること

## jqをインストール

```
$ brew install jq
```

## jsonファイルを用意

適当に`test`のようなファイルを作成します。
`test`内に以下を入力。

```
{"name": "hoge-user","data": [{"id": 123,"email": "hoge@hoge.com"}]}
```

`cat`コマンドで出力すると、先ほど入力したJSONが表示されるかと思います。

```
$ cat test
// 出力結果
{"name": "hoge-user","data": [{"id": 123,"email": "hoge@hoge.com"}]}
```

## jqコマンドを使って整形する

先ほどは`cat`コマンドでファイル内容を出力しましたが、出力したjsonをパイプで`jq`コマンドに渡しjsonを整形させます。

```
$ cat test | jq .
```

以下のように表示されるようになるかと思います。

```
{
  "name": "hoge-user",
  "data": [
    {
      "id": 123,
      "email": "hoge@hoge.com"
    }
  ]
}
```

以上です
Heart Rate Sensor PulseSensor Analog Signal Output - 心拍の生データ取得

# 心拍の生データ取得
## PulseSensorPlayground を使わずにデータ習得してみた。これだね！！
### かなり早いね。。。

![取得結果](https://qiita-image-store.s3.amazonaws.com/0/77496/409a7f47-385b-8d57-a2ac-b7126b2f1735.png)

## シンプルにアナログ入力の表示のみ
### イリーガル値のみ排除してシリアル出力

```

int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  Serial.begin(38400);          // For Serial Monitor
}

void loop() {
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  if ( sensorValue > 400 && sensorValue < 600 ) {
    Serial.print( "600 500 400 ");                        // Print the value inside of myBPM.
    Serial.println(sensorValue);
  }
  delay(10);
}

```
## ライブラリを使う場合は、ライブラリマネージャーから取得してください。
### 心拍数がほしい時は、こちらが便利

![ライブラリマネージャー](https://qiita-image-store.s3.amazonaws.com/0/77496/2ac8200c-0a22-f581-bf92-c4d8462107cc.png)
【孫引きメモ】git diff を見やすくするコマンド達

# 参考
当記事は「[gitのdiff, status, logを極限までコンパクト化＋便利化する](https://qiita.com/yuya_presto/items/ef199e08021dea777715)」の孫引きです。参照記事ですので、リンク先を読まれると捗るかと思います。
# 問題
git diff で差分チェックするも、一見して訳がわからないこと。
# 解決
git の色表示を有効にすると、見やすくなるらしい。
# 色付きにするコマンド

```bash:
git config --global color.ui auto   # 出力先が端末のときに色をつけて表示する
```

# 差分を小さく表示する場合のコマンド

```bash:
git diff --color-words  # 差分を単語単位で色分けで表示する
```

# 結果
素晴らしく見やすい状態となった。
ありがとうございます！
range指定ではなくActivecell指定で複数の連続していない(飛び石)位置のセルを選択する方法

ExcelVBAで複数の連続していないセルを選択する方法を記載する。
rangeで指定すればこれは割と簡単で、
```Range(range(A1), ActiveCell.Offset(B3)).Select```

のような構文で実現することができる。
しかしこれを応用してActivecellで同じ構文を作ると失敗する
```Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(2, 3)).Select```

このようにすると範囲選択が連続するすべてのセルになってしまう。
つまりoffset(0,1)から(2,3)の間にある全てのセルが選択されてしまう。
offset(0,1)と(2,3)だけを選択したい場合は以下のようにする
```Application.Union(ActiveCell.Offset(0, 1), ActiveCell.Offset(2,3)).Select```

これで実現可能。
この後に
```Selection.Copy```
```Selection.PasteSpecial```
```activecell.offset(0,1)```

あたりを打ち込めば行ごとに自動でコピー＆ペーストを繰り返せるあはずだ。
Xcode10とiOS12の穴巡り（更新中）

# 前提
　　　　iOS12とXcode10がリリースされたので、これが絶対何か変わったと思います。
　　　　色々ネットか、実際のプロジェクトで試したら、穴があった！

# lstdc++.6.0.9シリーズ無い
　　　　C++11前のC++のサポートライブラリーとして使っている、lstdc++.6.0.9
　　　　
　　　　`これがなぜ一番かと言うと、ほぼコアーなコードがC＋＋で書くと決まっているだからだ！`
　　　　だが、Xcode10から、無くなりました、libc++しかないぞ。
　　　　みんなは　`C++11に移行すべき` だ。
　　　
　　　　当てはまる人が、SDKを使う人、SDKを開発の人かなぁと思います。

# CocoaPodsのversion
　　　　CocoaPodsのバージョンは気付いていない人がいるかもしれないが、実は
　　　　バージョンは1.4.0以上じゃ無いと、
　　　　 `Copy Pods Resources` はXcode１０では無効になっているみたい。

　　　　つまり、ビルド成功したとしても、アプリが走れない、StoryBoard含める全てのリソースが無いぞ。

# 画像追加
　　　　iPhone XRシリーズ出たので、以下の解像度対応したLaunch画像を追加した方がいいみたい。
　　　　下記のように
　　　　`iPhone XR：828px x 1792px`
　　　　`iPhone XS Max: 1242px x 2688px`

　　　　Deviceのクラスでは、まだ追加判定しないといけないですね。
　　　　PS:なんで毎回新機種発表の時が追加判定しないといけないだろう、アップルが何か違うものを出したいだろうか、が、全然盛り上がらないぞ（笑

# Swiftを厳密に
　　　　残ったのはSwiftなので、ほぼ、提示あるから、特に大きい問題じゃ無いと思います。


（まだありましたら、追加更新します）
Running Container-Enabled Microservices on AWS を受講しました＆感想


AWS公式トレーニングの `Running Container-Enabled Microservices on AWS` を受けてきましたので、研修内容と感想を書きます。

# 研修情報
[クラスの詳細 | AWS Training & Certification](https://www.aws.training/learningobject/ilt?id=22699)
## 説明
> このコースでは、Amazon Elastic Container Service (Amazon ECS) を使用して、コンテナ対応アプリケーションを管理およびスケールする方法を学習します。コンテナ化されたアプリケーションを大規模に実行するという課題に注目し、Amazon ECS を作成および使用して、マイクロサービスベースのコンテナ化されたアプリケーションを開発およびデプロイする方法に関するガイダンスを提供します。ハンズオン演習では、Amazon ECS を使用して、長時間実行されるサービスの処理、コンテナイメージのビルドおよびデプロイ、サービスの連携、需要を満たすためのキャパシティーのスケーリングを行います。また、非同期アプリケーションプロセス向けのコンテナワーカーを実行する方法についても学習します。

- レベル
    - 上級コース
- 形態
    - クラスルームトレーニング、ハンズオンラボ
- 期間
    - 1 日
- 料金
    - ¥ 70000.00 (JPY)

# 感想
AWS-ECS を中心にコンテナ周りのワークロードを通しで学ぶことができたのでとても有意義な学びになりました。そもそも Docker わからないだとついていくのが辛いですが、本番ワークロードでコンテナ運用できていないとか、Docker 
 は開発で少し使うくらいとか、そのあたりの方々に効く内容でした。
　前半は概要の説明で、マイクロサービスの登場とモノリスとの対比、コンテナと Docker の概要。後半は詳細に踏み込み、パイプラインを使ったCI/CD、ECSの説明と監視とスケーリング、コンテナセキュリティ をがっつり一日で詰め込む内容でした。コンテナ管理は ECS 中心となり、Fargate と EKS は説明だけでした。

　ハンズオンが実践的な内容で、最初はしょぼかったアプリケーションが少しずつ強くなっていく様を体験できました。

1. dockerコマンドでモノリスなアプリケーションを起動し
2. アプリケーションをマイクロサービスに分割する（といってもソースは用意されているやつ）
3. docker-compose コマンドで起動できることを確認したあとに
4. ECS で各コンテナを起動するように設定
5. CodeCommit → Jenkins → ECR → ECS と CodePipeline で繋ぎ CICD 環境を作成
6. ECS クラスタとサービスのスケーリング設定（ここは環境都合でハンズオンできなかったのですが…）
7. git-seacretの設定、Twistlockを使ったコンテナイメージ脆弱性スキャン、認証情報のIAMロール化

 構成情報が CloudFormation のながーい定義に詰まっているので、唸りながら読み込んで頭の中でつないでいく感じで、すごく疲れました。初めて ECS をさわったのですが、短い時間でひととおり把握できたので、とてもいい経験になりました。
Mojaveにアップデートした際Gitエラーになるんだけど問題

##Mojaveにアップデートした際Gitエラーになるんだけど問題
OSをMojaveにアップデートした際
gitコマンドを叩くと…
<img width="557" alt="スクリーンショット 2018-10-12 10.43.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/bb501e0c-afde-5910-1a55-c243072cf590.png">

へい！きた。
だがもう怖くない。毎回アップデートの度、来ていたので”耐性”がついた。
CommandLineToolsが無くなってしまっている模様なので…

##単純にCommandLineToolsをインストールすればOK

コマンド：xcode-select --install

ハローワールド！
なぜDockerではホストOSと違うOSベースのコンテナイメージが動くのか

###2020.7.1 Update
2年ほど前に記事を投稿して以来、未だに時々LGTMいただいております。ありがとうございます。
当時はコンテナの動作について、おそらくLinux中級者以上にとっては当たり前の「Linuxカーネルの互換性」から解説された記事は見つけられず、このような記事を投稿していました。（予想以上に読んでいただき、びっくりしました）

最近は私の記事よりもわかりやすい記事も増えています。
私の記事よりも格段にわかりやすいので、こちらを読んでいただいた方がいいかもしれません。
https://thinkit.co.jp/article/17301

---
※「違うOS」は「違うLinuxディストリビューション」や「同じLinuxディストリビューションでもバージョン違い」を指します。（Linux以外の、WindowsやUNIXというレベルで「違うOS」は動きません）

#結論から言うと
- Linuxカーネルには互換性があり、その範囲内であれば異なるLinuxカーネル上でも同じ実装でアプリケーションは動作できる
- コンテナでは、アプリケーションの動作に必要な特定のディストリビューション上でのファイルシステムやライブラリを再現し、ホストOS環境からも分離する
- これらにより、ホストOSとは違うディストリビューション、違うバージョンのプロセスの動作が再現できる

#解説
###Linuxカーネルとファイルシステム・ライブラリ
コンテナはOS機能全ての完全再現ではなく、特定のディストリビューション上のアプリケーションの動きを再現するものです。そして、アプリケーションの動作は「Linuxカーネル」と「ファイルシステム・ライブラリ」に依存しています。
###Linuxカーネルの互換性
まずはLinuxカーネルについて解説します。
当たり前ですが、Linuxディストリビューションはいずれも「Linuxカーネル」を使って動作しています。そして、アプリケーションはLinuxカーネルの機能を利用して動きます。Linuxカーネル機能の呼び出し（システムコール）における、アプリケーションとLinuxカーネルの間のインターフェースを「Application Binary Interface: ABI」と呼びます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/174361/4c0ac409-f441-59aa-b5c3-ccfc5ae614f0.png" width=70%>
そして、Linuxカーネル開発では、前のバージョンから存在するシステムコールのインターフェースは同じ仕様で呼び出せるよう、ABIの互換性に配慮して作られています。これにより、Linuxカーネルバージョンが多少違っても、アプリケーションは概ね同じように動作できます。

**カーネルバージョンが違っても同じ実装でアプリケーションは動く**
<img src="https://qiita-image-store.s3.amazonaws.com/0/174361/869b7480-b377-1e89-f103-ec7a9ca30706.png" width=70%>
###ファイルシステム・ライブラリ
次に、アプリケーションに必要な特定のディストリビューション上でのファイルシステムやライブラリを再現方法です。
コンテナでは、コンテナ内のプロセスに対し、非コンテナ環境と同じ状態のファイルシステム・ライブラリを見せることで、プロセスの動作を再現しています。
ちなみに、ファイルシステムを見えなくする機能には「chroot」が使われています。ftpでサーバに接続したときに、ユーザのホームディレクトリより上位のディレクトリを触れなくするためにも使われる機能です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/174361/8daf6a2b-1c78-83f7-a8e8-e2695fa0057f.png" width=100%>

###補足
上記の考え方で、アプリケーションを「コンテナ」として隔離して動かす思想が「Linuxコンテナ」と呼ばれる技術であり、この技術を使ったコンテナの実装はdocker以外にも存在します。（docker≠コンテナ）
「Linuxサーバであればdockerコンテナはどこでも動く」ような印象を持ちますが、Linuxカーネルの互換性に依存しているため、文字通り「どこでも動く」わけではありません。例えば、新しいLinuxカーネルにのみ存在する機能を利用しているアプリケーションは、古いLinuxカーネル上では動作できません。
コンテナが「仮想サーバのようにOSを再現する」ようなイメージを持ちがちですが、OS機能はホストOSに依存しており、「アプリケーションの動作を再現しているだけ」というイメージを持つことが重要です。OS機能も含めて同じ環境を再現するには、コンテナよりも仮想サーバを使うべきです。

###参考
[第43回　「Dockerイメージ」のポータビリティとLinuxカーネルのABI (中井悦司)](https://www.school.ctc-g.co.jp/columns/nakai/nakai43.html)
[原理原則で理解するDocker](https://qiita.com/tajima_taso/items/28938415846dcc2e83ff)
python logger の初期化タイミングの罠

# 先に結論
[disable_existing_loggers](https://docs.python.jp/3/library/logging.config.html#logging.config.fileConfig): False

にしておきましょう。

# 問題・原因
以下のような簡単なコードで、 cls.logger.info() が表示されません。

これは次の２つのことが原因と考えられます。

- logging.config を行うとそれ以前に作成された logger インスタンスは disable: True になる
- logger は同じ名前のものは（おそらく）キャッシュが働き、同じインスタンスが返される
    - よって logging.config 以前に作ってしまった名前の logger は後で getLogger しても disable: True になり出力されない


```py
import logging.config


class Hoge:
    logger = logging.getLogger('hoge')

    @classmethod
    def print_log(cls):
        logging.getLogger('hoge').info('new hoge logger')  # 表示されない！
        logging.getLogger('fuga').info('new fuga logger')  # 表示される
        cls.logger.info('class hoge logger')               # 表示されない

        print('')
        print('new hoge disabled?:', logging.getLogger('hoge').disabled)  # True
        print('new fuga disabled?:', logging.getLogger('fuga').disabled)  # False
        print('class hoge disabled?:', cls.logger.disabled)               # True

        print('')
        print('new hoge instance:', id(logging.getLogger('hoge')))  # cls.logger と同じインスタンス
        print('new fuga instance:', id(logging.getLogger('fuga')))
        print('class hoge instance:', id(cls.logger))


if __name__ == '__main__':
    logging.config.dictConfig({
        'version': 1,
        'formatters': {
            'myFormatter': {
                'format': '%(asctime)s:%(message)s',
            }
        },
        'handlers': {
            'default': {
                'class': 'logging.StreamHandler',
                'level': 'DEBUG',
                'stream': 'ext://sys.stdout',
                'formatter': 'myFormatter',
            }
        },
        'root': {
            'level': 'DEBUG',
            'handlers': ['default'],
        },
        # 'disable_existing_loggers': False,  # このコメントを消すと解決
    })
    Hoge.print_log()
```

これは logger に対して logging.config で設定を行うと、過去に作られた logger が disable になるためです。
処理の順序は以下の様になります。

1. class 直下が実行される
    1. cls.logger が作成される
2. `if __name__ == '__main__'` 内が実行される
    1. logger が設定される（ここで cls.logger が disable: True になる）
    2. Hoge.print_log() が実行される
        1. getLogger('hoge') は cls.logger と同じ名前なので **値がキャッシュされており(?)** これも disalbe: True になってしまう。よって出力されない。
        2. getLogger('fuga') は新規に作成される logger なので disalbe: False であり出力できる。
        3. cls.logger は disable: True なので出力されない。

同じ名前の logger が getLogger でキャッシュされるのかはわかりませんが、同じ名前の logger は同じインスタンスになるということは確認しています。
また、実用上はこの Hoge クラスは別のファイルに定義されており、 import で呼び出されることが多いと思いますが、 import がファイルの最上部にかかれていれば同じ現象がおきます。

# 解決策
disable_existing_loggers: False にするとこの問題は解決します。
上のコメントになっている行を復活させるだけ。

logging.config 以前に作成された logger に対しても、 logging.config で指定した新しい設定が適用されるようです。
ターミナルでコマンドを入力できない　プロセスが完了しましたとなる

タイトルの通り、ターミナルを起動しても`プロセスが完了しました`となり、コマンドを受け付けなくなってしまった。

#背景
理由は明白でZsh使用中にZshを削除してしまった。デフォルトのshellをZshにしていたため何度再起動しても使えず、デフォルトのshellの変更すらできなくなってしまった。

#対応

`シェル`->`新規コマンド`を選択

<img width="448" alt="スクリーンショット 2018-10-12 10.33.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/97817/48f146fb-4d6b-f708-b125-a8ab2d3a3267.png">

コマンドに`/bin/sh`と入力

<img width="499" alt="スクリーンショット 2018-10-12 10.34.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/97817/cbbcaeff-d468-4453-6be7-0111018b0102.png">

そうすると新たにshellが立ち上がるのでここでzshを入れ直してもいいがとりあえずデフォルトをbashに戻すことに

`chsh -s /bin/bash`

でbashにもどしてzsh入れ直したりして完了
viで行番号を表示したい時はset numberだぞ。

# 問題
![スクリーンショット 2018-10-12 10.29.48.png](https://qiita-image-store.s3.amazonaws.com/0/190712/064b3311-56bf-bd28-66f8-26734c636566.png)
viで行番号表示されないと不便なので、表示するように設定変更。
# やりたいこと
viで行番号を表示する設定
# やること1:とりあえず表示したい場合
vi の管理画面で以下のコマンドを入力する。

```
:set number
```
おまけ:非表示
```
:set nonumber
```

結果
![スクリーンショット 2018-10-12 10.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/190712/8e373461-dd32-c1ed-08eb-fefce52303c9.png)
表示された。

# やること2:常に表示したい場合
viの設定ファイルを開く

```
# vi ~/.vimrc
```
viのファイルの中に以下を記述。

```
set number
```

結果
![スクリーンショット 2018-10-12 10.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/190712/8e373461-dd32-c1ed-08eb-fefce52303c9.png)
表示された。
[関数系] strtotime の細かい挙動を試してみた。

# 概要

細かい挙動を試してみたかったので、それをただまとめているだけの記事。

# 環境

MacOS Sierra: 10.12.6

```
PHP 7.2.6 (cli) (built: May 25 2018 06:18:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.6, Copyright (c) 1999-2018, by Zend Technologies
``` 

# 内容

```php:そもそも文字列じゃない
php > var_dump(date('Y-m-d H:i:s', strtotime(trim(2018-05-22))));
string(19) "1991-10-12 01:21:15"
```

```php:文字列だけど、時刻はない その２
php > var_dump(date('Y-m-d H:i:s', strtotime(trim('2018-05-22'))));
string(19) "2018-05-22 00:00:00"
```

```php:
php > var_dump(date('Y-m-d H:i:s', strtotime('2018/05/22')));
string(19) "2018-05-22 00:00:00"
```

```php:文字列で、
php > var_dump(date('Y-m-d H:i:s', strtotime(trim('2018-05-22T01:30'))));
string(19) "2018-05-22 01:30:00"
```

```php:余計な空白が存在する文字列
php > var_dump(date('Y-m-d H:i:s', strtotime('2018-05-22T01:30 ')));
string(19) "2018-05-22 01:30:00"
```

```php:空文字
php > var_dump(date('Y-m-d H:i:s', strtotime('')));
string(19) "1970-01-01 00:00:00"
```

```php:null
php > var_dump(date('Y-m-d H:i:s', strtotime(null)));
string(19) "1970-01-01 00:00:00"
```
VMDでのtclスクリプトの書き方、実行方法

#VMD(Visual Molecular Dynamics)でtclスクリプトを動かし、単純な繰り返し作業を自動化したい
 - やりたいこと
    - VMDでNAMDにより得られたトラジェクトリファイルの読み込み
    - センタリング
    - 別名保存
    - VMD終了
    - 次のファイルへ

という流れを自動化したい。

##環境

 - CentOS Linux release 7.5.1804 (Core)
 - VMD for LINUXAMD64, version 1.9.2 (December 29, 2014)

##VMDでtclスクリプトを読み込む方法

```bash
$ vmd -dispdev none -e scriptname.tcl
```
 - `-dispdev none` : display devise noneの略　ディスプレイウィンドウを表示しない
 - `-e scripname.tcl` : 読み込む(tcl)スクリプトの指定

これをシェルスクリプト中に書き込むことで、シェルスクリプトからtclスクリプトを呼び出していることになる。

##tclスクリプトの書き方
シェルスクリプトが書けるなら大体大丈夫。

###初めに
```tcl
#!/usr/bin/bash
```
を書いておく。

###実行するコマンドなど
```tcl
proc productname {}{
ここにコマンドを書く
}
```

###文字をコンソール上に表示
```tcl
puts $aaa
```
シェルスクリプトの`echo`に等しい。
($はシェルスクリプトと同じ変数置換詞)

###変数に値(文字)の代入
```tcl
set aaa 100
set bbb "moji"
```



###値を計算して代入
```tcl
expr 1+2
expr 100*$a
```
代入するときは、`[]`でくくって`set c [expr $a*5]`のようにする。

ここまでを応用して、
先の`puts`と組み合わせると、

```tcl:test.tcl
set a 10
set b "moji"
set c [expr $a*5]

puts $a
puts $B
puts $c
```
```bash:result
　10
  moji
  50
```

##参考
tclスクリプトについて、より詳しい解説は以下などを参考にしてほしい。

 - [Tcl文法](http://www.freesoftnet.co.jp/webfiles/tclkits/doc/tclcom.html)
ラジオボタンがうまく動かない

#なんでかラジオボタンがうまく動かない
2つのグループに分けたラジオボタンを制御しようと思ったけど
手動でSetCheckしたラジオボタンが、GetCheckしてもBST_CHECKEDにならない

#わかった
グループ分けしたつもりが、できてなかった。
それぞれ先頭のラジオボタンのGroupをtrueにして解決。

#なんで
クリックすると、グループに対してラジオボタン的な動作するのに、
SetCheckだとなにも反応してくれなくて、SetCheckしたボタンの表示だけが切り替わってしまう
自己署名証明書でhttpsアクセスができるコンテナ

## 1. 鍵の作成

```sh:
mkdir certs; cd certs

# 1.秘密鍵
openssl genrsa -out server.key 3072

# 2. csr
openssl req -new -key server.key -out server.csr -subj "/CN=example.com"

# 3. csrを署名したcrt
openssl x509 \
 -req \
 -in server.csr \
 -days 36500 \
 -signkey server.key > server.crt
```

```sh:動作確認
openssl \
 s_server \
 -tls1_2 \
 -accept 443 \
 -www \
 -cert server.crt \
 -key server.key 
```

* https://localhost にアクセスして応答があることを確認。

----

## 2. Apache 2.4 コンテナ

### httpd.conf

```apache:httpd.conf
# 追記

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
```

### 実行

```sh:run.sh
docker run --rm -it --name https \
 -p 443:443 \
 -p 80:80 \
 -v $(pwd)/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf \
 -v $(pwd)/conf/server.crt:/usr/local/apache2/conf/server.crt \
 -v $(pwd)/conf/server.key:/usr/local/apache2/conf/server.key \
 httpd:2.4
```

* https://localhost にアクセスして表示されることを確認。

----

## 3. nginx コンテナ

### 設定

```nginx:ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
server {
    listen 443;
    ssl on;
    #server_name       www.example.com;
    ssl_certificate     /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
```

### 実行

```sh:run.sh
docker run --rm -it --name ssl \
 -p 43:443 \
 -p 80:80 \
 -v $(pwd)/certs/:/etc/nginx/certs/ \
 -v $(pwd)/ssl.conf:/etc/nginx/conf.d/ssl.conf \
 nginx
```

* https://localhost にアクセスして表示されることを確認。
CentOS5のターミナルで、キー配列を英字から日本語に切り替える

> デバッグを頼まれたサーバー機器・・・
> ターミナルにログインしたら英字キー配列になっていた・・・
> おいおい「：」のキーどこだよ！Vimが閉じれないよ！あああ設定消えたぁ！

そんな貴方（私）のためのTIPSです。

注記1：
CentOS7以降は、方法が異なります。

注記2：
GUIを利用している場合、日本語入力ソフト側の問題である可能性があります。
「OSアップデート後に日本語入力できなくなった！」という場合は
こちらを疑ってみたほいがよいかもしれません。
素晴らしい記事（私も助けられた）があったので共有です↓
http://note.kurodigi.com/ibus-mozc-kbdlayout/

# 一時的にキーマップを変更するならloadkeysコマンド

loadkeysコマンドで、一時的にキーマップを変更することができます。

```
$ loadkeys jp106
Loading /usr/lib/kbd/keymaps/i386/qwerty/jp106.kmap.gz
→ ねんがんの 日本語キー配列 をてにいれたぞ！（注：こんな表示は出ません）
```


英字キー配置に戻す場合は、以下のコマンドを実行します。

```
$ loadkeys us
Loading /usr/lib/kbd/keymaps/i386/qwerty/us.kmap.gz
```

一般ユーザーだとpermissionエラーが出るかもしれませんが、
その場合は、rootユーザーかsudo でloadkeysコマンドを実行してください。

# 永続的にキーマップを変更する（設定ファイルでキーマップを設定する）

キーマップは設定ファイルに書かれているので、これを変更しキーマップを設定します。以下は設定例です。

```
usキーボード
# cat /etc/sysconfig/keyboard 
KEYBOARDTYPE="pc"
KEYTABLE="us"
```

```
jpキーボード
# cat /etc/sysconfig/keyboard 
KEYBOARDTYPE="pc"
KEYTABLE="jp106"
```

以上、どなたかの参考になれば幸いです。
Cloud Functions (Python3.7)からFiresotreへ書き込む

Firestoreへの書き込みサンプルが英語の公式ドキュメントに見当たらなかったので
firebase-adminをimportしたら書き込めた


まずrequirements.txtに下記を記述する

```
firebase-admin==2.13.0
```

クレデンシャル無しでアプリを初期化して書き込む

```python

import firebase_admin
from firebase_admin import firestore

# 初期化済みのアプリが存在しないか確認する。※複数アプリの初期化はエラーです。的な例外に遭遇したので入れたif文
if len(firebase_admin._apps) == 0:
    # アプリを初期化する
    default_app = firebase_admin.initialize_app()
db = firestore.client()

def hello_world(request):
    # firestoreに書き込み
    db.collection('A').document('docid').set({"foo": "bar"})
    # ブラウザに見せるために返す
    return f'Hello World!'

```

https://firebase.google.com/docs/reference/admin/python/firebase_admin
VSCodeの日本語化

## 概要
* VSCodeの日本語拡張インストール
* VSCodeのlocale設定

## VSCodeの日本語拡張をインストール
[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)

## VSCodeのlocale設定
Ctrl + Shift + Pでコマンドパレットを起動
「configure display language」を入力し、locale.jsonを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168030/717ed9dd-3513-2930-41cb-5a9eb8c3894f.png)

locale設定を"ja"に変更する
※日本語拡張がインストールされていれば補完が効く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168030/611c1ffc-d90c-4b58-9d86-af1e16f45f80.png)
Cloud Functions(Python)でcopy.pyが含まれているとデプロイに失敗する

## 概要

表題どおり。

## 再現方法

GCPのプロジェクト、Cloud Functionsや```gcloud``` コマンドが利用できる前提です。


```sh
> cat <<EOF > main.py
def hoge(request):
  return 'hoge!'
EOF

> touch copy.py

> gcloud functions deploy hoge --runtime=python37 --trigger-http

Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Error: cannot communicate with function.
```

## 調査

コマンド的な名前のファイルが含まれていると駄目なのかなと他にもそれらしきファイル名にして試してみました。

|ファイル名|結果|
|---|:---:|
|copy.py|✗|
|move.py|○|
|deepcopy.py|○|
|setup.py|○|

うーん。```copy.py``` 以外はいけるっぽい。

```copy.py``` を```src/copy.py``` に移動してデプロイしてみると、デプロイも関数実行も問題なし。

なぞです。


## まとめ

```copy.py``` ってファイル名をつけてデプロイしなければ問題はありません。
原因がわからないままだと、もやもやするので、```gcloud feadback``` コマンドからIssue登録しておきました。

(要Googleアカウントでログイン)
https://issuetracker.google.com/issues/117237035

さっそくコメントをいただき、不具合の再現ができたので、Cloud Functionsの開発チームへ共有するとのことです^^

>Thank you for this detailed bug report. I was able to reproduce the reported behavior on my end. Your bug request is forwarded to the Google Cloud Functions team to be investigated. However, I cannot offer you with an ETA for its resolution at this time.
Sorceryで作るユーザー機能をカスタマイズ

#実現したいこと
・sorceryで作成したユーザー機能をカスタマイズする
・emailカラムを削除しnameカラムを追加する

#実現のためしたこと
・テーブル、モデルを一から作り直した。
・ログイン設定を修正した
・そのほかのコードの修正

#テーブル・モデルの作り直し(ターミナルで)

1.モデルの削除

```
$ rails destroy model モデル名
```
2.マイグレーションファイルの作成

```
$ rails g migration ファイル名(任意)
```
3.マイグレーションファイルに追記

```ruby
def change
 drop_table :削除するテーブル名
end
```

```
$ rake db:migrate
```
4.再インストール

```
$rails g sorcery:install
$rake db:migrate
$rails g scaffold user name:string crypted_password:string salt:string --migration false
```

#ログイン設定の修正

```/config/initializers/sorcery.rb
  # --- user config ---
  config.user_config do |user|
    # -- core --
    # specify username attributes, for example: [:username, :email].
    # Default: `[:email]`　
    #
    user.username_attribute_names = [:name]　←ここを追記
```
デフォルトの状態ではログインの際にemailが求められるようになっている。だから、emailからnameに書き換えてやる。

また、「ログインの際にメールアドレスでも名前でもよい」とするときは下記のように複数指定してやれば良い。

```ruby
user.username_attribute_names = [:email, :name]
```

#そのほかのコードの修正
```app/controllers/users_controller.rb
  def user_params
      params.require(:user).permit(:name, :password, :password_confirmation)
    end
```

```app/models/user.rb
 class User < ApplicationRecord
  authenticates_with_sorcery!

  validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
  validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
  validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }

  validates :name, uniqueness: true
end

```
その他、フォームなどのHTMLファイルの修正をする必要がある。

#参考
https://github.com/Sorcery/sorcery/wiki/Simple-Password-Authentication
http://hyperneetprogrammer.hatenablog.com/entry/login-with-sorcery-by-username-or-email
https://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_sorcery_auth_no2/
https://qiita.com/Kuragasaki/items/7d98cf29341611fb189a

#最後に
テーブルとモデルの削除・作り直しに関しては、もっといい方法があるのかもしれないです。
ownCloud10.0.9のデータ保存先変更

# ownCloud10.0.9のデータ保存先変更

## 概要

Ubuntu16.04 LTSでowncloud10.0.9にて
今までデフォルトである、[/var/www/owncloud/data/]配下に
データを格納してましたが、写真をアップロードしようとしたところ、
空き容量不足でアップロードできないとメッセージが...。

空き容量を確認すると[/]が既に85%に...(・。・;

急遽、格納先の変更を検討せねば。
ちょろっとググって保存先を変更しましたというだけの記事ですけど。

## ownCloudの保存先変更

ownCloudの設定ファイルを修正

```
vi /var/www/owncloud/config/config.php
```
修正箇所は以下となる。

'datadirectory' => '/var/www/owncloud/data',
↓
'datadirectory' => '/share/owncloud/data',

'installed' => true,
↓
'installed' => false,


## ownCloudの保存先ディレクトリの作成

```
mkdir -m 755 /share/owncloud/data
sudo chown www-data:www-data /share/owncloud/data
```

## 端末からブラウザでアクセスし初期セットアップを実施

初期セットアップ方法については、省略
※初期セットアップなしでも保存先変更なんてできそうだが
データ再読込コマンドを実行しても古いフォルダを参照してしまうため。

## データ移行

[/var/www/owncloud/data]配下のデータを[/share/owncloud/data]に移動。

```
sudo cp -R /var/www/owncloud/data /share/owncloud/data
sudo rm -rf /var/www/owncloud/data
sudo chown -R apache:apache /share/owncloud/data
sudo chmod -R 755 /share/owncloud/data
```

## ownCloudに再読込を手動実行

```
sudo -u www-data php /var/www/owncloud/occ files:scan <owncloud user name>

Scanning files for 1 users
Starting scan for user 1 out of 1 (<owncloud user name>)

+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 91      | 5885  | 00:00:21     |
+---------+-------+--------------+
```
う～ん、ファイルスキャン早いのはいいけど
owncloud上のタイムスタンプも更新されちゃうんだね...。って当たり前かw
ghq + peco で GitHub リポジトリを選択しつつ、curl + jq で GitHub API を実行する

以前書いた記事で、curl + jq を使い、Github API で Pull Requestに関する base / head branch を取得できることを試しました。

[Github の Pull Request に紐づく base / head branch を curl と jq で取得する](https://qiita.com/gotchane/items/d4fcc15be8a067b334ce)

今回は、リポジトリの選択をより簡単にできるよう、ghq + peco でのリポジトリ選択を組み合わせてみることを試しました。

## 前提環境

* MacOSX 10.13.6
* ghq  0.8.0
* peco 0.5.3
* jq 1.5
* GitHub Access Token 取得済み (未取得の場合は <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/" target="_blank" rel="nofollow noopener">Creating a personal access token for the command line - User Documentation</a> 参照)

※ ghq, peco, jq はいずれも HomeBrew でインストールできます。

## 準備方針

下記方針で準備していきます。

* ghq でローカルに GitHub リポジトリの一覧を作成
* peco で GitHub リポジトリの一覧をインクリメンタルサーチ可能に
* curl で GitHub API を実行
* jq でレスポンスを加工

## 事前準備

### GitHub リポジトリのリストを作る

ghq で、Pull Request を確認したいリポジトリをローカルにクローンしておきます。

```bash
$ ghq get <repo URL>
``` 

### ワンライナーを準備

下記ワンライナーをシェルの設定に追記します。
僕の場合は zsh を使っているので、`.zshrc` にエイリアス登録し、`source ~/.zshrc` などでロードしておきます。

```bash
alias pb='curl -sH "Authorization: token ${GITHUB_API_TOKEN}" "https://api.github.com/repos/$(ghq list | sed s#github.com\/##g | peco)/pulls" | jq ".[] | { number: .number, title: .title, base: .base.ref, head: .head.ref }"'
```

curl, jq の部分は、[以前の記事](https://qiita.com/gotchane/items/d4fcc15be8a067b334ce) を踏襲しています。
追加した部分は、`$(ghq list | sed s#github.com\/##g | peco)` の部分で、`:owner/:repo` の部分を抽出してインクリメンタルサーチで選択できるようにしました。

`GITHUB_API_TOKEN` は、`.zshrc` にべた書きしたくなかったので、別ファイル`github_credentials`に切り出し、ロードする形にしました。
**※.github_credentials の中身を直接 Git 管理しないよう、.gitignore に指定しておくなど、注意してください！**

```~/.github_credentials
export GITHUB_API_TOKEN=xxx
```

```.zshrc
GITHUB_CREDENTIAL_FILE=~/.github_credentials
if [ -e $GITHUB_CREDENTIAL_FILE ]; then
  source $GITHUB_CREDENTIAL_FILE
fi
```

## 利用方法

alias に登録しておいた `pb` を実行すると、

ghq でクローンしてきたリポジトリのリストをインクリメンタルサーチできるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/2c174b76-41b6-c5a4-0c69-1dcedb766806.png)

そしてリポジトリを選択すると、リポジトリの Pull Request と source/head branches を確認できるようになります。

今回は [facebook/react](https://github.com/facebook/react) の Pull Request 一覧を表示してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/a6c0a798-69b8-6385-516f-9b89435eefa0.png)


## 終わりに

peco + ghq の組み合わせで、 GitHub APi の実行がより便利になりました。
今回は Pull Request に関する API の実行を試しましたが、 Issues など、他の API でも応用できるなと思いました。

## 参考URL

* [ghq, peco, hubで快適Gitライフを手に入れよう！](https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)
一眼レフのJPG/RAWファイルを仕分けるバッチ（.command）

# 思いつき
一眼等で撮影した際に、RAWファイルとJPGファイルが混ざる。
そんなもの、適当に拡張子で検索して仕分ければ良いだけなのだけど
せっかくシェルがかけるのだから、ダブルクリックで仕分けれた方が良いに決まってる。

自分はSONY αでこういったニーズが発生したのだけど
他メーカーでも勝手に仕分けたりはないのだろうか。
おしえてほしい。

# 主なうごき
1. 対象のファイル数を数える
2. RAW/JPGフォルダを作成する
3. 対象のファイルを移動する
4. (オプション) OUTフォルダを作成する
5. (オプション) このバッチファイルを削除する

### 1. 対象のファイル数を数える
たまに設定をコロコロ変えてると、どっちかだけで、特にJPGだけで撮影している場合があるので
ファイル数の差を見れるのが少し助かる。
現像時に撮って出しのJPGをとりあえず使わずに全部RAWから出すってときに
JPGだけで撮った画像が抜けたりして怖い。

### 2. RAW/JPGフォルダを作成する
仕分ける用のフォルダを作る。
既にフォルダがあると止まる。

### 3. 対象のファイルを移動する
それぞれのフォルダへ移動する。

### 4. (オプション) OUTフォルダを作成する
これは自分用でもある。Lightroomで保存先をここにして、
RAWからの現像ファイルはOUTフォルダへ保存して
RAW/撮って出しJPG/現像済みファイル の3点セットで保存している。

### 5. (オプション) このバッチファイルを削除する
基本、いつも置いてるフォルダからコピーしてきてダブルクリックするだけなので
このバッチファイル自体を削除すると、綺麗に1アクションで仕分けが終わる。

※(オプション)はコメントアウトして省略できる内容

# 想定しているフロー
1. SDからローカルへコピー
2. コピー先ローカルフォルダへこのバッチファイルをコピー
3. ダブルクリック
4. 仕分け完了

# バッチファイル本体
https://github.com/git6/other/blob/master/bash/Camera_RAW-JPG_B.command


今回ソースでは.ARWを指定しているが、RAWの拡張子は各自書き換えてどうぞ。
[RAWの拡張子を指定している行（L6）](https://github.com/git6/other/blob/master/bash/Camera_RAW-JPG_B.command#L6)
.ARW（SONY α）
.CR2（Canon）
.NEF（Nikon）
.PEF（PENTAX）

# 利用方法
GitHubからスクリプトをコピーするなりで
ローカルへ.commandファイルを作成する（ファイル名は任意で動作します。）

その後、実行権限の変更をする。
`chmod u+x Camera_RAW-JPG_B.command`
（参考：https://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67）

一度変更していれば、使うときはそのファイルをコピーすればダブルクリックで動作する。
docker-composeでブリッジネットワークのIPを変える

過去に何度も[docker0のIPアドレス帯を変えてきた](https://qiita.com/bellx2/items/25147ebba86a44a31bb9)が、docker-composeを使うと、docker0が設定されていても個別にブリッジネットワークを作成するようだ。そこでまた172.17....のネットワークが出現してしまう現象が発生した。

例によって私の環境は172.17.X.Xの帯域を使っているので接続不能に。ということで、また調査を行いました。

# 設定方法

いろいろ試したが、下記のようにdefaultネットワークのsubnetを設定すれば良い。

```
version: '2'

services:
....
networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.201.0/24
```

注意としてdocker0のネットワークとは別のsubnetを指定する必要がある。

# 参考

docker-compose up するときに subnet を指定する
https://qiita.com/manabuishiirb/items/293d5d5a3ec7d5328cc5

Docker container networking – Docker Documentation
http://docs.docker.jp/compose/compose-file.html#network-configuration-reference
2018年改訂後のAWS 認定ソリューションアーキテクト アソシエイトに合格した話

## 履歴
- AWS実務歴約1年
- ほぼ勉強せずに改訂前の試験を1度受けて不合格

## 教材
### 書籍
- 合格対策AWS認定ソリューションアーキテクトアソシエイト本  
3回ほど熟読しました。これで大事なポイントは抑えれました！

- 一番大切な知識と技術がみにつく Amazon Web Services シリーズ  
1回通読しました。細かい部分を確認用


### 動画
- udemy 手を動かしながら2週間で学ぶ AWS 基本から応用まで    
https://www.udemy.com/aws-14days/  
1回通り動画を流して、実務でやってない物は実際に手を動かしました。

BlackBeltは一度も見ませんでした


### 問題集
- AWS WEB問題集で学習しよう　（プラチナ）  
https://aws.koiwaclub.com/  
1回通り問題集を通して解きました。解説を読むことが何より大事！

スプレッドシートに点数を付けて、点数が低いところのみ2回目、3回目を実施。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142130/c45b3550-73db-99c8-a2be-468f550e76f9.png)

可視化は大事。モチベーションにも繋がる。

## 改定前との感じた違い
- WEB問題集とほど同一の問題は無かった
- 合格対策本とWEB問題集をやってると見えてくる、質問に対して何を答えさせたいかが見えてくる問題が多かった  
(出題の意図がEFSの機能を正しく知ってますか？Lambdaの特性を知ってますか？と読み取れる物がいくつもあった）

- ALB、Lambda、EFS、DynamoDB、S3の暗号化の5個についは改定前よりも多く出題されました
- Udemyで知った、Security Gatewayのインバウンド許可にSecurity GatewayのIDが使える事が正解な問題が2問もあった
- ネットワークの問題や計算問題が無くなった？
- 長文の内容が無くなった？どの問題もほぼ2行程度でした。


## 取得スコアと成績
Ginza CBTS Kabukiza Test Centerで受講し全65問、70分ほどで退出。  
スコアは815程でした。


## これから受ける方へ
合格対策本を熟読、WEB問題集を行う（同一の問題は無いが、出題意図を考えながら解くと良い）、
使った事ないサービスは動画で勉強がオススメの勉強方法です。  

私はこれからsysopsアソシエイトとアーキテクトのプロフェッショナルにチャレンジしていきます！！
VS Code 1.28 の新機能 - Windows版でカスタムタイトルバー＆メニューバーが標準に

https://code.visualstudio.com/updates/v1_28#_custom-title-and-menu-bar-on-windows-by-default

新機能ではないが、今までは設定`window.titleBarStyle`を`custom`に変更することで有効になっていたカスタムタイトルバー・メニューバーが今回リリースのWindows版でデフォルト扱いになった。

今まではこんな感じがデフォルトで、
![menu_old.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/c88be278-f414-e836-419f-dcf39152c5b3.jpeg)

今回からはこんな感じ。
![menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/283e323c-16b5-cd7d-4af7-824802232615.jpeg)

ポップアップメニューもカスタム化された。

v1.27(native)|v1.28(custom)
---|---
|![popup_old.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/949b156d-9141-3400-25ab-13af7a348c88.jpeg)|![popup.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/3f37a6fc-5e4c-9b4b-97ea-439b855882e8.jpeg)

やっぱりデザインが統一されていると綺麗。

配色テーマを変更すればメニューの色もちゃんと変わってくれる。
![menu_color.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/5b1af569-43ce-647e-c332-766c2ba2e840.jpeg)

ただ、タイトルバーがメニューバーの横っちょに移動してしまったので、ウィンドウをドラッグしたい場合、今まではウィンドウの上端をどこでも掴めたが、`custom`の場合はタイトルバーの部分かもしくは左上のVSCodeのアイコンを掴む必要がある。

あと、設定の`native`は残ったままなので、やっぱり元のやつのほうがいい、と思ったらに元に戻すことができる。
Javaで自作のYAMLファイル(*****.yml)を読み込む方法

使用している環境
-----
Tomcat：9
JDK：OpenJDK8(OPENJ9)
spring-boot：2.0.5

作成した処理（多分邪道だが動いたやつ）
----

読み込みたい設定ファイルはこれ↓↓↓

```[プロジェクトルート]/src/main/resources/test.yml
value:
  item1:
    aaa: 12345
    bbb: 22345
  item2:
    dog: poti
    cat: tama
```

Javaの記述はこれ↓↓↓

```xxxxx.java
DefaultResourceLoader resourceLoader;
InputStreamReader reader;

try {
	resourceLoader = new DefaultResourceLoader();
	Resource resource = resourceLoader.getResource("classpath:test.yml");
	reader = new InputStreamReader(resource.getInputStream());

    Yaml yaml = new Yaml();
    map = (Map<String, Object>) yaml.load(reader);
    
    System.out.println(ValueMap.toString());

} catch (Exception e) {
	e.printStackTrace();
}
```
ResourceLoaderを使えばいいと思い、当初、

```
@Autowired
ResourceLoader resourceLoader;
```
という宣言を試したのですが、Autowiredアノテーションが効いていないのか、NullPointerExceptionで落ちました。
ということで、DefaultResourceLoader クラスを使うという、邪道というか強引な方法で取得しました。


作成した処理（結局ダメだったやつ）
----
`※ この処理は、開発環境のeclipseでは動いていたのですが、Warに固めてTomcatに配置したところ、ディレクトリ構成が変わったためか動かなくなりました。`


読み込みたい設定ファイルはこれ↓↓↓

```[プロジェクトルート]/src/main/resources/test.yml
value:
  item1:
    aaa: 12345
    bbb: 22345
  item2:
    dog: poti
    cat: tama
```

Javaの記述はこれ↓↓↓

```xxxxx.java
InputStreamReader reader;

try {
	reader = new InputStreamReader(ClassLoader.getSystemResourceAsStream("test.yml"));

	Yaml yaml = new Yaml();
	Map<String, String> ValueMap = (Map<String, String>) yaml.load(reader);

	System.out.println(ValueMap.toString());

} catch (Exception e) {
	e.printStackTrace();
}

```



ValueMapに設定された内容はこんな感じ↓↓↓
![ValueMapの内容.png](https://qiita-image-store.s3.amazonaws.com/0/295558/def33f25-62c1-6c79-ad28-06017733988b.png)

という感じで取得できました。


依存関係の追加
----
上記の形で取得できたので、「どれどれwarに固めよう」と思ったところで、
*　　パッケージorg.yaml.snakeyamlは存在しません*
と怒られ、エラーで落ちました。
↓↓↓
mavenの依存関係に「snakeyaml」を追加して解決です。
Bash on Ubuntu on Windowsで文字化け

## 要約
問題：Bash on Ubuntu on Windowsで日本語が文字化けした
解決：プロパティからフォントを変更したら日本語が表示される

## 状況
Windows10にBashOnUbuntuOnWindowsを入れて、Ubuntu上で開発する環境を整えていたところGitコンソールで文字化けが発生しました。
Git側の設定かと思ったのですが、BashOnUbuntuOnWindowsのデフォルト設定だと日本語に対応していないフォントが設定されていたようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168030/94f50de5-9870-54e7-fe6d-0ef495d18011.png)
↑日本語が文字化けしている状態

## フォント設定

BashOnUbuntuOnWindowsのタイトルバーを右クリック→プロパティ
フォントタブでお好みのフォントを選択すればOK

選択可能なフォントで日本語対応しているものは以下
- NSlimSun
- MSゴシック
- SlimSun-ExtB
- ラスターフォント

いいフォントがないのでMSゴシックを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168030/b0b1a379-8608-68ff-40dc-30edb8e5aace.png)
↑フォント設定後

## 課題
外部フォントを設定する方法があれば見やすいフォントに変更したい
パワーシェルでファイルのリネームをする01

とにかくパワーシェルでファイルのリネームがしたかった
今回は置換コマンドを利用したものとなっています

##概要と説明
特定のファイル名を文字数の異なるファイル名にするために、ファイル名を置換する用のps1ファイルを作る

[Windows PowerShellを使って複雑なパターンのファイル名変更を行う](http://www.atmarkit.co.jp/ait/articles/1411/07/news133.html)
上記のサイトでご紹介の
` Get-ChildItem ＜対象ファイル＞ | Rename-Item -NewName { $_.Name -replace '旧文字列','新文字列' }`
を参考にして、筆者にとって使いやすいようにしたもの

例えば以下のようなファイル構成とするとき

```powershell

PS C:\user\xyz>Get-ChildItem -Name
12332.xyz
1233454.xyz
12335.xyz
123456.xyz
1236516.xyz
123log.log
example.sys
Rename.ps1
```

上記xyzフォルダ内の＊.xyzファイルのみ名前を文字数の異なるファイル名に変えたい
※Move-Itemというコマンドレットもありますが、今回はreplaceを使っております

##PowerShellコード
応用すれば容易にファイル名を規則的に変換できると思います

```powershell:Rename.ps1
$extension="xyz"
#xyzファイル一覧のホスト出力
Write-Host $extension"ファイル一覧"
Get-ChildItem -Name *$extension

#before replacementを略してBr
$Br=Read-Host "変換前ファイル名を入力:"

#After replacementを略してAr
$Ar=Read-Host "変換後ファイル名を入力:"

#拡張子がxyzのファイルに対してファイル名を変換(正確には置換)
Get-ChildItem *$extension | rename-item -NewName { $_.name -replace $Br,$Ar }

#PowerShell ISEで実行したときの確認用のホスト出力
Write-Host "ファイル一覧(変換後)"
Get-ChildItem -Name
```

実行例：Rename.ps1をPowerShellで実行
xyzファイルと同じフォルダで実行

```PowerShell
xyzファイル一覧
12332.xyz
1233454.xyz
12335.xyz
123456.xyz
1236516.xyz
変換前文字列を入力:: 123
変換後文字列を入力:: A
ファイル一覧(変換後)
123log.log
A32.xyz
A3454.xyz
A35.xyz
A456.xyz
A6516.xyz
example.sys
Rename.ps1
```

123*.xyzがA*.xyzに変換された
...正確には置換ですが

##参考
初心者には助かります
[文字列の入力を受け取る (PowerShell プログラミング)](https://www.ipentec.com/document/powershell-text-in)
再掲：[Windows PowerShellを使って複雑なパターンのファイル名変更を行う](http://www.atmarkit.co.jp/ait/articles/1411/07/news133.html)

##最後に
ホスト出力でも結果を確認したいので、コマンドプロンプトでいうpauseみたいなのはないのかね
ISEの通称はイスじゃなくてアイスなのね、イスでよくない？
というか今回はMove-Item使えばよかったのかも

- :arrow_backward: [前回の記事](https://qiita.com/kurosworld/items/164853da8ab5b8eaa750) | [次回の記事](https://qiita.com/kurosworld/items/35060a3e695df9feaa0a) :arrow_forward: