OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsⅠ

◆Expressを導入する

$ npm install express →入力してenter

nodejs_lesson@1.0.0/home/..
express@4.17.1 →入力結果

◆インストールしたExpressを利用する

const express = require('express') ;
const app = express();

◆listenメソッド

app.listen(3000);

『ターミナル』
$ node.app.js →app.jsをターミナルを実行する
ファイルを実行するには「node ファイル名」とします。

◆ルーティング

app.get('/top', (req,res) => {
トップ画面を表示する処理
});

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635497/d17d86cf-226e-33af-9541-b7a1626e02bb.png)

ルーティングの処理でres.renderと書くことで、指定したビューファイルをブラウザに表示できます。

app.get('/top', (req,res) => {
res.render('top.ejs');
});

◆CSSを適用するには（1）

app.use(express.static(public));
今回はpublicというフォルダにこれらのファイルを置く

◆JavaScriptを利用しよう

JavaScriptのコードを記述するには、<% %>または<%= %>で囲みます。

<% const item = {id:3, name: 'たまねぎ'};>
<p>id: <%= item.id%></p>
<p>name: <%=item.name%></P>

◆オブジェクトの配列を画面に表示しよう

①まずは、リストをまとめて配列を定義します

<% 
const items = [
{id:1, name:'じゃがいも'},
{id:2, name:'とまと'},
{id:3, name:'しらす'},
];
%>

②次に配列のオブジェクトを一覧画面に表示します。forEachは画面に表示させないので <% %>で記述しましょう。

<ul>
<% items.forEach((item)=>{ %>
<li>
<span><%=item.id></span>
<span><%=item.name></span>
</li>
<%});%>
</ul>
俺的Linuxサーバーの建て方

毎度サーバーの建て方を忘れて一から調べ直すのもアホなのでまとめたいと思う。
Linuxをサーバーとして構築するに当たってCLI環境でインストールする。セキュリティ設定は入れないので参考にする方は各々入れるように。

#1.サーバーをインストール
Ubuntuを使っていく。次のURLへアクセスしISOを落としておく。
https://jp.ubuntu.com/download　

##黒背景の画面
1. 言語は「English」を選択
2. キーボードレイアウトは「Japanese」を選択
3. ネットワークを設定
4. 静的の場合は「eth0」→「edit Ipv4」→「manual」を設定
5. プロキシは必要ならば設定
6. ミラーアドレスはそのまま
7. ディスク領域は全体を使用
8. 要約はそのままDone
9. 確認ダイアログはContinue
10. 「ユーザー名」「サーバー名」「パスワード」を設定する
11. SSHは入れない(後で入れるけど・・・)
12. 機能は追加しない
13. インストールが終わったら再起動(インストールメディアは抜いておく)

#2.サーバーにログインする

1.10で作成したユーザーでログインし、以下のコードを実行する。

```
$ export LANG=C
$ sudo apt update
$ sudo apt install ssh
```

##SSHを開けたのでリモートPCからログイン。
SSHクライアントはTeraTermを使用。
https://ja.osdn.net/projects/ttssh2/

![コメント 2020-08-18 134938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685298/966a4fc0-de4c-2218-d41c-4186a74855ed.png)

「ホスト名」は1.4で設定したアドレスを入れる。分からなければサーバーで「ip a」を実行する。

![コメント 2020-08-18 135049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685298/7eb6140b-104f-d266-3100-78869da1765f.png)
「ユーザ名」と「パスフレーズ」は1.10で入れた「ユーザー名」と「パスワード」を入れる。
入れたら「OK」を押す。


ログインできたら次のコマンド入れて、日本語化する。
sudoを使うとパスワードを求められるのでログイン時に使ったパスワードを入力。

```
$ sudo apt-get install language-pack-ja-base language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP.UTF-8
$ source /etc/default/locale
```

参考にしたサイト
https://shell-mag.com/portal-linuxserver/
https://symfoware.blog.fc2.com/blog-entry-2447.html


おしまい
Windows ServerのServer Coreインストールも作ろうかな。
db:migrateのやり直し

#db:migtateのやり直り方法

マイグレートしたファイルを削除する（やり直しをかける）

```terminal:terminal
$ rails db:migrate:down VERSION=[time stamp]
$ rmi -rf [time stamp]_***.rb
```
#migrate_***.rbへ追記方法

作成したカラムを修正したい時は、(1)defメソッドをupとdownを用意する。(2)change_columnに追記したいコードを入力する。(3)downの中に、remove_columnを用意して、元々のadd_columnを記述する。


```Ruby:日付_add_username_to_users.rb(修正前）
class AddUsernameToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :username, :string　#ここにnull: false, default: ""を加えたい。
  end
end
```

```Ruby:日付_add_username_to_users.rb(修正後）
class AddUsernameToUsers < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :username, :string, null: false, default: ""
    add_column :users, :username, :string
  end
  
  def down
    remove_column :users, :username, :string
  end
end
```


終わり。

#もし、db:migrate:downさせる前にマイグレーションファイルを削除してしまっていた場合
設定等が残ってしまうため、同じタイムスタンプのファイルを作成する必要がある

まずは、マイグレーションの状況を見て、何がup状態か確認する
やらかしている時は、下記のような***NO FILE***がいる

```terminal:terminal
$ rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200817055815  Devise create users
   up     20200817065100  Add name to users
   up     20200817102227  Create rooms
   up     20200817104106  Create entries
   up     20200818043808  ********** NO FILE **********
```

こうなっていた場合は、NO FILEのID（20200818043808）を元に、
簡易なマイグレーションファイルを作成する
(変にスペルミスしないように注意！、私は大文字小文字の打ち間違えで、エラー起こした。照り）

```terminal:terminal
$ vim db/migrate/20200818043808_tmp.rb

class Tmp < ActiveRecord::Migration
	def change
	end
end
```

念のため、statusでNO FILEがTmpに変わっていることを確認。（割愛）

```terminal:terminal
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200817055815  Devise create users
   up     20200817065100  Add name to users
   up     20200817102227  Create rooms
   up     20200817104106  Create entries
   up     20200818043808  Tmp
```

確認してできたら、上記の通りdownさせて、削除して終わり！

```terminal:teminal
$ rails db:migrate:down VERSION=20200818043808
$ rm -rf 20200818043808_tmp.rb
```

終わり

参考にさせていただいた記事
https://qiita.com/gita/items/2198e2961a9fc7d10bd2

誤った理解をしていればご指摘いただければ幸いです。
【備忘】Docker Container の MySQL Server にアクセスする方法メモ

Dockerコンテナ上に立てたMySQL Server にアクセスする際に意外と手間取ったのでメモ。

## 前提

OS: macOS 10.14.6
docker desktop: v2.3.0.3
Dockerイメージ：　https://hub.docker.com/r/mysql/mysql-server

## 手順

コンテナ起動してアクセス。ポートマッピングを忘れない！

```shell-session
$ docker run --name=mysql-develop \
             -p 3306:3306 \
             -d \
             mysql/mysql-server
$ docker exec -it mysql-develop bash
```

設定ファイル(/etc/my.cnf)に以下を追記。
`docker run` で起動している場合、ホストのIPは`127.10.0.1`です。

```:my.cnf
bind-address = 127.10.0.1
```

ルートユーザでコンテナ内からサーバーにアクセス。
パスワードはコンテナ作成時に自動でせいせされるので、ログから確認する。

```shell-session
$ docker logs mysql-develop 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: XXXXXXXX
$ docker exec -it mysql-develop mysql -u root -p
Enter password: # XXXXXXXX
```

リモートアクセス用のユーザー作成、権限付与。

```sql
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';
GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';
flush privileges;
```

コンテナから抜けて、ホストのクライアントからアクセス。

```shell-session
$ mysql -u remote_user -h '127.0.0.1' -p
Enter password: # mypass入力
```

## 参考

https://stackoverflow.com/questions/16287559/mysql-adding-user-for-remote-access
subprocessでのコマンド実行

ターミナルでlsを行ったときと同様の結果が得られる

>「LS」です。今、何がディレクトリの中にあるかを見ます。
これで、ファイルとディレクトリを表示することができます

```python:qiita.py
import subprocess

subprocess.run(['ls'])
```

ls -alを行いたい場合
書き方が二通りある
2つ目の方法は shellに渡して行う方法
セキュリティ的に問題がある為、好まれない
例えばrmが組み込まれファイルが消されるなど

```python:qiita.py
import subprocess

#１つ目
subprocess.run(['ls','-al'])
#２つ目
subprocess.run('ls -al', shell=True)
```

###exception
returncodeを用いた方法

>returncode
子プロセスの終了コード。一般に、終了ステータス 0 はプロセスが正常に終了したことを示します。
負の値 -N は子プロセスがシグナル N により中止させられたことを示します (POSIX のみ)。

存在しないコマンドを渡した場合

```python:qiita.py
import subprocess

r = subprocess.run('lsa',shell=True)
print(r.returncode)
```

実行結果
lsaという存在しないコマンドを実行＝１２７

```
127
/bin/sh: lsa: command not found
```

>https://qiita.com/Linda_pp/items/1104d2d9a263b60e104b

checkを用いることもできる

```python:qiita.py
import subprocess

r = subprocess.run('lsa',shell=True, check=True)
```

実行結果
エラー発生

```
/bin/sh: lsa: command not found
Traceback (most recent call last):
  File "/Users/kirinboy96/PycharmProjects/untitled1/lesson_package/NEW1.py", line 6, in <module>
    r = subprocess.run('lsa',shell=True, check=True)
  File "/opt/anaconda3/lib/python3.7/subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'lsa' returned non-zero exit status 127.

```

###PIPE
stdout（出力）をsubprocess.PIPEにわたす
p2.communicate()[0]は出力
p2.communicate()[１]はエラーが返ってくる

```python:qiita.py
import subprocess

p1 = subprocess.Popen(['ls', '-al'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(
    ['grep', 'test'], stdin=p1.stdout,stdout=subprocess.PIPE
)
p1.stdout.close()
output = p2.communicate()[0]
print(output)
```

実行結果

```
b'-rw-r--r--   1 kirinboy96  staff    22 Aug 18 00:44 test.csv\n-rw-r--r--   1 kirinboy96  staff   216 Aug 18 14:20 test.tar.gz\n-rw-r--r--   1 kirinboy96  staff   763 Aug 18 14:52 test.zip\ndrwxr-xr-x   4 kirinboy96  staff   128 Aug 18 02:52 test_dir\ndrwxr-xr-x   3 kirinboy96  staff    96 Aug 18 14:20 test_tar\n'

```
PHP学習メモ① (基礎内容を自分用にメモ)


### 開始タグ、閉じタグ

```PHP:PHP

<?php
php?>

PHPのファイルにはHTMLも書けますが、
PHPのコードしか書かない場合は、閉じタグを書くべきではないというルール!

```

### 改行

```PHP:PHP
echo "Helo" . PHP_EOL;

# PHPでは、"\n"ではなくPHP_EOLを使う。
# エンドオブライン
```

### コメント

```PHP:PHP
// コメント
# コメント
/*
複数行でのコメント
*/
```

### 変数

```PHP:PHP
// コメント
$name = 'taguchi';
echo 'Hello ' . $name . PHP_EOL;

# 変数の宣言は$を利用するが、使い方はrubyとさほど変わらない

```

### ""の使い方

```PHP:PHP
$name = 'taguchi';
echo "Hello $name" . PHP_EOL;

# 「""」であれば、変数を中に入れられる！
```

### 長めのテキスト表現

```PHP:PHP
$name = "taguchi";

$text = <<<"EOT"
hello!$name
 this is looooooooong
text!
EOT;

echo $text;

#"EOT"をシングルにしてしまうと、変数が利用できなくなるので注意

$text = <<<'EOT' nowdoc(ドキュメント)
$text = <<<"EOT" heredoc(ドキュメント)

```

###　定数(1)

```PHP:PHP
define("NAME","taguchi");
echo NAME . PHP_EOL;

# 定数なので、二回定義しても、すでに定義されていると表示されます
```

###　定数(2)

```PHP:PHP
const NAME = "taguchi";
echo NAME . PHP_EOL;

# 定数なので、二回定義しても、すでに定義されていると表示されます
```

### defineとconstの違いについて
https://qiita.com/schrosis/items/485b984e05b2eb4521b4


###　型の調べ方

```PHP:PHP
var_dump($a);
# 型と文字数、内容について表示されます
```
Laravel(Blade)の配列をJavaScriptのオブジェクトに変換する

メモ書きです。

## Bladeのコード

```php
<script>
    var app = <?php echo json_encode($array); ?>;
</script>
```

```php
<script>
    var app = @json($array);

    var app = @json($array, JSON_PRETTY_PRINT);
</script>
```

```php
<script>
    var app = {!! json_encode($array) !!}
</script>
```

## 参考

- https://readouble.com/laravel/7.x/ja/blade.html
- https://www.it-swarm.dev/ja/javascript/javascript%E3%81%A7%EF%BC%88laravel%EF%BC%89%E9%85%8D%E5%88%97%E3%82%92%E6%B8%A1%E3%81%99/1057047683/
MySQL⑧　データの集計処理、サブクエリ

users_with_team テーブル

| id | name | score | team |
|:-:|:-:|:-:|:-:|
|  1 | AAA  | 11  | team-A  |
|  2 | BBB  | 22  | team-B  |
|  3 | CCC  | 33  | team-C  |
|  4 | DDD  | 44  | team-B  |


####データの個数を調べる　count()
select count() from users_with_team;
➡️４
####特定のカラムのデータの個数を調べる　count(カラム名)
select count(score) from users_with_team;
➡️４
####sum で合計、 min で最小値、 max で最大値、 avg で平均
select sum(カラム名) from users_with_team;　➡️１１０
select min(カラム名) from users_with_team;　➡️１１
select max(カラム名) from users_with_team;　➡️４４
select avg(カラム名) from users_with_team;　➡️２７.５

####重複したレコードを取り除いて取得する　distinct カラム名
select distinct team from users_with_team;

| team |
|:-:|
| team-A  |
| team-B  |
| team-C  |


####重複したレコードの数を数える
select count(distinct team) from users_with_team;
➡️３

#グループ化する

####グループごとの合計をだす　group by グループ化の基準にするカラム名
select sum(score), team from users_with_team group by team;

####逆順にする　desc
select sum(score), team from users_with_team group by team desc;

####グループ化の後に条件をつける　group by グループ化の基準にするカラム名 having 条件
**havingでは、グループ化したカラム、集計した値以外使えない**
select sum(score), team from users_with_team group by team having sum(score) > 10.0;

####特定の条件でグループ化する　where 条件 group by グループ化の基準にするカラム名
**where で条件付きで抽出した後にグループ化する**
select sum(score), team from users_with_team where id > 3 group by team;



#一時的に使用するテーブル　サブクエリ

元のテーブル

| id | name | score |
|:-:|:-:|:-:|
|  1 | AAA  | 11  |
|  2 | BBB  | 22  |
|  3 | CCC  | 33  |
|  4 | DDD  | 44  |

ここから集計の為のテーブルを一時的に作成する

select sum(t.score), t.team from(
　　select　　　　　　　⬅️ここから
　　　　id,
　　　　name,
　　　　score,
　　　　case
　　　　　　when score > 8.0 then 'Team-A'
　　　　　　when score > 6.0 then 'Team-B'
　　　　　　else 'Team-C'
　　　　end as team
　　from users) as t　　　⬅️ここまでが**サブクエリ**
group by t.team;

#####サブクエリを使用しないと users_with_teamテーブルを作成してから集計する
create table users_with_team
select id, name, score,
　　　　case
　　　　　　when score > 8.0 then 'Team-A'
　　　　　　when score > 6.0 then 'Team-B'
　　　　　　else 'Team-C'
　　　　end as team 
from users　

select sum(score), team from users_with_team group by team;




# 抽出条件を保存する view
viewはテーブルの様に扱われる
####viewを作成する　create view ビュー名 as 抽出条件
create view top3 as select * from users order by score desc limit 3;


####保存された抽出条件を確認する　show create view ビュー名;
show create view top3;

####viewを削除する
drop view top3;
scipy curve_fit で任意関数(1 変数)のフィッティングをぺろっとおこなう

## 背景

* 関数 `f(x)` が既知である. 変数はひとつ.
  * たとえば specular BRDF 関数とか. 
* 測定データなどにその関数をフィッティングさせて係数を算出させたい
* お手軽ぺろっとやりたい

scipy curve_fit があります.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

ありがとうございます.

## 使い方

```
def func(x, a, b, c):
  return a * x + b * x * x + c * x * x * x
```

という感じでフィッティングしたい関数を定義します.
最初の引数が独立変数になります. のこりの引数は係数で任意個指定できます.

あとはチュートリアルなど参考にすればよろしく最適化し, 結果として係数の値を返してくれます.


### うまく値を見つけてくれない(収束してくれない)

とりあえず `maxfev=100000` とかして試行回数を増やして力技で解決します.

試行回数を指定する変数名は使う最小二乗メソッドで変わるので注意ください.
 
https://github.com/scipy/scipy/issues/6340

`dogbox` だとそこそこ時間かかります(50 万回(`max_nfev=500000` で 30 秒とか)

### 初期値を設定したい

`p0` 引数で指定します.

### 係数の値の範囲を指定したい

係数がどの範囲の値を取るか既知の場合は, `bounds` で設定して探索を絞りこめるでしょう
(筆者は試したことない)

### 観測数が少ない

観測数が少ない場合はデフォルトの `lm` 法では解けません.

`method` に `trf` or `dogbox` を指定します.
とりあえずは bound 設定しなくていい `dogbox` がよいでしょうか.

### その他

scipy.optimize.curve_fitでフィッティングするパラメータの一部を定数化したい
https://qiita.com/Syuparn/items/e0b1e878a84f223e9223

ありがとうございます.

## TODO

* 多変数の場合はどうなるのかな?
* ナウでヤングそうな jax で最適化を試してみる?
  * https://github.com/google/jax/issues/421
EC2でRailsを起動する（手動デプロイ）

日記がてら。

EC2でのRails起動までの準備を着々と進めていき、
いざ起動コマンド！と思いきや

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678246/760f8ff5-301a-1bfb-e9d2-f35f06be5870.png)

master failed to start, check stderr log for details
というエラー分が出て起動失敗。

stderrとはなんぞ？と思い調べてみるとconfig/unicorn.rbに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678246/f106a5ff-198b-c21d-b3a9-efe918081705.png)
という部分が。
なるほどエラーログというものがあるのか。

lessコマンドを使用することでファイルの中身を除けるらしいのでターミナルで打ち込んでみることに。
すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678246/13aa3925-5e6c-85b5-2dd9-e9e324e4088e.png)
この青ラインが何度も出ていることに気づいた。

まずcredentialなるものについてファイルを覗くも、全く触ったことのないファイルだったので一旦後回し。
その上のaccess_key、secret_access_keyに何かありそうだ。
調べていくうちに起動までの手順を一つ抜かしていたようで、ターミナルにsudo vim /etc/environmentと打ち込み、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678246/363767db-5e69-db26-d5ac-de2593746581.png)
こちら2点を追記することであっさり解決。

ここまで調べたり試したりで所要時間3時間。

もしEC2でRails起動しないことでお悩みの方は上記の点の確認と、
・ローカル→GiuHubへのpushのし忘れはないか（mergeまで確認）
・GithubからEC2への反映（git pull origin master）のし忘れは無いか
・EC2サーバー側でエラーログの内容を確認し、原因を見つけたか
・カリキュラム通りの記載ができているか
・データベースは正しく起動しているか
・EC2サーバー側の環境変数は正しく設定できているか
・EC2インスタンスの再起動を行ってみる
を確認してみることをお勧めします。

またインスタンスの再起動は最初よくわからず全く別のインスタンスを作成したりとかしちゃったので、その場合はいらないインスタンスで右クリック→インスタンスの状態→終了で問題なく終わらせられます。
すぐには消えないけど24時間程度で消えるそうです。

誰かの参考になれば幸いです。

master failed to start, check stderr log for details
bundler: failed to load command: unicorn_rails
Aws::Sigv4::Errors::MissingCredentialsError: Cannot load `Rails.config.active_storage.service`:
missing credentials, provide credentials with one of the following options:
51歳(現52)からのプログラミング　備忘　VScodeでjarの追加　Class.forName java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Drive

VScodeでjavaしてると、たまにハマります。
今回は、DB（mysql）を扱うために、mysqlのjdbcを使いたかったのですが、

    java.long.ClassNotFoundException: com.mysql.cj.jdbc.Driver
っていうエラーが止められなかった。
解決に丸１日（涙


VScodeでは、外部jarファイルの導入は、[java Dependency Viewer]を使うので、VScodeの拡張機能で[Project Manager for java ]をインスツールしときます(jdk8ならインスツールバージョンは0.9.0とか古いのを使ってね）。

では下記備忘です！

![vscode_dependenciew.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399000/b9897759-8921-1246-3ec9-74ef8c44f556.jpeg)
①でjavaファイルを選択し
②のエクスプローラメニュー[ ... ]を選択して
③jdk8 　 なら -> [ java Dependencies ]
 　jdk11　なら -> [ java Project ]
 　にチェックを入れると
④のように　[ JAVA PROJECTS ]\(jdk11) か [ JAVA DEPANDENCIES ]\(jdk8)
　が表示されるので、それらのディレクトリを開いて
　[ Referenced Libraries ]を表示させて
⑤の[ + ]をクリック！

すると
 ![vscode_dependenciex.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399000/98f1d481-0732-fb60-714e-379e42805202.jpeg)
利用したい外部ファイルを指定させるようにフォルダが開くので
目的のファイルを指定して終了！

何かの拍子に(新しいプロジェクトを生成したあととか）
java Dependency Viewer
のvesionが更新されたりするので
この標題のエラーがでたら確認するといいかも
5分で出来るSwiftUIネオンデザイン

UIに自由度が出ていろいろなものが作れる様になったSwiftUIですが、今回は比較的簡単に出来るネオンデザインを紹介したいと思います。

こんなんです。
![スクリーンショット 2020-08-18 15.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/6f00c2a9-e443-403e-7335-f972e09608d0.png)


ZStackで背景色を黒にした後ネオンにしたいパーツをVstackにバカバカ放り込んでいきます。

```swift:
struct ContentView: View {
    var body: some View {
        ZStack{
            Color.black
                .edgesIgnoringSafeArea(.all)
            VStack{
                Text(" neon design ")
                    .foregroundColor(Color.pink)
                    .border(Color.pink, width: 1)
                    .padding(.all, 50)
                

                Button(action: {
                    print("Button tapped")
                }) {
                    Image(systemName: "heart.fill")
                        .foregroundColor(.pink)
                        .padding(30)
                        .frame(width: 50, height: 50)

                }
                .foregroundColor(Color.pink)
                .border(Color.pink, width: 1)
            }
        }
    }
}
```

現在こんな感じです。
![スクリーンショット 2020-08-18 16.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/eedf343c-47b4-d8d4-22a4-4f023723970f.png)

そして同色のShadowをちょいとVstackに重ね掛け

これは全てpinkにしてますが枠線を明るい色、Shadowを少し暗い色にするともっとネオンらしさが出ます。

```swift
.shadow(color: Color.pink, radius: 20, x: 0, y: 0)
.shadow(color: Color.pink, radius: 20, x: 0, y: 0)
.shadow(color: Color.pink.opacity(0.8), radius: 3, x: 0, y: 0)
```

VstackにかけるとVstack内全てにShadowがかかります。
![スクリーンショット 2020-08-18 16.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/6e5cffc5-b4af-9bf4-ff45-1ef2e320b6f4.png)

完成
![スクリーンショット 2020-08-18 15.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415441/9217b3e7-23c3-fc2b-dd9a-abe8a0d8c903.png)


どうでしょうか。SwiftUIが触りたくなってきたんじゃないでしょうか。
皆様の知的好奇心を刺激できたなら幸いです。
.htaccessでサブディレクトリから上位ディレクトリにリダイレクトして移動する

# やりたいこと
http://example.com/test/hoge.php
から
http://example.com/hoge.php
にurlを移動させたいと思いました。
ルートディレクトリからサブディレクトリに301リダイレクトさせる方法はわかったのですが、その逆が見つかりませんでした。

# 方法

/test/フォルダを作って、その中に.htaccessというファイルを作ります。

```bash:.htaccess
RewriteEngine On
RewriteBase /
RewriteRule (.*)$ http://example.com/$1 [R,L]
```

これにより、例えば
http://example.com/test/hoge.php?12=34
が
http://example.com/hoge.php?12=34

にクエリを維持されたままリダイレクトされます。　

# 参考
- https://qiita.com/saitoryc/items/b73c55300a09ccb007e8
- https://web-plus.jp/htaccess-slash/
tempfile

>tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)
一時的な記憶領域として使うことの出来る file-like object を返します。 ファイルは mkstemp() と同じルールにより安全に作成されます。 オブジェクトは閉じられる (オブジェクトのガベージコレクションによる暗黙的なものも含みます) とすぐに破壊されます。

###一時的なファイルの作成
tempfileは使い終わったら勝手に消してくれる
TemporaryFileは一時的なファイルという意味
このファイルはpythonにより消される

```python:qiita.py
import tempfile

with tempfile.TemporaryFile(mode='w+') as t:
    t.write('hello')
    t.seek(0)
    print(t.read())
```

実行結果

```
hello
```

###一時的でないファイルの作成
NamedTemporaryFileとしてdeleteをFalseにする
print(t.name)でpathを表示させている

```python:qiita.py
import tempfile

with tempfile.NamedTemporaryFile(delete=False) as t:
    print(t.name)
    with open(t.name, 'w+') as f:
        f.write('test\n')
        f.seek(0)
        print(f.read())
```

実行結果


```
/var/folders/14/vk0vvxsn6jjbwjf0_nk2p7k40000gn/T/tmpxfqtokst
test
```

###一時的なディレクトリの作成

```python:qiita.py
import tempfile

with tempfile.TemporaryDirectory() as td:
    print(td)
```

実行結果

```
/var/folders/14/vk0vvxsn6jjbwjf0_nk2p7k40000gn/T/tmpcmdgfsuu
```
product variant sku まとめ

#初めに
ECの案件に携わった時に、商品の変数？呼び方？がたくさんあって混乱したので、主要なものをまとめてみました。

#商品の変数名ごとの違い
###product
商品名単位(色、大きさなどがたくさんあってもその商品名を１カウント)
###variant
種類別単位(productの種類をそれぞれ１カウント)
###sku
variantについている商品番号
１variantにつき１skuが存在する

#わかりやすいようにじゃがりこで考える
productをじゃがりこに置き換えると、、、

variantはサラダ味、じゃがバター、チーズ、サラダ味Lサイズ、のり塩ごま油味Lサイズなどなど、、、

skuは
A001:サラダ味
A002:じゃがバター
A003:チーズ
B001:サラダ味Lサイズ
B002:のり塩ごま油味Lサイズ

というように管理するためにつけている番号という感じです

余談
ちなみにじゃがりこの肉じゃが味が人気らしい
【始め方】GAS(TypeScript) プロジェクト開発時にやること

# 2021/10/17 追記
新しく記事を書きました。

https://qiita.com/hasehiro0828/items/e021ad5867de285b88b7

## はじめに
GAS開発をTypeScriptで行い、ESLint, Prettierを使用するためにやることを書いていきます。

## GASプロジェクトの作成
- https://script.google.com/home
- スプレッドシートの `ツール＞スクリプトエディタ`
から作成

## 開発環境の構築
### claspのダウンロード
https://github.com/google/clasp#install
ローカルで開発しやすくするためのツール

### GASのファイルをローカルに
先ほど作成したGASプロジェクトにアクセスし、`ファイル＞プロジェクトのプロパティ`を開き、スクリプトIDをコピー
GASからローカルにファイルを持ってくる

```
clasp clone **スクリプトID**
```

- コード.js
- appscript.json
- .clasp.json

がダウンロードされる。
以下の変更を加える

- `コード.js`を`AA_main.ts`にリネーム
    - AA_とつけるのは、GASエディタ上で一番最初に表示されるように（もっといい方法があるのかもしれませんが。。）
    - 開発はTypeScriptで行います
- `src`ディレクトリの作成
- `AA_main.ts`, `appsscript.json`を`src`下に移動
- `.clasp.json`の書き換え

```json
{
    "scriptId":"スクリプトID",
    "rootDir": "./src"
}
```

### ESLint,Prettier等インストール
```sh
yarn add -D @types/google-apps-script eslint prettier eslint-config-prettier eslint-plugin-prettier @typescript-eslint/eslint-plugin @typescript-eslint/parser
```

#### `tsconfg.json`の作成

```sh
echo '{
  "compilerOptions": {
    "lib": ["esnext"],
    "strict": true,
  },
  "include": ["src"]
}' > tsconfig.json
```

#### eslint, prettierの設定ファイルの作成

```shell
# pretier
echo '{\n\t"printWidth": 120\n}' > .prettierrc

# eslint
./node_modules/.bin/eslint --init
```

prettierと組み合わせるため、作成された`eslintrc.json`を編集

```json
"extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended" //これを追加
]
```

## アップロードできるかテスト
`AA_main.ts`を書き換え

```ts:AA_main.ts
const main = () => {
  console.log("hello");
};
```

プッシュ

```
clasp push
```

スクリプトエディタにアクセスし、ログに出力されるかを確認

## おわりに
これでローカルでGASをTypeScriptでいい感じに開発することでが出来るようなりました！
【ClarisConnect】FileMakerからGoogleカレンダーにスケジュール登録する（リスケジュール編）

#関連記事
前回の記事も参照してください。
[【ClarisConnect】FileMakerからGoogleカレンダーのスケジュールを登録する](https://qiita.com/Pepo_Yama/items/f84708ba5327eba764a9)
[【ClarisConnect】FileMakerからGoogleカレンダーにスケジュール登録する（イベントidの保存編）](https://qiita.com/Pepo_Yama/items/094979590bfc564e6dca)

#この記事でできること
ClarisFileMakerからClarisConnect経由で登録したGoogleカレンダーのイベントをリスケジュール（上書き変更）する。

#使ったもの
FileMaker Pro Advanced 18
FileMaker Server 18
ClarisConnect
GoogleCalender

#成果物
##前提条件
[前回の記事](https://qiita.com/Pepo_Yama/items/094979590bfc564e6dca)の新規登録機能により、FileMakerのレコードにカレンダーのイベントidが保存されていること

##【操作】FilemMaker

FileMakerのレイアウト上で時間を18:00～19:00→10:00～11:00に変更し、「日程変更」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/259bc961-4d69-89a0-18dc-5ef2a69300cd.png)

##【結果】Googleカレンダー
元々18:00～19:00で登録されていたイベントが、10:00～11:00に変更される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/24b947aa-c36c-17da-68ca-7ff2aceba2d8.png)

#やりかた
##【Connect】リスケジュールするフローを作成
イベントを新規登録するフローと同じプロジェクト内に、リスケジュールのフローを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/e7a1ef7b-0cf0-2744-c753-147f997a3507.png)

スクリプトトリガ―は新規登録の設定と同じです。
同一プロジェクト内のフローは同じコールバックURLになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/154a3b4d-1d65-0f4c-6a23-55744f47dd28.png)

###＜重要＞リスケジュールの詳細設定
ステップはノーコードで直観的に設定できますが、日時とイベント名(name)については注意が必要。

* 日時：正規表現にする必要があります。[新規登録に関する記事](https://qiita.com/Pepo_Yama/items/f84708ba5327eba764a9)を参照してください。
* イベント名（name）：変数で渡す場合は、タイトルではなくイベントidを渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/babf292b-5995-301f-4d87-caa33db34724.png)

ドロップダウンでカレンダーのイベントタイトルを選択できますが、それにならって変数でイベントタイトルを渡しても動作しません。
変数で指定する場合は、イベントidを渡す必要があります。
イベントidの取得と保存については、[前回の記事](https://qiita.com/Pepo_Yama/items/094979590bfc564e6dca)を参照してください。

#感想
今回もうっかり日本語翻訳された状態のキャプチャですみません。

イベント名をそのまま変数で設定してもエラーになるので、苦戦しました。
テストレビューでイベントidっぽいものが表示されていたので、もしかしたら…とイベントidを渡したら正常に処理されました。
これは迷うユーザーが多いのでは・・・将来的に改善されることを希望します。
【備忘録】　VirtualBox上でホストOSとゲストOS間でコピペ可能にする設定


yum update kernel

shutdown -r now

yum info kernel

yum install kernel-devel gcc

VirtualBox→デバイス→Guest Additions CD イメージの挿入

デスクトップにCDアイコン⇒右クリック⇒open⇒VboxLinuxAdditions.runをクリック

VirtualBox→デバイス→クリップボードの共有→双方向
（これだけで出来てくれよ。。。）

reboot

-------------------
tera termを使うとわざわざこのような設定は不要でした。
[Ruby]曜日を表示するコード

#概要
曜日を表示する方法について、学習内容をまとめます。

#環境
Ruby 2.6.5

#内容
今日の曜日を表示する為には、DateクラスというRubyの標準ライブラリを使用します。

```ruby
require "date"
```

Dateクラスを使用して今日の曜日を取得するには以下のように記述します。
wdayはDateクラスに用意されているメソッドで、曜日を整数0(日曜日)~6(土曜日)で取得することができます。
変数dayに代入します。

```ruby
day = Date.today.wday
```

wdayで取得した整数に対応させるように、曜日を配列を用意します。

```ruby
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
#整数      0         1        2        3        4        5        6

```

下記のように出力してあげます。
daysという配列からday番目の要素を取り出します。

```ruby
puts "今日は#{days[day]}です"
```

出力結果(月曜の場合)

```
今日は月曜日です
```


以上
centos7.8で起動時にカーネルパニックが起きたときの対処

# はじめに

centos7.8がyum update後に起動不可になったので，その対処方法をメモ

同時期にインストールしたOSで，yum update はansibleを使って同タイミングで一括更新しているにもかかわらず，５台中１台だけカーネルパニックになり起動しなくなった
適当にググって調べた限りでは，grub.confをいじって解決している記事が多く，grub2での記事を見かけなかったので投稿しました．

# 構成

|環境||
|:-----------|:------------|
| HW | vmware workstation player 15 |
| OS | centos7.8 |
| 更新前カーネル | CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core) |
| 更新後カーネル | CentOS Linux (3.10.0-1127.18.2.el7.x86_64) 7 (Core) |

# 暫定対処

参考にさせていただいたサイトによると，grubの設定を変更して起動するカーネルを変更すれば一旦起動するとのこと

参考：
- [CentOS 6.3 - Kernel Panic](http://ayufishing.blog.fc2.com/blog-entry-12.html)

要は，起動時に読み込むカーネルバージョンを起動していたころのものにすれば，いったん起動できるとのこと
起動後にデフォルトで選択されるカーネルの変更を行う
参考にしていた記事は grub で，今回は grub2 だったため， Redhat のページを参考に下記のコマンドを実行したら起動するようになった

```
[root@CENTOS7NODE12 ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-1127.18.2.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-fa877117174942a9ad676067f5fe02d2) 7 (Core)
[root@CENTOS7NODE12 ~]# 
[root@CENTOS7NODE12 ~]# grub2-set-default 1

```

参考：
- [26.5. GRUB 2 設定ファイルのカスタマイズ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-customizing_the_grub_2_configuration_file)


# 本格対処

いったんは起動できるようになったが，他のマシンとカーネルバージョンが異なるのは嫌なのでカーネルの再インストールを行うことにした
カーネル情報は下記の通りとなっている． 
node12 のみ古いカーネルで起動している状態である．

```
[root@ANSIBLE01 ansible_work]# ansible -i /etc/ansible/hosts centos7 -m command -a "uname -r"
node1 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node3 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node2 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node11 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node12 | CHANGED | rc=0 >>
3.10.0-1127.el7.x86_64
[root@ANSIBLE01 ansible_work]# 
```

事前の状態を確認後，カーネルの再インストール

```
[root@CENTOS7NODE12 ~]# yum reinstall kernel
[root@CENTOS7NODE12 ~]# reboot
```

再インストール完了後，正常に起動するようになった．

```
[root@ANSIBLE01 ansible_work]# ansible -i /etc/ansible/hosts centos7 -m command -a "uname -r"
node1 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node2 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node3 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node11 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
node12 | CHANGED | rc=0 >>
3.10.0-1127.18.2.el7.x86_64
[root@ANSIBLE01 ansible_work]# 
```
Node-RED 自作ノードのバージョン更新方法

# Node-REDのパッケージバージョン管理
npmに公開しているnode-redの自作ノードを更新しましたが、Node-RED画面上の「パレットの管理」からインストールしたら失敗しました。
原因は、Node-red画面の「パレットの管理」からインストールするパッケージはnpmではなく [https://flows.nodered.org/node/](https://flows.nodered.org/node/)を参照するためです。

npmサーバーの更新をしたら、
[https://flows.nodered.org/add/node](https://flows.nodered.org/add/node)
の一番下の「Enter your npm module name here」を押すと、即座にnode-redのパッケージが更新されるようなので、忘れずに対処しましょう。

![スクリーンショット 2020-08-18 14.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136933/d5134673-916d-50c1-8bcd-cde00a8b6334.png)
[備忘録] ネットワークアーキテクチャについて軽く勉強してみた

##はじめに
当記事はネットワークを勉強する時に、ノート代わりにまとめたものになります(備忘録です)笑笑

## ネットワークアーキテクチャとは
ネットワークにおいて必要な論理構造や**プロトコル(通信規約)**を体系的に定めたもの。
代表例としては、OSI参照モデルやTCP/IP等がある。

## OSI参照モデル
コンピュータ等の通信機能を、7つの階層構造に分割したモデルのこと。

|OSI参照モデル||
|:--:|:--:|
|第7層|アプリケーション層|
|第6層|プレゼンテーション層|
|第5層|セッション層|
|第4層|トランスポート層|
|第3層|ネットワーク層|
|第2層|データリンク層|
|第1層|物理層|

### アプリケーション層
アプリケーションに対して、通信に必要なネットワークサービスを提供する階層。

#### 主なアプリケーション層のプロトコル

|プロトコル|ポート番号|使用用途|
|:--:|:--:|:--:|
|FTP|20|ファイル転送|
|SSH|22|安全なリモート通信|
|TELNET|23|リモート通信|
|SMTP|25|電子メール|
|HTTP|80|Web閲覧|

### プレゼンテーション層
機器固有の表現方法やネットワーク共通の表現方法の変換を行う階層。
圧縮方法や文字コード、暗号化方式等々。

### セッション層
通信の確立からデータ伝送までの通信の一連の流れを管理する階層。

#### **セッション**
ひと続きとみなされる通信状態のこと。
複数コネクションから構成される。

### トランスポート層
ネットワーク層から流れてきたデータの誤り訂正等を行い、コネクションを確立してデータを確実に伝送するための階層。

#### 主なトランスポート層のプロトコル

|プロトコル|方法|信頼性|速度|使用用途|
|:--:|:--:|:--:|:--:|:--:|
|TCP|コネクション型(双方向)|高い|遅い|web閲覧、メール送受信等|
|UDP|コネクションレス型(単方向)|低い|速い|音声通話、ビデオストリーミング等|

### ネットワーク層
**IPアドレス**から伝送先と最適ルートを判断して通信する階層。

#### **IPアドレス**
伝送元、伝送先のコンピュータを識別するための情報。
いわば、コンピュータの住所。

#### **グローバルIPアドレス**
インターネットで利用されるIPアドレス。
同じIPアドレスを持つコンピュータは存在しない。

#### **プライベートIPアドレス**
LAN等の閉じたネットワークで利用されるIPアドレス。
インターネットには利用できないが、グローバルIPアドレスに変換したらインターネットに利用可能。
このプライベートIPアドレスをグローバルIPアドレスに変換することを**NAT**という。
　
### データリンク層
**MACアドレス**を利用にして、どこに伝送するデータなのかを判断して通信する階層。
通信媒体で直接接続された機器間で通信するための仕様を定めているものを**データリンクプロトコル**という。

#### **MACアドレス**
ネットワーク機器等に付いている固有の識別番号。

#### 主なデータリンク層のプロトコル

|プロトコル|使用用途|
|:--:|:--:|
|Ethernet|LAN、WAN|
|FDDI|LAN、中枢・大規模なネットワーク等|
|PPP|電話回線等|

####**LAN(Local Area Network)**
　同じ建物内の狭い範囲でのネットワーク。

####**WAN(Wide Area Network)**
　建物同士を繋ぐ広い範囲でのネットワーク。

### 物理層
デジタルデータを電気信号に変換して送信する階層。
また、通信媒体の仕様も定める。

####**主な通信媒体**
1. 同軸ケーブル
2. ツイストペアケーブル
3. 光ファイバーケーブル
4. 無線　　　　　　　　　　等々...

## TCP/IP階層モデル
TCP/IPは、現在のインターネット通信で最も利用されている通信プロトコル。

|TCP/IP階層モデル||
|:--|--:|
|第4層|アプリケーション層|
|第3層|トランスポート層|
|第2層|インターネット層|
|第1層|ネットワークインターフェース層|

### アプリケーション層
OSI参照モデルでいう**アプリケーション層**、**プレゼンテーション層**、**セッション層**に該当する階層。

### トランスポート層
OSI参照モデルでいう**トランスポート層**に該当する階層。

### インターネット層
OSI参照モデルでいう**ネットワーク層**に該当する階層。

### ネットワークインターフェース層
OSI参照モデルでいう**データリンク層**、**物理層**に該当する階層。

## おわりに
情報セキュリティ編
https://qiita.com/N46_myHearter/items/421e214bb58e7108c9a9

データベース編
https://qiita.com/N46_myHearter/items/ea99005298c742d1934e
MacのSSHで公開鍵認証を使うときにハマった

# sshの公開鍵認証でハマった
sshの公開鍵認証をいくら設定してもうまくいかなくて、この記事
https://qiita.com/kazokmr/items/754169cfa996b24fcbf5
を参考に公開鍵を設定した。慣れれば1分くらいでできる。

しかし、ちゃんと設定しているはずなのに公開鍵認証が動かない。なぜだ。。。

#　解決策
最終的には、この記事を参考にMac自体の設定を変更したらうまくいった。
http://d-and-i.hatenablog.com/entry/2017/01/25/130000#etcsshsshd_config%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B

 ![Screen Shot 2020-08-18 at 14.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/7d79bc3f-2500-9c1d-b1ea-d479bbdc55d9.png)

Macの設定を英語にしているので表示が英語になってしまっていますが、配置はほぼ同じです。

上の画像のようにSystem Preferences(システム環境設定) -> Sharing(共有) -> Remote Login（リモートログイン）にチェックを入れて有効にしたら、sshの公開鍵認証が動いた。疲れた。。
SQL　データ加工の基礎的な方法Ⅲ

◆データを加工する（並べる）

ORDER BY 並べ替えたいカラム名 並べ方
「昇順」は「ASC」「降順」は「DESC」

例）
SELECT *
FROM purchases
ORDER BY price DESC;

WHEREと併用することも可能

SELECT *
FROM purchases
WHERE　条件
ORDER BY price DESC;

◆ある文字を含むデータを取得したい場合

例）
SELECT *
FROM purchases
WHERE name LIKE "%文字列%";

例２）
SELECT *
FROM purchases
WHERE name LIKE "プリン%";
プリンで始まる文字列

例３）
SELECT *
FROM purchases
WHERE name LIKE "%プリン";
プリンで終わる文字列

◆LIMIT　最大取得件数の設定

SELECT *
FROM purchases
WHERE 条件
LIMT 5

◆データを追加しよう
INSERT INTO students(id,name,course)
VALUES(4,"kate","java")

id部分は省略することができる

◆データの更新
UPDATE　students
SET name = "jordan", course = "HTML"  →指定するカラムを新し値にする
WHERE id = 6; →更新したいレコードを記載する

◆データを消す
DELETE FROM　students
WHERE　id = 6;
【Vue.js】src/assetsフォルダに画像ファイルを設置し、v-forで画像を表示する

## src/assets/imagesに画像ファイルを置く

```
src/
 └ assets/
     └ images/
        ├ 1.jpg
        ├ 2.jpg
        └ 3.jpg
```

## Vueコンポーネント

```vue:Sample.vue
<template>
   <div v-for="(image,i) in images" :key="i">
       <img :src="image" />
   </div>
</template>

<script>
export default {
  data() {
    return {
      images: [
        require('@/assets/images/1.jpg'),
        require('@/assets/images/2.jpg'),
        require('@/assets/images/3.jpg'),
      ],
    }
  }
}
</script>
```
Notarization 対応したアプリをデバッグする方法（macOS Catalina）

　macOS Catalina 環境向けに Notarization 対応を行ったアプリケーションは、 [Hardened Runtime](https://developer.apple.com/documentation/security/hardened_runtime) という機能が有効になっていて、デバッガをアタッチできません。

　VST プラグインのような、商用のホストアプリケーション上に動的リンクライブラリとしてロードされるプラグインを開発するときは、ホストアプリケーションにデバッガをアタッチした状態でプラグインをロードしてプラグインのデバッグを行います。そのため、ホストアプリケーションが Notarization 対応済みでデバッガをアタッチできないのは結構やっかいな問題です。

　この問題について、 JUCE[^about-juce] のフォーラムに、「ホストアプリケーションのコードサイニング情報を上書きしてしまえばデバッグできるようになる」という有用な情報がありました。

[^about-juce]: オーディオアプリケーション開発によく使用されるフレームワーク

* https://forum.juce.com/t/xcode-debugger-not-working/36964/5

　Hardened Runtime の機能は、アプリケーションに設定されたコードサイニングの情報と紐付いているため、この情報を別のもので上書きしてしまえば Hardened Runtime を無効化できるということのようです。

　実際に僕の手元の環境で試したところ、以下の手順でデバッガをアタッチできるようになりました。ここでは Ableton Live という DAW のトライアル版を使用しています。

1. コードサイニング情報を上書きした改変版アプリケーションを用意する。
    
    ```sh:改変版アプリケーションの用意
    # アプリケーションをどこかに複製する
    mkdir -p ~/Desktop/modified_daws
    sudo cp -R /Applications/Ableton\ Live\ 10\ Trial.app ~/Desktop/modified_daws
    cd ~/Desktop/modified_daws

    # 別のコードサイニング情報を上書きする
    codesign -s "<別のコードサイニング証明書名>" -f ./Ableton\ Live\ 10\ Trial.app
    ```

1. 自分が開発しているプラグインの Xcode プロジェクトを開き、デバッガ起動時にアタッチするプロセスを、上記手順で改変したアプリケーションに設定する。
1. デバッグを開始する。
1. デバッガによって改変版アプリケーションが起動される時に、アプリケーションの安全性が検証されていないという警告がでるので、 「システム環境設定」→ 「セキュリティとプライバシー」→「一般」の画面を開いて、[このまま開く] ボタンを押してアプリケーションの実行を許可する。 

## おわりに

この解決方法はかなり強引で、アプリケーションによっては問題が起きることがあるかもしれませんが、とりあえずこの方法でいけそうでした。
Eclipseを使ったtwitter4Jの環境構築メモ 

Twitter APIをJavaで動かしたいと思い、twitter4Jに出会いました。
ここに、環境構築やデバッグ時の操作についてメモを残します。

動作環境
- Windows10
- Java11
- Eclipse IDE
- twitter4J 4.0.7

#環境構築
何はともあれTwitter APIの登録を。https://developer.twitter.com/en
Consumer API keys, Access token & access token secretを取得しておきましょう。

次に、twitter4Jのダウンロード。http://twitter4j.org/ja/index.html#download
適当なディレクトリに解凍しておきましょう。

Eclipseのインストール方法は省きます。

**プロジェクト作成**
Javaプロジェクトを作成します。ここでは、TestTwitter4Jという名前にしました。
![01_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693775/6b2c1887-b5e0-2628-737a-7caee94ad8fa.png)

**JARの追加**
プロジェクト作成後、このプロジェクトからtwitter4Jが見えるようにします。
プロジェクトを右クリック→Javaのビルド・パス→ライブラリーを選択します。
「クラスパス」を選択し、「外部JARの追加」から先ほどダウンロードしたtwitter4J-core-4.0.7.jarを追加します。
twitter4J-core-4.0.7.jarは、インストール先\twitter4j\libにあります。
ほかにもいろいろ.jarファイルが見えますが、coreだけで充分だそうです。(詳しくは[公式サイト](http://twitter4j.org/ja/index.html#howToUse)で)
![02_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693775/4bf2e1c2-e4da-9f25-1901-182c1203afdd.png)

**プロパティファイル**
twitter4j.propertiesにTwitter APIから取得したConsumer API keys, Access token & access token secretをそれぞれ書きます。
ひな形は、twitter4j\binにあるので参考に。
プロパティの設定については[こちら](http://twitter4j.org/ja/configuration.html)を参照してください。
プロパティファイルは、**プロジェクトフォルダに置いてください**。

#デバッグ
あとは、普段通りデバッグすれば動きます。
twitter4Jのサンプルは、twitter4j-examplesにあるので参考に。
以下のサンプルを動かしてみます。
Twitterトレンドのロケーションを一覧表示するだけです。

```Test.java
import twitter4j.Location;
import twitter4j.ResponseList;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

public class Test {
	public static void main(String[] args) {
        try {
            Twitter twitter = new TwitterFactory().getInstance();
            ResponseList<Location> locations;
            locations = twitter.getAvailableTrends();
            System.out.println("Showing available trends");
            for (Location location : locations) {
                System.out.println(location.getName() + " (woeid:" + location.getWoeid() + ")");
            }
            System.out.println("done.");
            System.exit(0);
        } catch (TwitterException te) {
            te.printStackTrace();
            System.out.println("Failed to get trends: " + te.getMessage());
            System.exit(-1);
        }
    }
}
```

**実行結果**
以下のように表示されれば、問題ありません。
![03_debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693775/14ee5f67-2f20-3c1f-96f0-e6f72eff5850.png)

#最後に
こうして書き起こすと結構シンプルですね。
最初はよくわからないエラー吐かれたりして、対処法もわからず悩みました。
次はもっといろんなメソッド使ってみたい。
Firebase Cloud Functionsをクライアントから呼び出すと謎の認証エラーと出くわした

#Cloud Functionsをクライアントから呼ぶと謎のエラーが…

firebaseエミュレーターを使って、cloud functionsやらfirestoreやらを起動してテスト中に
クライアント(reactアプリ)から、下記のコードでcloud functionsの処理を呼び出すとエラーが…

###クライアント側
```javascript:firebase.js
export const functions = firebase.functions("asia-northeast1");

if (window.location.hostname === "localhost") {
  functions.useFunctionsEmulator("http://localhost:5001");
}
```
```javascript:app.js
  const handleEntry = () => {
    var onCall = functions.httpsCallable("entry");
    try {
      const result = await onCall({});
      console.log(result);
    } catch (e) {
      console.log(e);
    }
  };
```

###サーバー側
```javascript:index.js
const admin = require("firebase-admin");
const functions = require("firebase-functions");

const serviceAccount = require("./hogehoge.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://hogehoge.firebaseio.com",
});

const db = admin.firestore();

exports.entry = functions
  .region("asia-northeast1")
  .https.onCall( (data, context) => {
    return {
      result: true,
      message: "OK",
    };
  });

```


##エラー内容
> api.ts:54 POST https://fcmregistrations.googleapis.com/v1/projects/hogehoge/registrations 401
> app.js:100 FirebaseError: Messaging: A problem occured while subscribing the user to FCM: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. (messaging/token-subscribe-failed).

**メッセージングで認証？？？**
**Cloud Messagingなんて使ってまへんけど…**:confused:

###結局原因はわからん…:sob:

#解決方法
原因がわからんのに解決て…って感じですが、とりあえず回避する方法がわかったので残しておきます。
正式な回避方法がわかる方がいらっしゃったら、是非コメント頂けたらと…。

###悪いのはこいつっぽい
*とhogehogeでマスクしてます

```javascript:firebase.js

const config = {
  apiKey: "***",
  authDomain: "hogehoge.firebaseapp.com",
  databaseURL: "https://hogehoge.firebaseio.com",
  projectId: "hogehoge",
  storageBucket: "hogehoge.appspot.com",
  messagingSenderId: "***", /* こいつがあると上記の認証エラーが出るのでこいつをとりあえずコメントアウト */
  appId: "***",
  measurementId: "***",
};
```
**messagingSenderId**がconfigに指定されているとダメのようです。
今回はこれは使ってないのでコメントアウトして逃げます:sweat_smile:

Cloud Messaging使ってる場合はどうするんだろうか…

謎を残しつつ退散
AtCoderBeginnerContest175復習＆まとめ（前半）

# AtCoder ABC175
2020-08-15(土)に行われたAtCoderBeginnerContest175の問題をA問題から順に考察も踏まえてまとめたものとなります．
前半ではABCまでの問題を扱います．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc175)
[公式解説PDF](https://atcoder.jp/contests/abc175/editorial)

## A問題　Rainy Season
> 問題文
> AtCoder 町の、ある連続した$3$日間の天気の記録があります。天気の記録は長さ$3$の文字列$S$で表され、$i(1 \leqq i \leqq 3)$日目の天気は$i$文字目が"S"のとき晴れ、"R"のとき雨でした。
> 天気が雨である日が連続していた最大の日数を求めてください。

解説にも書いてありますが，三日間であれば，8通りしかないので，場合分け書けば通せます．
条件の順番に注意すれば，以下のような場合分けで解けます．

```python:abc175a.py
n = input()
if "RRR" in n:
    print(3)
elif "RR" in n:
    print(2)
elif "R" in n:
    print(1)
else:
    print(0)
```


## B問題　Making Triangle
> 問題文
> $1,⋯,N$の番号がついた$N$本の棒があります。棒$(i(1 \leqq i \leqq N)$の長さは$L_i$です。
> このうち、三角形を作ることのできるような長さの異なる$3$本の棒を選ぶ方法は何通りあるでしょうか。
> つまり、$3$つの整数$1 \leqq i < j < k \leqq N$の組であって次の$2$つの条件の両方を満たすものの個数を求めてください。
>　・$L_i,L_j,L_k$がすべて異なる
>　・$3$辺の長さが$L_i,L_j,L_k$であるような三角形が存在する

全ての辺が異なる条件は簡単なので，三角形が成り立つ条件に関してですが，$3$辺の長さを$L_i < L_j < L_k$とすると，$L_i + L_j > L_k$のとき三角形が存在します．
最初に$N$本の棒をソートすることで，$N$本から$3$本選んだとき，選ばれた$3$本の中で一番右側が一番大きい値になります．
$N$は100以下なので，時間内に全組み合わせを調べることができます．

```python:abc175b.py
n = int(input())
l_list = list(map(int, input().split()))
l_list.sort()
count = 0
for i in range(0, n - 2):
    for j in range(i + 1, n - 1):
        for k in range(j + 1, n):
            a = l_list[i]
            b = l_list[j]
            c = l_list[k]
            if a == b or b == c or c == a:
                continue
            if a + b > c:
                count += 1
            else:
                break
print(count)
```


## C問題　Walking Takahashi
> 問題文
> 数直線上で暮らす高橋君は、今座標$X$にいます。これから高橋君はちょうど$K$回、座標の正または負の方向に$D$移動する行為を繰り返そうと考えています。
> より正確には、$1$回の移動では座標$x$から$x+D$または$x−D$に移動できます。
> 高橋君は、ちょうど$K$回移動した後にいる座標の絶対値が最小となるように移動したいです。
> $K$回の移動後の座標の絶対値としてあり得る値の最小値を求めてください。

最初，座標$X$にいますが，求める最小値は座標の絶対値であることから，$X$と$-X$の答えは一致する．
$0 \leqq X$のときを考えると，移動回数$K$に制限がなければ，$X$を$D$で割った余り$T1$か，$T1$から$D$を引いた$T2$のどちらかが答えになる．(座標の絶対値を小さくしたいので，原点近くで行ったり来たりするのがベスト)
まず，$T1$に到達できるかどうかを判定し，到達できない場合は，$X$から移動回数×$D$を引いた値が答えとなる．
$T1$に到達できる場合，必ず$K$回移動しなければならないので，それまでに移動した回数から残りの移動回数を計算し，残りの移動回数が偶数か奇数かで，$T1$か$T2$が決まる．
$T2$は負となるため出力に注意．

```python:abc175c.py
x, k, d = map(int, input().split())
if x < 0:
    x *= -1
t1 = x % d
t2 = t1 - d
n = (x - t1) // d
if k < n:
    print(x - k * d)
else:
    n = k - n
    if n % 2 == 0:
        print(t1)
    else:
        print(-t2)
```

前半はここまでとなります．
夏休み中ですが，論文が条件付き採録になって回答書作りで忙しいため，後半は時間ができたら書きたいと思います．
最後まで読んでいただきありがとうございました．
GKE <-> EKS コマンド対応表

個人的なメモです。随時更新。


```bash
$ gcloud auth list <-> aws sts get-caller-identity
$ gcloud container clusters list <-> aws eks --region=ap-northeast-1 list-clusters
$ gcloud container clusters list <-> eksctl get cluster
$ gcloud container clusters get-credentials <cluster-name> --region xxx <-> aws eks --region=ap-northeast-1 update-kubeconfig --name=<cluster-name>
$ gcloud container clusters resize num-nodes=0 <-> aws eks delete-nodegroup  --cluster <cluster-name> --nodegroup <nodepool-name> // 0個に指定はできさなそうなのでノードプール削除する
$ gcloud container images xxx <-> aws ecr describe-repositories
$ gcloud container images xxx <-> aws ecr list-images  --repository-name "repo name"
```

## 番外編
```
gcloud redis list <-> aws elasticache describe-cache-clusters --show-cache-node-info
```
J:COMのZAQ無線LAN内蔵ルータ HUMAX HG100R-02JGでポート開放につまった

かなり初歩的な内容です．
# 問題
表題の通り．
LAN内にWebサーバを立てて，外部からのアクセスをしようと，ルータでポートフォワーディングを行ったが，
`504 Gateway Timeout`と表示され接続できずに困っていた．
## 環境
- Raspberry Pi 4
- Raspbian
- Apache2

# 解決方法
有効化前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402702/6a1e683a-1226-7918-7838-37d6bcf36754.png)
有効化後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402702/15cbe40c-e075-c872-c85b-af29fae9af09.png)

1. LAN内からルータ(192.168.0.1)にアクセス
2. 詳細設定→フォワーディングと進み，ポートフォワーディングの設定を行う
3. **有効ボタンを押し，設定を有効化する**

手順3，デフォルトだと有効化されておらず，接続できませんでした．

くだらないことですが，誰かの役に立つこともありうるかもしれない．
ARCoreアプリが起動直後に必ず落ちる問題

## 忙しい人向け
64bit対応をするのです。

## 環境
|     モジュール    | バージョン  |
|:----------------:|:----------:|
| Unity            | 2019.4.1f1 |
| ARFoundation     | 2.1.8      |
| ARCore XR Plugin | 2.1.11     |

## 現象
上記環境でARCoreの最低限の設定を行いビルドを行うと、正常にapkは生成されます。
しかしapkを転送してアプリを実機(Pixel3)で実行させると、Unityロゴ表示後、一瞬アプリの画面が表示(カメラ映像は出ていない)されてから、アプリが必ず異常終了してしまいます。

なお、過去にUnityで作成して動作していたハズの他のARCoreアプリケーションについても、同様の現象によってUnityロゴ表示後に異常終了をしてしまいます。

## 原因
原因は以前からアナウンスされていた、以下URLのARCore 64bit要件によるものらしいです。

ARCore 64-bit requirement
https://developers.google.com/ar/64bit

> In August 2020, Google Play Services for AR (ARCore) removed support for 32-bit-only apps on 64-bit devices running Android 10 (API level 29) and later.

これによって2020年8月以降、Android10を搭載した64bit端末上で、ARCoreを利用した32bitのみのアプリケーションは動かなくなってしまったようです。

## 解決策
Android Developersの以下のURLの項目通り、
1. [Scripting Backend]を[Mono]から[IL2CPP]へ変更
2. [Target Archtecture]で[ARM64]を有効にする
3. 通常通りビルド実行
すると、動くようになると思います。

64 ビット アーキテクチャのサポート
https://developer.android.com/distribute/best-practices/develop/64-bit#change-build-settings

## さいごに
かなり以前からアナウンスされている事だったので、わかっている人にとっては当たり前の事だと思います。
が、自分のようにたまにちょっとARCoreのアプリをテスト的に作るかー！みたいな人だと、何で落ちんねん・・・。何で前動いていたアプリすら落ちんねん・・・。となってしまうのではないかと思います。きっとそうです。そんな人たちの助力になれば。
jsonから取得した文字が文字化けしてしまう

jsonから取得した文字列をUILabelで表示したところ、
シミュレータでは大丈夫なのですが、実機確認したところ文字化けをします。
原因が分からないので、対応方法がわかりません。どなたか教えていただけると助かります。
また、文字化けを起こす時と起こさない時で、文字の区切られる位置が変わります。

シミュレータ
文字列:

支給
あり）

実機
文字列:
支給あり？？？　←黒い六角形に白でハテナが3つ出る。

使用フォント:Hiragino-Sans
使用ラベル:attributedText
グローバルにインストールした kintone-cli を最新版にアップデートする

グローバルにインストールした kintone-cli をアップデートする際のメモです。

# グローバル一覧を確認

```
$ npm ls -g | grep kintone-cli
├─┬ kintone-cli@0.1.0 (git://github.com/kintone/kintone-cli.git#2029fbd72e2d9c295267e80e0a6a9f7ca718aa33)
```

# 古くなっているパッケージの確認

```
$ npm -g outdated
Package            Current  Wanted  Latest  Location
kintone-cli          0.1.0     git     git  global
```

# アップデート実行

```
$ npm update -g kintone-cli
```

# バージョン確認

```
$ kintone-cli -V
0.1.5
```

# 参考

* https://docs.npmjs.com/cli-commands/outdated.html
* https://docs.npmjs.com/cli-commands/update.html
* https://github.com/kintone/kintone-cli
Dockerコンテナ上でのbundle installコマンドがcode: 15でエラー終了する時はBUNDLE_PATHの設定を確認する

# 事象
### Docker Imageをクリアした日からCIがエラー終了するようになった
`bundle install --clean`が失敗するようになってしまった。

```
Bundle complete! 62 Gemfile dependencies, 187 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Cleaning all the gems on your system is dangerous! If you're sure you want to
remove every system gem not in this bundle, run `bundle clean --force`.
Service 'xxxx' failed to build: The command '/bin/sh -c bundle install --clean' returned a non-zero code: 15
```
一度`Bundle complete!`と表示されるのだが、その後`Cleaning all the gems on your system is dangerous!`として`code: 15`を返してエラー終了してしまっている。

----

問題となったコンテナのDockerfile

```
FROM ruby:2.6.5
ENV RUBYOPT -EUTF-8
ENV LANG C.UTF-8
RUN gem install rails -v 6.0.2
# 以下略
```

# 原因
RubyのDocker Imageに入った下記の変更により、BUNDLE_PATHが自動で設定されなくなっていた。
[Stop setting \`BUNDLE_PATH\` by deivid-rodriguez · Pull Request #306 · docker-library/ruby](https://github.com/docker-library/ruby/pull/306)

Dockerfile上では`BUNDLE_PATH`を指定していなかったため、Imageでの設定が削除されたことで`BUNDLE_PATH`の指定が空になってしまい、対象がグローバルになってしまった。
だから以下のようなメッセージが表示されたと考えられる。

```
Cleaning all the gems on your system is dangerous! If you're sure you want to
remove every system gem not in this bundle, run `bundle clean --force`.
```

しばらくはキャッシュで古いイメージを使っていたため問題が発生しなかったが、キャッシュをクリアしてImageを再取得したことで問題が発生した。

# 対応
`ENV BUNDLE_PATH=$GEM_HOME`をDockerfileに追加することで解消した（上記PRで削除された箇所を、自前のDockerfileに記載する形）。
（最初はdocker-composeファイルの`environment`に追加したのだがエラーが解消されませんでした。急いでいたので詳しく検証はできていないですが…）

# 参考
[Newest version breaks build - 'Cleaning all the gems on your system is dangerous!' · Issue #3271 · rubygems/rubygems](https://github.com/rubygems/rubygems/issues/3271)
GrafanaのVariables Queryに$timeFilterを使う方法

## Template variablesとは

[公式ドキュメント](https://grafana.com/docs/grafana/latest/variables/templates-and-variables/)より。
> A variable is a placeholder for a value. You can use variables in metric queries and in panel titles. So when you change the value, using the drop-down list at the top of the dashboard, your panel’s metric queries will change to reflect the new value.
> Variables allow you to create more interactive and dynamic dashboards. Instead of hard-coding things like server, application, and sensor names in your metric queries, you can use variables in their place. Variables are displayed as drop-down lists at the top of the dashboard. These drop-downs make it easy to change the data being displayed in your dashboard.

ダッシュボード読み込み時にvariableを動的生成する場合、[Query variable](https://grafana.com/docs/grafana/latest/variables/variable-types/add-query-variable/)を使えばよい。
InfluxDBの場合は通常`Query`欄に以下のようにクエリを指定する。

```
SHOW TAG VALUES FROM "<measurement>" WITH KEY = "<tag key>"
```

## Template variableに時間による絞り込みを加える

上記の`SHOW TAG VALUES`クエリの場合、過去すべての`<tag key>`の値が表示される。過去の値すべてが不要なケースにおいて、いつまでもTemplate variablesに値が残ってしまうのは都合が悪い。

`SELECT`クエリと同様に`SHOW TAG VALUES`クエリが以下のようなWHERE句を解釈できればよいか、あいにくサポートされていない。

```
SHOW TAG VALUES FROM "<measurement>" WITH KEY = "<tag key>" WHERE $timeFilter
  or
SHOW TAG VALUES FROM "<measurement>" WITH KEY = "<tag key>" WHERE time > now() - 1h
```

ワークアラウンドとして、`SELECT`クエリを使っう以下の方法ならうまく機能するようだ。

```
SELECT "<tag value>" FROM ( SELECT "<field>", "<tag value>" FROM "<measurment>" WHERE $timeFilter )
  or
SELECT "<tag value>" FROM ( SELECT "<field>", "<tag value>" FROM "<measurment>" WHERE time > now() -1h )
```