OmniAICreator/Qiita-1.07M huggingface dataset:
複数のNode-REDを連携させる

# はじめに
## やりたいこと
* ラズパイにあるローカルのNode-REDとbluemixにあるクラウドのNode-REDを連携させたい
    * コールバックのドメインが必要な場合や、外出先から入りたい場合があり、ローカルだけに片寄ができないんです。。。

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 動作環境

* ローカル
    * RaspberryPi : 3
    * raspbian : 9.8
    * Node-RED: v19.4 
* サーバ
    * Node-RED : v20.5

# 本編
## プロトコル
今の所どんなプロトコルでもよいのですが、3種類を検証しました。

* http(get)
* http(post)
* websocket

基本的に、Node-REDはWebサーバの機能を持つので、サーバ側にクライアント側が接続しにいくイメージです。

## http(get)
* サーバのフロー

![s_http_get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/ed51f816-4d76-7fb3-3394-3f24f4d14f6c.png)

* クライアントのフロー

![c_http_get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/9fa15450-f4e3-736c-1926-68792cdb9c7b.png)

### 補足
* サーバ側はURLを設定し、クライアントに返すデータをfunctionノードでmsg.payloadに詰めます
* クライアント側は、単純にGETでURLを叩きます

## http(post)

* サーバのフロー

![s_http_post.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/028e8011-02f8-d990-03c1-7b72f8fb099c.png)

* クライアントのフロー

![c_http_post.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/0e6a98fe-48a2-cefa-7268-9772e3ec8461.png)

### 補足
* サーバはgetと同じく、URLを設定し、クライアントに返すデータをfunctionノードでmsg.payloadに詰めます
* クライアント側はサーバに送りたいデータをmsg.payloadに詰めてからPOSTで呼び出します
## websocket

* サーバのフロー

![s_wss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/998f6da5-4e55-82d6-a507-8ac9238fc957.png)

* クライアントのフロー

![c_wss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/c888c0bf-e51d-1ec9-ca78-3968091f3c2a.png)

### 補足
* サーバはURLを設定し、種類=待ち受けでWSの設定を行います。
* クライアントは、種類=接続でwsの設定をします
* 図の構成にすると、クライアント側のデータが一周回ってクライアントに帰ってきてデバッグノードから出力されました。
    * サーバ側は一周回りませんでした。

# 結論
* どれを使っても非常に簡単でした!! 
* bluemixはsecure通信ですが、特に何もしなくても(プロトコルとしてhttpsやwssにするだけで)動作しました
Python個人的メモその3：スライス編～「始め：終わり：間隔」が基本！～

#はじめに
pythonにはとっても便利な仕組みがあります。そのうちの一つが**スライス**。
どんなものかは例を見ればすぐわかります。


#リスト操作
要素数10のリストの中から(先頭を0番目として)「2番目から4番目」を取り出したいときどうします?
わざわざfor文を回しますか? pythonではそんな必要はありません。
こうすればよいのです。

```python:slice_list
l=[10,9,8,7,6,5,4,3,2,1]
print(l[2:5])  #[8,7,6]
```

`リスト名[始め:終わり]`と指定すると，リストの一部分を取り出せるわけです．
結果からわかるように、`l[2:5]`と指定したとき2番目から3番目までしか取れていません。これは、このように考えると納得がいきます。
【0】10【1】9 **【2】** 8【3】7【4】6 **【5】**
### 間隔を指定する
また、奇数番目の要素だけ取り出したいとき、つまり1番目から一つ飛ばしで取り出したいときはこのようにします。

```python:slice_list_odd
l=[10,9,8,7,6,5,4,3,2,1]
print(l[1:10:2])  #[9,7,5,3,1]
```

今度は`リスト名[始め:終わり:間隔]`としました．間隔は省略可能で、その場合1がデフォルトの値として扱われます。
なお、始めと終わりも同様に省略ができ、例えば`[:]`は`[0:len(l)]`を意味します。これはつまり元のリストと等しいですね。
### 負の値も指定可能
また、これらに負の値を設定することも可能です。
`l[-2:]`の結果はこのようになります。

```python:list_slice_minus
l=[10,9,8,7,6,5,4,3,2,1]
print(l[-2:])  #[2,1]
```
「終わりから数えて2番目」から最後までが取り出されました．以下のように考えることが出来ます．


【-5】5【-4】4【-3】3 **【-2】** 2【-1】1

また，間隔に-1を指定すると，逆からリストを取り出せます(順序が逆転するということです)．
ちなみに同様の操作は`リスト名.reverse()`でも可能です．

```python:list_reverse
l=[10,9,8,7,6,5,4,3,2,1]
print(l[::-1])  #[1,2,3,4,5,6,7,8,9,10]
```

#文字列操作

さて、この「始め:終わり:間隔」の考え方は他の場面でも使えます。

文字列は，リストと同じように扱うことが出来ます．(ただし文字列は変更不可なので注意)
どういうことかというと、文字列のある一部分を取り出したいときにも、「始め:終わり:間隔」のスライスが使えるということです。

```python:str_slice
s='abcdefg'
print(s[2:6])  #'cdef'
#変数に入れなくても同じように扱える
print('abcdefg'[2:6])  #'cdef'
```

### 文字列に新たな文字を挿入/置換する
スライスを使うと，本来変更不可な文字列に新たに文字を挿入することが出来ます．
要は入れたい位置で文字列を二分割して，その間に文字を挿入してから再びくっつければよいのです．
少し変えると挿入ではなく任意の位置の文字を置換できます．

```python:insert_str
#0から数えて5番目の後に挿入
def insert_str(s, c, idx):
    return s[:idx] + c + s[idx:]

#0から数えて5番目を置換
def replace_str(s, c, idx):
    return s[:idx] + c + s[idx+1:]

s='123456'
print(insert_str(s, 'A', 2))  #'123A456'
print(replace_str(s, 'A', 2))  #'12A456'
```


#range
厳密にはスライスと呼ばれるものではないと思うのですが、「始め:終わり:間隔」の考え方は同じなので取り上げます。

for文を回す時，しばしばrangeを用います．

```python:range_sample
s=''
for i in range(5):
    s += str(i)
print(s)  #'01234'
```

このrangeは **コンマ区切りで** 始めと終わりと間隔を指定できます．

```python:range_sample2
s=''
for i in range(1,10,2):
    s += str(i)
print(s)  #'13579'
```

ただし，`range(1,,2)`などはエラーになるので注意が必要です．

###おまけ：enumerate
rangeを取り上げたのでどうせならenumerateも紹介しておきます．
もはやスライスでも何でもないのですが．
リスト内の全要素に順番にアクセスするとき，indexも同時に取得したい時に使います．
for文を書く際，リストをenumerateで包むだけです．
第二引数に数字を指定すると，indexがどの数字で始まるかを指定できます．全要素を取得することに変わりはありません．

```python:enumerate_sample
l=['a','b','c','d']
#index,value
for index, name in enumerate(l):
   print(index, name)
'''
0 a
1 b
2 c
3 d
'''

#第二引数は，indexをどの数字から始めるか指定する(全要素を取得すること自体は変わらない)　省略すると0
for index, name in enumerate(l,1):
   print(index, name)
'''
1 a
2 b
3 c
4 d
'''
```
#おわりに
スライス操作は非常に強力です．ぜひマスターしましょう．
モダンな技術で安全なアプリ開発

#本記事の目的
アプリを安全に開発するために学んだことをまとめます

#安全とは
以下の事項に着目しました
1.　開発したアプリが意図した通りに動作する
2.　実装した内容を明確に把握できる
3.　機能向上やバグフィックスが行える

#安全の重要性
1. アプリ全体が意図した通りに動作することで、人間の要求を満たせる
2. 既存の実装を明確に把握することで、その後意図した実装を行える
3. アプリは機能向上とバグ改善が避けられない

# 実現のために
基本的なツール、設計手法、マインドセットは以下のものだと考えています
1. Gitを使う
2. テストを書く
3. 可読性を保つ
4. 凝集度・結合度

以下では一つずつ見ていきます

## Gitを使う
Gitはバージョン管理ツールです。これによって、実装内容のセーブと差分比較が行えます。

実装内容をセーブできるメリット
1.　新しい実装内容を、それまでの実装と明確に区切って実装できる（安心していじれる）
2.　間違えた修正を行った時に、戻りたいセーブ地点まで完全に戻れる

差分比較のメリット
1.　どこでバグを生んだか見当がつけやすい(変更差分のある所にバグはある)
2.　チームレビューや自分で見直す時に、変更内容を把握できる

メリットをなくさないために
セーブ地点でちゃんと変更内容をコメントする
変更内容を細かく区切って、一つの変更ごとに一つのコミット（セーブ）を行う

## テストを書く
テストは大きく分けると以下の２つがあります
1. ユニットテスト
2. インテグレーションテスト

ユニットテストは、関数などのモジュール毎に動作を確認するために行います。
インテグレーションテストは、ユニットテストで確認したモジュールを組み合わせてちゃんと動作するか確認を行います

テストを書くメリット
1. モジュールが意図した通りに動くか（テスト本来の役割）
2. 意図した動作ができているかのテストを書くことで、テストケースが仕様書になる（実装内容の把握）
3. リファクタリングでバグを生んでないか確認できる（テストがこけてはダメ）

インテグレーションテストは複数のモジュールが組み合わさるので、変更に弱くテストの寿命が短くなります。
そのため、インテグレーションテストでは、必要不可欠な機能の動作確認を行えるレベルで行うべきです。

メリットをなくさないために
ユニットテストは可能な限り細かく行う（初めが肝心）
機能改善をしたときにはテストはこけるので、新しくテストを書き直す
Gitでリモートレポジトリにpushしたときに、CIツールを用いてテストを自動化することでテストを要所要所で走らせる

## 可読性を保つ
可読性とは、実装内容の理解のしやすさの度合いです。実装内容の素早い理解は開発速度も上げます。

以下のことを心がけることが必要条件です
1.　変数、関数、クラスなどの名前はその内容が把握できるようにつける（プログラムはそれらから構成される）
2.　直感的な実装方法を選ぶ（レビュー時に説明・理解できない内容は複雑な実装！！）
3.　モジュールは大きくなりすぎないように作る（複雑なものは理解しづらい、疲れる、楽しくない）

## 結合度・凝集度
抽象的な概念ですがイメージとしてこの二つは、コードのスパゲッティ化を抑えるための概念です。
以下で結合度が低い、凝集度が強いについて説明しますが、一般にこれは良い特徴です。
これらの特徴を持ったモジュールの設計を行うと、それぞれのモジュールの影響範囲がどこまで及ぶか把握しきれず、それらから構成されるプログラムの実装内容は、把握したくても把握できないアプリになってしまいます

結合度が低い良いモジュールとは、他の部分の実装内容に依存せず、それだけで動作できるモジュールです。
アンチパターンの代表は、他のモジュールのデータを操作したり、複数のモジュールがグローバル変数を共有したり、他のモジュールの実装ありきでモジュールを作成するなどです。他のモジュールの実装を意識して、新たに実装を行うのは結合度が高くなるので避けるべきで、そのことに気づいたときに踏みとどまるべきです。

凝集度が強い良いモジュールとは、その中の機能がすべて関連し合っていて、変更するときにすべて同時に変更されるようなモジュールです。オブジェクト指向のクラスで例えると、その中のメソッドがすべて、そのクラスが果たすべき役割を果たすのに必要なものだけが集まっているものです。良いモジュールであれば、そのモジュール内のメソッドはすべて一つの目的を達成するために存在しているので、一通りみればそのモジュールの役割が理解できるものになっています。

要するに良い特徴とは、一つのモジュールは一つの役割を担当し、他の役割は他のモジュールに任せることで、他のモジュールに影響を与えず実装もわかりやすいということです。どちらの概念も一つのモジュールは自分の役割に専念し、他の内容の事を考えないということです。もし、他の機能が必要なら、その機能を満たしているモジュールを呼び出して使うことで解決します。

したがって、アプリは単一の責任を持ったモジュール群のオーケストレーションで意図した動作を発揮することが大事です
【Oracle】クエリパラメータ(バインド変数)を使うとパフォーマンスが悪くなることもあるバインドピーク問題

# はじめに
サーバーリプレースでOracle 11gからPostgreSQL 9.6に移行し性能検証をしています。
性能検証ということでデータ量をかなり多くしてOracle 11gとPostgreSQL 9.6で既存アプリケーションを使用してみるわけです。

今年リリースしたASP.NETアプリケーションがあるのですが、PostgreSQL 9.6では少し時間がかかるものの抽出結果が表示されてくるのですが、Oracle 11gではまったく結果が返ってこないのです。
これでは性能検証として比較するどころではないわけです。

# 調査
Oracle 11gで実行したSQLをデータベース接続ツールで実行すると結果が返ってくるわけです。
データベース接続ツールはJDBCドライバーを使用しており、ASP.NETアプリケーションではODP.NETを使用しています。そこで違いが何かあるのかと、フォームとボタンのみの簡易アプリケーションを作成してSQLを実行すると結果が返ってくるわけです。

実際のアプリケーションでは、クエリパラメータ(バインド変数)を使用しており、データベース接続ツールで実行する際にはバインド変数のパラメーターを置き換えた状態で実行しておりました。

簡易アプリケーションでも同様にクエリパラメータ(バインド変数)を使用した状態に書き換えて実行してみたところ、結果が返ってこない状態になりました。

# 原因
ネットで「Oracle 結果が返ってこない バインド」で検索すると「バインドピーク」というキーワードが引っ掛かってきました。そこで「バインドピーク」で検索すると下記サイトが見つかりました。

* [[Oracle] バインド・ピーク機能の落とし穴](https://ameblo.jp/archive-redo-blog/entry-10042452810.html)
* [門外不出のOracle現場ワザ 第4章　Oracleデータベースの頭脳 「オプティマイザ」徹底研究](https://www.oracle.com/technetwork/jp/articles/chapter4-2-100886-ja.html#p01e)
* [バインドピーク機能とは](http://www.doppo1.net/oracle/admin/bind-peek.html)
* [バッチ処理にバインド変数はもうやめません？ ~|バッチ処理の突発遅延を題材にして考えてみる~ SlideShare](https://www.slideshare.net/ryotawatabe/120406-bind-variablesonbatch)

## バインドピーク機能とは
バインドピーク機能は9iから追加された新機能で、バインド変数を含むSQL文でオプティマイザが実行計画を生成する際、実際にバインド変数にセットされた値を考慮(覗く(peek)し実行計画を立てることができるようになる機能です。

### バインドピーク機能のメリット
内部デフォルト値ではなく、ユーザーが指定した実際の値(バインド変数)と統計を利用できるため、より適切な実行計画が選択されるようになります。 

### バインドピーク機能のデメリット
バインド変数にセットされる値が不定の場合、実行計画が安定しなくなる。
ハードパース時にその時にバインド変数にセットされていた値をもとに実行計画が立てられますが、 これは統計情報に変化がなくともハードパース時にセットされていたバインド変数値によって実行計画が変わってしまう可能性がある。
11g以降、このデメリットを解消しうる機能として11gR1で優れたカーソル共有、11gR2でカーディナリティフィードバック、12cR1で適応計画といった新機能が追加されていますが、いずれの機能もこのデメリットを完全に払拭できていない。

## 主原因
抽出条件を変えながらSQLを10回程度実行してテーブルに登録しています。
SQLは同じテーブルを自己結合しているのですが、抽出条件によってレコード数の落差が激しいのではないかと、一番最初に抽出するレコードが少ない状態で実行計画が作成され、多い状態の際にフルスキャン状態になってしまっているではないかと考えています。

### バインド変数化を盲目的に推奨する風潮
>バインド変数化を盲目的に推奨する風潮？
• バインド変数化の有無は、開発者がそれぞれ のSQLごとに判断する必要がある 
– 現在のOracle Databaseでは・・・残念ながら
• しかし、盲目的に「バインド変数化＝善」と判断している風潮が見られる
– コーディング規約でのルール化
– DBアクセスロジックを過度に共通化突発的なパフォーマンスダウンを避けるため、盲目的にバインド変数を使用することは避けてほしい
[バッチ処理にバインド変数はもうやめません？ ~|バッチ処理の突発遅延を題材にして考えてみる~ SlideShare](https://www.slideshare.net/ryotawatabe/120406-bind-variablesonbatch)

SQLをバインド変数にして実行することは、パフォーマンスを良くする、SQLインジェクション対策などのメリットがあり、デメリットがあることは考えたことがありませんでした。コーディングルールでも指定されてたりと、まさに指摘されてるように盲目的に「バインド変数化＝善」という考えでした。

# 対応
|No|対処策|説明|
|--:|:--|:--|
|1|SQLをリテラル（バインド変数を使用しない）に修正|リテラル値（≒WHERE条件）毎に実行を作成<br>→異なるWHERE条件が指定された SQLに対して、1つの実行計画を使いまわさないようになる|
|2|実行計画を誘導（ヒント、アウトライン、SQL実行計画管理）|指定した実行計画が作成される<br>→実行計画がバインド変数値に依存しないようになる|
|3|バインドピークを無効化(\_optim_peek_user_binds=false)|デフォルト値を基準に実行計画を作成する<br>→実行計画がバインド変数値に依存しないようになる|

1のSQLをリテラルに修正、プログラム的にあまり変更しないようにSQLはバインド変数を残したまま、実行前に値に置換する関数を作成しました。
ところが、SQLをリテラルに修正したにも関わらず、抽出条件によって遅いものが出てきてしまいました。よって、2の実行計画を誘導のヒント句を追加しました。
OracleとPostgreSQLでプログラムは共通化しているため、Oracleのみヒント句を追加。

※3のバインドピークを無効化は、Oracle上は「隠しパラメータ」で通常は「サポートセンターの指示なしでは設定すべきでない」パラメータなので今回は対策として除外します。

# 最後に
対応して結果は返ってくるようになったものの、PostgreSQLとの速度差は歴然としている。
SQL自体をそもそも見直す必要があるのかも知れません。
[JavaScript]オブジェクトのキー名をsnake_caseからlowerCamelCaseに変換する

こんな感じで出来るはず。

```javascript:camelConverter.js
class CamelConverter {
  static convert(obj)  {
    return Object.keys(obj).reduce((acc, key) => {
      // 値がobjectの場合は再帰的にconvertを実行
      if(Object.prototype.toString.call(obj[key]) === '[object Object]') {
        acc[this.toCamel(key)] = this.convert(obj[key]);
        return acc
      }
      acc[this.toCamel(key)] = obj[key];
      return acc
    }, {});
  };

  // snake_caseの単語をlowerCamelに変換する
  static toCamel(str) {
    return str.replace(/_(\w)/g, (_match, capture) => {
      return capture.toUpperCase()
    });
  };
}

export default CamelConverter
```

テストはこちら（Jest）

```javascript:camelConverter.test.js

import CamelConverter from './camelConverter'

describe('CamelConverter', () => {

  describe('#convert', () => {
    test('Key名をキャメルケースに変換する', () => {
      const snakeCase = {
        id: 1,
        property_string: 'string',
        property_int: 1,
        property_boolean: false,
        property_object: {
          inner_property_string: 'string',
          inner_property_int: 1,
          inner_property_boolean: false,
        }
      };
      expect(CamelConverter.convert(snakeCase)).toStrictEqual({
        id: 1,
        propertyString: 'string',
        propertyInt: 1,
        propertyBoolean: false,
        propertyObject: {
          innerPropertyString: 'string',
          innerPropertyInt: 1,
          innerPropertyBoolean: false,
        }
      })
    });
  })
})

```
[Mac]地理院の10mメッシュデータをgrdファイルに変換した備忘録

国土地理院が公開している基盤地図情報は、そのままではGMTで取り扱うことができません。
今回はMacで10mメッシュデータ(xml)をgrdファイルに変換した備忘録です。

##環境
Mac mini(2018)
macOS Mojave 10.14.5


##必要なもの
基盤地図情報ダウンロードサービス　会員登録
<b>GMT4←ここ重要！</b>

##1. 国土地理院HPからデータを入手
[ここ](https://fgd.gsi.go.jp/download/menu.php)へアクセスし、<b>基盤地図情報数値標高モデル</b>の<b>ファイル選択</b>をクリックします。
デフォルトでは5mメッシュになっているので、<b>10mメッシュ</b>をクリック。
![スクリーンショット 2019-05-25 19.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415028/0cd7518e-002b-b247-fda3-877799c7d70a.png)

データが欲しいエリアを選択した後、<b>ダウンロードファイル確認へ</b>をクリックすると、ダウンロードファイルリストが出てきます（下図参照）。
<b>このページをまとめてダウンロード</b>を選択します。ここで会員IDが求められるので入力します。



![スクリーンショット 2019-05-25 19.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415028/e528259d-1831-ee9b-c1e7-3a4295566d74.png)

アンケートに答えたら、あとは未ダウンロードファイルがなくなるまで「このページをまとめてダウンロード」を連打すればOKです。

##2. Zipファイルを解凍
ターミナルを起動しダウンロードファイルのあるディレクトリに移動したら、以下のコマンドを実行しましょう。（一つずつ解凍したらキリがないので）

```ruby:Terminal
find . -name '*.zip' -exec unzip -d data {} \;
```

これを実行すると、ディレクトリ内にdataディレクトリが作成されます。
解凍して生成されたxmlファイルは、このdataディレクトリにあります。

##3.grdファイルに変換
産総研の野田さんが、xmlファイルをgrdファイルに変換するperlファイルを作成してくださっているので、有り難く使用させてもらいます。

まず[野田さんのHP](https://fgd.gsi.go.jp/download/menu.php)から`jpgis2grd.pl`をダウンロードします。
このperlファイルを`2. Zipファイルを解凍`で作成したdataディレクトリに入れます。

このperlファイルですが、GMT4環境では上手く動きません。
しかし、[sfuno's blogさんの記事（削除済み）](https://sfuno.hatenablog.com)によると、perlファイルの<b>110行目</b>にある 
`<^\s*$> `を `<\/gml:tupleList> `に置き換えると良いらしいので、perlファイルの<b>110行目</b>を以下のように書き換えます。


```ruby:Atom
if (/\/gml:tupleList/) { $data_on = 0; $n = 0; } # 空行ならデータ行は終了;
```



あとは野田さんのperlファイルを走らせるだけですが、<b>以下の作業はGMT4の環境下で行わないと失敗します。</b>
ターミナルでdataディレクトリに移動し、

```ruby:Terminal
perl jpgis2grd.pl
```

を実行します。
xmlファイルの量によっては滅茶苦茶時間がかかるので注意。

生成されたout.grdファイルを使うと、こんな図ができます。(プレビューでカット＆リサイズ済)
ちなみに下図は千葉県の外房あたりです。
![chibamap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415028/d7d2cc43-589a-531c-8210-ba2a987bbd0b.jpeg)



##参照サイトなど
[[shell]フォルダ内にある大量のZIPファイルをまとめて解凍する](https://4to.pics/article/post/112)

[JPGIS形式をgrd形式へ変換](https://staff.aist.go.jp/a.noda/programs/jpgis2grd/jpgis2grd.html)

[sfuno's blog](https://sfuno.hatenablog.com)

画像1~2枚目出典
地図基盤情報　ダウンロードサービス(一部改変)
Arch Linux に yay をインストール

Arch Linux に yay をインストールする方法です。

必要なライブラリーのインストール

```bash
sudo pacman -S git
sudo pacman -S fakeroot
sudo pacman -S binutils
sudo pacman -S make
sudo pacman -S gcc
```

```bash
sudo pacman -S --needed git base-devel
```

```bash
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
```

インストールできたことの確認

```text
$ which yay
/usr/bin/yay

$ yay --version
yay v12.4.2 - libalpm v15.0.0
```

yay の使い方
例えば　python-dotenv のインストール

```bash
yay -S python-dotenv
```

ソフトの更新

```bash
yay -Syu
```

次のエラーが出た時は、yay を再インストールすれば、修復します。

```text
$ yay --version
yay: error while loading shared libraries: libalpm.so.12: cannot open shared object file: No such file or directory
```
【JSメモ】for, for ... in, for ... of の違い

# 概要
JavaScriptにおける3種類のfor文

# for 
```js:
for(let i = 0; i < 10; i++){
	// 10 回ループ
}
```

# for ... in
オブジェクトの**プロパティ**に対するループ処理

```js:
for(let pro in object){
	// オブジェクトのプロパティに対する処理
}
```

# for ... of
反復可能オブジェクト（Array, Map, Set, arguments）の**値**に対するループ処理

```js:
for(let value of object){
	// オブジェクトのプロパティの値に対する処理
}
```

# 参考
[公式ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loops_and_iteration)
Pythonで "TypeError: 'module' object is not callable" エラー

サブフォルダimportでハマりました。。。
解決法備忘録。

# 結論

親ファイルから`execute01()`のように呼び出さない。
`execute01.main()`で呼び出す。


# 例で説明
## フォルダとファイル構成

***Hogefolder***
┣*mainHoge.py*
┣***Executefolder***
　┣*execute01.py*
　┣*execute02.py*
　┣*execute03.py*

mainHoge.pyからExecutefolder内のpythonファイルを呼び出す構成。

## pythonコード
OK例とNG例。

### これだといけない :cry: 

親ファイルから`execute01()`のように呼び出す。
エラー吐きます。

```Python:mainHoge.py
from Executefolder import execute01, execute02, execute03 

execute01()
execute02()
execute03()
```


```Python:execute01.py

# 処理を記述
num = 1+2
```
実行します。エラー吐きます。

```powershell:cmd
$ python3 mainHoge.py

︙
TypeError: 'module' object is not callable
```

### これだといける :smile: 

親ファイルから`execute01()`と呼び出さない。
`execute01.main()`で呼び出す。

```Python:mainHoge.py
from Executefolder import execute01, execute02, execute03 

execute01.main()
execute02.main()
execute03.main()
```


```Python:execute01.py
def main():
    # 処理を記述
    num = 1+2

if __name__ == '__main__':
    main()
```

実行します。正常に動くはずです。

```powershell:cmd
$ python3 mainHoge.py
```

~~`if __name__ == '__main__':`はよく理解できてない。。。omajinai~~
PureScript + Halogen のUIデザインフレームワーク調査メモ

# はじめに

アプリを作っていると、最初のうちは画面のデザインはデフォルト CSS のままでもいいのだけれど、だんだん形が出来上がってくるとデザインもどうにかしたくなってくる。ただ自分で CSS をゴリゴリ書く気にはならないし、デザインフレームワークを使ったほうが楽だしきれいに出来上がる。

Vue.js や jQuery なら有名どころがいくらでも見つかるのだが、PureScript ＋ Halogen ではなかなかない。
「[PureScript / Halogen でOnsen UIを使ってみよう](https://qiita.com/KNaito/items/6b26c59c87828ca16d35)」という記事を見て自分で Onsen UI を組み込んでみようとしたもののうまくいかなかった[^1]。やはり出来合いのものを見つけて導入したい。

[^1]: 特に Tabbar。こいつがうまくできてたらもう少し頑張れてたと思う…。

ということで見つけたものをメモしていこうと思う。

ちなみに「[PureScriptのUIライブラリまとめ](https://qiita.com/hiruberuto/items/ec3f58c7742e79e3885a)」という記事もあって、これはこれで大いに参考にさせていただいたのだが、この記事とはスコープが違う。
イメージとしては下の表「???」に当てはまるものを知りたい。

| 言語       | UIフレームワーク | デザインフレームワーク |
| ---------- | ---------------- | -------------------- |
| PureScript | Halogen         | **???** |
| PureScript | React           | MaterialUI |
| JavaScript | Angular         | Angular Material |
| JavaScript | React.js        | Material-UI |
| JavaScript | Vue.js          | Vuetify |
| JavaScript | jQuery          | Bootstrap |

※ 表内の記述はあくまで一例であり、ほかの組み合わせも可能です。ていうかもっといい組みあわせはあると思われる…。

# Ocelot

[Ocelot](https://github.com/citizennet/purescript-ocelot) は CitizenNet 社が自社アプリケーションで使用しているUIコンポーネントをライブラリとして外部公開したもの。
ライセンスは Apache License 2.0。

* [Tailwind.css](https://tailwindcss.com/) をベースにデザインが作られている
* CSS はスコープ付きでコンポーネントにバンドルされている
* 「ブロック」と「コンポーネント」に分類されている
* 「ブロック」は単純な HTML / CSS の塊（ただの render 関数）
* 「コンポーネント」はふるまいや状態を持った Halogen コンポーネント

「ブロック」はただの render 関数なので自分の作っている Halogen コンポーネントの render 関数内で呼び出せばすぐに使えそう。カスタムエレメントのような感じ。

「コンポーネント」は slot を使って読み込む必要がある。普通に Halogen コンポーネント。

[documentation site](https://citizennet.github.io/purescript-ocelot) で実際のコンポーネントの見た目を見ることができる。 ocelot のリポジトリにソースコードもあるので、使い方の参考にもなる。ただ [Pursuit](https://pursuit.purescript.org) には公開されていないのでドキュメントの参照は少し手間かもしれない。

コンポーネントの品ぞろえは、BootStrapなどと比べてるとどうしても見劣りする。とくにナビゲーションやタブバー、メニューといった要素がないのが残念な感じ。

# halogen-storybook

いきなり脱線気味だが気になったのでメモしておく。

[halogen-storybook](https://github.com/rnons/purescript-halogen-storybook) は [Storybook](https://storybook.js.org/) をPureScript ＋ Halogen で使用できるようにしたもの。Storybook そのものの説明は割愛。

* 開発時用のものであって本番のアプリケーションには使っちゃダメだと思う
* Ocelot のドキュメントサイトもこれを使って作られている
* オリジナルな UI コンポーネントを作ったらこれでコンポーネントカタログも作っておくと後々便利そう
mySQLのDBを複製する手順

## 目的
テスト環境で動作させ、その設定を本番環境へ複写する機能のテストを行う機能のテストを行います。そのために、DBの複製環境を作成することを目的とします。

## 前提事項
* 作成済み（稼働中）の環境があること
* データの複写テストであるため、テーブルだけを対象とする（ViewやTrigger等は意識していません）
* MySQLのadmin権限のユーザーで操作できる

## 実施手順
Windows環境を使用し、ある程度は自動化したいという気持ちがあったのでコマンドプロンプトでコマンドを実行していきます。

### 作っておくと楽だと思うもの
何度か接続することになるので、パスワードを入力すればいい状態にしておきます。このbatを実行してパスワードを入力すれば接続完了です。

```MysqlLogin.bat
rem * admin権限での接続情報
set userName=admin
set hostName=host
set dbName=targetDatabase

mysql --username=%userName% --host=%hostName% -p
```

### 既存環境から定義情報を取得
既存のDBからテーブル定義を取得します。今回は環境の複製が目的のため、データは取得しないオプション「--no-data」を指定しています。

```mysqldump.bat
rem * 複写元となるデータベースの接続情報
set userName=admin
set hostName=host
set dbName=targetDatabase

rem * 取得する定義情報の出力先（batファイルと同じ場所、同じ名前で拡張子を「sql」として保存）
set outputFileName=%~dpn0.sql

rem * 対象の環境を指定、このコマンドのあとにパスワードを入力します
mysqldump --username=%userName% --host=%hostName% -p --no-data %dbName% > %outputFileName%
```
オプションの指定を「-u」ではなく「--user」のようにしているのは、この方がコマンドを覚えやすいという個人的な好みの問題です。

### 複製先のデータベースを作成
dbの作成自体は１文で済みます。

```sql
-- db作成
create database db_name;
-- 作成されていることを確認
show databases;
```

### 複製先のデータベースへテーブルを作成
データベースへ接続し、mysqldumpで取得した内容を実行します。

```sql
-- 複製先のDBを選択
use db_name;

-- エラーを回避するためのコマンドを実行する（具体的なコマンドは思い出したら書きます．．．）

-- smysqldumpを実行し、取得したsqlファイルの内容を実行
```

外部ファイルを取得してテーブル生成するように書けば、ほぼ自動化することができます。
今回は一回きりの実行だったのでそこまでやっていませんが、定期的に「本番環境→開発環境」の複製が必要であれば、仕組みとして作ってしまった方がよさそうですね。

## 参考情報
* mysqldump のオプション一覧
  * https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html
* mysql で使用したコマンドのヘルプ関連
  * https://dev.mysql.com/doc/refman/5.6/ja/database-use.html
Qiitaのユーザー画面からそのユーザー記事のフリーワード検索へ移動する

# 機能

![user2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/7bae1d47-0a32-7bfe-ff92-a0491a924d2b.jpeg)

@Qiita のユーザーページでプロフィールアイコン画像をクリックすると

![search.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/229d8050-fe44-0303-ecce-a29373ef8bde.jpeg)

https://qiita.com/search?q=user%3AQiita

`user:Qiita`が入力済みの検索画面へ移動する。
(赤枠は編集追加)

# 動機

良い記事を見つけて、そのユーザーのその分野の記事をもっと見たい！と思ってユーザーの記事画面 https://qiita.com/Qiita/items (itemsはもうないのですが)　に飛ぶものの、時系列で並ぶだけで投稿数とジャンルが多彩な方の場合は目的の記事を探すことが難しいです。

最初からフリーワード検索をすればいいのですが、
どうしてもそのユーザーの記事を探したいときの行動がユーザーページ訪問、と身についてしまっていることと、
ユニークなユーザー名の入力が苦手なので入力補助的な意味合いで作成。

# 動作検証環境


* Firefox 64bit 66.0.5
* Tampermonkey v4.9.5921


# コード

```js
// ==UserScript==
// @name         Qiita add search user items link to profile icon
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  ユーザーページのアイコンをそのユーザーの記事検索へのリンクにします
// @author       khsk
// @match        https://qiita.com/*
// @exclude      https://qiita.com/
// @exclude      https://qiita.com/timeline*
// @exclude      https://qiita.com/tag-feed*
// @exclude      https://qiita.com/notifications*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const iconDiv = document.querySelector('.newUserPageProfile_avatar')
    if (!iconDiv) {
        return
    }

    const link = document.createElement('a')
    const id = document.querySelector('.newUserPageProfile_name>span').textContent
    link.href = 'https://qiita.com/search?q=user%3A' + id

    const icon = iconDiv.querySelector('img')
    link.appendChild(icon.cloneNode(true))
    iconDiv.replaceChild(link, icon)
})();
```

直接フリーワード検索ができる`input`を追加しても良かったのですが、レイアイウトを崩さないことと、アイコン画像をクリックしても意味がなくさびしかったので、ユーザーを調べたい意図ということでアイコンに機能を持たせました。

`img`の子要素に`a`を追加してもダメなので、アイコンをクローンしてリンクで覆い、元のアイコン画像と置換します。
ちょっと迂遠な方法だと思いますが、他に方法があったかな？(`click`イベントは除外して)
Node-RED+RaspberryPiの基本(ボタンを押してLEDをつける)

# はじめに
## やりたいこと
* ラズパイとNode-REDをつないで、ボタンやLEDを制御したい。
* ハードウェア系の知識はないけれど、ラズパイと一緒に購入したキットにサンプルがあったので、これをベースに実装してみました
* 記事内容は、ボタンを押すとLEDが消えるため、光らせるためにはNOTを入れて信号を反転させてください。

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 動作環境
* RaspberryPi : 3
    * OSOYOO Raspberry Pi 電子工作キットもamazonで購入して利用しています
* Node-RED: v19.4 
* raspbian : 9.8


# 本編
## 全体の流れ
Node-REDへの入力と出力の一通りの流れを確認したいので、以下のような流れで実装しました。

1. LED点灯
    * Node-RED->ハードウェア
2. ボタンの押下の検知
    * ハードウェア-> Node-RED
3. ボタンとLEDの連携
    * ハードウェア-> Node-RED -> ハードウェア

### 回路図(付録より引用)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/711325ff-e618-f860-1d98-8a93aa84ef42.jpeg)
 

### 配線
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/510f3e21-a9ab-1ea8-7af1-6d62f6118d66.jpeg)
* 黒の部分がLED点灯制御の部分
* 白の部分がボタン制御の部分

### フロー
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/51c6aa65-b1ab-4980-81cb-c3922f5394f1.png)

### LED点灯
まずは、Node-REDでINJECTIONをしたら、LEDが点灯したり消したりさせたい。

* 該当するフローはON/OFF ⇛ PIN11という部分
    * 信号を制御するためには、下記の通り対応する信号を送る
        * ON:数値の1またはbooleanのtrue
        * OFF:数値の0またはbooleanのfalse
    * 出力先のGPIOのノードはraspberryPiのNode-REDであれば標準でインストールされている
        * どこのポートに信号を送るのかを選ぶだけ

* 手動でONをインジェクトすればライトが付き、OFFをインジェクトすればライトが消える
 
### ボタン押下
つづいて、ボタンの押下をNode-REDで検知したい。

* 該当するフローはPIN40 ⇛　デバッグノードの部分
    * ボタンが押されると、電気がGND側に流れるため、PINに電気が流れなくなるので0
    * ボタンが押されないと、電気が流れて1

* Node-RED側では切り替わった瞬間のみ0,1がやってくる

### ボタン押下でLED制御
最後に、２つのフローを組み合わせると完成

* ボタンを離すとLEDが光る(信号1がボタンから来てLEDにわたす)
![DSC_1824.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/0bb25b79-2a5d-d0e6-b776-45a4f12efdbc.jpeg)

* ボタンを押すとLEDが消える(信号0がボタンから来てLEDにわたす)
![DSC_1825.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/1a74e56f-445d-40dd-4647-d3072075a492.jpeg)



# 感想
* ようやくラズパイの基本のキができた
* 抵抗値ってどうやって決めるんだったかなと
    * 今回はサンプルで何Ωの抵抗を使うと指示があったからよかったのですが、自分でカスタマイズするときは、自分で計算すると思うので、電気回路の基礎を復習しないと。
Visual Studio Code 拡張機能を一括インストール

# 概要

Visual Studio Codeの拡張機能をコマンドで一括インストール。

# スクリプト

PowerShellに以下をコピペして実行。
`■ここから拡張`から下は各自必要なものを書く。

```PowerShell
# カレントにパスが通っていない場合は通す
if (-not $env:path.Split(';').Contains('.\')) {
    $env:path = $env:path + ';.\'
}

# binへのパスが未登録ならカレントディレクトリ変更
$binPath = Join-Path ([Environment]::GetFolderPath('LocalApplicationData')) 'Programs\Microsoft VS Code\bin'
if ($env:path.IndexOf($binpath, [System.StringComparison]::OrdinalIgnoreCase) -eq -1) {
    cd $binPath
}

# ■ここから拡張

# 日本語パック
code --install-extension MS-CEINTL.vscode-language-pack-ja --force

# コーディング支援
code --install-extension visualstudioexptteam.vscodeintellicode --force

# C#
code --install-extension ms-vscode.csharp --force

# PowerShell
code --install-extension ms-vscode.powershell --force

# ブックマーク
code --install-extension alefragnani.Bookmarks --force
code --install-extension alefragnani.numbered-bookmarks --force

# 括弧強調
code --install-extension CoenraadS.bracket-pair-colorizer-2 --force

# Git
code --install-extension eamodio.gitlens --force
code --install-extension donjayamanne.githistory --force

# Markdown
code --install-extension yzhang.markdown-all-in-one --force
code --install-extension DavidAnson.vscode-markdownlint --force

# HTML
code --install-extension abusaidm.html-snippets --force
code --install-extension mkaufman.HTMLHint --force
code --install-extension Zignd.html-css-class-completion --force

# XML
code --install-extension DotJoshJohnson.xml --force

# TypeScript
code --install-extension eg2.tslint --force

# lint
code --install-extension taichi.vscode-textlint --force
code --install-extension ics.japanese-proofreading --force

# CSVカラー表示
code --install-extension mechatroner.rainbow-csv --force
```

`code --install-extension ●●●●●● --force` の●●●●●●部分は以下の例を参照。

![vscode_ext.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/c0b830a7-6f14-c368-98ca-a672922b7c91.png)
Discord Bot 最速チュートリアル【Python&Heroku&GitHub】

<font color="red">**2022/12/28追記
Herokuは11月時点で無料プランが廃止されたため、以下の手順は課金が前提となりました。
無料でホスティングしたい場合はRailwayやOracle Cloudのご利用をご検討ください。**</font>

※この記事について分からないことがあればこちらでご質問ください。
[Discord Bot Portal JP](https://discord.gg/FWw6VqQ)：Discord Bot の利用者/開発者のための質問交流サーバー 

# 1. Discord Bot のアカウントを作成

- アカウント作成 https://discordapp.com/developers/applications/
- 作ったらDiscordサーバーに入れておく
- アクセストークンも取得しておく
- 参考：[Discord Botアカウント初期設定ガイド for Developer - Qiita](https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/455f8c71-895e-3f1c-2fd4-26ee3101c5dd.png">

# 2. GitHub のアカウントを作成

- アカウント作成 https://github.com/join
- 参考：[1分もかからない！5ステップでGitHubアカウント作成 | アールエフェクト](https://reffect.co.jp/html/create_github_account_first_time)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/55c37ec2-c5e6-c795-ca04-a932ea417832.png">

# 3. discord.py startup テンプレートからリポジトリを作る

- リポジトリ https://github.com/DiscordBotPortalJP/discordpy-startup
- 緑の `Use this template` ボタンを押す

![スクリーンショット 2021-08-22 16.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/af75bef6-512c-cddc-67cf-8a58686709ac.png)

- Repository name に好きな名前を入れる
- コードを非公開にしたい場合は Private を選択
- 緑の `Create repository from template` ボタンを押す

![スクリーンショット 2021-08-22 16.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/ef87ed76-91f8-fa36-cae3-936c72deb6cf.png)

# 4. Heroku のアカウントとアプリを作成

- アカウント作成 https://signup.heroku.com/
- アプリ作成 https://dashboard.heroku.com/new-app

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/e835f0ba-5fa9-3106-dcf8-6591b611a52a.png">

# 5. Heroku でアクセストークンを設定

- Settings の Config Vars に書き込む
- KEY に `DISCORD_BOT_TOKEN`
- VALUE に手順1で取得したアクセストークン
- 書いたら Add を押す

![token.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/205b5721-30d4-5e18-2b55-04f0660f85f7.gif)

# 6. Heroku アプリと GitHub リポジトリを連携

- Deploy の Deployment method で GitHub を選ぶ
- `Repository name` に入力した名前を入れて Search

![github.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/716e8793-e357-b32b-3e21-10ad5151e1be.gif)


# 7. デプロイの設定

- Automatic deploys の Enable Automatic Deploys を押す
- Manual deploy の Deploy Branch を押す

![deploy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/54ecd292-0cc5-ab04-3422-c922c33973cd.gif)

# 8. Dynosの設定

- Resources の Free Dynos から設定
- バーを右にスライドできていればOK

![dynos.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/1646b8d7-8c77-d7af-0f98-546fa46326d4.gif)

# 9. 動作確認

Discord で `/ping` と発言して、
Botから `pong` と返ってきたら成功です。

# 10. Botに機能を追加

- GitHub でコードを編集して保存する
- 保存したらBotが再起動して反映される

![implement.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118830/c9aff9d0-e4a5-91a2-83fe-7a10c884e805.gif)
gob: name not registered for interface の対処

初投稿です。

GAE/Goでgo1.11対応をしたときに、タイトルのエラーでだいぶハマってしまいました。


# 経緯
従来は、セッションのicza/sessionを使用していたのですが、build appengineタグが廃止されたとのことで現在正しく動かなくなっています。そのため、gorilla/sessionsを使ってセッションまわりのコードを書き直していたら...という感じで、セッションまわりの対応で下記のエラーと戦うことになりました。

```
ERROR: %!(EXTRA securecookie.MultiError=securecookie: error - caused by: securecookie: error - caused by: gob: name not registered for interface: "hoge"
```

# やったこと
デバッグ用のページを作り、そこでエラーの原因を調べます。
色々と調べてみて、とりあえずセッション名を変更して、新しいセッションを生成。

```go:session.go
const (
	// ここを変更
	sessionName = "session"
)

func newSession(c echo.Context) (*sessions.Session, error) {
	store := sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
	session, err := store.Get(c.Request(), sessionName)
	return session, err
}

func SaveSession (c echo.Context)  {
	sess, err := newSession(c)
	// セッションを保存する処理
}
```

次に、newSessionが呼ばれるたびに、新しいクッキーストアが生成されるのが影響しているのかと考え、sessions.NewCookieStoreを関数の外に出してみました。

```go:session.go
const (
	sessionName = "session"
)

var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func newSession(c echo.Context) (*sessions.Session, error) {
	session, err := store.Get(c.Request(), sessionName)
	return session, err
}

func SaveSession (c echo.Context)  {
	sess, err := newSession(c)
	// セッションを保存する処理
}
```

これで、デバッグ用のページではエラーが出なくなったのですが、セッションを使用したいページで同じことをしてもエラーは変わりません。

そこから色々と考えられる限りのことを試していき、

```go:app.go
func main() {
	//構造体を使う場合、セッションの保存などの処理が行われる前にRegisterをしておかないとエラーになる
	gob.Register(Hoge{})
	
	// 以下ルーティング等
	
}
```

セッションの処理を呼び出している全ての処理の前で、gob.Registerで型の登録をすることで解決しました。
（これまでは、様々なところでセッションの処理を呼び出している内の、一ヶ所のみでgob.Registerを呼び出していました。）

セッションに構造体を入れたい場合は、gob.Registerをgob.Registerが必要な処理の前に書きましょう。
Noto CJKフォントSuper OTC版はuplatex/lualatex/xelatexで使えるのか

日本語texでグーグルの高品質フリー日本語フォントNoto CJKのSuper OTC版を使った話はあまり見ないので使えるかどう調べた。

- `uplatex` + `pxchfon.sty` はフォントファイル名決め打ちのため使えない（と思う）
- `lualatex` + `luatexja-preset` は問題なく使えるし初回使用メモリ量も6 GBで従来と同じ
- `xelatex` + `zxjafont` は従来と変わりなく使える

# 実験の条件

- Debian 10のTeXLive 2019 (`texlive-full	2019.20190508-1`)
- [Google Github](https://github.com/googlefonts/noto-cjk) にある`NotoSansCJK.ttc.zip` (version 2.001)
- [別のグーグルの配布サイト](https://www.google.com/get/noto/help/cjk/) にある `NotoSerifCJK.ttc` (162585388バイト、2017年9月23日)
- これらを`/usr/share/fonts/opentype/` 以下の適当なところにおいて`fc-cache` と `mktexlsr` を実行して`xelatex`と`lualatex`が（ファイル名ではなく）フォントの名前でフォントにアクセスできるようにする

# 実験のTeXファイルと結果

- [LuaLaTeXの結果](https://qiita.com/kakinaguru_zo/items/764c54f2e84d21092069)
- [XeLaTeXの結果](https://qiita.com/kakinaguru_zo/items/76ff53077abdeb231807)
【JSメモ】オブジェクト型の仕様

# 概要
JavaScriptの型は大きく分けてオブジェクト型とプリミティブ型の二つ．
単なる数値や文字列はプリミティブ型で，それ以外はオブジェクト型．

# 最小のオブジェクト型
```js:
var obj = {};
```

# 仕様
```js:
var objectName = {
    Name1: Value1,
    Name2: Value2,
    Name3: Value3
}
```
`プロパティ: 値`で定義する．
値にオブジェクトを入れることもできる．

# 具体例
```js:
var obj = {
	num: 1,
	str: 'hoge',

	obj: {
		num: 1,
		str: 'fuga'
	},

	func: function(){
		console.log('hello world'!);
	}
};
```
関数を定義することもできる．

# アクセス方法
### ドット記法
```js:
obj.num
obj.obj.num
obj.func()
```
### 角括弧記法
```js:
obj['num']
obj['obj']['num']
obj['func']()
```

# 参考
[公式ドキュメント](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Basics)
H8 3069クロスコンパイル開発環境のセットアップ

12ステップで作る組込みOS自作入門をやるために
H8 3069のクロスコンパイル環境を構築した際のメモ．

# 環境
- OS 
Arch linux 64bit

# 試した手順

``` sh 
$ wget http://kozos.jp/books/makeos/download.sh
$ chmod +x download.sh
$ ./download.sh
$ chmod +x build-binutils.sh
$ chmod +x build-gcc.sh
$ ./build-binutils.sh
$ cd binutils-2.19.1
$ sudo make install
$ cd ..
$ ./build-gcc.sh
$ cd gcc-3.4.6
$ wget http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt
$ patch < patch-gcc-3.4.6-x64-h8300.txt
# パッチ対象が聞かれるので，"gcc/config/h8300/h8300.c"を￥入力
$ make
$ sudo make install
```
以下で記述しているエラーに対応済み．

# 引っかかったポイントと解決法
公式サポートページにあるように64bitOSでサポートページの手順をとると，  
make install が以下のエラーで止まる．

``` sh
./libgcc2.c: In function '__muldi3':
./libgcc2.c:542: error: unrecognizable insn:
(insn 234 233 235 2 ./libgcc2.c:533 (set (reg:HI 3 r3)
        (const_int 4294967214 [0xffffffae])) -1 (nil)
    (nil))
./libgcc2.c:542: internal compiler error: in extract_insn, at recog.c:2077
Please submit a full bug report,
with preprocessed source if appropriate.
See  for instructions.
```
そのため，以下の手順を追加した．

``` sh
$ wget http://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt
$ patch < patch-gcc-3.4.6-x64-h8300.txt
# パッチ対象が聞かれるので，"gcc/config/h8300/h8300.c"を入力.
$ make
```

# 参考サイト

　[公式サポートページ](http://kozos.jp/books/makeos/)
Pythonでリストアップされたhtmlの本文を抽出する。

# やったこと
htmlを記載したテキストファイルを読み込んで、
htmlの本文を抽出したファイルを出力する。

```shell-session
$ python python.py [input_file_name]
```

```python.py
from readability.readability import Document
import urllib.request
# url encode
import urllib.parse
# markdown
import html2text
# datetime
import time
# 引数読み込み
import sys
from sys import argv

# htmlリストを読み込む
def get_page_list(input_file_path):
	page_list = []
	with open(input_file_path,'r') as f:
		for page in f:
				page_list.append(page)
		return page_list
# Webページから本文抽出
def read_page(page_list, output_file_path):
	with open(output_file_path, 'w', encoding = 'utf-8') as f:
		page_num = 1
		all_num = len(page_list)
		print("対象：" + str(all_num) + "件")
		error_num = 0;
		for page in page_list:
				print(page)
　　　　　　　　　 # URLが読み込めない場合のエラー処理
			    try:
					url = urllib.request.urlopen(page)
				except:
					print("読み込めませんでした。")
					error_num += 1
					continue
				source = url.read()
　　　　　　　　　 #本文抽出
				article = Document(source).summary()
				text = html2text.html2text(article)
				f.write(str(page_num) + "---ページ区切り---\n")
				f.write(text)
				f.write("\n")
        # 処理結果
		print("対象:" + str(all_num) + "件")
		print("成功：" + str(all_num - error_num) + "件")
		print("失敗：" + str(error_num) + "件")

def gethtmls():

def main():
	#引数の取得
	input_file_path = sys.argv[1]
	#ファイル実行開始時刻を取得
	timestr = time.strftime('%Y%m%d-%H%M%S')
	#出力ファイル名の生成
	output_file_path = './' + timestr + '_result.txt'
	# htmlをリストに格納
	page_list = get_page_list(input_file_path)
	# 各htmlの読み込み
	read_page(page_list, output_file_path)

if __name__ == '__main__':
		main()

```
# 参考
[python - Python3でwebスクレイピングしたいのですが存在するURLが開けません。 - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/27922/python3%E3%81%A7web%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8Burl%E3%81%8C%E9%96%8B%E3%81%91%E3%81%BE%E3%81%9B%E3%82%93)
[Python - コマンドライン引数でファイル名を入力して、numpyで開きたい｜teratail](https://teratail.com/questions/133733)
【Java】アノテーション

## アノテーションの定義
 - @interface を付けるとアノテーションとしての定義となる。

## アノテーションのパラメタ定義
 - アノテーションを使用する際のパラメタの宣言

```java:TestAnnotation.java
public @interface TestAnnotation {
    String param1();
    String param2() default "defaultValue";
}
```
``` java:UserAnnotation.java
@TestAnnotation (param1="30", param2="100")
public UserAnnotation() {}
```

## アノテーションの参照
 - リフレクションを使用して参照する。

```java:参照クラス
    Class<?> c = UserAnnotation.class;
    for (Annotation a : c.getDeclaredAnnotations()) {
        System.out.println(a);
    }
```
```java:コンソール出力
@com.example.demo.com.annotation.TestAnnotation(param2=100, param1=30)
```


## メタアノテーション

```java:TestAnnotation
@Documented
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{}
```

  - アノテーションに対して付けられるアノテーションのこと。
  - そのうち、java側で用意されているのを標準メタアノテーションという。<br>
    ex. Documented, Target, Retention, Ingerited

### @Documented
  - Javadoc中にアノテーションの説明を記載するかどうか。

### @Target
  - アノテーションの配置する場所を定義する。

| 種類 | 説明 |
|:--|:--|
| TYPE | クラス・インタフェース・enum・アノテーション |
| FIELD  | フィールド |
| METHOD  |  メソッド |
| ANNOTATION_TYPE | アノテーション型の宣言 |

### @Retantion
  - アノテーションの情報がどの段階まで使用されるか。

| 種類 | 説明 |
|:--|:--|
| SOURCE  | ソース上のみ保持、クラスファイル作成時に削除される。  |
| CLASS  |  クラスファイルでも保持できるがアプリケーション実行時には参照できない。 |
| RUNTIME  | アプリケーション実行時でも使用可能。<br>リフレクションでアノテーションを参照するならこれが必要。 |

### @Inherited
  - クラスを宣言したサブクラスにもアノテーションの情報を付与する。



#参考サイト
@Documentedの挙動
  https://qiita.com/opengl-8080/items/1cc996d9e8bb5c811567

@メタアノテーションとは
https://www.techscore.com/tech/Java/JavaSE/JavaLanguage/7-3/
[CSS] <input type='submit'>のサイズが変わらない

CSSでsubmitボタンをいじっていてつまったのでメモ。
#submitボタンのサイズが変わらない
```html:sample.html
<input id='sample' type='submit' value='提出'>
```
```css:sample.css
#submit{
    width:50px;
    height:25px;
    border-radius: 5px;
    box-shadow: 1px 1px 1px;
    border-color:rgb(247, 191, 158);
}
```

上記のように記述したところsubmitボタンのスタイルにwidth、heightがうまく適用されなかった。


`border-style: solid;`

の一行を加えてborderのスタイルを指定すると正常に適用されるみたい。

```css:sample.css
#submit{
    width:50px;
    height:25px;
    border-radius: 5px;
    box-shadow: 1px 1px 1px;
    border-color:rgb(247, 191, 158);
    border-style: solid;
}
```
Gitの使い方メモ

gitを実際に使うようになってきたので、大体の流れをメモしておく。

# ＜同期のやり方＞
##１．新しくリポジトリを作る場合
先にgithubでリポジトリを作成する．例えば，https://github.com/username/myapp.git
その後，ターミナルにてフォルダを作成してローカルリポジトリとして登録する．

```
$mkdir myapp
$cd myapp
$git init
```

リモートリポジトリとローカルリポジトリを同期させる．

```
$git remote add origin 'https://github.com/username/myapp.git'
```



## ２．リモートリポジトリからcloneしてくる場合
```
$git clone https://github.com/〜
```

これで、カレントディレクトリをリモートリポジトリと同期できる．

#＜使い方＞
##持ってきたフォルダを開いてみる
```
$code -n フォルダ名
```
vscodeでフォルダを開くことができた。

##どのブランチにいるか確認しておく
次にコードを編集する前に自分が今どのブランチにいるか確認し、masterにいるならブランチをきって移動しておく。

```
$git branch //ブランチの表示（*がついてるところが現在のブランチ）
> * master

$git branch sub-branch  //ブランチをきる
$git branch
> * master
> sub-branch

$git checkout sub-branch  //ブランチの移動
$git branch
> master
> * sub-branch
```
sub-branchという名前でブランチをきって移動した。

##コードの編集
変更がある箇所のコードを変更する。

##変更をリモートリポジトリに反映させる
コードの編集が終わったらリモートリポジトリに変更を反映させる。

```
$git add --all  //変更内容をインデックスに保存
$git commit -m 'first commit'  //インデックスに追加されたファイルをローカルリポジトリに記録
$git push origin sub-branch  //ローカルリポジトリの変更をリモートリポジトリのsub-branchに反映
```
（.gitignoreちゃんと作ろう）

##他の人がpushしたらその変更をローカルに反映する
自分以外の人がリモートリポジトリにpushした変更は自分のローカルリポジトリには自動で反映されない。

そこで、fetchをしてリモートリポジトリの最新の情報をローカルリポジトリに反映させる。

```
$git checkout master  //masterに移動
$git branch
> *　master
> sub-branch
$git fetch  //最新の情報をローカルリポジトリのorigin/masterに反映
$git merge origin/master  //masterに origin/master をmerge
```
sub-branchに変更を反映させたければ、sub-branchにいる状態でorigin/masterをmergeする。
masterとorigin/masterは別物なので気をつけること。
laradock(Docker)+PhpStorm環境のxdebug導入でphp-fpmのエラーが起きる

[laradock環境でのxdebug導入手順](https://qiita.com/M4e/items/f2c205df4977ead9a3f7)
を参考にしてxdebug導入で躓いたのでメモ。
たぶんブログの環境とは違うので起きたと思われる。

設定ファイルをブログの通りに設定、イメージ再構築の段階でエラー発生。

```
docker-compose up -d --build nginx mysql workspace 
```
エラー内容

```
E: Could not open file /var/lib/apt/lists/deb.debian.org_debian_dists_buster_main_binary-amd64_Packages.diff_Index - open (2: No such file or directory)
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c if [ ${INSTALL_IMAGEMAGICK} = true ]; then     apt-get update &&     apt-get install -y libmagickwand-dev imagemagick &&     pecl install imagick &&     docker-php-ext-enable imagick ;fi' returned a non-zero code: 100
```
検索して、[Laradockでphp-fpmのビルドが失敗する（ERROR: Service 'php-fpm' failed to build:）](http://domwp.hatenablog.com/entry/2019/01/30/151146)を見つける。
手順通りに実行したがエラーは解決できず。そもそもエラーメッセージを見比べてみたら微妙に違う。
調べ続けたら[kit-starter-symfony-4-dockerのissue](https://github.com/romaricp/kit-starter-symfony-4-docker/issues/10)を見つけた。
結果的に
laradock/php-fpm/Dockerfileを編集。

```
###########################################################################
# ImageMagick:
###########################################################################

USER root

ARG INSTALL_IMAGEMAGICK=false

RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \
    rm -rf /var/lib/apt/lists/* && \
    apt-get update && \
    apt-get install -y libmagickwand-dev imagemagick && \
    pecl install imagick && \
    docker-php-ext-enable imagick \
;fi
```

下記を追加して無事解決。

```
    rm -rf /var/lib/apt/lists/* && \
    apt-get update && \
```
ラック搭載図・設計図の書き方

ラックへのルータ等装置の搭載図の書き方や設計にはガチガチのルールがありません。

正直、常識の範囲であ考えて適当に搭載しても大体なんとかなると思います。
ただ何でもよいと言われると初めての方は逆に困りますし、仕事でやる以上設計ポリシーを聞かれた時にそれなりの理屈を述べないといけません。
そこでラック搭載図を書く際に最低限注意したほうが良いことをまとめてみました。


#1.ラック搭載図の書き方


##1-1.ラック搭載図は何で書けばいい?Excel(エクセル)?PowerPoint?

職場で前例があるなら、とりあえずそれに従うのが無難でしょう

あえていえばExcelがお奨めです。
1UをExcel(エクセル)の1セルとすれば高さの縮尺の調整が楽です。
PowerPointに資料をまとめる時もキャプチャを貼り付ければいいです。



#2.ラック搭載図の設計


##2-1.装置の幅・高さを確認しよう
搭載する装置のサイズ(幅x高さx奥行き)を気にする必要がります。
19インチラックや通信装置は、大体EIA(米国電子工業会)という規格に沿ってつくられています。

そのためルータ・SWやサーバなど装置の幅はあまり気にしなくて大丈夫です。
装置のスペック表を見て44cmぐらいであればラックのマウントフレームに付けられると考えてよいでしょう。

高さについても装置のスペック表で大概U数が記載されているためそのまま記載すればいいです。


#2-2.装置の奥行きに注意!!
大概のラック搭載図は前面から見た2次元の図になるかと思います。
そのため奥行きについて見逃しがちなので注意しましょう。

EIAではラックの幅や1Uの高さは決まっていますが奥行きは決まっていません。
だから装置の奥行きを確認したうえで適切な奥行きのラックを手配しなければいけません。
また装置の前後は通信線や電力線を接続するスペースも確保しておく必要があります。


##2-3.装置の重量を確認しよう
装置の重さに耐えられるラックや別売りの棚・タイプレールを用意しましょう。

装置の重さはシャーシのほか増設する予定のラインカードも考慮しましょう。
装置によってはシャーシの2倍ぐらいの総重量になることがあります。

棚・タイプレールが何Kgまで上に搭載できるかは搭載荷重で確認しましょう。



#2-4.保守スペースを確保しよう
装置の排熱や運用後の装置交換(保守)などを考慮して、一般的には装置同士をくっつけて搭載することはありません。
かといって装置同士を空けすぎては1ラックに収納できる装置の数が減ってしまいます。
上記のバランスを取りながらとなりますが、装置同士の間隔は最低でも1Uは空けたほうがよいでしょう。



#2-5.0系・1系は別ラックに分けよう
冗長化構成のNWなどであれば装置は0系・1系でラック分けたほうがよいでしょう。
NWの設計ポリシーによりますが、0系・1系の装置は別ラックに分けてリスク分散する設計が一般的かと思います。


#2-6.同系統の装置はまとめよう
上記の奥行きまたは配線・電力などを考えると同じ機種・役割の装置は近い場所に配置したほうがよいでしょう。
また将来、装置増設の予定がある場合は増設用スペースも意識して搭載場所を決めましょう。


以上


上記の条件はこれを守れば問題ないという条件ではありません。
装置搭載の叩き台を作る際に考慮したい最低限の初歩的条件となります。
実際には電力・空調なども考える必要があります。

ただ上記を考慮してラック搭載図のたたき台は作れると思います。
jqでキーを指定して深い位置にある要素を取得する

version: jq-1.6 on mac

こういうJSONがあったとしてtestを取りたいとする。キーはユニークなものを想定。

```json
{
  "a": "foo",
  "b": {
    "c": {
      "d": {
        "test": {
          "key": "value"
        }
      }
    }
  }
}
```

これで取れる。

```bash
jq '..|select(.test?)|.test' test.json
```

selectの?がないと`Cannot index string with string "test"`と言われて怒られるので注意。

testと二回書くのが嫌な時はこれでもいけるけど、検索文字列が短い場合はちょっと冗長な感じかも。

```bash
jq '..|to_entries?|.[]|select(.key=="test").value' test.json
```
Finderにあるフォルダをターミナルで開く

# このフォルダをターミナルで開きたい、、、
という場合があるかと思います。
下記、手順を記述します。
環境はMacです。

# 環境設定
環境設定→キーボード→ショートカット→サービス
`New Terminal Tab at Folder`にチェックを入れる。
<img width=75% alt="Screen Shot 2019-05-25 at 4.10.21 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/eca59bf0-d4fc-8271-3266-66df0a2f42e9.png">

# フォルダからターミナル起動
任意のフォルダを指定し、右クリック。
`New Terminal Tab at Folder`をクリックすると、該当のフォルダがターミナルで開かれます。
<img width=75% alt="Screen Shot 2019-05-25 at 4.14.37 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/d591f37f-6650-b05a-dae6-bcd057601e3e.png">
SVG要素の重なり順を動的に変える

SVG要素にz-indexが使えないことで一瞬戸惑ってしまいますが、要素の並び順＝重なり順であるので、要素を並び替えればいい。
ということでそれが実現できるSVG-Z-ORDERを利用します。

## 利用パッケージ

SVG-Z-ORDER
https://takamin.github.io/svg-z-order/
https://takamints.hatenablog.jp/entry/npm-svg-z-order-js

## 機能

- SVGZElement.toTop() - 指定した要素の並び順を一番先頭に持ってくる（一番手前に表示される）
- SVGZElement.toBottom() - 指定した要素の並び順を一番末尾へ変更する（一番後ろに表示される）
- SVGZElement.moveUp(element/n) - 指定されたターゲット要素の前またはn回、要素を手前へ移動する
- SVGZElement.moveDown(element/n) - 指定されたターゲット要素の後またはn回、要素を奥へ移動する
- SVGZElement.moveTo(element/index) - Moves the element to the specified position.ターゲット要素を指定された場所へ移動する



## コード例

### require使う場合

```
var svgz = require("svg-z-order");
var g = svg.getElementById("foo");
svgz.element(g).toTop();
```

### require使えない／使わない場合

読み込みます。

```
<script type="text/javascript" src="svg-z-order.js"></script>
```

D3.jsとあわせて利用し、マウスオーバーした要素の重なり順を一番手前にするには、たとえばこんな感じで。

```
.on("mouseover", function() {
    var d3g = d3.select(this);
    svgz_element(d3g.node()).toTop();          
})
```
Salesforce @future 使用方法 

　  Future方法用于异步处理，常用于Web service callout操作.Future方法需要有几个规范：

　   1.方法必须是静态static的;

　　2.方法上方需要使用@Future标签;

　　3.方法返回类型必须是void类型;

　　4.方法参数必须是模块私有的变量，不能使public等;

　　5.方法参数不允许使用标准的Object或sObject类型，可以使用基本类型或者集合类型;

　　6.不能再一个future方法调用另一个future方法，当future方法运行的时候也不可以在trigger中调用;

　　7.future方法中不能使用getContent()和getContentAsPDF()方法。

　　以下为Future方法代码举例。此方法用来输出符合Id在形参List中的所有Account的Id。　

public with sharing class FutureSample {
    @future
    public static void futuremethod(List<ID> ids) {
        String sql = 'select Id,Name from Account where Id in :ids';
        List<Account> accounts = Database.query(sql);
        for(Account account : accounts) {
            System.debug(account.Id);
        }
    }
}　
　　有几点需要注意：

　　1）future方法执行不保证质量，如果需要好的质量可以使用Queueable方法；

　　2）可以允许两个future方法同时运行，当两个future方法同时对一条记录进行操作时，可能引起记录锁定或者运行时异常。

　　总之，使用future方式不保证质量。。。。。。而且有很多限制，开发的时候能不用就不用，如果必须使用情况下自己评估一下。

      测试future方法在Test类中执行，和普通的方法测试区别的是，future方法执行需要在Test.startTest()和Test.stopTest()方法中进行.以下为测试代码：

@isTest
private class Test_FutureSample {
    static testMethod void myUnitTest() {
        Test.startTest();
        List<ID> ids= new ID[]{'0012800000Hz6ozAAB','0012800000Hz6oxAAB'};
        FutureSample.futuremethod(ids);
        Test.stopTest();
    }
}
Queueable
　　Queueable接口有着类似future的特性，类似将future特性和批处理功能混合在一起，相对future方法来讲，有很大的优势：

　　1.可以使用Object和sObject类型作为参数;

　　2.便于监控，可以直接通过System.enqueueJob()方法运行返回AsyncApexJob ，方法不用限制在startTest()和stopTest()方法中;

　　3.可以链接两个job，一个Queueable接口方法可以调用另一个Queueable接口。

　　Queueable在执行异步的时候大部分可以替代掉future，但是不是所有的情况都可以替换。当一个方法有时需要同步执行有时需要异步执行，相对来讲用future操作更为简单，毕竟不需要修改方法的内容，只是注解而已。

Queueable接口代码举例：

public with sharing class QueueableSample implements Queueable{
     
    private List<ID> ids{get;set;}
     
    public QueueableSample(List<ID> ids) {
        this.ids = ids;
    }
     
    public void execute(QueueableContext qc) {
        String sql = 'select Id,Name from Account where Id in :ids';
        List<Account> accounts = Database.query(sql);
        for(Account account : accounts) {
            System.debug(account.Id);
        }
    }
}
运行实现QueueableSample接口的类的方式如下：

@isTest
private class Test_QueueableSample {
    static testMethod void myUnitTest() {
        Test.startTest();
        List<ID> ids= new ID[]{'0012800000Hz6ozAAB','0012800000Hz6oxAAB'};
        QueueableSample sample = new QueueableSample(ids);
        ID jobID = System.enqueueJob(sample);
        Test.stopTest();
    }
}
　　Queueable尽管很好用很强大，不过force.com对于Queueable有很多限制和规范，详情请参看官方文档。
PostgreSQLで接続エラー「psql: could not connect to server〜"/tmp/.s.PGSQL.5432"?」への対処

## 環境

macOS Mojaveバージョン10.14.4

## エラー内容

```
psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

## やったこと①

postgresを再起動すれば普通にいけるんじゃないかと思い

```
brew services restart postgresql
```

をしたが状況は変わらない。

## やったこと②

.pidというプロセスが残ってしまっている可能性があるので、

```
rm /usr/local/var/postgres/postmaster.pid
```

でプロセスを削除しようとしたがそのようなファイルはないと言われてしまう。


## やったこと②

- [”psql: could not connect to server: No such file or directory&quot;となりPostgresqlに接続できない - Qiita](https://qiita.com/hozmii/items/3617b67ea350f116ca3a)

上記の記事を参考に

```
$ cd /usr/local/Cellar/postgresql
$ curl -o fixBrewLionPostgresql.sh http://nextmarvel.net/blog/downloads/fixBrewLionPostgres.sh
$ chmod 777 fixBrewLionPostgresql.sh
$ ./fixBrewLionPostgresql.sh
 ```
 
 ここまでコマンドを打つも最後のコマンド

 ```
 $ pg_ctl -D /usr/local/var/postgres start
 ```
 
 を打った際に
 
```
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.63.dylib
  Referenced from: /usr/local/Cellar/postgresql/11.1_1/bin/postgres
  Reason: image not found
no data was returned by command ""/usr/local/Cellar/postgresql/11.1_1/bin/postgres" -V"
The program "postgres" is needed by pg_ctl but was not found in the
same directory as "/usr/local/Cellar/postgresql/11.1_1/bin/pg_ctl".
Check your installation.
```

このようなエラーが発生した。


## 最終的に

最終的にPostgreSQLのディレクトリを削除し、再インストール。初期化したあと起動してなんとか解決。

- 参考：[PostgreSQLをアップグレードしたら動かなくなったのでやったこと - Qiita](https://qiita.com/akito19/items/409f06c61b5b8dc0ebaa)

<br>

この記事に書いてあるコマンドを打ったあとpsqlコマンドを確認してみると

```
psql: FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory
```

このようなエラーが出たが、

<br>


```
pgrep -f 'postgres' | xargs sudo kill
```

- [PostgreSQLにて"global/pg_filenode.map"がないエラー](http://shinriyo.hateblo.jp/entry/2016/08/23/PostgreSQL%E3%81%AB%E3%81%A6%22global/pg_filenode.map%22%E3%81%8C%E3%81%AA%E3%81%84%E3%82%A8%E3%83%A9%E3%83%BC)

この記事を参考に必要のないプロセスを切ることにより解決しました！