OmniAICreator/Qiita-1.07M huggingface dataset:
MacOSでeksctlからEKSを使い始める

# 環境
- Mac OS X

# 手順
[AWSのチュートリアルを参考](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dashboard-tutorial.html)

## awsコマンドに認証情報入れる
```sh
aws configure
```

## eksctlをインストール
```sh
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl
eksctl version
```

## EKSをデプロイ
```sh
eksctl create cluster \
--name prod \
--version 1.13 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--node-ami auto
```

## サービスが起動しているか確認
```sh
kubectl get svc
```
FizzBuzz

（自分の間違え）

```php

for ($i = 1; $i <= 100; $i++) {
  echo $i;
  if ($i % 3 == 0) {
    echo "Fizz";
  } elseif ($i % 5 == 0) {
    echo "Bizz";
  }elseif ($i % 3 == 0 && $i % 5 == 0) {
    echo "FizzBuzz";
  }
}
```
（回答）

```php

for ($i = 1; $i <= 100; $i++) {
  if ($i % 3 == 0 && $i % 5 == 0) { // $iが3の倍数かつ5の倍数の時
    echo 'FizzBuzz';
  } elseif ($i % 3 == 0) { // $iが3の倍数の時
    echo 'Fizz';
  } elseif ($i % 5 == 0) { // $iが5の倍数の時
    echo 'Buzz';
  } else {
    echo $i;
  }
  echo '<br>';
}

```
UnityでPackage Managerが提供するパッケージにパッチを当てる

# はじめに

Unity2019.2.3f1でShader Graph 6.9.1を使ったらプロパティ名をリネームするとフリーズしてしまいます。
修正されていないか調べると案の定、[[6.9.x] Fix InputView freeze by alindmanUnity · Pull Request #4386 · Unity-Technologies/ScriptableRenderPipeline](https://github.com/Unity-Technologies/ScriptableRenderPipeline/pull/4386)で修正されていました。
そこでShaderGraphを修正するためにPakcage Managerが提供するパッケージにパッチを当てる方法を調べました。

# プロジェクト固有の場合

Package Managerからパッケージをインストールすると以下のフォルダにキャッシュが作成されます。

```
[Project Folder]/Library/PackageCache/*
```

ここから該当パッケージを探して以下のフォルダにコピーしてパッチを当てます。
コピー先のフォルダはキャッシュより優先されるのでこれで済むわけです。

```
[Project Folder]/Packages/
```

バグ修正版がリリースされてPackage Managerからバージョン更新したらパッチを当てたフォルダは不要になるので削除してしまいましょう。

# 特定のPCのみの場合

Package Managerからパッケージをインストールすると以下のフォルダにダウンロードされてUnityプロジェクトにキャッシュがコピーされます。

Windows

```
%LOCALAPPDATA%\Unity\cache\packages\packages.unity.com\*
```

macOS

```
~/Library/Unity/cache/packages/packages.unity.com/*
```

ダウンロードしたパッケージを変更するとUnityプロジェクトにもキャッシュが反映されます。
ただし複数人でUnityプロジェクトを共有している場合は他のPCには反映されないのでこの方法はあまりおすすめできません。
React app をgithub pages に公開する

https://{githubユーザー名}/{リポジトリ名}
にReact SPA (Single Page Applicaiton)を公開

### 1. ローカルの設定
```bash
npx install create-react-app my-app
# my-app はローカルのプロジェクトのディレクトリ名
cd my-app
npm start
```
一度ローカルで動くのを確認する
https://localhost:3000

### 2. gh-pagesのインストール
```bash
npm install gh-pages
# プロジェクトディレクトリでやる
```

### 3. Githubの設定
リポジトリを作る
以上

### 4. package.jsonの編集
以下を追加

```json:package.json
  ...
  "scripts": {
    ...
    "predeploy" : "yarn run build",
    "deploy": "gh-pages -d build"
    ...
  },
  ...
  "homepage": "https://{githubユーザー名}/{リポジトリ名}",
  ...
```

### 5. terminalからdeploy
```bash
git init
git remote add origin https://github.com/<githubユーザー名>/<リポジトリ名>.git
# remote URLはgithubからコピペ
npm run deploy
# Github Pagesに公開
```

### 6. Github PagesのURLに行って確認
https://{githubユーザー名}/{リポジトリ名}
に行けば公開できているはず
AWS認定ビッグデータ - 専門知識 勉強記~Kinesis Data Streams&Kinesis Firehose~

今回は,Kinesis Data StreamsとKinesis Data Firehoseについて勉強したことをまとめる.なお,理解したことが増えたら本記事を適宜更新する.

# Data Streamsの概要
* マネージドのリアルタイムアプリケーション(KCL、Spark/Flink、Lambda)
* データストリームを収集、保存、処理
* 低コスト
* 3つのAZに永続ストレージに強い生合成でデータを複製

*参考*
[[AWS]kinesisまとめ](https://qiita.com/yShig/items/500d4139efed91bc432d)

# Data Firehoseの概要
*  マネージドのデータストリームをデータストアにダイレクトに配信(ストリームデータのバッチ化、圧縮、暗号化が可能で最短60秒でデータを配信)
*  シームレスにスケール
*  サーバレスETL(Lambdaを使ったスリームデータの変形が可能)

# Kinesis Data Firehose との使い分け
* Streams: ストリームデータを「 *処理* 」するためのアプリケーションを独自に構築
* Firehose:ストリームデータをS3、Redshift、ECへ簡単に「 *配信* 」

## 設計の考え方
### １,数珠つなぎでサービスを連携
収集(Kinesis Data Streams)->変換(Lambda)->分析(Kinesis Data Analytics)->アクション(Lambda)->保存(Kinesis Data Firehose)

### 2,管理対象を少なくする
1. マネージドサービス同士で接続
2. Lambda関数でサービス間連携
3. EC2上のアプリで接続

# Kinesis Streams と Firehose の適用事例

①可視化

* データ送信者->Firehose->ES->kibana

②仮説検証

* Firehose->S3>Athena

③自動化

* S3->Firehose->Analytics->Streams->Lambda->SNS
Rubyで文字列を `Kenkenization` する

うちのチームにkenkenというニックネームのメンバーがいて、日々がんばっています。

今日、pyamaさんというひとが「`kenken`ってタイプするの面倒だから`ken`にしなよ」と横暴なことをいいだして、「こりゃマズい、`kenken`の入力を効率化しないと勝手に名前を変えられてしまう！」というわけで、みんなで知恵をふりしぼりました。

## 既存手法

`kenken`という文字列は、`ken`という文字列がふたつ並んでいます。つまり、プログラマの三大美徳のひとつ「怠惰」という観点からすると、同じ文字列の入力を2回繰り返すのは、とてもダルいことです。

これを解決するために、まずはストレートに以下の案がでました。

```ruby
2.times { print "ken" }
```

確かに、2回同じ文字列の入力を繰り返すことは避けられました、しかし、繰り返しは避けられたものの、`puts "kenken"`に比べて、総入力文字数という観点では、むしろダルくなっているのは否めません。

そこで、以下のようなやり方が提案されました。

```ruby
puts "ken" * 2
```

確かに、これならそこそこ短い入力で、`kenken`という文字列を出力できます。しかし、当たり前過ぎて、特に面白い回答とはいえません。

## 提案手法

わたくしたちは考えました。以下のような書き方で文字列`kenken`を出力できるとしたら、かっこいいのではないかと。

```ruby
puts ken ^ 2 #=> "kenken"
```

そこで作成したのが https://github.com/kentaro/kenken です。このライブラリを使うと、文字列`kenken`の出力を以下のように書けます。

### `Kenken`クラスを使う場合

```ruby
ken = Kenken.new("ken")
puts ken ^ 2 #=> "kenken"
```

### `String`クラス拡張を使う場合

```ruby
ken = "ken"
puts ken ^ 2 #=> "kenken"
```

これだけだと、「まあそうだよね」的な感じですよね。しかし、上記はあえてミスリーディングな例を示しています。**このモジュールの真の力はここから発揮されます。以下の例をご覧ください。**

### `Kenken`クラスを使う場合

```ruby
ken = Kenken.new("hayapi")
puts ken ^ 2 #=> "kenken"
```

### `String`クラス拡張を使う場合

```ruby
ken = "hayapi"
puts ken ^ 2 #=> "kenken"
```

おわかりでしょうか。つまり、引数にわたされた文字列によって`kenken`という文字列を出力しているのではなく、**変数名によって**文字列を出力していることが。ここまでやれば、pyamaさんといえども、`kenken`というニックネームを認めざるを得ないでしょう。

## 技術的な解説

`Kenken`クラス、および、拡張されている`String`クラスともに、上記の処理を実装した`Kenkenizer`モジュールをmixinしています。`Kenkenizer`モジュールの実装は以下の通りです。

```ruby
module Kenkenizer
  def ^(count = 1)
    b = binding.of_caller(1)
    var = b.eval('local_variables').find do |v|
      var = b.eval(v.to_s)
      self == var
    end

    var.to_s * count
  end
end
```

ポイントは、`binding.of_caller(1)`という箇所です。これは[binding_of_caller](https://github.com/banister/binding_of_caller)というgemの提供するメソッドです。呼び出し元をさかのぼって、レベルごとの`binding`、すなわち環境をいい感じにとってこれるというものです。

`binding.of_caller(1)`でひとつ上の環境をとってきたあとに`b.eval('local_variables')`とすることで、その環境での変数名（`Symbol`）の一覧を取り出し、さらにそれらをその環境で評価することでオブジェクトにします。それらのオブジェクトと自分自身を比較して、一致するものを自分自身を表す変数として判定します。

これで、無事に変数名から動的に、`Kenkenize`するべき文字列を取り出せました。すなわち、`Kenkenize`とは、

1. 変数名から出力に使う文字列を動的に取り出す
2. `^`メソッドにより、その文字列を繰り返す

という処理のことをいいます。それを実現するためにわたくしたちが開発したのが https://github.com/kentaro/kenken ということになります。

## おわりに

`kenken`と、`ken`を繰り返し入力するのはダルいというのは、プログラマの三大美徳的の「怠惰」的に、自然な感情であるとはいえます。しかし、ひとのニックネームをプログラマの都合で変えるのは誤りです。かといって、ただその誤りを精神論的に責めてもしかたありません。プログラマなら技術で対抗するべきでしょう。そのため、わたくしたちはこのようなライブラリを実装したのでした。

この記事が、みなさまの参考になれば幸いです。
PHPStormでPHP CS Fixer実行時のタイムアウト時間を設定

# 概要
PHPStormでのファイル保存時に PHP CS Fixer でコード整形を行っていた
あるファイルの保存時に `phpcs: Can not correctly run the tool with parameters` というエラーが出た

# 原因  
開いていたPHPのファイルの行数が多く PHP CS Fixer の実行に時間がかかりタイムアウトしていた

- PHPStorm の PHP CS Fixer の設定項目にはタイムアウト値があり、これを過ぎると強制終了される
  - https://www.jetbrains.com/help/phpstorm/using-php-cs-fixer.html#configuring-advanced-php-cs-fixer-options

# 対応
上記の設定項目はデフォルトで5秒に設定されているので、これを長めの値に変更する (1~30秒で設定可能)
設定は `Settings/Preferences -> Languages & Frameworks -> PHP -> Quality Tools` から
陰関数 f(x,y) = 0 を満たす点のプロットをJuliaでします．

# 本日は

Juliaで陰関数の描画をしたいお気持ちにかられたのでそのメモをします．

二変数関数 $z=f(x,y)$ が与えられたとき $f(x,y) = 0$ を満たすような二次元の点 $(x,y)$ の集合を描画するというものです. 陰関数は implicit function なのでそのキーワードで調べると [Juliaの discourse](https://discourse.julialang.org/t/implicit-plot-with-plots/6585) に出会いました．どうやら [ImplicitEquations.jl](https://github.com/jverzani/ImplicitEquations.jl) というパッケージがあるみたいです．

# Install

公式パッケージらしいので add で入ります．

```julia
julia> ] # just type ]
(v1.1) pkg> add ImplicitEquations
```

余談ですがパッケージ導入の方法はREPLモード上でも下記のようにしてできます．

```
julia>using Pkg
julia>Pkg.add("ImplicitEquations")
# 複数のパッケージを一気に導入もできる
julia>Pkg.add(["Plots","ImplicitEquations"])
# string macro @pkg_str を用いた方法
julia> using Pkg
julia> pkg"add Plots ImplicitEquations"
# こんな感じでワンラインでもOK
julia> using Pkg; pkg"add Plots"
```

> To return to the julia> prompt, either press backspace when the input line is empty or press Ctrl+C. Help is available by calling pkg> help. If you are in an environment that does not have access to a REPL you can still use the REPL mode commands using the string macro pkg available after using Pkg. The command pkg"cmd" would be equivalent to executing cmd in the REPL mode.

# 使ってみる

## 円の例
半径１の円の方程式は $x^2 + y^2 = 1$ とかけます．これは点 $(x,y)$ と原点の距離が1の点の集まりともみることができます．また二変数関数 $f(x,y)=x^2+y^2-1$ の f(x,y) = 0 を満たす点の集まりともみることができます．なんにせよ Julia でこれを表現してみませう．ImplicitEquations.jlを用いると簡単です


```julia:circle.jl
using Plots
gr()
using ImplicitEquations

f(x,y) = x^2 + y^2 - 1
plot(f ⩵ 0, aspect_ratio=:equal)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/689f69c1-f4b2-5208-6a7f-1978a0c8ea48.png)

無事円が表示できましたね．ここで注意するのが `==`を使うのではなく `\Equal`+ Tab で得られる `⩵` 用いなければいけません．

`⩵`の記入の仕方わからないよーという場合でも Julia の help mode でそれをコピペすれば使い方・入力方法を教えてくれます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/6520c526-1d29-ed86-124e-b19f0eb16196.png)


## 楕円曲線の例

$y^2 = x^3 + ax+b$ というような形の方程式を満たす点の集まりを描画してみましょう

```julia:elliptic.jl
using Plots
gr()
using ImplicitEquations
a = -1
b = 1
f(x,y) = y^2 - x^3 - a * x - b
plot(f ⩵ 0, aspect_ratio=:equal)
```

結果は下記の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/bfab7fe0-8ace-dde5-5702-dce0b2634172.png)

これは Wikipedia の楕円曲線の例の一つです． https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A

うーん．こんな便利なパッケージがあったらもっと早く使いたかったなぁ・・・

# 追記

`\Equal` の代わりに `Eq(f,0)` と書いても良い． また $f\geq 0$ を満たす領域を描画することもできる Hint: Lt, Gt を使う．

# 陰関数描画アルゴリズムの文献

メモとして陰関数表示のアルゴリズムの文献表を置いておきます．ImplicitEquationsの実装は [Tupper氏](http://www.dgp.toronto.edu/~mooncake/) の方法を用いているようです．

- [Reliable Two-Dimensional Graphing Methods
for Mathematical Formulae with Two Free Variables](http://www.dgp.toronto.edu/~mooncake/papers/SIGGRAPH2001_Tupper.pdf)

その他日本語で読めるものとして

- [陰関数描画に関する –つの試み](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/0920-18.pdf)
- [陰関数描画と区間数演算の効率化について](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1652-14.pdf)
[超簡単]Redashのダッシュボードを開いた段階で自動更新されるようにする


# 概要
* 弊社では数値のモニタリングにRedashを活用しています。
* モニタリング用PCの電源を入れるとOSのスタートアップの設定でブラウザが自動て立ち上がり、  
  Redashのダッシュボードが表示されます。
* が！しかし、自動リロードの設定を毎回手動で行わなければならず、手間がかかっていました。

![913CC1E8-796E-4B42-8937-4D9AD19C60B2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/863c1358-cdce-c022-7ca0-7b5a81f64b7b.png)


## ダッシュボードを開いた段階で自動更新されるように設定する

* URLの最後にパラメーターを追加するだけ！

```
https://redashurl/dashboard/ダッシュボード名?refresh=30
```

* `?refresh=30` のようにパラメーターを追加します。
* 秒単位で指定でき、最小は、30秒です。


## あれこれ
* これでPCの起動ボタン１発で ダッシュボードを表示し自動更新されるようになります！＼(^o^)／
* こんな機能あったらいいなと、redash の github レポジトリを眺めていたら出てきました。  
  ２年前から既に実装されていたようなので、早くきづければよかったです。
* 参考
   - [該当コード](https://github.com/getredash/redash/blob/master/client/app/pages/dashboards/dashboard.js#L183)
jQueryの読み込みとフォールバック

*jQueryをCDNで読み込みたい
*万が一に備えてフォールバック処理を入れたい


#jQueryの記述方法


```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
  window.jQuery || document.write("<script src='js/jquery.js'><\/script>");
</script>
```


これで、CDNからの読み込みに失敗した場合、jsフォルダに用意しておいたローカルファイルが読み込まれます。


#window.jQuery || document.write()

A||Bの記述は、Aが偽(false)の時にBを返すというもの。

１行目のCDNでjQueryが実行されなかったとき、windowオブジェクトにjQueryプロパティは存在していないことになり、falseとなります。

Bのdocument.write()は、()内の記述をドキュメント(この場合HTML)に書き加えるもので、HTML上では

```html
<script src='js/jquery.js'><\/script>
```

となり、ローカルファイルが読み込まれます。
使える「TypeScript」プロジェクトを最速でセットアップする（Babel7 + TypeScript -> yarn dev）

# これはなに？

node.jsで色々やるために、webpack無しでなるべくシンプルに、
yarn + Babel7 + TypeScript
の環境を作ります。

Googleで探すとwebpackを使った長大な説明だったり、逆にtscやnodeコマンドを直接使っていて素朴すぎたりと丁度よいサンプルが見当たらなかったのでメモを兼ねて書きました。

※※誤りやもっと良い方法などありましたらご指摘ください※※

# 前提
・node.js
・yarn
知っている／使える

TypeScriptのソースフォルダは「./src」トランスパイル後のJavaScript格納フォルダは「./dist」としてセットアップしています。好みに応じて変更してください。

# 本文

## プロジェクトをセットアップ

プロジェクトフォルダで

```sh
yarn init
#（プロジェクト名などの質問には適宜答えてください）
```

## 必要モジュールのインストール

```sh
yarn add --dev \
  @babel/core \
  @babel/cli \
  @babel/preset-env \
  @babel/preset-typescript \
  typescript
```

## Babelの設定

babelの設定ファイルを作成し編集

```sh
vi babel.config.js
```

```babel.config.js
module.exports = {
  presets: [
    '@babel/preset-typescript',
    '@babel/preset-env'
  ]
}
```

## TypeScriptの設定

```sh
tsc -init
```

tsconfig.jsonファイルが生成される。
（プロジェクトに応じて適宜編集）

## 起動コマンドの登録

package.jsonの適当な場所にスクリプトの記述を追加。

```js
  "scripts": {
    "dev": "yarn run check && yarn run build && yarn run exec",
    "check": "tsc --noEmit",
    "build": "babel src --out-dir dist --extensions '.ts,.tsx'",
    "exec": "node ./dist/index.js"
  },
```

これで、最低限のTypeScript開発環境が整いました。

## 確認

サンプルコードを用意してトランスパイルと実行の確認をします。

```sh
mkdir src
vi src/index.ts
```

```src/index.ts
console.log("hello typescript");
```

実際にトランスパイルと実行を行います。

```sh
yarn dev
```

次のように表示されれば成功

```
Successfully compiled 1 file with Babel.
hello typescript
Done in 1.13s.
```
ec2インスタンスの自動起動・停止


CloudWatch Eventのcronで朝晩に呼び出す。

勉強のために起動はPythonで、停止はNode.jsで書く。

## 起動(Python)

```python:startEC2.py
import json
import boto3
import os

instances = [os.environ['INSTANCE_ID']]
region = "ap-northeast-1"

def lambda_handler(event, context):
    ec2 = boto3.client('ec2',region_name=region)
    ec2.start_instances(InstanceIds=instances)
    
    return {
        'statusCode': 200,
        'body': json.dumps('Started Instance')
    }
```

Pythonでの環境変数の指定方法は`os.environ`。

## 停止（Node.js）

```js:stopEC2.js
var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1';

function StopEC2(callback){
  var ec2 = new AWS.EC2();
  var params = {
    InstanceIds: [
      process.env['INSTANCE_ID']
    ]
  };

  ec2.stopInstances(params, function(err, data) {
    if (err) {
      console.log("ERROR", err);
    } else {
      console.log(data);
      callback();
    }
  });
}

exports.handler = function(event, context) {
  console.log('Process Start');
  StopEC2(function() {
    context.done(null, 'Stoped Instance');
  });
};
```

nodeでの環境変数の指定方法は`process.env`。
UnityプロジェクトをGit(Github)とSourcetreeで管理する

# はじめに
下記の記事を参考にさせていただきましたが、一部補足しておきたい部分がありましたので記載します。
下記の記事を読んでから本記事をお読みください。

参考: https://qiita.com/cs1000/items/07368892a599b2b7b836

# 環境
* Windows10

# 注意！
下記の手順でUnityのプロジェクトをGit＋Sourcetreeで管理することができるようになりますが、その後Unityでプロジェクトを開くとオブジェクトのコンポーネントの変数から結構な数のオブジェクトがデタッチされており（されていないものもありました）、また、変数の設定値が初期値に戻っているものもありました。
アタッチし直して設定値を再設定すると問題なく動きましたが、ご承知の上、自己責任でお願いします。

# 1. 作業ツリーのファイルをインデックスに追加してコミットする

これは今思えば当たり前のことですが、Gitをマスターしていない私は引っかかったためメモ。

参考サイトの作業を終えたままでは、ブランチが1つも作られていない状態かと思います。
下記の手順でローカルリポジトリにコミットしましょう。

1. 下記画像の「全てインデックスに追加する」ボタンを押下し、ファイルをインデックスに追加する。
2. 「コミット」ボタンを押下し、インデックスに追加したファイルをローカルリポジトリにコミットする。


![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/1557a02c-c5d9-2316-ddc3-7e5e10c5d099.png)

# 2. リモートリポジトリにプッシュする

1.で作成したmasterブランチにチェックアウトした状態でプッシュボタンを押すと、私の場合下記のようなエラーが発生しました。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205347/e3aa32ce-6dba-1546-d3fe-c9ea18bbeb06.png)

下記の手順で解決しました。

1. masterブランチから適当な作業ブランチAを切る。
2. 作業ブランチAをリモートリポジトリにプッシュする（リモートリポジトリに作業ブランチAを作成する）
3. Aをローカルリポジトリのmasterブランチにプルする。
4. ローカルリポジトリのmasterブランチをリモートリポジトリのmasterブランチに強制プッシュする。
（強制プッシュはデフォルトで無効になっているため、Sourcetreeの「ツール」＞「Git」＞「強制プッシュを有効にする」にチェックを入れて実行してください。）

# 最後に
スクリプトの内容や設定値を変更するごとに、作業ブランチの「コミットされていない変更があります」の行を選択して「作業ツリーのファイル」から毎回手動で「インデックスに追加」する必要があります。
自動化する設定があるのでしょうか？

以上です。
javaのstaticメソッドで，画像をjarファイルに含める

Eclipseを用いてjarファイルを作成したときに画像が含まれなくて困ったときのメモ．

## 問題
jarファイルを作成しても画像が表示されない． 
画像を読み込むメソッドはstaticである．
このままだとjarファイルに画像は含まれない．

```java:Main.java
public static ImageIcon getImageIcon() {
    ImageIcon icon = new ImageIcon("nanase.jpg");
    return icon;
}
```

## 解決策
クラスを引数にする  

```java:Main.java
public static ImageIcon getImageIcon(Main m) {
    ClassLoader cl = m.getClass().getClassLoader();
    ImageIcon icon = new ImageIcon(cl.getResource("nanase.jpg"));
    return icon;
}
```

## staticでないときの解決策
参照→ https://virtualwalk.hatenadiary.org/entry/20121013/1350127275

```java:Main.java
public ImageIcon getImageIcon() {
    ClassLoader cl = this.getClass().getClassLoader();
    ImageIcon icon = new ImageIcon(cl.getResource("nanase.jpg"));
    return icon;
}
```

## 参考
・ https://virtualwalk.hatenadiary.org/entry/20121013/1350127275
・ https://www.javadrive.jp/tutorial/imageicon/index2.html
・eclipseでjarの作成 https://java.keicode.com/lang/how-to-compile-jar-with-eclipse.php

## 全体

```java:Main.java
package include;
import java.awt.BorderLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame{

	  public static void main(String[] args){
	    Main frame = new Main();
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setBounds(10, 10, 150, 150);
	    frame.setTitle("タイトル");
	    frame.setVisible(true);
	  }

	  Main(){
//	    ImageIcon icon = this.getImageIcon();
	    ImageIcon icon = Im.getImageIcon(this);
	    JLabel label = new JLabel(icon);

	    JPanel p = new JPanel();
	    p.add(label);

	    getContentPane().add(p, BorderLayout.CENTER);
	  }

//	  private ImageIcon getImageIcon() {
//		  ClassLoader cl = this.getClass().getClassLoader();
//		  ImageIcon icon = new ImageIcon(cl.getResource("nanase.jpg"));
//		  return icon;
//	  }
	}


class Im{
	public static ImageIcon getImageIcon(Main m) {
	  ClassLoader cl = m.getClass().getClassLoader();
	  ImageIcon icon = new ImageIcon(cl.getResource("nanase.jpg"));
	  return icon;
	 }
}
```
JSの関数宣言と関数式の書き方と違い

どーもです😄

JavaScriptで本日学んだことを書いていきます。

関数宣言以外にも関数式という書き方があります。

##(1)関数宣言の書き方
＜関数宣言＞

```js
function 関数名(仮引数,仮引数,...) {
 処理;
 処理;
 return 返り値;
}
```

＜呼び出し＞
```関数名(実引数,実引数,...);```

という書き方が関数宣言になります。その他にも同じ意味として関数式というのがあります。

##(2)関数式の書き方
＜関数式＞

```js
const 定数名 = function(仮引数,仮引数,...) {
　処理;
　処理;
　return 返り値;
};
```

＜呼び出し＞
```定数名(実引数,実引数,...);```

という書き方が関数式になります。

##(3)関数宣言と関数式の違い
関数式は最初に定数や変数を宣言し、その中に関数の値を記入するという方法です。つまり宣言した定数や変数が関数になります。

関数宣言ではfunctionの後に関数名が必要ですが、関数式では必要なく、これを無名関数と呼びます。

また、定数や変数を宣言した時と同様にブロック終わりである}の後には;が必要です。
【Swift】UINavigationBarをUIViewControllerにstoryboardで追加する

UINavigationBarを表示する際、普段であればUINavigationControllerを使っていると思います。
が、UIViewControllerだけで表示する方法を見つけたので書いておきたいと思います。
しかもコーディング無しです。

ざっと手順を書くと以下の様になります。
1. UIViewControllerの追加
2. UINavigationBarの追加
3. タイトルやボタン等の設定
4. Constraintsの追加
5. barPositionの追加 (**今回の肝？**)

それでは一つずつ見ていきましょう。

## UIViewControllerの追加

<img width="1145" alt="スクリーンショット 2019-09-04 1.17.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/89d398b1-b823-ae08-7b54-469a458b5839.png">

UIViewControllerをUIリストから追加します。

## UINavigationBarの追加

<img width="1148" alt="スクリーンショット 2019-09-04 1.18.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/992aa8ad-7b19-3e30-5cee-df746ed43b46.png">

UINavigationBarをUIリストから追加します。
ここまでは簡単ですね。

## タイトルやボタン等の追加

<img width="1146" alt="スクリーンショット 2019-09-04 1.21.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/7f1549c2-34f7-a88a-9f10-dc69aba9fb04.png">

ここは各々ご自由にどうぞ笑

## Constraintsの追加

<img width="1146" alt="スクリーンショット 2019-09-04 2.02.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/04baf3e5-762b-df05-716a-a28a532d24c7.png">

付けたのは以下の4つです。
`NavigationBar.Top = SafeArea.Top`
`NavigationBar.centerX = centerX`
`NavigationBar.leading = Safe Area.leading`
`NavigationBar.trailing = Safe Area.trailing`

これで上部に張り付けつつ、左右には伸びる様になります。

これをしないとiPad等でおかしくなってしまいます。

## barPositionの追加

そして、肝といっても良いのではないでしょうか。barPositionです。

<img width="442" alt="スクリーンショット 2019-09-05 0.01.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/0335cebf-a4f5-1da1-058b-5afefa5876c7.png">

これがないまま実行すると上の画像の様になってしまいます。

これを解決するのがbarPositionというプロパティです。
[UIBarPosition - UIKit | Apple Documentation](https://developer.apple.com/documentation/uikit/uibarposition)

<img width="965" alt="スクリーンショット 2019-09-05 0.04.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/4287827a-de1a-7ae6-e7f2-19ba3d9fb6ba.png">

こちらの図の様にUINavigationBarに対して `barPosition = 3` をセットします。
barPositionの3はenumの `topAttached` です。

[UIBarPosition.topAttached - UIKit](https://developer.apple.com/documentation/uikit/uibarposition/topattached)

これを設定して実行すると。

<img width="446" alt="スクリーンショット 2019-09-05 0.06.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11800/d13c291f-685c-22ec-d550-21bfa4c9bd1a.png">

この様にノッチの部分までUINavigationBarが表示される様になります。
しかもコーディング0！

誰かのお役に立てば。
TensorFlowでDropoutするときに気をつけること

「モデルにDropoutを噛ませたら，テスト時にはDropout_rate=0にしましょう」という今更すぎる自戒です．

# Dropout

Dropoutは，モデルのOverfittingを防ぐテクニック．
学習epoch毎に，ネットワークのweightを一定の割合(Dropout_rate)無視する(敢えてモデルの表現能力をフルに使わない)ことで，より広いデータにフィットするモデルを獲得する．無視するweightは毎epoch変わる．
テスト時には全てのweightを使って(Dropout_rate=0で)predictを行う．

# やらかしたこと

**テスト時にもDropoutしていた．**:innocent::innocent::innocent:
TensorFlowの方で，訓練とテストでよしなにDropout_rateを変えてくれると勝手に思っていたんです許して．

具体的には

```model.py
def my_model(input):
    hidden = tf.layers.dense(input, unit=2048, activation=tf.nn.sigmiod)
    dropout = tf.layers.dropout(inputs=hidden, rate=0.2)
```

みたいに**モデル定義にDropout_rateを直書き**していた．これだとテスト時にも2割のweightを無視してしまう．

# 正しくは

モデルの方では引数でDropout_rateを決めるようにしておいて，

```model.py
def my_model(input, drate):
    dropout = tf.layers.dropout(inputs=hidden, rate=drate)
```

runするときにplaceholderからdrateを指定してやる．

```main.py
drate_p = tf.placeholder(tf.float32)
model = my_model(input_p, drate_p)

sess=tf.Session()
sess.run([model], {input_p: my_image, drate_p: 0.2})
```

テスト時にはdrate_p: 0.0でrunすればいい．

ちなみにkerasだとmodel.fitの時とmodel.predictの時でよしなにやってくれそう．
9/4 Tech Expert (事前学習) day 5　/　hash!!!

【学習アウトプット】

#今日の目標(やること)
hash!!!

##今日のまとめ
###STEP3 : ハッシュを使って情報を整理しよう

####ハッシュオブジェクト(略称:ハッシュ)
hash = {}
１つの変数で複数のデータを持つことのできる

####キーバリューストア（KVS（Key-Value Store））
Key（標識）とValue（保存したいデータ）を組み合わせペアで保存する方式
キーを指定してそれに対応するデータを取り出せる
{キー1 => 値1, キー2 => 値2, ...}

####シンボルオブジェクト(略称:シンボル)
先頭に接頭語:をつける。
シンボルオブジェクトは名前を識別するためのラベル（文字を使った標識番号のようなもの）で基本は文字列と同様に扱える
ハッシュオブジェクトのキーは文字列より実行の速度が早いシンボルがベター。（表向きは”字”だが、裏では数値として機能している為。）

空のハッシュを宣言することで、後からハッシュの要素を追加出来る
 post = {} # 空のハッシュの宣言

person = { name: "rachel", age: "30", gender: "woman" }
puts person[:name]
puts person
person[:weight] = 50
puts person

rachel
{name=>"rachel", age=> 30, gender=> "woman" }
{name=>"rachel", age=> 30, gender=> "woman" ,weight=> 50 }





##〜独り言(まとめやら感想やら)〜
今日は　off day！にするつもりが、「少しでもすすめなきゃ！」と、ワンセクションを集中！
Nuxt.jsを使ったPWAを個人開発してリリースした（概要編）

バーコードをスマホ画面に手軽に表示できるPWA「disp barcode」をリリースしました:tada:

https://dispbarcode.com/


## 経緯
バーコードをスマホ画面にさくっと表示できるアプリがほしい（仕事で必要）
・パソコン用のバーコード作成ソフトはあるけど印刷が面倒
・Web用もあるけど、スマホ表示に特化されておらず、使いにくい
・スマホのネイティブアプリは意外にない（バーコードリーダーばかり）

...よし、作ろう！

## 要件
- スマホ画面にバーコードを表示できる
- 最低限、以下の種類のバーコードへ対応する
 - JAN（8桁、13桁）
 - CODE128
 - NW-7
- 作ったバーコードを保存しておき、後から手軽に呼び出せる

## 技術
ネイティブアプリ開発はしたことないし、審査も面倒だし、iOS向けは費用もかかる、、、

:bulb:そうだ、PWAにしよう。
PWAなら、公開するのも使ってもらうのも敷居が低いので。

あとは、自分が使える技術で、なおかつイマドキのものということで、以下を選択。

- Vue.js
 - HTMLとCSSの部分を宣言的に書けるのが好きです。
- Nuxt.js
 - Vue.jsでPWAを作るならこれでしょう。
- Vuetify
 - Vue.jsとの親和性が一番良いように思えます。
- Netlify
 - 静的ホスティングならこれかなと。
- GitHub
 - ド定番。[^4]

[^4]: GitHub Flowを参考にしてfeatureブランチを切って作業しつつも、自分しかいないのでプルリクは使っていません。featureブランチでローカルで動作確認→stagingに入れて実機確認→masterへマージして本番環境へ。

GitHubにpushしたらNetlifyが自動で拾ってdeployしてくれるので超便利です。

現時点ではPWAとしてフロントエンドだけで動作しています。



## 概要
Nuxt.jsのPWAで開発開始。
バーコード表示にはvue-barcodeというライブラリ[^1]を活用。

[^1]: JsBarcodeをVue.jsで使いやすくするためのラッパー

v-inputとbarcodeをバインディングしてあげるだけでコアの部分は完成[^2]。
[^2]: データの桁数が増えたときに全体のレイアウトが崩れる問題が発生し、それを回避するのに結構手間取りました。$refを使って子要素を取得し、そのwidthを見てリサイズするなどして対応。



あとは、localStorageを使って、アプリを終了させてもしばらくの間は[^3]データを保存できるように工夫。

[^3]: localStorageの内容は削除されてしまう可能性があります。履歴を削除した時とか。これを回避するにはサーバサイドへの保存も必要になりますが、それにはユーザか端末の識別が必要になるので、現時点では手を付けていません。

## 作業
細部は後日更新または別記事で書こうと思います。

- Nuxtで雛形を作る
- Githubに初期コミット
- ざっくりと動くところまで作り込む
- Netlifyに上げて、スマホ実機で動作確認できるようにする
- スマホのブラウザ（iPhone版Safari）で使えることを確認
- 「ホーム画面に追加」して、オフラインでも使えることを確認（機内モードで起動）
- ブラッシュアップ（localStorageを使った保存とか、一覧からの削除機能とか）
- 独自ドメイン取得
- 独自ドメインをNetlifyに設定（DNSはNetlifyのものを使用）
- PWAのURLを変更[^5]
- 公式Twitter作成
- Vuetifyを2.0にアップデート[^6]
- OGP画像を設定（Twitter用）
- リリース告知

[^5]: ドメインの直下はアプリではなく説明用のサイトにしたかったので。nuxt.config.js で base を設定すればOK（/app/とか）、、、と思いきや、うまく動かず。とりあえず、Nuxtの中でpages/app/index.vue にアプリ本体を移動し、pages/index.vue をランディングページにしました。（もっと良い解決策がありそう）

[^6]: 1.5系のv-layoutではなく、2.0系のv-rowを使わないとうまく表示できない場所がありました。

#記事
dispbarcodeを実装している間に実験した部分的なスタディは、先行してQiitaの記事にしていたものもあります。関連記事としてご紹介します。[^7]

[^7]: この記事にはコードが全く載っていませんが、紹介した記事にはちゃんとコードも入っています。

- v-listの要素をCRUDするサンプルコード
 - https://qiita.com/shozzy/items/059326ab1fd2a89f02f0
- タイトルバー付きでスクロールできるv-menu
 - https://qiita.com/shozzy/items/290154a72a2662213935

これらの記事を書きながら学んだ内容は、dispbarcodeの「保存したバーコードの一覧表示部分」に活かされています！

<img width="261" alt="スクリーンショット 2019-09-04 23.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120785/ec484578-fbb1-4962-38e4-f8135e6118d1.png">



#感想
初めての個人開発でのリリースでしたが、どのタイミングで、どこまで作った時点でリリースするかは非常に迷いました。

「完璧を目指すよりも、まずは終わらせろ」というザッカーバーグの名言や、「Minimum Viable Product」の考え方から、今回は最低限必要な「バーコードを作成、表示、保存、削除できる」機能を実装したことで当初の要件は達成できたので、リリースする覚悟を決めました。

まだ改良したい点はいくつもあるので、少しずつバージョンアップしていこうと考えています。
Linux - systemctl サブコマンド一覧

unit一覧表示するのって何だっけ？とたまに忘れてしまうのでこの際一覧として書いておく。

## 基本的なサブコマンド 
- start - サービスを起動する
- stop - サービスを終了する
- restart - サービスを再起動する
- reload - サービスの設定を再読込みする
- status - サービスの稼働状態を表示する
- is-active - サービスが稼働しているか確認する
- is-enabled - サービスが自動起動が有効かどうか確認する
- enable - システム起動時にサービスを自動起動する
- disable - システム起動時にサービスを自動起動しない
- list-unit-files - 全てのunitを表示する
- reboot - システムを再起動する
- poweroff - システムをシャットダウンする

## メモ
is-activeとis-enabledってどっちもstatusで事足りるような気がする。わざわざ使うことあるのかな、、、？
MySQLのJSON列にCakePHP3.8のORMでデータを保存する。

# 忘備録 JSON and ORM

```php
$new->field_json = [1,2,3];
```
こんな感じでNewしたエンティティの対象列にセットすると保存できました。

配列の状態でセットするだけでいいみたいです。

なんでそんな事を書いているのかっていうとSQL的には

```sql
INSERT INTO table (field_json) VALUES ('{"name":"pincyosu"}');
```

データ部分がJSONになってるからです。

だからもしかして　$new->field_json = "{"natsuda":"os-1"}"; みたいに書くのかなって思ったんですよ。

ちゃうかったんですね。

ところでこのMYSQLのJSON列って面白いですね。

続きは気が向いたら。
docker-compose buildするときにbundle installやmysql-clientでコケた話

docker-compose buildする際に色々エラー踏んだので備忘録として書きます

2019 9/4追記
原因２について、こちらの記事も大変参考になるなーと感じたので載せときます
[Circle CI で mysql-client が apt-get install できなくなってCI環境が壊れた話](https://yourmystar-engineer.hatenablog.jp/entry/2019/07/15/140644)

一応修正前のソースコードも載せときますね
https://github.com/ityusuke/docker-test
Dockerfileはこんな感じで書いてます。

```bash:bash
FROM ruby:2.5.5

RUN apt-get update -qq && \ 
    apt-get install -y build-essential \ 
                             libpq-dev \
                         mariadb-client\        
                                 nodejs
               
RUN mkdir /app_name 

ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD . $APP_ROOT

```

エラー文はこんな感じです。おそらくbundle installでコケてるのかな？と思ったのですが、具体的な解決方法が検討つかないので、有識者の方に知恵を貸して頂きました！

```bash:bash
ERROR:Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 18
```

###原因その１：ローカルとdockerイメージの両者で、bundlerのバージョンが一致していない

ローカルのbundlerは２系（2.0.2）を使っていたのですが、落としてくるイメージのbundlerは1系なのでバージョンの整合性が取れずにエラーが起きてしまう、とのことでした。

なるほど！！！！ということで
その後、Gemfile.lock内のBUNDLERのバージョンを下げ、docker-compose buildしてみたところ、今度は別のエラーが、、、なんでやねーん

以下エラー文です

```bash:bash
E: Package 'mysql-client' has no installation candidate
ERROR: Service 'web' failed to build: The command '/bin/sh -c apt-get update -qq && apt-get install -y build-essential                           libpq-dev   mysql-client  nodejs returned a non-zero code: 100
```
###原因その２:mysql-client は、 mariadb-client に統合されてしまっている
「パッケージ：「mysql-client」 のインストール候補がありません」という意味だと仮定して調べてみたところ同じような記事があったので確認してみます
https://stackoverflow.com/questions/57048428/e-package-mysql-client-has-no-installation-candidate-in-php-fpm-image-build-u

記事によるとどうやら、mysql-client は、 mariadb-client に統合されちゃったみたいですね...

ということで、Dockerfile内のmysql-client を、 mariadb-clientに変更してdocker-compose buildしてみます

...成功しました！！！！！！！！
いやー長かった〜

###まとめ
１.dockerイメージを引っ張ってくるときは内容をきちんと確認しましょう
２.2019年9/3現在ではmysql-client は、 mariadb-client に統合されているようです

駄文失礼いたしました
IBM Watsonで音声認識を試してみた

#初めに
IBM Watsonの「Speech to Text」を使って、音声ファイルからテキストを生成する。
参考にしたのはこの本。
[現場で使える！Watson開発入門 Watson API、Watson StudioによるAI開発手法](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81Watson%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-Watson-API%E3%80%81Watson-Studio%E3%81%AB%E3%82%88%E3%82%8BAI%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95-%E4%BC%8A%E6%BE%A4-ebook/dp/B07MXJ1Q65)

#① IBM Cloud のアカウント登録
無料で利用できる「ライトアカウント」を登録する。
（詳細割愛）

#②「Speech to Text」のサービスを作成する。
・IBM Cloudのログイン画面から作成したアカウントでログインする。
[IBM Cloud](https://www.ibm.com/jp-ja/cloud)

・「カタログ」 → 「AI」 → 「Speech to Text」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/0ac1a7df-8892-363a-477d-f187ca8eaaee.png)

サービス名：任意
ロケーション：とりあえず「東京」を選択
リソースグループ：Default
価格プラン：ライト

を選択して、「作成」をクリック

#③ API鍵とURLを確認
「管理」をクリックして、トップページに移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/5bbf57fb-21d4-01ef-bf8e-dfad35227602.png)

API鍵、URLそれぞれの右にあるアイコン（画像は切れてる）をクリックして、コピー。
それぞれをメモ帳などに保存しておく。

#④ cURLを使って実行する。
・Windows 10 の PowerShellを起動する。
　Windows 10デフォルトのcurlはInvoke-WebRequestのaliasとして設定されているので、aliasを削除する。
　参考：https://devadjust.exblog.jp/22690878/
・音声ファイルを用意する。
　ここでは、英語と日本語混在のファイルを準備
・以下コマンドを実行
> curl -X POST -u "apikey:＜API鍵＞" --header "Content-Type: audio/mp3" --data-binary @＜ファイルパス＞ "＜URL＞/v1/recognize"

#⑤ 結果の確認
```
{
 "results": [
      {
         "alternatives": [
            {
               "confidence": 0.79,
               "transcript": "I turn the video on "
            }
         ],
         "final": true
      },
      {
         "alternatives": [
            {
               "confidence": 0.33,
               "transcript": "the oldest Musta "
            }
         ],
         "final": true
      }
   ],
   "result_index": 0
}
```
英語の「I turn the video on」は正確にテキスト化してるけど、日本語はできないらしい。
「the oldest Musta」は、「ビデオをオンにしました」をテキスト化したもの。音は似てるような気はする・・・
（Python）pandas read_excel でExcelの特定列のみ型指定して取得する

## ■課題 pandas read_excel で取れる値の型を特定の場合のみ文字列に指定したい
Excel ファイルを読み込む pandas.read_excel（ExcelFile のparse）で、**文字列「0000」 を デフォルトの設定で取得すると、 int 型 の 0　として取得されてしまいました。**

example.xlsx
![numberInTheCellToString1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/e6268502-ad4d-2b5e-10ad-f9847a6561f4.png)

```test.py
from pandas import DataFrame, ExcelFile
import os
def isExcelFilePath(filepath:str)->bool:
    return (filepath.endswith('.xlsx')  
            or filepath.endswith('.xls'))

def getExcelFile(filepath:str)->ExcelFile:
    if (not os.path.exists(filepath)
        or (not isExcelFilePath(filepath))):
        return None
    return ExcelFile(filepath)
    
def getDataFromExcelFile(excelFile:ExcelFile)->DataFrame:
    return excelFile.parse(
        index_col=None,
    )

dataFrame = getDataFromExcelFile(
    getExcelFile('./sample.xlsx')
)
print (dataFrame)
```

```出力結果.txt
   社員コード   社員名
0      0  田中太郎
1      1  多田久信
2      2  安村花子
```
本来は**「0000」という文字列**で値を取得したかったため、期待する値を取得する方法を調査しました。

## ■解決法 read_excel で、パラメータ converters に特定列の型を指定する
**read_excel （ExcelFile の parse）のパラメータ converters に特定の列の型を指定することができます。**
converters には、 カラム名：型 の 連想配列を設定します。

```test.py
def getDataFromExcelFile(excelFile:ExcelFile, converters={})->DataFrame:
    return excelFile.parse(
        index_col=None,
        converters=converters
    )

dataFrame = getDataFromExcelFile(
    getExcelFile('./sample.xlsx'),
    converters={0:str}
)
print (dataFrame)
```
これで、指定した１列目の値がstring型で取得されました。**（またその他の値はデフォルトの設定の時と同じ取得の仕方で取得されています。）**

```出力結果.txt
  社員コード   社員名
0  0000  田中太郎
1  0001  多田久信
2  0002  安村花子
```


以上です。
pandasのセルのなかにdictionaryが！

ある日pandasのread_jsonで辞書形式のデータを読み込んでて気づいたもの。

##1.起
こういうデータを

     [{"label":"20/00","x":297.0729064941406,"y":-385.3456726074219,"id":"145",　"attributes":{"time":"1530"},"color":"rgb(153,153,153)","size":16.59930992126465},{"label":"10/04","x":4398.1484375,"y":-2204.3076171875,"id":"2692","attributes":{"time":"2460"},"color":"rgb(153,153,153)","size":4.0},・・・略・・・}]

こう読み込んだ。

    df = pd.read_json("20153_nodes.json",orient="records")


ふとdfで出力してみるとセルの中に辞書っぽいものが！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/d57793a0-18ea-7008-158b-b2fa08d3aea2.png)

attribute…ほんとは辞書の中の値を取り出したいのに。
どうも辞書の中に辞書形式でデータが入ってたようで。

##2.承
まあstr⇒置換しちゃえばいいやと思ったらできない！(NaNになってしまう)
辞書で入っている！

    df['attributes'] = df['attributes'].str.replace("{'time", "")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/aa91405f-ee4b-014e-559c-9571f96c11c1.png)

##3.転
[ネット上でそれらしき情報](https://codeday.me/jp/qa/20190223/295873.html)があったので、参考に。しかし意味不明の日本語。結果として無事にできました。

    df["attributes"] = df["attributes"].apply(pd.Series)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/e171e1c8-332e-6835-ca5c-53cde4bc0494.png)


##4.結
pandasってネスト状態の辞書もちゃんとそのまま読み込むんだなーと感心。
今回はネスト内で値が１つしかなかったけど、複数あっても上記方法で分解してから、
mergeかjoinで連結すればもとのdfにひっつけられますね。


追記：dictionaryだけじゃなくlistでもＯＫだった。
[Illustrator Script] フォント指定時の値を app.textFonts.getByName("fontName") とする理由

##完成コード

例えば小塚ゴシックを指定する場合以下のように書く。

``` javascript
sel = activeDocument.selection
sel[0].textRange.characterAttributes.textFont = app.textFonts.getByName("KozGoPro-Regular")
```

##何が理解できなかったのか

上記コードでフォントは指定できるが、例えば以下コードのように<font color="Red">文字列</font>で指定するとエラーが出る。

``` javascript
sel = activeDocument.selection
sel[0].textRange.characterAttributes.textFont = "KozGoPro-Regular"
```

そもそも`textFontプロパティ`の値は文字列ではなく`fontオブジェクト`を指定すべである。
しかしなぜこのようなコードを書いてしまったかと言うと以下コードのように書くことで、フォント名を取得することが出来る。

``` javascript
sel = activeDocument.selection
alert(sel[0].textRange.characterAttributes.textFont)
```

「小塚ゴシック」のテキストオブジェクトを選択して上記コードを実行すると、ダイアログに「textFont KozGoPro-Regular」と表示される。
短絡的に「じゃあtextFontの値に"KozGoPro-Regular"を文字列で指定すればいんじゃね？」と指定してしまった訳である。

##結論
`textFontプロパティ`の値は`Fontオブジェクト`でなければならない。
FontオブジェクトはtextFontクラスのgetByName()メソッドで取得出来る。
屋内環境を手軽にモニタリングする～①動機とコンセプト～

以前から、屋内(プライベート/オフィス/工場)の主な環境情報の変化の傾向を把握したいと思っていました。CO2とPM2.5の各濃度、あと一般的な環境情報(温度、湿度、照度など)についてです。

[PM2.5](https://www.env.go.jp/air/osen/pm/info.html)は、ここ数年、大気汚染に関して良く聞く単語で、大気中の微小粒子状物質を指します。

また、地球温暖化の指標として、[大気中のCO2濃度](https://ds.data.jma.go.jp/ghg/kanshi/info_co2.html)が取り上げられていますが、現在、屋外の濃度は平均して400 ppm程度だそうです。一方、閉め切った部屋では、軽く1000 ppmを超えることをインターネットの記事で知りました。[こちらの記事](https://www.san-eee.com/measuring/co%e3%81%a8co2%e6%bf%83%e5%ba%a6%e3%81%ae%e4%ba%ba%e4%bd%93%e3%81%b8%e3%81%ae%e5%8d%b1%e9%99%ba%e5%ba%a6%e3%81%ab%e9%96%a2%e3%81%97%e3%81%a6/)によると、2000 ppmを超えると体調への影響が懸念されるそうで、今回の取り組みの主な動機の一つです。

更に、工場を想定して、産業オートメーション機器から稼動情報を取得して、簡単にモニタリングする機能を入れました。このために、機器から情報を取得するプロトコルとして、インダストリー4.0 / IIoTで注目されている[OPC-UA](https://en.wikipedia.org/wiki/OPC_Unified_Architecture)を使用します。現在、この分野は工場のIoT化の観点からホットな領域と思いますが、まずは、お試しで、設備機器の稼動状況を手軽にモニタリングする際の一助になれればと思います。

ただ、現在、稼働中の機器の中でOPC-UAに対応済みの機器はまだまだ少数なのではと思います。この場合、既存の機器の産業用ネットワークプロトコル(例、[EtherNet/IP(CIP)](https://ja.wikipedia.org/wiki/EtherNet/IP)や[Modbus](https://ja.wikipedia.org/wiki/Modbus)など)をOPC-UAに変換する仕組みが必要になります。実際、このようなプロトコル変換の商用製品が存在します。(オープンソースでは未だ見たことがありません)

これらのデータを収集して、リアルタイムにモニタリングする簡易ツールを目指して、以下の要件を立てました。

- 屋内(プライベート/オフィス/工場)の一般的な環境情報(CO2、PM2.5、温度、湿度、照度)をモニタリングする
- 産業オートメーション機器の稼働情報をOPC-UAで取得してモニタリングする
- Raspberry Pi 3Bで稼動する
- Java 8以上で稼動するOSGiアプリケーションにまとめる(Java & OSGiには慣れているので)
- モニタリングに使用する時系列データベースと可視化ツールは、既存のオープンソースを利用する
- 収集したデータを他の用途に利用可能にする(データソース機能)

イメージはこんな感じです。
<img width="800" alt="concept_overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/f164a9f1-4e8f-eab0-b632-d9ffd7430aa3.png">
先に結論を言いますと、一連の記事で紹介する、作成した各種センサーデータ取得用のJavaライブラリを組み込んで簡易ツールにまとめたものは、[こちらのGithub](https://github.com/s5uishida/rainy)で公開しています。

今後、本ツールの設定と更新を簡単に繰り返せるように、コンテナ化して、Kubernetesで構築したエッジのコンテナクラスタに配備することで、手軽に利用できるようにしたいと思います。

## 一連の記事
このシリーズは、以下の記事から構成されます。
1. **動機とコンセプト(今回)**
2. [Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)](https://qiita.com/items/a4543c9e7fb13b4c7c6e)
　関連するGithubは[こちら](https://github.com/s5uishida/bluetooth-scanner)。
3. [TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)](https://qiita.com/items/79a2de6a7026ef230e9b)
　関連するGithubは[こちら](https://github.com/s5uishida/cc2650-driver)。
4. [MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)](https://qiita.com/items/1759498f8f706c4c3314)
　関連するGithubは[こちら](https://github.com/s5uishida/mh-z19b-driver)。
5. [PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)](https://qiita.com/items/4ae7784aeaf50df1e3d3)
　関連するGithubは[こちら](https://github.com/s5uishida/ppd42ns-driver)。
6. [産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)](https://qiita.com/items/60954d356a3ea1048c61)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy-opcua)。
7. [簡易ツールにまとめる](https://qiita.com/s5uishida/items/c56f1444c6856656b128)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy)。
8. [後記](https://qiita.com/s5uishida/items/d2a888eb2d68e72f32ae)

## 追記
[2019.11.16]
簡易ツールの最新情報は、[こちら](https://github.com/s5uishida/rainy)をご参照下さい。
特定のラベルをセットした Issue を自動的に GitHub Projects のカラムに追加する

2019/09/28 追記:
`PROJ A` ラベルがすでに設定されている Issue で別のラベルを追加した際も `To do` カラムに移動されてしまう問題があったので例を修正しました。

---

Project への追加自体は以下の Action を使えば簡単にできます。
https://github.com/alex-page/github-project-automation-plus

が、「ラベルを設定したら」というトリガーには少し工夫が必要です。
以下は Issue に `PROJ A` というラベルを設定したら `Project A` という GitHub Project の `To do` というカラムに追加するための Workflow の定義です。
これを `.github/workflows` のなかに `*.yml` で保存します。 (基本的なところは https://help.github.com/en/articles/configuring-a-workflow とかを参照)

```yaml
name: 'Project A: Kanban Automation'

on: [issues]

jobs:
  automate-project-columns:
    runs-on: ubuntu-latest
    steps:
      - name: Move labeled issues into To do
        if: github.event.action == 'labeled' && github.event.label.name == 'PROJ A'
        uses: alex-page/github-project-automation-plus@master
        with:
          project: Project A
          column: To do
          repo-token: ${{ secrets.PERSONAL_TOKEN_FOR_KANBAN }}
```

`repo-token` については private repo の場合、Personal Access Token を作ってリポジトリに Secrets として登録しておく必要があるようです。
プリセットの `secrets.GITHUB_TOKEN` では必要なパーミッションが足りていないようです。

以下のようなパーミッションを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208/59797626-a628-aa31-cc60-e24f59319816.png)

リポジトリにひもづく Project なら `repo`、Organization にひもづく Project なら `admin:org` のパーミッションが必要なはずです。 (多分)

試してないですが public repo であれば `secrets.GITHUB_TOKEN` でも問題ないと思います。
cwltoolで、[Errno 28] No space left on device がでるときの対処方法

# 概要

cwltoolで、以下のようなエラーがでるときがある。

```
[Errno 28] No space left on device on device: '/tmp/q0aq3bde
```

実際ディスク領域が足りない。

# 結論

`/tmp` に十分な容量がないときにおこるものなので、
以下のオプションで、十分に容量があるところを指定する

```
--tmpdir-prefix TMPDIR_PREFIX
Path prefix for temporary directories
--tmp-outdir-prefix TMP_OUTDIR_PREFIX
Path prefix for intermediate output directories
```

Mac で docker を使っているときなどに起こりやすい

# 考えられる原因

`/tmp` が足りないケースはいくつか考えられる。Macのdockerとかつかっているとおこるかもしれないし、
Linux でも起こりうる。

このような場合、普通のディスクをしていしてみるという手もある。
RAMディスクがつかえるならば、それでもよいかもしれない。

共有計算機で、分散ファイルシステムだったりすると、あまりこのような使用に向いていないファイルシステム(lustreとか?)が考えら得るので、scratch領域、各計算ノード固有のディスクスペースなどがあるならばそれを指定したほうが良い。

いくつかの環境でベンチマークをとっておくと、
常に遅いのか、マシン固有なのかなどのきりわけでもできるだろう。
[nginx]本番環境で動画を投稿した際413 Request Entity Too Largeと出る

#はじめに
本番環境[EC2サーバー]にて動画を投稿した際に413 Request Entity Too Largeと出る。
原因はどうやらnginxはデフォルトの設定値が１Mみたいで大きいサイズのファイルはエラーが出る見たいです。なのでアップロードの上限値を増やしたいと思います。

#設定方法
設定をする為のファイルをまずは開きます。今回は本番環境でのエラーなのでEC2サーバーで。

```
sudo vi /etc/nginx/nginx.conf
```

容量を増やす為`client_max_body_size`を使用しファイルに記述。場所はserverの中では上手くいかなかったので別な場所に記述、今回は容量の上限値を２０Mに指定

```
http{

    keepalive_timeout   65;
    types_hash_max_size 2048;
    client_max_body_size 20M;
    以下略*******************
```
最後に`sudo /etc/init.d/nginx reload`をし適用しましょう。

#最後に
今回はこれで上手くいったのでよしとします。大きめの画像、動画のアップロードだとnginxで本番環境でエラーが出るいい勉強になりました。
以下、参考にさせて頂いた資料です。
https://caramelcase.com/nginx-too-large-error/
https://qiita.com/takecian/items/639deeae094466de6546
twineからパッケージをより安全にアップロードする

最近になってPyPIが2段階認証だったりトークン機能が対応したようで、twineからより安全にパッケージをアップロードすることができました。

日本語記事が少ないと思うので忘備録を兼ねて書いておきます。

※投稿現在はベータ機能としてリリースされているようなので、もしかしたら変わってるかもしれません。

# トークンを発行する

https://pypi.org/manage/account/token/ にアクセスしてトークンの発行ページにアクセスします。
ログインしていない場合はログイン画面が出るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111880/d8eccc2b-a729-2145-0934-b12efadc430f.png)

**Token name**には任意の名前を入力します。これはAPIトークンの管理をするときに表示されるものです。

**Scope**には対象のパッケージを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111880/38e80791-682e-c1e2-6501-b4e3ee56fc0e.png)

トークンが発行されると以下の項目が表示されます。このトークンを控えてください。
**1度しか表示されないためご注意ください。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111880/96fb2600-8b7e-5a80-6c4e-947edb6ef079.png)

# 設定をする

ホームディレクトリにアクセスし、`.pypirc`という名前でファイルを作成します。

※`.pypirc`に関する詳しい設定は割愛いたします

```plaintext:.pypirc
[distutils]
index-servers =
  pypi

[pypi]
username: __token__
password: pypi-********
```

`username`は**必ず**`__token__`と入力してください。

`password`には先程控えたトークンを貼り付けます。

これで設定は完了です。twineコマンドでアップロードなどをして正常にアップロードできるか試してみてください。
pandas DataFrame からpython標準のプリミティブ型で値を取得する

## ■課題 DataFrameの値取得はpython標準のプリミティブ型の値が返らない
DataFrame から、指定した列のvalue を取る時にアクセサ[]やgetメソッドを使うと、プリミティブの値ではない、ライブラリのオブジェクトが返りました。

```extractDataFrame.py
from pandas import DataFrame
def getColumnValueIn(dataFrame:DataFrame, columnKey):
    return dataFrame[columnKey]

df = DataFrame([
    ['A','Bb','cccc']
])
print(getColumnValueIn(df, 1))
print(getColumnValueIn(df, 1) == 'Bb')
```

```出力結果.txt
0    Bb
Name: 1, dtype: object
0    True
Name: 1, dtype: bool
```
取得できた値は想定通りですが、**pandasのライブラリのオブジェクトとして値が取得されました。**
この後の処理で、条件分岐などで、値を使用する際には、少し使いづらくなってしまうため、**DataFrame内の値からpython標準のプリミティブ型のデータで取得する方法を調べました。**

## ■対応 DataFrame から一度 list に戻してからアクセスする。
DataFrame からpython 標準のlistに変換し、鍵括弧[]でアクセスできるようにします。

```extractDataFrame.py
from pandas import DataFrame
def getColumnValueIn(dataFrame:DataFrame, columnKey):
    return (dataFrame.values.tolist())[0][columnKey]

df = DataFrame([
    ['A','Bb','cccc']
])
print(getColumnValueIn(df, 1))
print(getColumnValueIn(df, 1) == 'Bb')
```
一度ndarray に変換し、tolist()を呼ぶことで、**python標準のlist オブジェクトに変換され、通常のアクセサで値がそのまま取得できました。**


```出力結果.txt
Bb
True
```

以上です。
WEB開発から見たDB設計(DB設定)

## はじめに
[WEB開発から見たDB設計(テーブル設計)](https://qiita.com/mink0212/items/c5e08110e8e0fe902b89)ではWEB開発時のテーブル設計についてまとめました。
次はアプリ開発者にはあまり機会が少ないDB側およびアプリ側の設定をWEB開発の観点からまとめます。


## DB側の設定項目
 - ログ

## DB側の設定説明
### ログ
データベースにもログを記録する機能があります。
大抵のWEBサービスの場合、DBを使うときはネットワーク経由で接続をするため、アプリ側でログを取っていてもネットワークの途中で切れてアクセスが失敗することがあります。
そのため、DB側でもちゃんとsqlが届いたことを確認できるようにログを出したほうが良いです。

ただし、大量に出るためログローテートなどでちゃんと容量を圧迫しないように処理することが必要です。

postgresの設定

``` :/var/lib/postgresql/data/postgresql.conf
#log_directory = 'log'
 -> log_directory = 'log' へ変更
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
 -> log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'　へ変更
#log_statement = 'none'
 -> log_statement = 'all'　へ変更
```
## アプリ側の設定項目
 - アプリケーション名
 - タイムアウト値
 - セッション(プール数)

## アプリ側の設定説明
### アプリケーション名
アプリからDBを利用をする際は、DBの使用のたびに接続をするのではなく、一度接続をした際にセッションを使いまわして接続のロスをなくしています。
バグなどで使いまわすのに失敗して多くのセッションを作成してしまうとDBに負担がかかる上に、DBに設定されている上限を超えるとセッションが作成できなくなってしまいます。
その時のためにどこのセッションが悪いのかを判断できるようにセッションにアプリケーション名を付けます。
個人的には関数名をつけるのがわかりよいと思っています。

postgresqlにsqlalchemyでアプリケーション名をつける例
sqlalchemyの使い方については以前まとめた記事を見てください。その差分のみここに記載しています。
[sqlalchemyを使用してpythonでDBアクセスをする](https://qiita.com/mink0212/items/d7f31f6e2903c5f0b837)

``` python
ENGINE = create_engine(CONNECT_STR, connect_args={"application_name":"py_app"})
```

結果

```
SELECT * FROM pg_stat_activity;
16384	animal_db	75	10	postgres	py_app	000.00.0.0	​(NULL)​	57196	2019/09/03 21:42:15.004	​(NULL)​	2019/09/03 21:42:15.057	2019/09/03 21:42:15.073	Client	ClientRead	idle	​(NULL)​	​(NULL)​	COMMIT	client backend
```

### タイムアウト値
ここが一番重要な点です。
DBアクセスをした際に何かの原因でアプリが停止するのを防ぐために設定した時間を過ぎたら接続が切断されるようにタイムアウト値を設定します。
WEBアプリではとかく早いレスポンスが期待されます。サービスにもよりますが最長で秒オーダーになります。そのため、長くとも5秒程度のタイムアウトにするべきです。
※WEBサイトを開いたときに5秒以上待たされるときをイメージしてみてください。
DBサーバへの物理的な距離やDBサーバのメモリ等環境によって左右されるので実際は測定してから考えることになると思います。


postgresqlにsqlalchemyでタイムアウトをつける例
pool_timeoutはプール獲得のタイムアウトでconnect_timeoutが接続のタイムアウトになります。
sqlalchemyの使い方については以前まとめた記事を見てください。その差分のみここに記載しています。
[sqlalchemyを使用してpythonでDBアクセスをする](https://qiita.com/mink0212/items/d7f31f6e2903c5f0b837)

``` python
ENGINE = create_engine(CONNECT_STR, pool_timeout=10, connect_args={'connect_timeout': 10})
```

### セッション(プール数)
基本的にはプロセスやスレッドに対して1つあれば事足りますが、ネットワーク異常などで切れたセッションが解除される前に
再接続してしまう可能性を考えて各プロセスに対して2個程度プールがあったほうが安心です。

例は[sqlalchemyを使用してpythonでDBアクセスをする](https://qiita.com/mink0212/items/d7f31f6e2903c5f0b837)に記載しています。


## おわりに
DB接続をするときに気を付けるべきことを記載しました。
ここら辺の設定は何もしなくても正常に動きますが、異常が発生したときに威力を発揮する設定になります。
そのため、いざ開発しようというときに抜けていることがありテストの時に気づくというケースがありました。
タイムアウトなどDB側の設定でもいじれますが、DB全体に影響を与えるため基本的にはアプリ側でコントロールしたほうが良いと思います。
OSとUnixとLinuxについて【初心者による初心者向けの記事】

#初心者はそもそも基礎がわからん

プログラミングを始めて、簡単なアプリケーションは作ることができるようになったけど、そもそも”OS”とか”Unix”とか”Linux”とかあんまり理解せずに進めている未経験エンジニアは結構いると思います。

何を隠そう、私もそういう基礎的なところないがしろにしていました。
が、調べてみると「自分が普段使っているパソコンはこういう仕組みなのか！！」と新たな発見の喜びがあります。

ってことで、とりあえず今回はUnixとLinuxの違いなんかについてアウトプットします。

#そもそもOSって…

- OSとは、Operating System（オペレーティングシステム）の略。

- これがないとパソコンは動かないよってやつ。（OSはパソコンのもっとも基本的な機能を制御しているソフトウエア。）

- OSの例
・ Windows　：　PCをハードウェアとする
・ Mac OS　：　PCをハードウェアとする
・ UNIX　：　サーバをハードウェアとする
・ Linux　：　PCもしくはサーバをハードウェアとする

他にも、BSD,Android,iOSなんかがあります

#UNIXとは
- Unix（ユニックス）とは、現存する中で最も古いOS
- OSの安定性が高く、ネットワーク機能に優れている。長時間にわたって動かす必要のあるコンピューターなどに利用。

- Mac OSはUnixと親戚の関係(色々あって、LinuxからMac OSができた)


#Linuxとは
- Linux（リナックス）はUnixを参考に作られているUNIX系OS。

- パソコンやスマートフォン、そして多くのサーバーで利用されている。

- 大きな特徴は、誰でも自由に開発、入手、使用、改変、再配布などができること。



#UnixとLinuxの違い
色々あるけど…

- Unixは企業が開発して、知的財産権が企業に属していること。
- Linuxはオープンソースソフトウエアで無料な上、配布や改変も自由であること。
. で呼び出した.ps1ファイルの変数のScopeは呼び出し元と同じなんですね(Parameterも)。

# 事の顛末
先日からPowerShellにはまっている。好きではまっているわけではないのだけれど、動きがわからないと何かとよくはまる。今回は . で呼び出した.ps1ファイルのParam()が勝手に変わっていてはまった件。いや、勝手にというのは横柄なもの言いで、「コードがそうなっていたから」というのが正しいです。。

こんな感じで、パラメータ付きのスクリプトを作成して、その中から別のパラメータ付きのScript2.ps1を呼び出しているのだが。。。

```Script1.ps1
Param([Parameter(Mandatory)][string]$SomeParam)
Write-Output  $SomeParam
. ".\Script2.ps1"
Write-Output $SomeParam
```

```Script2.ps1
Param([string]$SomeParam = $null)
```

```:実行結果
PS C:\PowerShell> c:\PowerShell\Script1.ps1
value1
       <- Script2.ps1によって、値を書き換えられてNULLになってしまっている。。。
```
Script2.ps1が呼び出された時に、\$SomeParamがdefault valueである\$nullで初期化されていたため、Script1.ps1に戻ってきたときには値が\$nullになってしまっていた。コード書いているときには、Script2.ps1にデフォルトパラメータがあったことなど忘れていたので、なんで\$nullになるのか意味不明??? あれれ???

# 結論
. で呼び出した .ps1 ファイルのスコープは呼び出し元と一緒なので、変数名が同じだと書き換わっちゃう。Param()で指定したパラメータ名も変数なので、動きは同じ。。。ということらしい。
# で、どうしたか?
2つのScriptのうち、どちらかのパラメータ名を変更すればいいのだけど、パラメータの名前は.ps1を呼び出すときの名前付きパラメータとして表に出る名称なのでやたらと変更したくない。なので、こんな感じで内部変数にコピーしてしのぎました。(この変数名も結局、重なったら上書きされてしまうけどね)。

```Script1.ps1
Param([Parameter(Mandatory)][string]$SomeParam)
$_someParam = $SomeParam # <- 別の変数にコピーしておく
Write-Output  $_someParam
. ".\Script2.ps1"
Write-Output $_someParam
```
# 参考文献
[PowerShell のスコープ完全に理解した](https://tech.blog.aerie.jp/entry/powershell-advent-calendar-2018-18)