OmniAICreator/Qiita-1.07M huggingface dataset:
New Relic Oneが公開されました

すでにお気付きのかたもいるかもしれませんが、New Relicの新しい機能New Relic Oneというのがリリースされています。日本語でのプレスリリースも出しています。

https://www.newrelic.co.jp/press-release/20190530

英語ですが詳細なドキュメントはこちらになります。

https://docs.newrelic.co.jp/docs/new-relic-one/use-new-relic-one/get-started/introduction-new-relic-one#platform

すでにリリースされているので、New Relicの画面（添付画像はAPMの画面）にログイン後このように表示され、クリックすると移動できます。

<img width="1085" alt="スクリーンショット 2019-05-27 9.49.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/ebc6e7f9-36e8-c10b-efcf-093f72f5a544.png">

もしくは [https://one.newrelic.com](https://one.newrelic.com)にアクセスすると表示されます。

<img width="1431" alt="スクリーンショット 2019-05-27 9.49.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/e66499fa-b8dd-de4c-d732-37740cfab894.png">

New Relic OneはAPMやBrowserといったくくりで新しい機能が追加された**訳ではなくて**、これらの機能をみる新しい画面が追加された、というイメージです。追加のサブスクリプションなどは必要なく、既存の画面も今まで通り使えますが、新たに画面が追加された形になります。
機能が豊富ですので、小分けにして紹介したいと思います。まずはじめにこのTop画面周りを説明します。

今までのRPMの画面であればNew RelicのAgentさえ動いていればすぐにアプリケーションのパフォーマンスが表示されていました。New Relic Oneでは先ほどの画面のように表示されて、様々なViewへのポータル的な役割を果たしています。

まず、一番上に`Quick find`という検索欄があります。APMでつけていたアプリケーションの名前、インフラエージェントのホスト名、あるいは`kubernetes Cluster Explorer`などのサービス名を入力するとその画面に移動することができます。

<img width="1420" alt="スクリーンショット 2019-05-27 11.25.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/4a486b76-abc7-fbcb-4348-ee5d8db3d0cd.png">

<img width="1420" alt="スクリーンショット 2019-05-27 11.26.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/25e590d0-7dd7-faa1-bc2d-6935c4771523.png">

APMで監視していたアプリをNew Relic Oneのビューでみたいといった場合はまずここで検索するか、次の`Entity Explorer`で探せます。

`Quick find`の下にあるタイルからそれぞれのサービスにアクセスできます。

`Entity explore`では`Entity`を検索できます。Entityは何かというと、New Relicで監視できる「何か」のものです。実際に開くとこのような画面になります。

<img width="1438" alt="スクリーンショット 2019-05-27 11.44.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/ae85d01c-feb4-3134-93fe-151de3fd64f7.png">

`Services`、`Hosts`、`Browser applications`は今までのNew Relicのサービスでみていた対象のものです。このアカウントでは、AWSとAzureのCloud Integrationを有効にしているので、それぞれのサービスで監視している対象が表示されています。

<img width="1438" alt="スクリーンショット 2019-05-27 11.50.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/02e0613a-6fdf-86d1-ada1-ae52d5241a06.png">

<img width="1438" alt="スクリーンショット 2019-05-27 11.51.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/eff7810f-c6a9-6371-6fe0-874a23627166.png">

また、kubernetes Cluster で監視しているkubernetesクラスターも表示されています。

New Relic Oneの画面で、Entityの左側など星マークが表示されることがあります。これはお気に入り機能で、お気に入りに入れると最初にお見せしたトップ画面の一番下にまとめて表示されます。

`Distributed tracing`は分散トレーシングのビューです。こちらは改めて説明することにします。

`Dashboard`はいわゆるダッシュボードで、複数のビューやチャートを組み合わせたものをダッシュボードとして保存できます。もし、今までのNew Relicの画面でダッシュボードを作っていた場合、こちらのダッシュボードの一覧にも表示されます。

その下の`Kubernetes cluster explorer`と`AWS Lambda`も今までと同じ機能のビューになっています。こちらもそれぞれ改めて説明したいと思います。

New Relic Oneのトップページをかいつまんで説明してみました。次回以降はそれぞれのサービスの画面を紹介したいと思います。
[Ruby]レーシバ自身を変更するとは？

#概要
配列からnilである要素を取り除いた新しい要素を返すメソッドcompactですが、compact！となにが違うのかとおもいました。

リファレンスには「！」がつくほうはレシーバ自身を変更するメソッドとありました。

では、「レシーバ自身を変更する」とはどういうことなのでしょうか

#レシーバとは
レシーバとはメソッドを実行するオブジェクトのことです。
下記だと、.の左側のarrayです。

```
array.compact
array.compact!
```

#レシーバ自身を変更するとは

レシーバとはメソッドを実行するオブジェクトのことでしたので、「レシーバ自身を変更する」とは、このオブジェクトが変更されるということになります。

object_idをみてみます。

```ruby:sample.rb
fruits = ["apple", nil, "orange", nil, nil, "banana"]

puts fruits.object_id
fruits =  fruits.compact
puts fruits.object_id
```
```:ターミナル
70311962445680
70311962445540
```
まずは「!」がないほうですが、idが違います。
つまり、配列fruitsから、compactメソッドによりnilを除いた新しい配列fruitsができたことになります。

次は「！」をつけます。

```ruby:sample.rb
fruits = ["apple", nil, "orange", nil, nil, "banana"]

puts fruits.object_id
fruits =  fruits.compact!
puts fruits.object_id
```
```:ターミナル
70332086281520
70332086281520
```

idが同じです。
つまり、配列fruits自身が変更されたことになります。

これがレシーバ自身（今回でいうとfruits）を変更するの正体でした。

#まとめ
レシーバ自身を変更とは破壊的メソッドということでした。

今回は「！」をつけるつけないで、参照元から変更するかしないかを選択できます。
「！」をつけ参照元から変更するメリットは、メモリの節約ってところでしょうか。
Powershellでflattenっぽいことをやる

# はじめに
Powershellでflattenをしたかったのですが、functionがありませんでした。
ForEach-Objectであっさり代替処理ができたので残しておきます。

# 実装

```powershell:flatten
$IMAGE_EXTENSIONS = @("*.jpg", "*.png")
$OTHER_EXTENSIONS = @("*.pdf")

# 平坦化した配列 $EXTENSIONS を作成する
$EXTENSIONS = New-Object System.Collections.ArrayList
foreach ($array in @($IMAGE_EXTENSIONS, $OTHER_EXTENSIONS)) {
    $array | ForEach-Object { $EXTENSIONS.add($_) | Out-Null }
}
```

たった2つのarrayですが、arrayが増えても対応できるようにforeachしました。

利用頻度が高い場合、function化すべきですが、外側でaddしないといけないので微妙だなぁと思いました。
書き方が冗長なのと、ぱっと見でflatten感がありません。
function化したり、method化すれば、その辺りはかなり良くなると思います。

# 追記
@nukie_53 さんよりコメントを頂き追記

大変すばらしい書き方だと思います。シンプルっていいですね。
基本的には、こちらの書き方を使うべきだと思います。
間違えちゃう人もいそうなので、カンマをつけない旨、しっかりコメントで残して使っていきたいサンプルですね。

```powershell:シンプル版
$EXTENSIONS = @( #,カンマは付けない、改行で区切る
    $IMAGE_EXTENSIONS
    $OTHER_EXTENSIONS
    # 必要に応じて追記
) # -> System.Object[]
```
WSLのUbuntu16が勝手に18になったので困った

# 事の発端

 Ubuntu16.04をクリアした結果、Ubuntuが18になってるううう！

## 直し方

### 無印のUbuntuをアンインストール

アプリと機能から、(あれば)無印のUbuntuを削除します。

これだけにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/4b449d81-acaf-1589-9636-00b91b6a2eda.png)


## Ubuntu16のイメージをダウンロードする

下記にアクセスし、「Ubuntu 16.04」を選択しappxファイルをダウンロードする

https://docs.microsoft.com/ja-jp/windows/wsl/install-manual

## ダウンロードしたものを実行する

こんな感じで言われるのでインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/187589a5-3b76-f845-b0bb-e00c1a12491e.png)

## ミッションコンプリート！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/12a964df-9ac6-1561-9a8c-0c8cf8862c94.png)
ルーティングについて

##ルーティングについてざっくりまとめていきます！

*Wikipedia　[ルーティング](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)


ルーティングとは、ルーター同士のやり取りのことです。


例えば、ネットワークAとネットワークBへデータを送るときに、ネットワークAのルータはネットワークBのルータを送り先にするためのデータを持っておかなければなりません。

また、ネットワークEにデータを送りたいときときは、ネットワークAはネットワークA→ネットワークC→ネットワーク→Eといった情報を持っていないとネットワークEにデータを送ることが出来ません。


![無題の図形描画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203857/a3c7c1db-ebe7-cf9a-8a2b-8d05486a5403.png)

ルータには、「このネットワークに属するコンピュータにデータを送るときは、このルータにデータを送らなければならない」という**ルーティングテーブル**というデータが用意されてます。

なので、上の図でA→Bデータを送る場合は、ネットワークAのルータはルーティングテーブルを参照して、ネットワークBのルータにデータを送っていることになります。

また、ルータがルーティングテーブルを設定するのに二通りの方法があります。

###１.手動で設定する方法
「スタティックルーティング」といいます。
手動で設定する分大変ですが、ネットワークの負荷を軽減することができます。
しかし、新たにネットワークが出来た場合など、各ルータの情報を更新しなけなかったり、設定する情報が間違えていた場合に、目的のネットワークに情報を届けることが出来なかったりします。

以上のことから、小規模ネットワークで活躍するでしょう。


###２.ルータ同士が情報を交換して自動で設定する方法
「ダイナミックルーティング」といいます。
ルータ同士が情報を交換するために、ルーティングプロトコルを使用します。

自動で他のネットワークのルータの情報が設定されるので、管理が簡単です。
また、ネットワークの途中の経路で何かトラブルがあれば、自動で他の経路を探し出して、目的のネットワークとのデータのやり取りを行うことが出来ます。

以上です。ありがとうございました！
React Native製 Android アプリの64bit対応

2019/8/1から64bit対応していないAndroidアプリのストアへのアップロードができなくなります。
これにあたってReact Nativeアプリの64bit対応を行ったので方法をメモしておきます。
作業前にAndroidネイティブアプリの64bit対応についての[ドキュメント](https://developer.android.com/distribute/best-practices/develop/64-bit)を読んでおくと作業がスムーズにすすむと思います。

# RN0.59
React Nativeのバージョンを0.59系にあげます

# build.gradle
build.gradleを修正し64bitバイナリを含めるようにします

```gradle|app/build.gradle
    defaultConfig {
        applicationId 'jp.co.runners.mimizuku'
        minSdkVersion "${rootProject.ext.minSdkVersion}"
        targetSdkVersion "${rootProject.ext.targetSdkVersion}"
        versionCode 33
        versionName "2.0.7"
        // ↓このブロックがあったら削除
        //ndk {
        //    abiFilters "armeabi-v7a", "x86"
        //}
    }

    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            //include "armeabi-v7a", "x86"
            // ↑これを↓こうする
            include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
        }
    }

    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def versionCodes = ["armeabi-v7a":1, "x86":2]
            // ↑これを↓こうする
            def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
```

参考
https://github.com/facebook/react-native/commit/4b996da

# apk確認
Android Studioの Build -> Analyze APK で lib以下の*.soファイルが各アーキテクチャに過不足なく存在するか確認します。
私の場合はlibrealmreact.soの64bit版が存在していませんでした。
ちょうど数日前に64bit対応されたバージョン2.28.0がリリースされていたので使用するrealmのバージョンも上げる必要がありました。
このようにネイティブバイナリを使っているライブラリの場合はこのような問題があるので、soファイルの存在チェックはアプリを動かす前にしたほうがよさそうです。

詳しいやり方 
https://developer.android.com/distribute/best-practices/develop/64-bit#look_for_native_libraries_using_apk_analyzer

# 動作確認
64bit対応しているデバイスで動作確認します。
アプリのインストールはabiオプションを指定して次のようにすることで、64bitライブラリのみ使用するアプリがインストールできます。

```
adb install --abi arm64-v8a YOUR_APK_FILE.apk
```

デバイスが64bit対応しているか調べる方法は [こちら](https://qiita.com/sekitaka_1214/items/2847c5e83a9a760dc538)の記事を参照してください。

詳しいやり方
https://developer.android.com/distribute/best-practices/develop/64-bit#test_your_app_on_64-bit_hardware
(仕事用)用語&リンク集

**一般的な用語だけど忘れっぽいので備忘録として**
## CodeCommit ([AWS CodeCommit](https://aws.amazon.com/jp/codecommit/))

- AWSがフルマネージドで提供するGitリポジトリ[^1]サービス
- GitHub[^2]のAWS版。というのが近いのだろうか？
- コードを格納し、バージョン管理する場所
- [AWS CodeCommit UserGuide](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/welcome.html)
- [DevelopersIO CodeCommit入門 – Code三兄弟を知る](https://dev.classmethod.jp/cloud/aws/codecommit-introduction/)

## CodeBuild([AWS CodeBuild](https://aws.amazon.com/jp/codebuild/))
>ソースコードをコンパイル[^3]し、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる完全マネージド型のビルドサービス

## CodeDeploy([AWS CodeDeploy](https://aws.amazon.com/jp/codedeploy/))
>Amazon EC2 インスタンスやオンプレミスインスタンス、サーバーレス Lambda 関数、または Amazon ECS サービスに対するアプリケーションのデプロイを自動化するデプロイメントサービス

- [AWS再入門 AWS CodeDeploy編](https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-codedeploy/)

## CodePipeline([AWS CodePipeline](https://aws.amazon.com/jp/codepipeline/))
>完全マネージド型の継続的デリバリーサービスで、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パイプライン[^4]のリリースを自動化

- [Qiita: AWS CodePipeline マルチリージョンアクションを試してみた](https://qiita.com/yi7027/items/aee67b51dd49257e4546)

## Amazon ECS([Amazon ECS](https://aws.amazon.com/jp/ecs/))
>Docker コンテナをサポートする拡張性とパフォーマンスに優れたコンテナオーケストレーション[^5]サービスです

## Docker
コンテナ[^6]

- [Qiita: 【図解】Dockerの全体像を理解する](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)
- [paiza開発日記: Dockerのすべてが5分でわかるまとめ!](https://paiza.hatenablog.com/entry/docker_intro)
- [注目を浴びる「Dockerコンテナ」、従来の仮想化と何が違うのか？](https://cn.teldevice.co.jp/column/10509/)

## BIgQuery　
>BigQuery は、高スケーラビリティでコスト効率に優れたサーバーレス クラウド データウェアハウスで、インメモリ BI エンジン[^6]と機械学習ビルトインを備えています

- [GCP BIGQUERY](https://cloud.google.com/bigquery/?hl=ja#header)

## Embluk
並列データ転送ツール

- [Embulkのコマンドヘルプまとめ](https://qiita.com/hiroysato/items/86ad1cdfb1754440eed5)
- [Fluentdのバッチ版Embulk(エンバルク)のまとめ](https://qiita.com/hiroysato/items/397f36c4838a0a93e352)

[^1]: **リポジトリ(repository)**情報工学において、仕様・デザイン・ソースコード・テスト情報・インシデント情報など、システムの開発プロジェクトに関連するデータの一元的な貯蔵庫を意味する　
[^2]: [そもそもGitHubとは一体何か？](https://jp.techcrunch.com/2012/07/15/20120714what-exactly-is-github-anyway/)
[^3]: コンパイルはソースコードをコンピュータが実行可能な形式に変換すること。ビルド(build)はコンパイル(compile)に加えてライブラリのリンクなどをおこない、実行可能な状態にすること
[^4]: パイプラインに関する[Wikipediaの解説](https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A4%E3%83%97_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)
[^5]: [コンテナオーケストレーションツールの“事実上の標準”という座をつかんだ「Kubernetes」。その重要性とは？](https://cn.teldevice.co.jp/column/10519/)
[^6]: [Wikipedia: インメモリデータベース](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)とは、[複数システムから、必要なデータを収集し、目的別に再構成して時系列に蓄積した統合データベース](http://www.advanlink.co.jp/crmconsultation/crm_dwh.html)のこと最近ではBI(Business Intelligence)の一つ
未経験・文系がプログラマ・SEとして働いていく際の3つのお願い

#未経験文系プログラマから、SEになるときのお願い
私は、JavaとSQLを教えている社内講師です。
私事ですが、4月に担当する新人さんが何名か増え、一緒に仕事出来ることに嬉しく感じています。

新入社員さんのほとんどは、理系だったり、文系だったり、
プログラム作成経験者だったり、そうでなかったり、多種多様のいろんな方がいます。

勿論、色々なケースがありますが、プログラム未経験者は経験者よりも少し出足が遅れたり、
数学が得意な理系さんが、他より飲み込みが速かったりすることがあります。

私は、文系・理系や経験者・未経験での**アドバンテージは、あまり感じておらず**、
最初の3ヶ月は飲み込みが速かったり、最初からプログラムが書けたりと、差はつくことがありますが、
それ以降は、**過ごし方次第**で理系や経験者を追い抜くことを何度も見てきました。

私は、SEとして成長して欲しく、新入社員に3つのお願いをしています。(勿論、強制はしません。)
その内容を記事に致しました。

##その1.疑問に目を傾けて、都度調べて、理解して下さい
日常生活の中で、不思議なこと、わからないことは色々あると思います。

例えば、
「家の鍵の種類ってどういった形？」：（ピン？ディンプル？）
「ゲーム機をTVやモニターと繋ぐケーブルはどんなケーブル？
　ケーブル毎に何が違うの？」(D-Sub,Displayport,DVI,HDMI,RCAピン等)
「USBの指す場所が黒と青の2種類があるんだけど、何か違うの？」(USB 1.0,2.0,3.0)
「スマホの充電ケーブルは100均のやつと、高いやつ、何が違うの？」(出力アンペア量の違いや耐久性等)

日常的なことでも、目を傾け、耳を傾ければ、
このような疑問があると思いますが、気にしたことはあるでしょうか。

SEで仕事をしていると、1~2年間くらいはずっとわからない単語が飛び交うことがあると思いますが、
わからないままでは仕事が成り立たないことがあるかと思われます。

プログラム云々・仕事云々関係なく、**わからないことを即座に調べる**、
調べたらなるべく**知識として貯めていく**ことを癖つけて下さい。

##その2.ITニュースを読んで下さい
前提として、なるべく普通のニュースには目を通して欲しいですが、
加えて、ITニュースにも目を通して下さい。

英単語の暗記みたいに、膨大なIT用語を丸暗記はかなり辛いものになってしまいます。

そこで、**ITニュースを読み、前述の調べる・理解する**ことを行って下さい。
いつの間にかIT用語に精通しているかと思われます。

全体的なIT知識であれば**ITmedia**や**Techcrunch**を流し読みし、
専門分野の精通を目的するのであれば**Qiitaのデイリートレンド**に目を通す
程度で構わないと思います。

通勤時間の5分くらいを割いて、読む程度で構わないので、ぜひともしばらく継続して読んでみて下さい。

##その3.楽しんで下さい
これは、私が特に言いたいことです。

言語や、内容にもよりますが、
たまに、プログラムや勉強を苦しんで行っている人をお見受けします。

どうやら、話を聞いていくと、「お勉強が嫌いだから、辛い」とのことです。

**わしだって勉強嫌いじゃ！**
…と言いそうになりますが、よくよく考えるとあまり独学中に苦しいと思った経験はありませんでした。
（資格勉強は苦しいですが…）

開発は芸術（みたいなもの）です。
音を奏でるが如く、絵を書くが如く、創作は楽んでなんぼだと思います。
仕事の色気ない開発は別腹ですが、自分の作りたいものは仕様や制約はありません。

SEの平均勉強時間ですが、約35%が月20～40時間程自習しているそうです。[^1]
生涯、辛い勉強が20時間も続くとは考えられません。

思想を形に変えることという**創作を楽しんで下さい。**

##総じて…
苦痛の作業を生涯やることは、なかなか耐え難いものがあると思います。
楽しみながら、トライ・アンド・エラーでやっていき、習得していったほうが面白く、
持続するモチベーションにもなると思います。

ぜひとも、無理のないレベルで楽しくプログラムと付き合ってみてはいかがでしょうか。
ここまでご閲覧いただきありがとうございました。

[^1]https://paiza.hatenablog.com/entry/2014/09/16/IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E5%8B%89%E5%BC%B7%E6%99%82%E9%96%93%E3%81%AF%E6%9C%8820%E6%99%82%E9%96%93%E4%BB%A5%E4%B8%8A%EF%BC%81%EF%BC%9F%E5%A5%BD%E3%81%8D%E3%81%AA%E3%81%93
Nuxt v2.7 で実行時に「TypeError: fsevents.watch is not a function」のエラーで起動できない


# Nuxt v2.7.1にしたら、起動できなくなった

Nuxt v2.7.x で、yarn dev 実行時に以下のエラーが出た。

``` sh:fsevents-handler.js
  const stop = fsevents.watch(path, callback);
                        ^

TypeError: fsevents.watch is not a function
    at createFSEventsInstance (/Users/masaakikakimoto/Documents/nuxt_firebase_sns/node_modules/@nuxt/builder/node_modules/chokidar/lib/fsevents-handler.js:57:25)
    at setFSEventsListener (/Users/masaakikakimoto/Documents/nuxt_firebase_sns/node_modules/@nuxt/builder/node_modules/chokidar/lib/fsevents-handler.js:111:16)
    at FsEventsHandler._watchWithFsEvents (/Users/masaakikakimoto/Documents/nuxt_firebase_sns/node_modules/@nuxt/builder/node_modules/chokidar/lib/fsevents-handler.js:296:18)
    at initWatch (/Users/masaakikakimoto/Documents/nuxt_firebase_sns/node_modules/@nuxt/builder/node_modules/chokidar/lib/fsevents-handler.js:433:27)
    at LOOP (fs.js:1787:14)
    at process._tickCallback (internal/process/next_tick.js:176:11)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
```

調べると以下のIsuueがHit
https://github.com/nuxt/nuxt.js/issues/5725

## nodejs のバージョンを下げることで解決した。

とりあえずnode v10.15.3でNuxtが正常起動することを確認しました。

(※v12系やv9系では、エラーが出るようだ。)

### ※追記 おまけ

気を良くして、いろいろとパッケージを追加していたら、またまたNuxtが起動しなくなった。

エラー内容

``` sh

 ERROR  Failed to compile with 1 errors                       friendly-errors 17:07:19

This dependency was not found:                                friendly-errors 17:07:19
                                                              friendly-errors 17:07:19
* core-js/modules/es7.promise.finally in ./.nuxt/client.js    friendly-errors 17:07:19
                                                              friendly-errors 17:07:19
To install it, you can run: npm install --save core-js/modules/es7.promise.finally
```

corejs v2.6.5を入れ直すことで解決した。

``` sh
yarn add core-js@latest2.6.5
```
webpackで既存ライブラリをbundle

既存のプロジェクトをwebpack化するとなると、困るのは古いライブラリたちですよね。
しかも古いバージョンで固定して開発してるので、バージョン変えたくない。
新しくしてどこか動かなくなっても困るし。

## 一番簡単な形
```
npm install jquery@[バージョン]
```


```webpack.config.js
plugin: [
    new ProvidePlugin({
         jquery: 'jquery',
         $: 'jquery'
    })
]
```

これだけ。

Jsファイルで 
`$(function(){ なんか処理 });` とか、
`$('.test')` とか、
`;(function($){ なんか処理 })(jQuery);`と
しているところで、
`npm install` したjqueryライブラリを使えるようにprovideします。

しかし `npm install` したバージョンとダウンロードしたバージョンが同じかどうか確証が得られませんでした。。
jquery.jsファイルを比較してみても差分だらけ。。

## bundleしたファイル以外で読み込む場合
jqueryをbundleせずに別で読み込む。
もともと読み込んでた `<script type="text/javascript" src="jquery.js"></script>` をそのままにして、bundleできるものだけbundleする。

### OKケース

```index.html
  <head>
    <meta charset="UTF-8">
	<title>Webpack Test</title>
	<script type="text/javascript" src="../js/jquery.min.js"></script>
	<script type="text/javascript" src="app.bundle.js"></script>
  </head>
```

### NGケース
なぜかbundleしてしまうと、jsファイルは読み込んでいるのに `$ is not found.` と出てしまいます。

```index.html
  <head>
    <meta charset="UTF-8">
	<title>Webpack Test</title>
	<!-- ↓この中にjquery.jsを含める -->
	<script type="text/javascript" src="vendor.bundle.js"></script>
	<script type="text/javascript" src="app.bundle.js"></script>
  </head>
```


```webpack.config.js
module.exports = {
	entry: {
		vendor: 'js/jquery.min.js',
		app: 'main.js'
	},
};
```

## bundleに含めて使う
jqueryをnpm installしないで、webpackする。

```webpack.config.js
module.exports = {
	//前半略
	plugins: [
		new webpack.ProvidePlugin({
			$: 'jquery',
			jQuery: 'jquery',
		}),
	],
	resolve: {
		alias: {
			jquery: "../js/jquery"
		}
	},
	module: {
		noParse: new RegExp("../js/jquery")
	}
};
```

ProvidePluginで設定しているjqueryに対して、
resolve.aliasでどのファイルを使うか設定してます。
パスはbundleするjsファイルのからのパスです。
parseされてしまうとダメなようなので、 `noParse` でも同じファイルを設定します。

jquery以外にもライブラリがたくさんある場合は、[ここ](https://stackoverflow.com/questions/28969861/managing-jquery-plugin-dependency-in-webpack)のように `addVendor` 関数作って設定すると楽かもしれませんね。
[(参考)](https://stackoverflow.com/questions/28969861/managing-jquery-plugin-dependency-in-webpack)

- ファイル構成
 
```
app/
	node_modules/
	js/
		jquery.js
```
[現在非推奨] UniP2Pマッチングサーバーの建て方　チュートリアル２

# 現在開発中止につき非推奨です
(追記 2020/01/24)
UniP2Pは開発を中止します。リアルタイム通信ライブラリとしてUniQUICを今後制作します。

(追記 2021/04/23)
今のところ、この記事の用途を求めている場合は、Mirrorのwebrtcパッケージが割と有効ではないかと考えています。
Steamにリリースする場合ですと、MirrorのSteam Networkingを使うパッケージがあるので、その使用を推奨します。

# UniP2Pとは
[こちら](https://qiita.com/ChujoHiroto/items/dc8d61f8b3d4b88af833) を参照
本記事のUniP2PはVer0.2です。
UniP2P本体の導入は[こちら](https://qiita.com/ChujoHiroto/items/53a7a99a6aa32b5c8b64)

# マッチングサーバーとは
UniP2Pでは公式にマッチングサーバーを用意しておらず、開発者が自由に作成、開発できるようになっています。
サーバーを持っていなくてもHerokuの無料枠の範囲で動作するようになっています。
またHerokuにデプロイするためのスクリプトも内蔵しています。
https://github.com/unip2p/SimpleMatchingServer-Node

# Herokuで建てる場合
https://github.com/unip2p/SimpleMatchingServer-Node からクローンしてください。
またHerokuで導入する場合、CLIツールが必要です。以下からインストールしてください。
https://devcenter.heroku.com/articles/heroku-cli

またgitも必要なため導入されているかを確認してください。

## Windowsの場合
heroku/create.ps1を右クリックしてpowershellで実行を選択してください。
herokuのログインを要求された場合は、指示に従ってください。

## Mac Linuxの場合
heroku/create.shをbashで実行してください。
herokuのログインを要求された場合は、指示に従ってください。

## マッチングサーバーの情報
両方の場合ともエラーなく成功した場合は、ブラウザが自動的に開いてしばらくすると、「Welcome to UniP2P Matching Server!!」と出ます。こうなっていれば立ち上げ成功です。もしなっていなければ手順を見直してください。
無事に立ち上がっている場合は、コンソールのログに残っているものか、herokuディレクトリに入っているMatchingServerSettings.txtを参照して、
MatchingServerURL:XXXXXXX
MatchingGameKey:XXXXXXX
MatchingSecretKey:XXXXXXXXX
をメモして大切に保管してください。

# Unity側に記録
先程保存したマッチングサーバーの情報をAssets/UniP2P/Resources/MatchingSettingsをUnityで開いて書き込んでください。
[現在非推奨] UniP2P導入方法　チュートリアル１

# 現在開発中止につき非推奨です
(追記 2020/01/24)
UniP2Pは開発を中止します。リアルタイム通信ライブラリとしてUniQUICを今後制作します。

(追記 2021/04/23)
今のところ、この記事の用途を求めている場合は、Mirrorのwebrtcパッケージが割と有効ではないかと考えています。
Steamにリリースする場合ですと、MirrorのSteam Networkingを使うパッケージがあるので、その使用を推奨します。

# UniP2Pとは
[こちら](https://qiita.com/ChujoHiroto/items/dc8d61f8b3d4b88af833) を参照
本記事のUniP2PはVer0.2です。

# 導入方法(まだプロジェクトを作成していない場合)
[ここ](https://github.com/unip2p/unip2p)からリポジトリごとクローンして、Unityで開けばよい

# 導入方法(既に存在するプロジェクトに導入したい場合)
## まず手元の環境確認
UniP2P推奨のUnityバージョンは Unity 2018.4(LTS)の最新です。
それ以降のバージョンでも動くとは思われますが、保証はしていません。
要件バージョンとしては2018.1以降となっています。それ以前は動作しないので注意してください。

Unity2018.1 and 2018.2の場合はIncremental Compilerが必須なのでそちらも導入してください。

## 依存ライブラリのインストール
本ライブラリは[UniRx](https://github.com/neuecc/UniRx)と[MessagePack for C#](https://github.com/neuecc/MessagePack-CSharp)に依存しています。
そのため二つのライブラリを導入する必要があります。
既に導入している場合は飛ばしてください。

###UniRx
https://github.com/neuecc/UniRx/releases/download/6.2.2/UniRx.6.2.2.unitypackage
上記のリンクからダウンロードしたunitypackageを導入してください。
既に導入している方の場合でもバージョンによっては動かないことがあるので注意してください。
UniRx.Asyncが含まれているバージョンであれば動作すると思います。

###MessagePack for CSharp
https://github.com/neuecc/MessagePack-CSharp/releases/download/v.1.7.3.5/MessagePack.Unity.1.7.3.5.unitypackage
上記のリンクからダウンロードしたunitypackageを導入してください。

## 本体のインストール
https://github.com/unip2p/UniP2P/releases/download/ver0.2.0/UniP2P.0.2.0.unitypackage
上記のリンクからダウンロードしたunitypackageを導入してください。

#まとめ
エラーなく動作した場合は導入成功です。
しかしUniP2Pはマッチングサーバーがないと他のネット環境にいるPCと通信しません。
次のチュートリアルではサーバーの建て方を説明します。

https://qiita.com/ChujoHiroto/items/8f09d65add2d521204c2
Cost Effective, price performance and cost performance:英語(46)

英語では、日常用語と専門用語で同じ言葉を使うため、理論がわかりやすいと感じることがあります。

日本語では、日常用語は大和言葉なのに、専門用語が漢語由来の言葉か、カタカナ語で、大和言葉を使わない傾向があるかもしれません。

cost performanceは、日常言葉ではなく、専門用語だという記述がありました。
https://chewy.jp/businessmanner/9740/

専門用語としては、Cost Performance Indexという熟語がよくでてきます。

Cost Performance Measurements
https://www.theicpm.com/blog/item/79-cost-performance-measurements

Cost performanceではじまる熟語の掲載されている専門用語辞書
http://www.maxwideman.com/pmglossary/PMG_C13.htm

price performanceなら、消費者でも理解できるかもしれません。priceは公開されているから。cost performanceは、消費者がcostを認識できなければ、計算のしようがない。日常用語からは遠い感じがします。

cost effective
https://www.merriam-webster.com/dictionary/cost-effective

上の方の記事にある
"value for money"
という単語は主観的価値(value)に重きがあるかもしれません。お金を支払うだけの価値があるという言葉の流れ。買ったもののperformanceという実用的な意味からは遠くなって違う意味の言葉かもしれません。

この記事は、
用語の衝突
https://qiita.com/kaizen_nagoya/items/6a8eb7ffaa45eeb16624#comment-ed844737b987fe85d921
に@7of9 さんからいただいた、Cost performance, Cost Effectiveについてのコメントに基づいて調べ始めた中間報告です。
https://qiita.com/kaizen_nagoya/items/6a8eb7ffaa45eeb16624#comment-ed844737b987fe85d921

もう少し幅広く調べます。

売り手の立場の言葉と、買い手の立場の言葉は、英語でも違う。
製造業の言葉と、商業の言葉は、英語でも違う。
英語 Native同士で通じないことはしばしば。

# まとめ
英語の専門的な内容を日常用語で説明しようという姿勢を学び、よりわかりやすい英語表現をさぐります。英語Nativeの人が書く英語よりわかりやすい英語がnon Nativeの人の方が書けるという経験則があります。

# 補足
STARC RTL  Design Style Guide は、日本人が書いているのに、日本語版より英語版の方がわかりやすいという経験則があります。日本語での輪講の際に、意味がわからないと英語版を紐解いたことがあります。

p.s. 
海外に行っても、ホテルと大学以外だと、computer shopか, book shopか、Libraryか,Musiumにしかいかず、日常会話をほとんどしません。日常英語はさっぱりです。

# 自己参考(self reference)

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　 20190526
ver. 0.02 ありがとう追記 　 20230529

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

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

Please press the like icon 💚　and follow me for your happy life.
Git環境構築

## Cent OSでの環境構築手順
## 1.gitをインストール
```shell
yum install git
```
## 2.sshをインストール
```shell
yum install openssh-server
```
## 3.ユーザ作成
```shell
#ユーザグループの追加(削除はgroupdel)
groupadd gitgroup
#追加されたグループの確認
cat /etc/group 
gitgroup:x:[groupID]:

#git用ユーザ作成(削除はuserdel)
useradd -u [userID] -g [groupID] [username]
#例
useradd -u [userID] -g [groupID] gituser

#作成ユーザーの確認
cat /etc/passwd
xxxx:x:[userID]:[groupID]::/home/[username]:/bin/bash
#例
xxxx:x:[userID]:[groupID]::/home/gituser:/bin/bash

#ユーザID,所属グループ確認
id [userID]
uid=[userID]([username]) gid=[groupID](gitgroup) 所属グループ=[groupID](gitgroup)

#パスワードの設定
passwd [userID]
[password]
```
## 4.格納ディレクトリ作成
```shell
mkdir /mnt/drive1/git-server
#ユーザ所有権、グループ所有権を変更
chown gituser:gitgroup /mnt/drive1/git-server
```
## 5.リポジトリの場所を作成
```shell
mkdir /mnt/drive1/git-server/sample1-rep.git
```
## 6.初期設定
```shell
#※オプションの意味
#--bare：最小限のリポジトリを作成する。もしGIT_DIR環境が設定されていなければ、現在のワーキング・ディレクトリが設定される。
#--shared：Gitリポジトリが複数のユーザで共有されることを指定する。このオプションは、同じグループに属するユーザがそのリポジトリにpushすることを許可する。
[gituser@CentOS7 ~]$ cd /mnt/drive1/git-server/sample1-rep.git/
[gituser@CentOS7 rep.git]$ git init --bare --shared
Initialized empty shared Git repository in /mnt/drive1/git-server/sample1-rep.git/
```
## 7.確認
```shell
[gituser@CentOS7 ~]$ ls -la /mnt/drive1/git-server/sample1-rep.git/
合計 16
4 -rw-rw-r--. 1 gituser gitgroup 23 5月 10 16:07 HEAD
0 drwxrwsr-x. 2 gituser gitgroup 6 5月 10 16:07 branches
4 -rw-rw-r--. 1 gituser gitgroup 126 5月 10 16:07 config
4 -rw-rw-r--. 1 gituser gitgroup 73 5月 10 16:07 description
4 drwxrwsr-x. 2 gituser gitgroup 4096 5月 10 16:07 hooks
0 drwxrwsr-x. 2 gituser gitgroup 20 5月 10 16:07 info
0 drwxrwsr-x. 4 gituser gitgroup 28 5月 10 16:07 objects
0 drwxrwsr-x. 4 gituser gitgroup 29 5月 10 16:07 refs
```
## Windows側設定
### 1.git for windowsをダウンロードしてインストール
https://git-for-windows.github.io/index.html
### 2.tortoisegitをダウンロードしてインストール
https://tortoisegit.org/
### 3.gitクライアント用のフォルダを作成
C:\Users\user1\Documents\git-client
### 4.サーバーと紐づけ
C:\Users\user1\Documents\git-client』を右クリック
Git clone..』を選択
URL』に
ssh://gituser@xxx.xxx.xxx.xxx/mnt/drive1/git-server/sample1-rep.git
『OK』ボタン
パスワード画面にgituserのパスワードを入力
『show log』または『close』
Laravel git cloneした後にすること

laravelをGit管理するときにつまずいたこ


コマンドプロンプトで少し操作しないと動かない


```
copy .env.sample .env
copy .env.example .env
no
composer install
php artisan key:generate
```


以下のように
```composer update
```コマンドを打つ場合は
composer.jsonファイルを書きかえた時だけ。


実際の手順は
作業者A　composer.json修正
作業者A　composer update
作業者A　GITにプッシュ->マージ
他の作業者　GITからプル
他の作業者　composer install

（参考）
https://qiita.com/waonn/items/43298d66f7cc59c64a2d

困ったときにすること
dump-autoload

(参考)
https://qiita.com/ytake/items/98c438d6a006f61df54a
Swiftでアプリ開発

#アプリ開発入門以下

初めてSwift書くことになったので詰まったところを書きたい

##storybord
こいつに惑わされた。
もともとAndroidStudioで開発していたので
コードベースの方がやりやすかったのかもしれない。

####最初にやったこと
storybordの中でレスポンシブさせながらHorizonStackViewに画像を4個表示させようとした。
しかしながら、レスポンシブがiphoneには適応されたが、ipadには適応されなかった。
自分が悪いのかもしれないが、調べてみると対応してないとかなんとか・・・？となった。

最終的にコードで画像を表示させ、コードでレスポンシブさせた方が楽だった。
AndroidStudioに戻りたくなったのはこの辺から（笑）

####次に
画像をクリックしたらコンソールにtag表示
imageViewに画像を最初は表示させていたが、どうもButtonに画像を表示させないといけないらしい。
その時点でもう嫌、、、となっていたが、学習のために頑張った。
なおかつ

```
@objc func buttonEvent(_ sender: UIButton) {}
```

という直感でわかりにくい関数を使わなくてはいけなかった。
func onclick(){}みたいな感じにはならないのかな？


tagの表示はsender.tagでできたので意外と楽だった。

####最後に
画面遷移だ。

画面遷移次第は楽なので、調べてみてほしい。
それよりも難しいのは遷移した後に前の画面を消すことだ。
消さなければメモリに負荷がかかり、無限画面生成アプリが見事に誕生するでしょう（笑）

```
UIApplication.shared.keyWindow?.rootViewController?
                .dismiss(animated: false, completion: nil)
```

これで前の画面を消すことができる。
しかし、この一文の意味が理解できないので詳しいことを知っている方教えてください。


とりあえず学習進めていくが、わからないことができたらまたqiita書きます。

最後にTwitter貼らせてください。
https://twitter.com/amondoteruteru
kotlinの'@'ラベルを使っていつでもreturnする

```kotlin
val callback = {
  // なにか
  ...
}

...

callback?.invoke()
```

kotlinは`{` `}`で囲まれたコードは、ラムダ式になるのでこんなこともできます。
しかし、、、

```kotlin
val callback = {
  if (someValue == 100) return // <- エラー
  ...
}

...

callback?.invoke()
```

ラムダ式の中で`return`するとエラーになってしまいます。
メソッドにラムダ式を使うときは`@メソッド名`をつけると問題なくreturnできるのですが、
上のコードの場合は`@`のあとに付ける名前が無いのでできません。

```kotlin
list.forEach {
  if (it == 10) return@forEach
}
```

こういうときはラベルを付ければいいよという話。

```kotlin
val callback = mark@{
  if (someValue == 100) return@mark
  ...
}

...

callback?.invoke()
```

`mark`っていうのは適当に付けたもので実際は何でもいい。
`@`の位置がラベル付けとreturnで違うのがモヤモヤするけど、
便利です。
webpackではnode_modulesより上のディレクトリにあるファイルにライブラリを指定できない


## webpackの落とし穴
`npm install` したjqueryを `ProvidePlugin`や `externals`に指定する時、
node_modulesがあるディレクトリより上の階層のjsファイルをbundleしようとすると、エラーになる。

```
app/
	node_modules/
	webpack.config.js	<—ココから
public/
	js/
		main.js			<-このjsファイルをbundle
```
この配置で `npm install` したjqueryを使おうと、以下のような設定を書いても、`$ is not found` と言われます。

```webpack.config.js
module.exports = {
	entry: '../public/js/main.js',
	plugin:[
		new ProvidePlugin({
			jquery: 'jquery',	// エラー
			$: 'jquery'			// エラー
		})
	]
};
```

## 解決法
public配下にあるjsファイルをapp配下にコピーしてくる。

```
public/
    js/
       main.js     <-ココから
app/
    node_modules/
    src/
        main.js    <- ココにコピー
    webpack.config.js
```
そして同じようにwebpackコマンド叩けば、bundleされました。

## 原因
publicは公開フォルダです。
その中で設定ファイルが見えるのがちょっといやで、外に出しました。
publicより上のフォルダなら見えないから、そこで `npm install` すればよかったですかね。。
Array#injectでArray#sumを代用

`Array#sum`はRuby2.4から、それより前のバージョンで`Array#sum`っぽいことがしたい時は`Array#inject`で代用可能。



```ruby
[1,2,3,4,5].inject(:+)
```

#参考
http://rurema.clear-code.com/query:sum/
http://rurema.clear-code.com/2.3.0/method/Enumerable/i/inject.html
MySQL 8で、mysql_upgradeがdeprecatedになった

# はじめに
　Mac上で、MySQLのバージョンを**8.0.12**から**8.0.16**にアップデートしたら、ユーザーを追加できなくなってしまいました。従来はmysql_upgradeを使って対処できましたが、**8.0.16**では**deprecated**になった為、代わりの方法を書き残しておきます。

# 環境
|       | バージョン |
|-------|:--------:|
| OS    | macOS 10.14.4 |
| MySQL | 8.0.16 |

# 現象
1. こんな感じでユーザーを追加しようとすると、エラーが表示される
    ```shell
    $ echo "CREATE USER 'db_user'@'%' IDENTIFIED BY 'db_userXXX';" | mysql -uroot
    ERROR 3009 (HY000) at line 1: Column count of mysql.user is wrong. Expected 51, 
    found 49. Created with MySQL 80012, now running 80015. Please use mysql_upgrade to 
    fix this error.
    ```

2. mysql_upgradeを使えと仰るので、使ってみると今度は**deprecated**とのこと
    ```shell
    $ mysql_upgrade -uroot
    The mysql_upgrade client is now deprecated. The actions executed by the upgrade
    client are now done by the server.
    To upgrade, please start the new MySQL binary with the older data directory. 
    Repairing user tables is done automatically. Restart is not required after upgrade.
    The upgrade process automatically starts on running a new MySQL binary with an 
    older data directory. To avoid accidental upgrades, please use the --upgrade=NONE 
    option with the MySQL binary. The option --upgrade=FORCE is also provided to run 
    the server upgrade sequence on demand.
    It may be possible that the server upgrade fails due to a number of reasons. In 
    that case, the upgrade sequence will run again during the next MySQL server start. 
    If the server upgrade fails repeatedly, the server can be started with the --
    upgrade=MINIMAL option to start the server without executing the upgrade sequence, 
    thus allowing users to manually rectify the problem.
    ```

3. 上記メッセージで「MySQL binaryに、オプション"--upgrade=XXXXX"をつけろ」と仰るので、付けてみても上手くいかない
    ```shell
    $ mysql -uroot --upgrade=NONE
    mysql: [ERROR] unknown variable 'upgrade=NONE'.
    ```

# 結論
- Mac上でのMySQL binaryは`mysql.server`のことなので、以下のように使う
    ```shell
    $ mysql.server start --upgrade=FORCE
    Starting MySQL
    . SUCCESS!
    ```

# 感想
　MySQL 8.0.16から、mysql_upgradeはdeprecatedとのことなので、エラーメッセージで「Please use mysql_upgrade to fix this error.」と書くのは誤解を招くなぁ、と思いました。まだエラーメッセージまで手が回っていないだけで、そのうち修正されると思いますが。

# 参考
- [MySQL 8.0.16: mysql_upgrade is going away](https://mysqlserverteam.com/mysql-8-0-16-mysql_upgrade-is-going-away/)
    + mysql_upgradeの仕様変更について解説があります
【UiPath】プロジェクトをCLIでパッケージ化する

# やり方
UiRobot.exeをコマンドラインから実行し、-pack オプションを使う。
参考：https://robot.uipath.com/lang-ja/docs/arguments-description

```
UiRobot.exe -pack "C:\UiPath\Projects\Notepad\project.json" -output "C:\UiPath\Packages"
```
Community Editionの場合、UiRobot.exeは以下のフォルダにある。
```%localappdata%\UiPath\app-xx.x.x```
最新バージョンのappフォルダを参照するのが良さそう。

# バージョン番号
-v オプションを使うと、バージョンを明示的に指定できる。省略した場合は、UiPathのバージョン番号の付け方に沿って自動的に設定される。

-packを実行するたびに、バージョン番号が増えてゆく。
![image01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/4f2561ea-9e5b-7713-1ef4-528b3b672965.png)

最新のバージョン番号はproject.jsonで管理されている。-packを実行するたびにproject.jsonのバージョン番号が書き換わる。

# おまけ
メリットはほとんどないが、NuGet.exe使ってパッケージを作ることもできるらしい。
2FAが必須になった今、CircleCIでfastlaneを使ってdsymのダウンロード/アップロードはできなさそう

タイトルの通りCircleCIでは実現が難しいことがわかったので紹介します。
背景として、先日、AppleIDの2FAが必須になりました。

fastlaneは2FAにも対応しており、詳しくは下記に記載があります。

[Continuous Integration - fastlane docs #authentication-with-apple-services](https://docs.fastlane.tools/best-practices/continuous-integration/#authentication-with-apple-services)

具体的には `fastlane spaceauth -u user@email.com` を実行し、出力された値を環境変数に設定するというものです。
ただし、上記を実行した環境と利用する環境でregionが違うと失敗する可能性があるようで、私の環境ではCircleCIに上記で得られた値を設定しても正常に動作しませんでした。

少し古いISSUEになりますが、2FAを無効にすると良いという回答もあります。

[Locally generated FASTLANE_SESSION does not work on CI machine · Issue #9518 · fastlane/fastlane](https://github.com/fastlane/fastlane/issues/9518)

今回はAccount Holderではないアカウントを使用したのですが、そのアカウントも2FAを無効にできず、その解決策が使えなくなっているようでした。

下記の通り、無効にする機能が表示されていません。
<img width="574" alt="スクリーンショット 2019-05-27 13.17.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40689/d20b9d58-19ee-b67e-f903-c901516f3a9c.png">


ちなみに、Bitraseでは2FAを行う環境が用意されているようです。
[App Store Connect 2FA solved on Bitrise | Bitrise Blog](https://blog.bitrise.io/app-store-connect-2fa-solved-on-bitrise)
Golang関数＋構造体まとめ(お勉強用)

Golangを覚え始めたのですが、某パブリッククラウドの某サーバレスサービスで、
Golangでファンクション作っている時にまとめたくなりここに記載します。

### 基本形
```go
func 関数名 (引数 型)　{
    // 処理
}
```
### 引数はカンマで区切り複数指定できる。
```go
func 関数名 (引数 型, 引数 型, 引数 型) {
    // 処理
}

例)
func ociComputeEventHandler(ctx context.Context, in io.Reader, out io.Writer) {
    処理
}
```
### 戻り値も定義できる。
とりあえずデータ型を指定。

```go
func 関数名 (引数 型) 型 {
    // 処理
    return 値
}
```
### 戻り値を指定できるし、こちらもカンマで複数指定できる。
```go
func 関数名 (引数 型) (戻り値 型, 戻り値 型) {
    // 処理
    return 値, 値
}

例) ※エラーハンドリングでよく使う。
func canStringBeRegion(stringRegion string) (region string, err error) {
	if blankRegex.MatchString(stringRegion) || stringRegion == "" {
		return "", fmt.Errorf("region can not be empty or have spaces")
	}
	return stringRegion, nil
}
```
### スライスを関数で扱う。
```go
fucn 関数名() スライス {
    // 処理
    
}

例)
func GetListInstancesSortByEnumValues() []ListInstancesSortByEnum {
	values := make([]ListInstancesSortByEnum, 0)
	for _, v := range mappingListInstancesSortBy {
		values = append(values, v)
	}
	return value
}
```
### 構造体の関数
関数名の前に「(変数名 構造体)」を付け加えます。

```go
type 構造体 struct {
    // フィールド定義
}

func (変数名 構造体) 関数名(変数名 型) 型 {
    // 処理
    return 値
}

例)
type FailedResponse struct {
	Message string
	Error   string
}

func (response FailedResponse) toString() string {
	return response.Message + " due to " + response.Error
}
```

参考:
チュートリアル
https://go-tour-jp.appspot.com/basics/4

https://github.com/oracle/oci-go-sdk/
java側linuxのzipコマンドで圧縮

java側linuxのzipコマンドを呼び出したい場合、ProcessBuilderを利用できます。
例１：
全部ディレクトリ保持の場合、
List<String> commandList = new ArrayList<String>();
commandList.add("-r");
ProcessBuilder pb =new ProcessBuilder(commandList);

例２：
ディレクトリ保持しない場合、（同じファイル名あれば、エラー）
List<String> commandList = new ArrayList<String>();
commandList.add("-j");
ProcessBuilder pb =new ProcessBuilder(commandList);
LINUXのzipコマンド一覧
-f   freshen: only changed files
-u   update: only changed or new files
-d   delete entries in zipfile
-m   move into zipfile (delete OS files)
-r   recurse into directories
-j   junk (don't record) directory names
-0   store only
-l   convert LF to CR LF (-ll CR LF to LF)
-1   compress faster
-9   compress better
-q   quiet operation
-v   verbose operation/print version info
-c   add one-line comments
-z   add zipfile comment
-@   read names from stdin
-o   make zipfile as old as latest entry
-x   exclude the following names
-i   include only the following names
-F   fix zipfile (-FF try harder)
-D   do not add directory entries
-A   adjust self-extracting exe
-J   junk zipfile prefix (unzipsfx)
-T   test zipfile integrity
-X   eXclude eXtra file attributes
-y   store symbolic links as the link instead of the referenced file
-e   encrypt
-n   don't compress these suffixes

例３下記の場合はどうする？
フォルダの形式：/home/AB/CD/+各種ファイルとサブフォルダ
入力パース
/home/AB/CD/
圧縮後（/home/AB/CD/含まない）
各種ファイルとサブフォルダ.zip
試して、下記のコマンドはいいです。

pb = new ProcessBuilder("sh", "-c", “zip -r test.zip ./\*”)).directory(new File("/home/AB/CD/"));
同じく書きの書き方でもいいです。
pb = new ProcessBuilder("/bin/sh", "-c", “zip -r test.zip ./\*”)).directory(new File("/home/AB/CD/"));
pb = new ProcessBuilder("/bin/bash", "-c", “zip -r test.zip ./\*”)).directory(new File("/home/AB/CD/"));
隱藏 UITextField 的 Caret

`Caret` 就是在 UITextField 和 UITextView 等 UI 元件中輸入內容時會出現的那個游標。

想要改顏色雖然可以透過這樣的方式達到：

```swift
textField.tintColor = .red
```

不過如果想要像 iPhone 裡面預設的通訊錄 app 中，編輯生日時不會顯示游標，但是又想要在選取的時候有顏色的話該怎麼辦？
如果是像下面這樣設定的話，連選取的時候的顏色也會跟著不見：

```swift
textField.tintColor = .clear
```

所以顯然不是這個方法。

## UITextInput#caretRect(for:)

解法不會很難，在比較底層的 protocol 有一個方法可以改變這個游標的大小。
可以新增一個 custom UITextField ，寫像是這樣的東西，就可以讓他變不見：

```swift
import UIKit

class CustomTextField: UITextField {
    override func caretRect(for position: UITextPosition) -> CGRect {
        return .zero
    }
}
```

但是如果把這樣寫死似乎沒有什麼彈性。

例如，當有共用的表單 UI 元件裡面有這樣的文字輸入框的時候就無法根據情境設定我要不要顯示這個游標，顯然不是很自由好用。

## 加入彈性

於是就來加個新的屬性 (property) 給他，讓 UI 自己可以決定是否要顯示

- 如果這個值是 nil 的話，就顯示預設的大小。因為是繼承的關係，因此可以透過 `super` 呼叫相同的方法來拿到這個值。
- 如果不是 nil 的話，就用我們期望的值。

用這個邏輯的時做就如下：

``` swift
import UIKit

class TextField: UITextField {
    
    var caretRect: CGRect?
    
    // MARK: - UITextInput
    
    override func caretRect(for position: UITextPosition) -> CGRect {
        if let caretRect = caretRect {
            return caretRect
        }
        
        return super.caretRect(for: position)
    }
}
```

###  使用

使用方式如下，
不想要他顯示的話就這樣寫：

```swift
// textField is a CustomTextField's instance
textField.caretRect = .zero
```

想要讓他顯示的話，就這樣做就可以了：

```swift
// textField is a CustomTextField's instance
textField.caretRect = nil
```

## 結語

因為 [UITextView](https://developer.apple.com/documentation/uikit/uitextview) 和 [UITextField](https://developer.apple.com/documentation/uikit/uitextfield) 都有實作 [UITextInput](https://developer.apple.com/documentation/uikit/uitextinput) 的方法，
所以包含 UITextView 就也可以透過相同的方式達到這樣的效果！


以上！

## 參考

- [UITextInput#caretRect(for:)](https://developer.apple.com/documentation/uikit/uitextinput/1614518-caretrect)
AWSのPolicyに関する備忘録

APIのクロスアカウントアクセスについて調べていて、アクセス許可についてしっかり理解する必要を感じたので自分なりにまとめます。

# アクセス許可
AWSのリソースも、OAuthのAPIと同じように「リクエストしたユーザー・ロール（＝プリンシパルエンティティ）が認証されているか」「アクセス許可を持っているか」を確認します。
私がよく躓くのは、この「アクセス許可を持っているか」の部分のようです。

# ポリシー
アクセス許可は、IAMユーザー・ロールにアタッチされているポリシーと、リソースにアタッチされているポリシーの両方を重ねて評価して判断されます。
ちなみに...
* アイデンティティ・リソース以外にも４種類のポリシータイプがあるらしい。
参考：[ポリシーとアクセス許可](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html)
* ポリシー以外のアクセス許可もあるらしい。例えば、ポリシーの条件にタグを含めるなど。
参考: [ポリシーを利用したアクセス制御](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_controlling.html)

大体の場合はアイデンティティベースのポリシーを設定するだけで済んでいると思いますが、クロスアカウントアクセスの場合はリソースベースのポリシーを設定することも必要になることがあります。

# アイデンティティベースとリソースベース
## 共通するポイント
どちらもJSONです。あ、CloudFormationで作成する場合はYAMLですね。でもAWS上ではJSONです。

文法もだいたい同じです。Resourceに対するActionのEffect（Allow/Deny)のリストをStatementとしてリストにする、ってとこですね。
アイデンティティベースの場合はPrincipal要素は指定してはいけないようです。
参考： [IAM JSONポリシー言語の文法](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_grammar.html)
参考: [AWS JSON ポリシーの要素:Principal](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying)


## 異なるポイント
アイデンティティベースのポリシーでは管理ポリシーを作ることができますが、リソースベースだとできません。つまり、リソースに対して似たようなポリシーを適用する場合は、リソースごとに同じポリシーをコピペする必要がある、ということです。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_managed-vs-inline.html


## 迷ったポイント
リソースとしてのIAM Roleにもリソースポリシーがあります。
例えばECSのサービスがIAM RoleとしてS3にオブジェクトをアップロードする場合、そのRoleに引受（Assume)可能かどうかをリソースポリシーとして設定するわけですね。

# クロスアカウントアクセス
要するに、IAM側でもリソース側でもアクセス許可をする必要があるようです。

参考: [IAM ロールとリソースベースのポリシーとの相違点
](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_compare-resource-policies.html)


# 参考資料
[AWS IAMポリシーを理解する](https://dev.classmethod.jp/cloud/aws-iam-policy/)
[IAMロール徹底理解 〜 AssumeRoleの正体](https://dev.classmethod.jp/cloud/aws/iam-role-and-assumerole/)
Windows On AWS

今更ながら、Windows Server 2019をAWS上に作ってみた。

アカウント作成〜インスタンスの作成まではここを参考にした。
https://qiita.com/HitomiHoshisaki/items/4e1eff6b32bcf91ec0d8

気をつけなきゃいけないのは、日本語版のWindowsは、
クイックAMIにはでてこない。

コミュニティAMIでJapaneseで検索すると、でてくる。
詳しくは、
https://qiita.com/nasuvitz/items/c479073a695f63b1b949
を見てみましょう。

実際、RDPで接続し、日本語にはなっていたものの、
時刻はUTCのままだった。

* 設定 -> 日付と時刻で日付と時刻画面を起動
* 日付と時刻タブ -> タイムゾーンの変更をクリック
* UTC+9 を選択

これで時刻ももとに戻ったぞ。よかった。
【CSS】display:none;を使いつつ、cssだけでフェードインしたい。

## こんなときに
* `display: none;` → `display:block;`
という切り替えが必須な状況。
* フェードインのアニメーションを追加したい。
* cssだけでどうにかしたい。
* フェードインしたらしっぱなし。フェードアウトの機能までは必要ない。

## コード
### Pug
```pug
.wrap
  input#show.check(type="checkbox")
  label.label(for="show") 表示
  .box ふわー
```

### SCSS
```scss
.wrap {
  background-color: #ddd;
  height: 300px;
  width: 100%;
  position: relative;
  padding: 30px;

  .box {
    height: 200px;
    width: 200px;
    margin: auto;
    background-color: #fadfaa;
    display: none;
  }
  .label {
    display: block;
    padding: 12px;
    border: 1px solid #444;
    position: absolute;
    bottom: 0;
    cursor: pointer;
  }

  .check {
    display: none;
    &:checked {
      & + .label {
        display: none;
      }
      & ~ .box {
        display: block;
        animation-name: fade-in;
        animation-duration: .7s;
      }
    }
  }
}

@keyframes fade-in {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
```

## 解説
### 今回のポイント
* displayはtransitionできないため、cssアニメーションを使用する。
* アニメーションで、opacityが0→1に遷移するよう指定する。

### displayの切り替え
```scss
.box {
	//中略
	display: none;
}
//中略
.check {
display: none;
	&:checked {
	  //中略
	  & ~ .box {
	    display: block;
		animation-name: fade-in;
	    animation-duration: .7s; //遷移時間
	  }
	}
}
```

`.box`という要素をチェックボックスがonの状態になったら、表示する。
`display:block` → `none`という切り替えを行いつつ、cssアニメーションの記述をする。
cssアニメーションの名前を設定。後に `@keyframes`で設定する。適当な文字列でOK。
遷移時間（秒）を設定する。


### アニメーションの設定
```scss
@keyframes fade-in {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
```
0%が初期状態、100%がアニメ終了時の状態を表す。今回はopacityを0→1に遷移させるだけでOK。

## 動作サンプル
https://codepen.io/dorara_css/pen/QRaXom

## 参考
[CSS3 のみで display: none からフェードインさせる - Qiita](https://qiita.com/youcune/items/b0bb4c5979071d53eb99)
この記事での内容、上記の記事の内容をベースに、コメントでの指摘を混じえたもの。

また今回は、以前の記事で扱った、チェックボックスによる「cssだけで非表示→表示にする手法」を用いている。
その解説の詳細は以下を参照。

[CSSだけで「もっと見る」ボタン(使い切り)を実装](https://qiita.com/dorara/items/3bf8e907ff41c6753625)
新しいGitHubActionsでpushしたのをトリガーにswaggerに反映

## はじめに
swaggerをチームメンバーにリアルタイムで反映する方法がわからなかったので、
この際、新しいバージョンになったGithubActionを使用して、
pushしたものをトリガーに反映させようと思います。

## GitHubActionsとは
簡単に言えば、githubのaction(pushやブランチ作成)をトリガーに、
自作で作ったdockerImageでも公式で用意されているdockerImageを使って、
なんでも好きな事ができるよっていう機能です。
詳しいことは、ググってください。(2019/5/4現在ベータ版なので申請が必要です)

## 方法
Githubのレポジトリに`.github`ディレクトリを作成し、
その中に`main.workflow`ファイルを作成する

今回の場合Awsのs3にファイルをアップロードすることを想定しています。

```.github/workflows/main.yml
name: S3-action
on:
  push:
    branches:    
      - master

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout Repo
      uses: actions/checkout@master
    - uses: actions/aws/cli@master
    - name: s3 push
      env:
        AWS_ACCESS_KEY_ID: "<アクセスキー>"
        AWS_SECRET_ACCESS_KEY: "<シークレットキー>"
      run: aws s3 sync --delete . s3://<S3バケット名>/$GITHUB_REPOSITORY/ --exclude \"*\" --include \"*.yaml\"
```

バケットを作成し、https://swagger.io/tools/swagger-ui/download/ から、
css,htmlをダウンロードしてバケットのルートディレクトリにコピーする


ip制限したければバケットをhostingしてバケットポリシーを指定してip制限する

```
{
    "Version": "2012-10-17",
    "Id": "Policy1551163444222",
    "Statement": [
        {
            "Sid": "Stmt1551163442413",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "ipアドレス"
                }
            }
        },
        {
            "Sid": "Stmt1551164678580",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<バケット名>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "<ipアドレス>"
                }
            }
        }
    ]
}
```

`http://hostingアドレス/<ユーザ名 or オーガナイゼーション名>/レポジトリ名/swagger.yaml`
のアドレスでアクセスできるようになります。
IonicとFirebaseを使って3日で作る写真共有アプリ

Ionicに慣れるためにfirebaseを使って写真共有アプリを作ったので開発の流れとつまづいたところを書き留めておきたいと思います。

# お品書き
1. アプリの設計
1. 実装フレームワークの選定
1. 開発環境の構築
1. Viewの作成（CLI、スタイル、画面遷移、写真の活用）
1. 画面処理の作成（Typescript）
1. 通信処理の作成（Service、firebaseツールの設定）

# サマリー
内容は別記事で順次投稿していきます。

1. アプリの設計
どんな風に設計したのかをまとめています。
https://qiita.com/kazuki502/items/5994216912e351ebd5ec

1. 実装フレームワークの選定
アプリの要件を基に、フレームワークの選定を行います。
https://qiita.com/kazuki502/items/bb6ac7f41151abf56616

1. 開発環境の構築
開発環境の構築の仕方を順を追って説明しています。
https://qiita.com/kazuki502/items/467a0f1c4faa890dc85a

1. Viewの作成（CLI、スタイル、画面遷移、写真の活用）
アプリの設計に従って、目に見える画面の部分と画面遷移を実装していきます。
https://qiita.com/kazuki502/items/650414c90e7a729972c7

1. 画面処理の作成（Typescript）
クライアント側で行う処理を実装していきます。
https://qiita.com/kazuki502/items/f6cb8f7100b2866b5d81

1. 通信処理の作成（Service、firebaseツールの設定）
サーバー（firebase）との通信処理を実装していきます。
https://qiita.com/kazuki502/items/7927965018bd928e5731
sed 正規表現で置換メモ

# sed で正規表現を使ってファイルを編集する

いつも忘れるのでメモ。

```
 sed -i<backup_ext> -r -e s/<regexp_pattern>/<replacement>/ <file_path>
```

|スイッチ|意味|
|:--:|:--|
|-i|ファイルを直接編集。（スペースをつけずに）後ろに文字列を追加するとこの値でバックアップファイルが作成される|
|-r|正規表現を使う|
|-e|コマンド、もしくはスクリプトの実行|

例)

こんなファイルを用意

```
% cat input.txt 
abcdaaa
abcdaba
aaabcde
```

```
% sed -i.back -r -e s/aaa$/bbb/ input.txt
```
とすると

```
% cat input.txt
abcdbbb
abcdaba
aaabcde

% cat input.txt.back 
abcdaaa
abcdaba
aaabcde

```
のようになる。
IonicとFirebaseを使って3日で作る写真共有アプリ - アプリ設計編 -

今回作っていくアプリの要件と設計についてまとめます。今回は個人開発＋シンプルなアプリなので、ここでは大体の設計にとどめて、細かい部分はその都度考えていきたいと思います。

## どんなアプリを作るのか
結婚式やイベントで写真を楽しむために、簡単に写真を共有できて、みんなで写真を楽しむ経験を提供するアプリを作る。
### どうして必要なのか
LINEやGoogleフォトでもいいけど、多様な人が集まる場所ではいちいち友達登録したり、メールアドレスを聞いたりするのが面倒で現実的ではない場合がある。その場合に、URLやQRコードで共有できるWebサイトに写真をアップロードするだけで共有可能な状況を作ることで、いろんな手間を省くことが出来ると考えられる。

## アプリの機能
1. 写真アップロード機能（必須）
2. 共有された写真一覧
3. 写真を楽しむフォトストリーム

## 画面
1. トップ画面：タイトルと招待コードの入力
2. ホーム画面：イベントごとにカスタマイズされた背景と各機能を呼び出すボタン
3. 写真アップロード画面：写真選択＋プレビュー表示＋アップロード機能
4. 写真一覧画面：共有された写真が一覧表示で閲覧可能、いいね機能、ダウンロード機能（有料プラン）
5. 写真ストリーム画面：共有された写真が流れてくる画面

### 画面遷移イメージ
準備中…
シェルメモ-複数ファイルリネーム

## 目標
ディレクトリ直下の指定ファイルを一気にリネームする
1. 複数ファイル名の同じキーワードを置き換える
2. 全てファイル（ディレクトリを含め）名の前にプレフィックス追加
3. 指定拡張子ファイルのみのファイル名前にプレフィックス追加

## 環境
### Amazon Linux
```
# bash --version
bash --version
GNU bash, version 4.2.46(2)-release (x86_64-koji-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"
```



## コード
### 1. 複数ファイル名の同じキーワードを置き換える

```
# ll
total 0
-rw-r--r-- 1 root root 0 May 28 15:57 stg_foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 stg_hoge.txt
# rename stg prd *.txt
# ll
total 0
-rw-r--r-- 1 root root 0 May 28 15:57 prd_foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 prd_hoge.txt
```

### 2. 全てファイル（ディレクトリを含め）名の前にプレフィックス追加

```
# ll
total 0
drwxr-xr-x 2 root root 6 May 28 16:06 testdir
-rw-r--r-- 1 root root 0 May 28 16:06 abc.tf
-rw-r--r-- 1 root root 0 May 28 16:07 efg.tf
-rw-r--r-- 1 root root 0 May 28 15:57 foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 hoge.txt
# for a in * ; do mv -i "${a}" "prefix_${a}"; done
# ll
total 0
drwxr-xr-x 2 root root 6 May 28 16:06 prefix_testdir
-rw-r--r-- 1 root root 0 May 28 16:06 prefix_abc.tf
-rw-r--r-- 1 root root 0 May 28 16:07 prefix_efg.tf
-rw-r--r-- 1 root root 0 May 28 15:57 prefix_foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 prefix_hoge.txt
```

### 3. 指定拡張子ファイルのみのファイル名前にプレフィックス追加

```
# ll
total 0
drwxr-xr-x 2 root root 6 May 28 16:06 testdir
-rw-r--r-- 1 root root 0 May 28 16:06 abc.tf
-rw-r--r-- 1 root root 0 May 28 16:07 efg.tf
-rw-r--r-- 1 root root 0 May 28 15:57 foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 hoge.txt
# for a in `ls -l *.tf` ; do [ -f "${a}" ] && mv -i "${a}" "prefix_${a}"; done
# ll
total 0
drwxr-xr-x 2 root root 6 May 28 16:06 testdir
-rw-r--r-- 1 root root 0 May 28 15:57 foo.txt
-rw-r--r-- 1 root root 0 May 28 15:57 hoge.txt
-rw-r--r-- 1 root root 0 May 28 16:06 prefix_abc.tf
-rw-r--r-- 1 root root 0 May 28 16:07 prefix_efg.tf

```