OmniAICreator/Qiita-1.07M huggingface dataset:
Python リストのインデックスをずらす！！

#はじめに

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているsaijoと申します！

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

この記事では、Pythonによる「リストのインデックスずらし」に関していくつか例を挙げていこうと思います！


#最初の準備

まずはずらしたいリストをキーボードで作成できるようにしましょう！


```python:python.py
n = int(input())
arr = list(map(int, input().split()))
result = leftShiftIndex(arr, n)
print(result)
```
ここでleftShiftIndex()はこの後定義する関数です。
またnはどれだけ要素をシフトさせるのかを表す変数です。


#パターンその１

それでは実際に関数leftShiftIndex()を定義していきます！

```python:python.py
def leftShiftIndex(arr, n):
   arr_len = len(arr)
   for _ in range(n):
      temp = arr[0]
      for i in range(arr_len-1):
         arr[i] = a[i+1]
      a[arr_len-1] = temp
   return arr
```
>特徴

>-  C言語的な記述の仕方。
- nの値が大きすぎるとTime is overとなってしまう。
- forの入れ子アリ。

プログラミングをC言語から始めた僕にとって一番しっくりくるコードがこれでした。
でもこのコードだと莫大な量のデータを処理する際にランタイムエラーとなってしまうという問題点があります。


#パターンその２

そこでPython特有の組み込み関数やメソッドを使えば、もっとコードや処理時間を短縮できるのではないかと思い、次に作成したコードが以下のものです。

```python:python.py
def leftShiftIndex(arr, n):
   for i in range(n):
      temp = arr[:1]
      sample_array = arr[1:]
      arr = sample_array + temp
   return arr
```
>特徴

>- 若干Pythonっぽい。
- nの値が大きすぎるとTime is overとなってしまう。
- forの入れ子ナシ。

いかがでしょう！
先ほどのコードと比較すると、リストのスライスを用いることでforループの入れ子がなくなりだいぶスッキリしたコードとなりました！
しかしこのコードを用いてもやはり莫大な量のnに対してはランタイムエラーとなってしまいます。


#パターンその３

では次にどのようにコードを書けば任意のnに対して正常な機能を果たすのかを説明していきます。

```python:python.py
def leftShiftIndex(arr, n):
   result = arr[n:] + arr[:n]
   return result
```
>特徴

>- これぞPython！！！
- 極限までコードを短くした。
- nの値の大きさに関わらず実行可能。

どうでしょうか。
パターンその１であれほど論理的コードを書いていたのが馬鹿らしく思えるくらいスッキリしましたね！(笑)


#まとめ

C言語経験者から言わせてもらうと、最初は「こんなの外道だ！もっと内部処理がわかりやすいコードを書くべきだ！」と強がっていましたが、これがPythonの特徴なんです！

確かにC言語のようにプログラムのフローを明瞭に掴むことは大切なのですが、組み込み関数を用いてコードや処理時間の短縮ができた方が便利ですよね！

この先多様なプログラミング言語を習得しようと思ってる人は、その言語の特徴（Pythonでいうモジュール・組み込み関数）をよく理解して学んで行くといいと思います。

以上、Pythonによるリストのインデックスずらし解説でした！
最後までご覧いただきありがとうございます！！
正規表現とは

#目次
1. はじめに
2. 正規表現とは
3. 実践編
4. 参考にしたWebサイト
5. 参考になりそうなWebサイト、書籍

#正規表現とは
ユーザーが入力したフォームから保存する値等の文字列の中に特定の文字が含まれているかを確認したり、特定の文字を取り除くといった操作をするための技術が正規表現です。

#実践編

####/文字列/
例えば、「NO PROGRAMMING, NO LIFE!」という文字列にマッチする正規表現を実際に書いてみると、以下のようになります。

````ruby
/NO PROGRAMMING, NO LIFE!/
````

実際にマッチするかの検証には演算子「=~」を使います。

````ruby:terminal
'NO PROGRAMMING, NO LIFE!' =~ /NO PROGRAMMING, NO LIFE!/
# => 0
````

「=~」は、文字列と正規表現がマッチするかを検証し、検証した場合には、マッチした部分文字列の先頭の文字の元の文字列内でのインデックス番号を返します。


####大文字と小文字の区別

大文字と小文字を区別しないという正規表現の実装のためには「i」を使います。「i」は正規表現のオプション修飾子と呼ばれます。

````ruby
/NO PROGRAMMING, NO LIFE!/i
````

この「i」は「Ignore Case」の略です。

####メタ文字
その文字本来の意味とは異なり、特別な意味や機能を持つ文字のことです。このメタ文字を使うことによって、さらにできることが増えていきます。

たとえば、「?」は、直前の文字が0~1回繰り返された場合にマッチします。

````ruby
/NO PROGRAMMING,? NO LIFE!?/i
````
こうすることで、大文字、小文字を区別しない、「,」と「!」の0~1回以上の組み合わせにマッチするということになります。

````ruby:terminal
regex = /NO PROGRAMMING,? NO LIFE!?/i
 
'NO PROGRAMMING, NO LIFE!' =~ regex
# => 0
 
'NO PROGRAMMING, no life' =~ regex
# => 0
 
'no programming NO LIFE' =~ regex
# => 0
````

####subメソッド,matchメソッド

#####subメソッド
文字列の中の指定した部分を別の部分に置換するためのメソッドです。第1引数に置き換えたい文字を指定し、第2引数に変換後の文字列を指定します。

````ruby:terminal
irb(main):001:0> str = "NO PROGRAMMING, NO LIFE"
=> "NO PROGRAMMING, NO LIFE"

irb(main):002:0> str.sub(/PROGRAMMING/,"RAMEN")
=> "NO RAMEN, NO LIFE"
````
subメソッドには、gsubメソッド等のメソッドもあります。

#####matchメソッド

引数に指定した文字列がメソッドの対象の文字列に含まれているかどうかをチェックするメソッドです。含まれている場合は、指定した文字列がMatchDataオブジェクトとして得られます。

#####MatchDataオブジェクト
マッチした文字列等はMatchDataオブジェクトで返されます。
配列からデータを取り出す時と同様の形で、MatchDataオブジェクトからは文字列を取り出せます。

````ruby:terminal
irb(main):001:0> str = "NO PROGRAMMING, NO LIFE"
=> "NO PROGRAMMING, NO LIFE"

irb(main):002:0> md = str.match(/LIFE/)
=> #<MatchData "LIFE">

irb(main):003:0> md[0]
=> "LIFE"
````

#参考にしたWebサイト
- [爆速理解！Rubyで学ぶ正規表現徹底入門！](https://tech-camp.in/note/technology/1167/)
- [正規表現：メタ文字（特殊文字）の一覧](http://www-creators.com/archives/2612)
- [正規表現とは？メタ文字とサンプル一覧](http://www-creators.com/archives/4278)
- [正規表現の構文](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392020(v=msdn.10)?redirectedfrom=MSDN)
- [正規表現](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)

#参考になりそうなWebサイト、書籍
- Webサイト
  - [忘れっぽい人のための正規表現チートシート](https://qiita.com/tossh/items/635aea9a529b9deb3038)
- 書籍
  - [反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)](https://www.amazon.co.jp/%E5%8F%8D%E5%BE%A9%E5%AD%A6%E7%BF%92%E3%82%BD%E3%83%95%E3%83%88%E4%BB%98%E3%81%8D-%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%83%89%E3%83%AA%E3%83%AB-WEB-PRESS-plus/dp/4774145092)
   - [詳説 正規表現 第3版](https://www.amazon.co.jp/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE-%E7%AC%AC3%E7%89%88-Jeffrey-F-Friedl/dp/4873113598)
【SWIFT】MapViewを利用した現在位置情報取得で参考になったサイト

SWIFTの開発で参考になったサイトを備忘録として掲載します。

# 位置情報の取得
位置情報の認証チェックやバックグラウンドモードでの位置情報取得などで参考になったサイト
参考サイト：【Swift4】CoreLocationを使用してバックグラウンドモードで位置情報を取得する方法【Objective-C】【iOS11】
リンク：https://program-life.com/191


現在位置と縮尺で色々試したが、うまくいかず結局はuserTrackingModeを使えば簡単に実装できた。
参考サイト：現在位置を地図の中心にする
リンク：https://qiita.com/rain_00_00_09/items/34b65640c7c839a379f4

# マップに複数のピンを置く
参考サイト【swift4】mapviewの複数のピンを立てる
リンク：https://dev-reco.com/384

## 複数ピンの配置でハマったところやエラーになったところ
addAnnotationをviewDidload内に記載していなかった。

# 取得した位置情報をUserDefaultに格納する
[【完全保存版！】iOSエンジニアとして働く上で知っておきたい14のこと](https://techacademy.jp/magazine/11766)
この記事の「情報を格納する」の箇所を参考にした。
【Visual Studio 2019 for Mac】入力補完のショートカットを割り当てる方法

こんにちは！
ねこじょーかー（[@nekojoker1234](https://twitter.com/nekojoker1234)）と申します。

普段WindowsでVisualStudioを使っていると、「Ctrl+Space」で入力補完を表示しますよね。
<img width="174" alt="スクリーンショット 2019-09-14 12.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/2c3d50bc-6946-cfc4-0215-c870886be200.png">
この機能があるかないかで、実装スピードが結構変わってきます。

しかし、Macで「control+Space」を入力しても、まったく反応がありません。

**調べてみたところ、原因は「システム環境設定」にありました。**

## 「control+Space」で入力補完を表示する

「システム環境設定→キーボード→ショートカット」と進んでいくと、入力ソースのところに「前の入力ソースを選択」というものがあります。
<img width="780" alt="スクリーンショット 2019-09-14 11.56.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/7b12e2f2-13a9-66b6-c4c9-e78914aa19b4.png">
**ここにチェックが入っているせいで、VisualStudioの設定よりもMacの設定が優先されてしまい、入力補完が動作していませんでした。**

なので、ここのチェックを外すようにしましょう。
そうすれば、「control+Space」で入力補完が表示されるようになります。

ちなみに、この機能は「英数」「ひらがな」など、1つ前に選んでいた入力ソースをショートカットキーで選択できるものです。

もし使いたい場合でも、ダブルクリックすればショートカットキーを変更することができます。

## 「command+Space」で入力補完を表示する

私は「command+Space」の方が使いやすいので、こちらで設定しています。

しかし、「command+Space」のデフォルト設定は、Spotlight検索が割り当てられているため、そのままでは使えません。
<img width="679" alt="スクリーンショット 2019-09-14 11.52.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/f8adb137-2fce-5df7-fb53-dc297c41d6a8.png">
先ほどと同じ場所で、「Spotlight」を選択し、「Spotlight検索を表示」のチェックを外すことで機能を無効にすることが可能です。
<img width="780" alt="スクリーンショット 2019-09-14 12.05.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/cb2f2fdf-d02f-ed33-df7c-83248bf7ad53.png">
しかし、この機能はわりと便利なので、私は「option+Space」を割り当てておきました。

VisualStudioの設定が「control+Space」のままになっているので、「ユーザー設定→キーバインド」を開いて、「入力候補」と入力しましょう。

<img width="957" alt="スクリーンショット 2019-09-14 12.08.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/430fe725-ce04-cd1b-00fb-3445d0b27fb4.png">

その行を選択して、「command+Space」を割り当てて「適用→OK」をすれば完了です。


## あわせて読みたい

[HTMLもわからない初心者が、独学で「投稿型SNSサービス」を作ったって本当？【193日間の死闘】](https://qiita.com/nekojoker/items/2497b4f81ffd1cd7025c)

運営している PlayFab 専用ブログ
https://playfab-master.com
Salesforceのコーディング効率化 

# コーディングについて

- Sobjectで返すよりMAPで返そう（変更発生時部品側で対応できる）
- 開発者コンソールのFile→Open Resourceで各オブジェクトのAPI名利用できる（SOQL手早く作成）
- トリガはアクティブ・非アクティブの関係で触らない。
<br>
<br>
- エラー発生時は、発生箇所の特定に注力！→ソースをコメント化するなどで絞込みを行う。
- サクラエディタで改行置換することで簡単にApexでの一括取得のSOQLかける。
<br>
<br>
- オブジェクトのカスタムボタン押下時にVFページを遷移先に指定するためにはStanderdControlerにそのオブジェクトを指定する必要がある。
 →URLとしてVFページを指定(/apex/VFページ?=カスタムオブジェクトID)すればカスタムコントローラでもOK!
<br>
<br>
- 定数は外だし（カスタム表示ラベル）
- 最終的に消すものはコメントを入れるなど分かりやすくする。
- 入力チェックのときは、VFで設定するか（required、文言が標準のものになる）、Apexで設定するか（ApexPages.severity等）、入力規則でやるかオブジェクトで必須にするか。
  入力チェックの順序が異なる。最初にVF。次にApex。最後に入力規則。
<br>

## その他
- 10分調査して分からなければ質問！！！（現象を伝えて説明できない部分は分からないと言う）
- 詰まった際はすぐにアラート。効率を常に重視するように。
- 利用しているコンテンツやメソッドをリファレンスで確認して属性などをチェックする
<br>
<br>
- すぐにコードを触るのでは無く、解決方法に当たりをつけれるように考えてから動く。1年後2年後の技術に大きく差がつく！！
【Android】Daoの中でContextをセットする正しい順番

## 注意
 - コンストラクタの中でContextをつめるべき。
 - 地の文で書くと、ContextがカラのままHelperにセットされてしまう。

## OK  
```HogeAppDao.java
public class HogeAppDao {
    private Context mContext;
    private HugaHelper hugaHelper = new HugaHelper(mContext);

    public HogeAppDao(Context context) {
        mContext = context;
        hugaHelper = new HugaHelper(mContext);
    }

    //すべてのユーザーの情報を取得するメソッド
    public List<UserInfoEntity> selectAll() {
       ...
    };
}
```

## NG  
```HogeAppDao.java
public class HogeAppDao {
    private Context mContext;
    private HugaHelper hugaHelper = new HugaHelper(mContext);

    public HogeAppDao(Context context) {
        mContext = context;
    }

    hugaHelper = new HugaHelper(mContext);

    //すべてのユーザーの情報を取得するメソッド
    public List<UserInfoEntity> selectAll() {
       ...
    };
}
```
【Android】finish();とreturn;のちがい

1. 一番最初のActivity で finish();  
 → アプリが落ちる
2. Main.ActivityからSub.Activityに遷移後、 Sub.Activity で finish();  
 → Sub.Actvityは消えて、Main.Activityが表示される
3. return;  
→処理は終わるが、画面は消えない。
【Android】no such tableエラーの解決策

## no such table エラーの原因
1. aというテーブルをMain.dbに作るHelperクラスをインスタンス化する
2. 別のhelperクラスでbというテーブルをMain.db（同一名のDB）に作成する
3. SQliteExceptionエラーで落ちる

→bテーブル作成用のHelperクラスのコンストラクタで、Main.dbを新規作成しようとしているが、Main.dbはすでに作成されているため、新しく作ることができず、bテーブルのonCreateが呼ばれないため、テーブルは作成されずno such tableとなる。

```A_helper.java
public A_Helper(Context context) {
        super(context, "Main.db", null, 1);
    }
```
```B_helper.java

 public B_Helper(Context context) {
        super(context, "Main.db", null, 1);
    }
```
##解決策
1.Helperクラスを1つに統合して、onCreateにCREATE TABLE文を2つ記載する。

```HogeHelper.java
 public HogeHelper(Context context) {
        super(context, "Main.db", null, 1);
    }
@Override
    public void onCreate(SQLiteDatabase db) {
        // テーブル作成
        db.execSQL("CREATE TABLE " + A_TABLE_NAME +
                " (" + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COLUMN_USER_NAME + " TEXT , "
                + COLUMN_USER_PASSWORD + " TEXT " + ");");

        db.execSQL("CREATE TABLE " + B_TABLE_NAME +
                " (" + COLUMN_BOOK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COLUMN_BOOK_TITLE + " TEXT , "
                + COLUMN_BOOK_IMAGE + " TEXT , "
                + COLUMN_BOOK_REVIEW + " TEXT " + ");");
    }
```
2.bテーブルのHelperクラスのDB名を変更する。

```A_helper.java
public A_Helper(Context context) {
        super(context, "Main.db", null, 1);
    }
```
```B_helper.java

 public B_Helper(Context context) {
        super(context, "Sub.db", null, 1);
    }
```
システムまぎちゃんへの道～ハードウェアはどうなっているのか～

* まぎちゃんは以下の表のように、複数台のラズパイ (Raspberry Pi) で構成される、

**お手軽並列処理計算機** です。

|No. |パーツ名                                  |価格     | 個数 |備考|
|:--:|:----------------------------------------|:--------|:----:|----|
|1   |Raspberry Pi 3 Model B+                  |5,980 円 |5     |    |
|2   |Power Supply                             |1,580 円 |5     |    |
|3   |Aluminum case                            |1,980 円 |5     |    |
|4   |Table TAP                                |-        |1     |    |
|5   |Trancend 32Gbyts MicroSD CARD            |880 円   |4     |    |
|6   |TOSHIBA 32GBytes MicroSD CARD            |2280(?)円|1     |    |
|7   |LAN Cable(0.5m)                          |300(?)円 |5     |    |
|8   |8port 1Gbit switching Hub(NETGEAR GS108T)|-        |1     |    |

あとは、まぁ、適当につなげれば起動します。
JavaScriptのアロー関数の省略記法について

JavaScriptのアロー関数の省略記法について少し戸惑ったので共有します。

###誰のための記事か
この記事では関数の省略記法について説明します。

そのため基本的なアロー関数の詳しい説明については下記の参考の欄の記事をお読みください。

###アロー関数の基本の形

```JavaScript
(引数) => {関数の本体}
```

上記が基本の形なのですが、色々と省略して記述することもできます。

###関数の本体が一文のとき
関数の本体が一文であれば下記のように{}を省略することができます。

また一文の計算結果がそのまま戻り値となるのでreturn文も省略することができます。

```JavaScript
(引数) => 関数の本体
```

###引数が1つのみの場合(引数が0個の場合は省略できない)

引数が一つの場合は引数の()すら省略することができます。

これによって基本的ですが、自分は変数の代入文とセットで使われるとアロー関数の引数と関数の本体の場合さえ代入のように見えてきて紛らわしくなり、とまどいました。

```JavaScript
引数　=> 関数の本体
```

例えばreduxのtodoアプリのアクション定義部分をみると

```JavaScript
export const addTodo = text => ({
  type: 'ADD_TODO',
  id: nextTodoId++,
  text
})
```

上記では引数がtextの一つのみで、()の部分がまず省略されていますね。

また、関数の本体部分もオブジェクトの一文のみで、{}もreturn文も省略されていることがわかります。

上記を省略記法無しで書くと以下のようになります。

```JavaScript
export const addTodo = text =>{return ({
  type: 'ADD_TODO',
  id: nextTodoId++,
  text
})}
```

ちなみになぜオブジェクトリテラル記法の{}の外を()でくくられているかというと、代入も宣言もしていないオブジェクトを関数内で直に書くときは()で括る必要があるからです。

()を外して以下のように書くとエラーになります。

```JavaScript
/*{}の外側の()を外して書くとエラーになる*/
export const addTodo = text => {
  type: 'ADD_TODO',
  id: nextTodoId++,
  text
}
```

###終わりに

JavaScriptのアロー関数は多くの仕様があり、慣れるのはなかなか大変ですね。

アロー関数にはここでは割愛しますが、thisを制限するという仕様があります。

興味のある方は[こちら](https://qiita.com/mejileben/items/69e5facdb60781927929)の記事が分かりやすいので読んでみてください。



###参考

[JavaScriptのアロー関数を説明するよ](https://qiita.com/may88seiji/items/4a49c7c78b55d75d693b)
透過色を、同じ色に見える非透過色に変換するStylusの関数

言葉で説明するのが難しいけど、`rgba(255,0,0,0.5)`を `#ff7f7f`に変換する関数を作りました。

Stylusのビルトイン関数 `transparentify`の逆バージョンみたいなやつ。

背景色を指定すると、その背景色に重ね合わせたときに実際に目に見える色に変換されます。

```javascript

// color: 変換したい透過色
// background: 透過色の背景
untransparentify(color, background = #fff)
  if alpha(color) == 1
    return color

  else
    if alpha(background) < 1
      background = untransparentify(background)

    base = alpha(color, 1)
    percentage = alpha(color) * 100%

    return mix(base, background, percentage)
```
無料で使えるCTF構築キットまとめ

昨今、セキュリティ技術を競うイベントであるCTFが一般的に広く知られるようになってきました。
社内・社外向けにCTFを企画・開催する方も増えてきたのではないでしょうか。

CTF環境を構築される方向けに、OSS（オープンソース）化されたCTFキット（スコアボード含めたプラットフォーム）でメジャーなものをまとめてみました。
使ったこと（参加したこと）はあるのですが、**構築したことはないので、難易度についてはわかりません；；**
ご経験のある方いましたら教えていただけると嬉しいです。

#CTFキットの紹介
##１．fbctf
Facebookが作成・公開しているCTFキットです。[Githubはこちら。](https://github.com/facebook/fbctf)
世界地図のデザインになっていて、エリアがカテゴリ、国名が問題になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/60657294-78b0-d355-5590-d3543e578ee2.png)
画像引用’[Facebook、セキュリティ向上のためCTFキットをオープンソース化](https://news.mynavi.jp/article/20160513-a224/)

##２．Root The Box
[CactusCon 2016で作成されたシステム](https://root-the-box.com/)のようです。[Githubはこちら。](https://github.com/moloch--/RootTheBox/)
Missionがカテゴリ、その配下に問題を作る形です。
個人的にはめちゃくちゃ好きなデザインです(〃∀〃)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/8e89171d-3d6e-bac1-cac2-b6bd08232808.png)

##３．CTFd
こちらは利用したことはないのですが、シンプルで使いやすそうだったので紹介します。
[Githubはこちら。](https://github.com/CTFd/CTFd)　[デモサイトはこちら。](https://demo.ctfd.io/)
[こちらのブログ](http://sectanlab.sblo.jp/article/178829917.html)で検証されている方がおり、非常にわかりやすく記載いただいています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102081/d4536130-8dee-0757-417f-e7149ffcf76a.png)


#おわり
ほかにも有名なもの、つかいやすいものなどありましたら、コメントにて教えて頂けると嬉しいです！
EspressoでRecyclerViewの任意のインデックスの要素にテキストが表示されているか調べる方法

```
onView(withId(R.id.recyclerView)).check(
    matches(
        atPosition(
            0,
            hasDescendant(withText("ほげ"))
        )
    )
)
```

`hasDescendant` は子孫に指定されたmatcherの要素があるか。
cookie-universal-nuxt で localhost (development ) 環境を除外しつつ set cookie 処理に secure 属性を指定するイメージである。 #js #nuxt

```js
    if (process.env.NODE_ENV === 'development') {
      this.$cookies.set(key, value)
    } else {
      this.$cookies.set(key, value, { secure: true })
    }

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2430








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windowsのgvimでリモートファイルをnetrwで開く

# 背景
windowsのgvimでリモートファイルをnetrwで開こうとしたらエラーが出た。

# 前提
リモートサーバにパスなしのカギでsshできること

# 原因
```
gvim scp://server/filename
```
とすればリモートのファイルを開くことができるはずだが、できない。
netrwから呼ばれるscpコマンドが

```
scp -q "server：filename" "/C/Users/user/AppData/Local/Temp/****.tmp"
```
となっているが、Windows10標準で搭載されているSCPコマンドではこのPathを解釈できていないっぽい。これはmsysでビルドされたSCP用の仕様らしい。
https://github.com/vim-jp/issues/issues/635

# 解決策
\vim81\autoload\netrw.vim
をバックアップとってから書き換える

2099行あたりを下記のようにコメントアウト

```
    " 'C' in 'C:\path\to\file' is handled as hostname on windows.
    " This is workaround to avoid mis-handle windows local-path:
    "if g:netrw_scp_cmd =~ '^scp' && (has("win32") || has("win95") || has("win64") || has("win16"))
    "  let tmpfile_get = substitute(tr(tmpfile, '\', '/'), '^\(\a\):[/\\]\(.*\)$', '/\1/\2', '')
    "else
    let tmpfile_get = tmpfile
    "endif

```

# お願い
netrw.vimを書き換える以外の方法をご存じの方がいればコメントをお願いいたします。
rbenvでRubyをインストールする

# これは何？
rbenvでRubyをインストールする方法のメモ。

# Requirements
以下を想定して書かれた記事。

- aptをPackage Managerとして利用しているLinux

# セットアップとインストール

まずは、インストールされいるRubyを削除。

```shell
# 以下コマンド（コピペ対応）
sudo apt-get uninstall ruby
```

rbenvのインストール。

```shell
# 以下コマンド（コピペ対応）
cd $HOME
sudo apt-get update 
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
```

インストール可能なVersionをリストする。

```shell
rbenv install -l
```

リストされた中から特定のVersionをインストール。

```shell
rbenv install [インストールするVersion]
```

使うVersionを指定する。

```shell
# インストールされた
rbenv versions

# リストされた中から1つ選択する
rbenv local [使うVersion]
```
スクロールバーが細くてうまく押せない！…Stylus使ったら即解決した

スクロールバーがやたらと細いっていうサイト、見えにくいし、うまく押せないこともしばしば、「私、細かい操作苦手なんですけど！」て思いながら耐えていたんですが、ふと「これ何とかならないかな」って思って、試してみたら…、いう話です。

こんなサイトのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/d8a7ba8b-62b2-b692-4f5e-5f16ec48fb21.png)

思いついたのが Firefox で Stylus アドオンを使って CSS を書き換えてしまう方法。もともと Stylus は入っていたこともあって、あっけないくらい簡単に解決できてしまったのでコピペできるようにメモで残しておきます。

今回試した環境は以下のとおり、

- Lubuntu 16.04
- Firefox 69.0
- Stylus 1.5.6

実際の Stylus 上で登録した CSS は以下のような感じ。

```css:スクロールバーのスタイル変更を禁止
* {
    scrollbar-width: auto !important;
    scrollbar-color: auto !important;
}
```

適用するとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/7f6b3c9e-752b-4628-90e6-b06f63df4f71.png)

何でもっと早く気づかなかったんだろうって思うんですが、でも今は幸せ。
バッチファイルでよく使うやつ

# 俺メモ

## フォルダ階層ごとコピー
```
rem 中身があるフォルダのみ
xcopy /t "コピー元フォルダ" "コピー先フォルダ"
rem 空フォルダのみ
xcopy /e "コピー元フォルダ" "コピー先フォルダ"
rem 両方
xcopy /e /t "コピー元フォルダ" "コピー先フォルダ"
rem 特定の拡張子のみコピー
for /f %a in (".\コピー元フォルダ\*.vcproj") do (xcopy /t "%a" ".\コピー先フォルダ")
```

## 空フォルダのみ削除
```
for /f %a in ('dir /s /b /ad | sort /r ) do (rm "%a")
```

## 標準の変数一覧
```
%CD%                    - 現在のディレクトリ文字列に展開します。
%DATE%                  - DATE コマンドと同じフォーマットで現在の日付に展開します。
%TIME%                  - TIME コマンドと同じフォーマットで現在の時刻に展開します。
%RANDOM%                - 0 から 32767 の間の任意の 10 進数に展開します。
%ERRORLEVEL%            - 現在の ERRORLEVEL の値に展開します。
%CMDEXTVERSION%         - 現在のコマンド プロセッサ拡張機能のバージョン番号に展開します。
%CMDCMDLINE%            - コマンド プロセッサを起動したオリジナル コマンド ラインに展開します。
%HIGHESTNUMANODENUMBER% - このコンピューター上の最大の NUMA ノード番号に展開します。
```
## ファイルチェック、フォルダチェック
```
if exist C:\local\* (
    echo ディレクトリが存在します
)
（ローカルパス、UNCパス、ネットワークドライブパスなんでも行けるらしい）

if not exist "%フォルダパス%\*" (
    if exist "%フォルダパス%" (
        echo ファイルが存在します。
    )
)
```

## 変数の置換
```
set STR=ababababab
echo %STR:a=c%
cbcbcbcbcb

rem 日付の形式変更
set str=%target:~開始位置,文字数%
%date:~0,4%%date:~5,2%%date:~8,2%
yyyy/mm/mm→yyyymmddになるよ
```

## 標準出力をぶち込む（最後の一行だけ）
```
for /f "delims=" %a in ('%CMD%') do (set VAL=%a)
```

## 文字コード変換
```
rem SHIFT-JISで定義
set SHIFT-JIS=えすじす
rem UTF-8に変更
chcp 65001
rem UTF-8でリダイレクト
echo %SHIFT-JIS%>UTF-8.txt
```
## リダイレクト
```	
rem エラー出力のみ
コマンド 2> ファイル名
rem 標準出力とエラー出力を両方
コマンド > ファイル名 2>&1
```

## 引数全部参照やつ
```
 %*
何個入れられるんだろう。
```

## 行数カウント
```
rem Linuxならwc -l
コマンド | find /c /v ""
```

## GREP相当
```
コマンド | find "文字列"
コマンド | findstr /r /c:"正規表現"
```

## 検索
```
dir /s/b C*\*hoge*
```

### 参考したやつ
https://qiita.com/yz2cm/items/8058d503a1b84688af09
CurlでPOSTできない！！RailsのCSRF対策

# RailsをAPIとして使おうとターミナルから`curl`コマンドでPOSTしようとしたがエラった時のメモ

- `curl -X POST localhost:5000/api/tasks -d 'task[name]=fugafuga'`をやろうとして以下のエラー

# <font color="OrangeRed">エラー内容</font>
- 422エラー:`Can't verify CSRF token authenticity`
- これを日本語にすると`CSRFトークンの信頼性を確認できません`となる

# 普通のフォーム入力の場合
こんな感じでhiddenにCSRF対策用のtokenが埋め込まれている
<img width="1354" alt="スクリーンショット 2019-09-14 9.16.03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303093/54525d8a-2bf4-2251-4a9b-60aa3ba1b86b.jpeg">

- 今回curlコマンドでPOSTしたことによりこのtokenがないことにRailsが怒ったってことか。。。

# 調査と対応
- APIで使用する場合...
  - APIはステートレスであるべきなので、認証はすべてのリクエストでサーバー側のセッションを使わずに行われる。
  - なのでAPIのコントローラにはprotect_from_forgeryを追加したくない、実際CSRF攻撃のリスクはほぼない。らしい。
- 以上のことから<font color="OrangeRed">`application_controller`に`protect_from_forgery with: :null_session`を追加</font>してヨシとした。

```ruby:application_contrller.rb
class ApplicationController < ActionController::Base
    protect_from_forgery with: :null_session
end
```


# 補足
- 以下のように該当のコントローラのこのアクションを`protect_from_forgery`の対象から除外するやり方もあるみたい。

```ruby:hoge_controller.rb

class HogeController < ApplicationController
  protect_from_forgery :except => [:huga]

  def huga
    ## 処理
  end
end
```


RailsはAPIで使われることが多いから覚えておこう。
次回は`API認証をつける`をテーマに執筆予定
以上！！
LiveDataの更新が反映されない

たまにLiveDataの更新がビューに反映されなくてハマります。
よくやるのが lifecycleOwnerを設定し忘れること。 これをやってしまうと初期値は反映されるが更新が反映されなくて、ViewModelの記述を見ても悪いところがなくて解決に時間がかかります。

```
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    viewModel = ViewModelProviders.of(this).get(HogeViewModel::class.java)
    binding = HogeFragmentBinding.inflate(inflater, container, false).apply {
        viewmodel = viewModel
        lifecycleOwner = viewLifecycleOwner // これを書き忘れる
    }
    return binding.root
}
```
Mac OS X 固有コマンドでどんなものがあるかを調べる

## はじめに

Mac OS X には固有のコマンドがいくつかあります。しかし、どのコマンドが Mac OS X 固有なのかはあまり把握していませんでした。

その調べ方を探してみたので紹介します。

## tl;dr

以下サイトに記載されていたコマンドを使い、絞り込むことができました。

[OSXの固有コマンド - MacWiki](https://macwiki.osdn.jp/wiki/index.php/OSXの固有コマンド)

```
zgrep -l "Mac OS X" /usr/share/man/man1/*
```

man ページの中の内容から、`Mac OS X`という文字列があるものを抽出しています。これが Max OS X 固有のコマンドと取り扱っています。

また man1 にディレクトリを絞ることで、汎用コマンドの内容に絞っています。結果は以下のようなイメージになります。

```
/usr/share/man/man1/AppleFileServer.1
/usr/share/man/man1/afscexpand.1
/usr/share/man/man1/analyticsd.1
/usr/share/man/man1/arch.1
/usr/share/man/man1/asctl.1
/usr/share/man/man1/authopen.1
/usr/share/man/man1/automator.1
/usr/share/man/man1/avconvert.1
/usr/share/man/man1/awdd.1
/usr/share/man/man1/base64.1
/usr/share/man/man1/brctl.1
/usr/share/man/man1/checkLocalKDC.1
/usr/share/man/man1/configureLocalKDC.1
/usr/share/man/man1/createhomedir.1
...
```

ここから調べてみたいコマンドを再度 `man` コマンドで見る形ですね。

## おわりに

なかなか man でコマンドについて調べる機会を持てていないので、これを機に使えそうなコマンドを調べていきたいと思います。

## 参考

* [OSXの固有コマンド - MacWiki](https://macwiki.osdn.jp/wiki/index.php/OSXの固有コマンド)
Automation Anywhere でトリガー機能を使う

# 概要
Automation Anywhere ではパソコン内で特定のイベントが発生したときにタスクを起動する**トリガー**という機能が利用できます。これはAutomation Anywhere Client の中のタスクリストの画面で設定できます。7種類のイベントに対応しており、使い込むととても便利な機能で、人気があるようです。

**対象**

* Automation Anywhere Enterprise 11.3.2
* Automation Anywhere Community Edition

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/421777d3-fcc8-025e-1cb5-2cc97be566ca.png)


# トリガーの種類
トリガーには以下のような種類があります。

|種類|説明|
|:--|:--|
|ウィンドウ|特定の文字列をタイトルに持つウィンドウが開くとき/閉じるときにトリガーされます。|
|ファイル|指定したファイルが削除/作成/名前変更/修正されるときにトリガーされます。|
|フォルダー|指定したフォルダーが削除/作成/名前変更される、もしくはフォルダー内でいずれかのファイルが削除/作成/名前変更されるときにトリガーされます。サブフォルダーを監視するオプションもあります。|
|パフォーマンス|CPU使用量/ディスク空き容量/プロセス数が特定の値/割合を上回る/下回るときにトリガーされます。|
|プロセス|指定した名前のプロセスが開始/停止したときにトリガーされます。|
|サービス|指定した名前のサービスが開始/停止/再開/一時停止したときにトリガーされます。|
|電子メールメッセージ|指定したアカウントで新規メールを受信したときにトリガーされます。|

また、システム変数に`$Trigger Value$`というものがあり、これにはトリガーとして設定されているファイル/フォルダー/ウィンドウの名称が代入されています。

# トリガーを使ってみる
いくつかのトリガーを使ってみましょう。"MessageBox" という名前で以下の1行のアクションが入ったタスクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4406b0bd-8a3a-fc2d-e29d-4a1e3d0ee381.png)

そして、保存したタスクをEnterprise Client上で選択して、トリガータブの「トリガーの種類」を選んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/83688325-8d5c-8c73-2a5c-4b66b19a6d2d.png)


### ファイルトリガー
「トリガーの種類」に「ファイル」を選択、「ファイル名」に「d:\bot\input.csv」というファイルを指定します。「操作」は「ファイルを作成するとき」を選択します。ここに入力ファイルが入ってきたらBotの処理を開始する、という想定です。「保存」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/50ab8ea1-9170-6e8f-3ca1-c91937f65b29.png)

すると右側に設定されたトリガーの一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b943ed83-c038-f8e8-90fc-4d04b357d048.png)

実際に「d:\bot\input.csv」の位置にファイルを作成してみると、Botが起動してダイアログボックスが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b344a965-02c7-4f10-8cd9-0d37da0298b6.png)



# トリガーを使うことのライセンス的な観点での意味

「トリガー」はプログラマーの観点からすると、パソコン上のある特定のイベントを監視するためにプログラムのループを組めば実現できるので、どのRPAソフトウェアであっても技術的に実現することはそう難しくありません。ただし、そのようなループを組んでロボットに監視させていると、**ロボットのライセンスと実行環境を1つそのために消費してしまいます**。ロボットのライセンスや実行環境は高価ですから、そのために消費してしまうのは勿体ないのです。トリガー機能があると、ロボットライセンスや実行環境を占有されなくなります (別のレイヤーで監視が行われるため)。そのため、トリガーが使えるかどうかというのはRPAソフトウェアで費用対効果を考える上で結構重要な要素となります。
WindowsTerminalでWSL上に構築されたArchLinuxを使う方法

# 前提
Windows10 1903
ArchWSLをインストール済み（[ここから](https://github.com/yuk7/ArchWSL/)インストールできます）
Windows Terminalをインストール済み（Version: 0.4.2382.0）
こんな記事見てる人はかなり詳しいと思うので細かい説明は省きます。

# 方法
##　1: レジストリでArchWSLのGUIDを調べる

レジストリエディターを起動し、

```
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\
```
まで移動してください。
配下にいくつかのキーがあります。これがWSLの設定なので、DistributionNameの値でも見ながらArchWSLのキーを探してキーの名前をコピーしてください。

## 2: 設定ファイルに追記する

WindowsTerminalから設定ファイルを起動して、jsonの`profiles`の最後に

```
        {
            "acrylicOpacity" : 0.5,
            "closeOnExit" : true,
            "colorScheme" : "Campbell",
            "commandline" : "wsl.exe -d Arch",
            "cursorColor" : "#FFFFFF",
            "cursorShape" : "bar",
            "fontFace" : "Consolas",
            "fontSize" : 10,
            "guid" : "ここにGUID",
            "historySize" : 9001,
            "icon" : "C:/Program Files/WindowsApps/yuk7.archwsl_19.7.2.0_x64__35zwpb4sx6e50/images/Square44x44Logo.scale-200.png",
            "name" : "ArchLinux",
            "padding" : "0, 0, 0, 0",
            "snapOnInput" : true,
            "useAcrylic" : false
        }
```
と追記してください。直前の`}`のあとに`,`を必ず入れてください。

あとは再起動すれば新しいタブリストにArchLinuxができるはずです。

## 3:デフォルトにする
PowerShellよりArchLinuxのbashが良いんだ！という方のためにデフォルトにする方法です。
設定ファイルの上の方に`globals`があると思うので、`defaultProfiles`の値をArchWSLのGUIDに変更してください。
Elmでストップウォッチを作った

Elmで何か作って勉強しようという目的のもと、自分が時間管理に使いそうなものを作っています
リポジトリは[こちら](https://github.com/maron8676/elm-stopwatch)

# 機能
1. startをクリックしてからの経過時間を計測します
1. endをクリックして計測を中断でき、startをクリックして再開できます
1. resetで計測を終了して、履歴に記録します

# データ設計
当初は、経過時間を計ればいいから開始時刻と終了時刻を```Maybe Int```で準備すればいいかと思っていたのですが、Introductionの[Maybe](https://guide.elm-lang.jp/error_handling/maybe.html)を読んで考え直すことにしました。
結果として状態を３つ(Initial, Start, Stop)に分けて、

1. Initialは時刻を持たない
2. Startは「最後に中断したときまでの経過時間」、「開始時刻」を持つ
3. Stopは「経過時間」を持つ

ことにしました。Maybeで持つよりは大分よくなったと思います。

# レイアウト
[elm-neat-layout](https://github.com/arowM/elm-neat-layout)を使ってみることにしました。
個々の部品にpaddingを設定して、縦並びと横並びを組み合わせて組んでいくイメージのようですね。[^1]
[^1]: paddingは型で管理されているので、違うpaddingを同じ並びに入れてしまう（レイアウトが崩れる）とコンパイラが教えてくれます。
表示内容に変更があったときでもそれっぽく並べてくれるので、全体を見つついろんなところを調整する、、、なんてことがなくなりそうです。

# 今後
とりあえず以下の機能を作ったら個人的に使い始められそう
~~1. サブを足して、ストップウォッチを２つにする~~
~~2. 中断していた時間はサブで計測し、別で履歴を残す~~
3. 履歴のimport/export

2019/10/05
追加開発したので更新
WSL上のArchLinuxでyayを使う方法

# 前提
Windows10 1903のWSL上に[このパッケージ](https://github.com/yuk7/ArchWSL)でArchLinuxを構築した際にyayをインストールする方法です。


# 症状

```
hayao@Hayao-PC-Win10:~/yay$ makepkg -si                                                                                  ==> Making package: yay 9.2.1-1 (Sat 14 Sep 2019 08:07:01 AM JST)                                                       ==> Checking runtime dependencies...                                                                                    ==> Checking buildtime dependencies...
==> Retrieving sources...
  -> Downloading yay-9.2.1.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   117    0   117    0     0    326      0 --:--:-- --:--:-- --:--:--   327
100  345k  100  345k    0     0   440k      0 --:--:-- --:--:-- --:--:-- 10.4M
==> Validating source files with sha1sums...
    yay-9.2.1.tar.gz ... Passed
==> Extracting sources...                                                                                                 -> Extracting yay-9.2.1.tar.gz with bsdtar
==> Starting build()...
go build -v -gcflags=all=-trimpath=/home/hayao/yay/src/yay-9.2.1 -asmflags=all=-trimpath=/home/hayao/yay/src/yay-9.2.1 -ldflags=-extldflags=-zrelro -ldflags=-extldflags=-znow -ldflags '-s -w -X main.version=9.2.1' -o yay -mod=vendor        ==> Entering fakeroot environment...
fakeroot, while creating message channels: Function not implemented                                                     This may be due to a lack of SYSV IPC support.                                                                          fakeroot: error while starting the `faked' daemon.                                                                      kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 
```

# 対処法
通常の方法ではfakerootの段階で失敗してしまい、正常にビルドできません。
修正版のfakerootを手動でインストールすることで解決します。

```bash
sudo pacman -Syu
sudo pacman -S git base base-devel
wget https://github.com/yuk7/arch-prebuilt/releases/download/18082100/fakeroot-tcp-1.23-1-x86_64.pkg.tar.xz
sudo pacman -U fakeroot-tcp-1.23-1-x86_64.pkg.tar.xz
rm fakeroot-tcp-1.23-1-x86_64.pkg.tar.xz
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
cd ..
rm -r yay
# Gitを削除してもいい場合は
yay -Rsn git
```
JavaScript で連分数から行列を使って近似分数を作る

連分数について調べていたら、行列積を使って近似分数を計算できることを知ったので実装してみた。
下記の通り簡単に実装できるので、なんとなくお得感がある。

```.js
// 正則連分数の部分商の列から、近似分数の[分子, 分母]を返す
const convergent = (...xs) => xs.map(lineFrac).reduce(mul2x2, id2x2).map(v => v[0]);

// 部分商を2x2行列にする
const lineFrac = a => [[a, 1], [1, 0]];

// 2x2行列の積
const mul2x2 = (a, b) => [0, 1].map(i => [0, 1].map(j => [0, 1].map(k => a[i][k] * b[k][j]).reduce((x, y) => x + y, 0)));

// 2x2単位行列
const id2x2 = [[1, 0], [0, 1]];
```

# 使ってみる

```.js
// √2の近似。99/70は分母、分子が2桁以内のものでは一番√2に近い
convergent(1,2,2,2,2,2); //=> [99,70]

// √3の近似
convergent(1, 1,2, 1,2, 1,2, 1); // => [97,56]

// ネイピア数
convergent(2, 1,2,1); //=> [11,4]
convergent(2, 1,2,1, 1,4,1); //=> [106,39]
convergent(2, 1,2,1, 1,4,1, 1,6,1); //=> [1457,536]

// 円周率
convergent(3,7); //=> [22,7]
convergent(3,7,15,1); //=> [355,113]
convergent(3,7,15,1,292); //=> [103993,33102]
```

# 行列積が使える簡易的な説明

有限連分数の部分商の整数列$a_n$に対して、整数列$p_n$、$q_n$を次のように定義する（添字$n$が通常と逆順なことに注意)。
ただし、$\frac{p_0}{q_0} = \frac{a_0}{1}$とする。

```.math
\frac{p_n}{q_n} = a_n + \frac{1}{a_{n-1} + \frac{1}{a_{n-2} + \frac{1}{\ddots a_1 + \frac{1}{a_0}}}} = a_n + \frac{1}{\frac{p_{n-1}}{q_{n-1}}} =  \frac{a_n p_{n-1} + q_{n-1}}{p_{n-1}}
```

この時、次式で定義される行列$A_n$を用いて、

```.math
A_n = \begin{pmatrix}
a_n & 1 \\
 1  & 0 \\
\end{pmatrix}
```

下記が成り立つことを数学的帰納法で示す。ただし、$v^T$は行ベクトル$v$の転地列ベクトルである。

```.math
(p_n, q_n)^T = A_{n} A_{n-1} \cdots A_{2} A_{1} A_{0} (1, 0)^T
```

###### n = 0 の場合

定義より、

```.math
\frac{p_0}{q_0} = \frac{a_0}{1}
```

```.math
A_0 (1, 0)^T
= 
\begin{pmatrix}
a_0 & 1 \\
 1  & 0 \\
\end{pmatrix}
\begin{pmatrix}
1 \\
0 \\
\end{pmatrix}
=
\begin{pmatrix}
a_0 \\
1 \\
\end{pmatrix}
```

となるので、$(p_0, q_0)^T = A_{0} (1, 0)^T$で、$n=0$の場合は成り立つ。


###### n = k で成り立つと仮定した場合

定義より、

```.math
\frac{p_{k+1}}{q_{k+1}} = \frac{a_{k+1} p_k + q_k}{p_k}
```

となる。一方、仮定$A_{k} \cdots A_0 (1, 0)^T = (p_k, q_k)^T$を用いれば、

```.math
A_{k+1} A_{k} \cdots A_0 (1, 0)^T
=
A_{k+1} (p_k, q_k)^T
=
\begin{pmatrix}
a_{k+1} & 1 \\
 1  & 0 \\
\end{pmatrix}
\begin{pmatrix}
p_k \\
q_k \\
\end{pmatrix}
=
\begin{pmatrix}
a_{k+1} p_k + q_k \\
p_k \\
\end{pmatrix}
```

となるから、$n = k$で成り立てば、$n = k + 1$でも成り立つ。


# おわり

ふと思ったが、行列をアフィン変換みたいに捉えれば視覚的な説明ができたりするのだろうか？
ラズパイでWindows共有フォルダーを使用できるようにする

ラズベリーパイを使ってWindows共有フォルダーにアクセスする方法。

#Sambaのインストール
`samba`は文字通りSamba本体のインストールです。`winbind`と`libnss-winbind`はWindowsのコンピューター名で名前解決するためのものです。

```console
$ sudo apt-get update
$ sudo apt-get install samba
$ sudo apt-get install smbclient
$ sudo apt-get install winbind
$ sudo apt-get install libnss-winbind
```

#/etc/nsswitch.confにwinsを書き加える
`/etc/nsswitch.conf`ファイルの`hosts:`と記載されている行に`wins`を書き加えます。

```/etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns wins
```

#共有フォルダーを探してみる
`smbtree`コマンドで共有フォルダーの一覧が表示できます。

```console
$ smbtree
Unable to initialize messaging context
WORKGROUP
	\\RASPBERRYPI    		Samba 4.9.5-Debian
		\\RASPBERRYPI\EPSON-EP-902A  	EPSON EP-902A
		\\RASPBERRYPI\IPC$           	IPC Service (Samba 4.9.5-Debian)
		\\RASPBERRYPI\USERFILES      	User Files
		\\RASPBERRYPI\print$         	Printer Drivers
	\\DMR-BRX_BX2050 		DIGA file sharing
		\\DMR-BRX_BX2050\IPC$           	IPC Service (DIGA file sharing)
		\\DMR-BRX_BX2050\USER_area      	User area of DIGA HDD
```

`smbclient -L (コンピューター名)`は、共有フォルダーを提供しているコンピューター名を指定して、共有フォルダーの一覧を確認します。

```console
$ smbclient -L (コンピューター名)
```

#共有フォルダーをマウントする
`mount -t cifs`で共有フォルダーをマウントします。
尚、user= と password= には共有フォルダーにアクセス権のあるユーザー名とパスワードを適宜指定してください。

```console
$ sudo mount -t cifs -o user=abc,password=xxx //(コンピューター名)/(共有フォルダー名) /(マウント先)
```
SlackbotでGit管理のソースコードを更新する〜PythonでのBot開発〜

本記事はSlackbotでGit管理のソースコマンドを更新する方法を説明するものです。

サーバーで稼働中のソースコードをアップデートする場合、「サーバーにログインしてgit pullコマンド」を実行という面倒な操作が必要となります。
が、SlackbotにGit更新の命令を記述しておくことでSlackbotに指示を出すだけでサイトのデータの更新が可能となります。

SlackbotでGit更新をすることで、ソースコード更新の手間を大幅に削減できることができます。

<h2>SlackbotでGit管理のソースコードを管理する方法</h2>
システムがあるサーバーとにSlackbotのプログラムを予めアップロードしておく必要があります。

Slackbotをアップロードする手順については「<a href="https://se.miyabikno-jobs.com/slackbot-rental-server/" rel="noopener noreferrer" target="_blank">Slackbotをレンタルサーバーで動かす</a>」をお読みだくさい。

<h2>SlackbotでGit管理のソースコードを更新する方法</h2>
作業は
・シェルスクリプトの作成
・Slackbotの応答処理の作成

の２つです。

<h3>シェルスクリプトの作成</h3>
更新処理は対象のディレクトリに移動して「git pull」を実行すればOKですが、Pythonに直接書き込んでしまうと複数のサーバーを管理している場合にサーバーごとの判定を用意する必要があり不便です。

サーバーによって更新操作が異なる場合があると思うので更新部分はシェルスクリプトにまとめた方が良いでしょう。

<span class="text_bolder">◆サイトアップデートのスクリプト例(git_pull.sh)</span>
<pre class="lang:default decode:true " >
#!/bin/sh
# ターゲットディレクトリに移動
cd /home/user/xxxxxxx/
# 更新をpullする
git pull
</pre> 

<span class="text_bolder">◆複数のサーバーでSlackbotによる更新を使用したい場合</span>
git_pull.shをサーバーごとに用意します。
git_pull.shはSlackbotプロジェクトの直下には置きますが、git管理から外します。
.gitignoreに「git_pull.sh」を追加しておきましょう。

<h3>Slackbotの応答処理の作成</h3>
シェルスクリプトを呼び出して結果を受け取ります。
OSの操作を行うライブラリには「os」と「subprocess」などがあります。

「os」は結果を受け取ることができないので「subprocess」を使用しましょう。

「check_output()」メソッドを使用すると「git pull」の出力内容を取得できます。
 
<pre class="lang:default decode:true " >
from slackbot.bot import respond_to
import subprocess

@respond_to('^サイトアップデート$')
def update_site(message):
    message.send('サイトをアップデートします')
    # スクリプトを実行して出力内容を取得
    out = subprocess.check_output("./git_pull.sh")
    message.send('アップデートしました')
    message.send(out)
</pre> 

<span class="text_bolder">◆実行結果</span>
<a href="https://miyabi-knock.com/tools/wp-content/uploads/2019/03/slackbot_gitpull.png" rel="noopener noreferrer" target="_blank"><img src="https://miyabi-knock.com/tools/wp-content/uploads/2019/03/slackbot_gitpull.png" width="500" alt="Slackbotでgit更新" class="alignnone size-large" /></a>

以上、SlackbotでGit管理のソースコードを更新する方法でした。

Slackbot+PythonまとめTOP＞＞<a href="https://se.miyabikno-jobs.com/slackbot-manual-python/">Slackbotの作り方マニュアル〜Python編〜</a>

◆関連記事
<ul>
<li><a href="https://se.miyabikno-jobs.com/slackbot-api-token/#slackbot-token-osenv">Slackbotを複数のワークスペースで使う</a></li>
<li><a href="https://se.miyabikno-jobs.com/slackbot-forever/">Slackbotのプロセスを永続化する〜PythonでのBot開発〜</a></li>
<li><a href="https://se.miyabikno-jobs.com/slackbot-upload-file/">SlackbotでファイルをSlackにアップロードする</a></li>
</ul>
【PHP】mb_convert_kanaでだいたい全角に変換する


ローマ字以外だいたい全角に変換するメモ。
表記揺れとか考えずもっと簡易で最低変換だけやる。


数字を半角から全角に変換と
小文字から大文字に変換する処理も入れた。


```php:
print(mb_strtoupper(mb_convert_kana($s, 'HcRNASV', 'UTF-8')));
```

```php:
<?php

//英数字：半角を全角へ
$s = "1 Hello World.";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));
$s = "2 Ｈｅｌｌｏ World.";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));
//ひらがな
$s = "おはよう";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));
//ローマ字はさすがに厳しい。めんどいけど別途作らないと無理。
$s = "ohayou";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));

//カタカナ：半角を全角ひらがなへ
$s = "ｵﾊﾖｳ";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));
//カタカナ：全角を全角ひらがなへ
$s = "オハヨウ";
print(mb_convert_kana($s, 'HcRNAS', 'UTF-8'));

```



結果


```
１　Ｈｅｌｌｏ　Ｗｏｒｌｄ．
２　Ｈｅｌｌｏ　Ｗｏｒｌｄ．
おはよう
ｏｈａｙｏｕ
おはよう
おはよう
```
tkinterのTextウィジェットを使っているときCtrl+Shift+Zでredoが効かないのを直す

この記事では、Windows10の環境で、Python 3.7.4を使っています。

# tkinterのTextウィジェットでundoやredoを効かせる
　Textウィジェットでのundoやredoのやり方ではまったので書かせてもらいたいと思う。
## tkinterのTextウィジェットを表示させる
　以下のコードでTextウィジェットを表示できる

```python:text.py
import tkinter as tk

root = tk.Tk()
text = tk.Text()
text.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))

root.mainloop()
```

　実行すると以下のようになる。
<img width="424" alt="text_widet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496119/bd6f209e-7fa4-d01a-7de3-027df210d2d9.png">

## Textウィジェットでundo redoをさせる

　undo redoをさせるにはそんなに難しくない。4行目の

```python:text.py
text = tk.Text()
```

　を

```python:text.py
text = tk.Text(undo=True)
```

　と（）にundo=Trueを入れるだけで良い。

　これで、Ctrl+Zでundoができるようになる。のだが、なぜだかCtrl+Shift+Zでredoが効かない。これでは困ったことになるので、何とかしないといけない。

## Textウィジェットでredoをさせる

　方法として、bindを使う。
　これは、あるイベントに対して、特定の処理を行うための方法である。
　今回は、Ctrl+Shift+Zというイベントにredoを行う処理を与えることにする。これで上手くいくはずである。

　まず、2行目にredoを行う処理を追加する。

```python:text.py
def redo(event=None):
    text.edit_redo()
```

　そして、6行目にbind設定を記入する。

```python:text.py
text.bind('<Control-Shift-Key-Z>', redo)
```

　このとき注意しないと行けないのはZは大文字にならないと行けない。（Shiftを押しているので大文字になるとのこと。）
　これを実行するとちゃんとCtrl+Shift+Zでredoが効くようになる。

### 今回のすべてのソース

```python:text.py
import tkinter as tk

def redo(event=None):
    text.edit_redo()

root = tk.Tk()
text = tk.Text(undo=True)
text.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
text.bind('<Control-Shift-Key-Z>', redo)

root.mainloop()
```
Nuxt.jsのaxiosを秒でモックするnpmモジュールの入門サンプル

Nuxt.jsって環境構築ラクだからついAPIの実装を待たずにフロント開発を始めたくなりますよね！

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63528/cee161a9-3a88-fe7d-6b80-3abc6fc18fe7.png)


## 事前準備

Nuxt.jsと[Axios Module](https://axios.nuxtjs.org/)がインストールされたNodeプロジェクトを用意します。
個人的には[create-nuxt-app](https://ja.nuxtjs.org/guide/installation/)でaxiosも同時にインストールするのをおススメします。
必要な構成を簡単に作れます。

## インストール

```bash
$ npm i axios-mock-server
```

## プラグイン作成

Nuxt独自の `$axios` をモック化します。

```javascript:plugins/mock.js
import mock from '~/mocks/$mock.js' // ビルド時に自動生成されるファイル

export default ({ $axios }) => mock($axios)
```

## Nuxt.jsの設定ファイル

作成したプラグインのパスを追記します。

```javascript:nuxt.config.js
export default {
  plugins: ['~/plugins/mock.js']
}
```

## APIエンドポイント定義

`mocks/users.js` のファイルを作成し `/users` のGETとPOSTを定義します。

```javascript:mocks/users.js
const users = [{ id: 0, name: 'taro' }]

export default {
  get: () => [200, users], // 返り値は [status, body?, headers?]

  post: ({ data }) => {
    users.push({
      id: users.length,
      name: data.name
    })

    return [201]
  }
}
```

## 普段通りにaxiosを使う

```vue:pages/index.vue
<template>
  <div />
</template>

<script>
export default {
  async mounted() {
    await this.$axios.$post('/users', { name: 'yoko' })

    const users = await this.$axios.$get('/users')
    console.log(users) // [{ id: 0, name: 'taro' }, { id: 1, name: 'yoko' }]
  }
}
</script>
```

## npmスクリプト

```json:package.json
{
  "scripts": {
    "dev": "axios-mock-server -b && nuxt",
    "build": "axios-mock-server -b && nuxt build",
    "start": "axios-mock-server -b && nuxt start",
    "generate": "axios-mock-server -b && nuxt generate"
  }
}
```

## Nuxt.jsを起動

`dev` コマンドで `mocks/$mock.js` が作成され、API定義が変わる度にNuxt.jsも更新されます。

```bash
$ npm run dev
```

## もっと詳しく

他にもモックサーバーに必要な機能はだいたい揃ってます。
[RESTfulな「axios-mock-server」の使い方 - Qiita](https://qiita.com/m_mitsuhide/items/b8e073cba0dae5af2359)
Mac スクリーンショットに影を付けないように設定する方法

ターミナルを起動して、次のコマンドを実行してください。

```
$ defaults write com.apple.screencapture disable-shadow -bool true
```

これだけで、スクリーンショットを撮影する際、影が付かなくなります。

ちなみに、元に戻すには、次のコマンドを実行すれば良いようです。

```
$ defaults write com.apple.screencapture disable-shadow -bool false
```
Keycloakのインポート/エクスポートの使い方の調査

AWS Workspaces (OSはAmazon Linux2)
Keycloak 7.0.0

# KeycloakのDockerコンテナ起動

```
# AWS Workspaces環境のみ
$ sudo vi /etc/docker/daemon.json

# 以下を追加
{
    "dns": ["8.8.8.8", "8.8.4.4"]
}

$ sudo service docker restart

$ cd
$ mkdir -p dkwork/keycloak/tmp
$ cd dkwork/keycloak
$ chmod 777 tmp

$ docker run -d -p 18080:8080 \
  -e KEYCLOAK_USER=admin \
  -e KEYCLOAK_PASSWORD=admin \
  -v $(pwd)/tmp:/tmp \
  --name keycloak \
  jboss/keycloak:7.0.0
```

# レルム追加/SSL required設定変更/追加レルムの管理ユーザー追加
```
$ docker exec -it keycloak bash

# Admin CLI コマンドで「SSL required」を「NONE」に変更
# Keycloakのデフォルト設定だと「SSL required」項目により、SSL通信が必須
# HTTP通信で使うために設定を変更
# 管理者ID（ここではadmin）で認証情報を設定する

$ keycloak/bin/kcadm.sh config credentials \
--server http://localhost:8080/auth \
--realm master \
--user admin \
--password admin

# レルム「master」のSSL requiredを「NONE」に変更
$ keycloak/bin/kcadm.sh update realms/master -s sslRequired=NONE

$ exit
```

ブラウザでKeycloakの管理画面にログイン(admin/admin)
http://IPアドレス：18080/auth/admin

# レルム「test」追加
・「Add realm」ボタンクリック
・Nameに「test」を入力して「Create」ボタンクリック

# レルム「test」のSSL required設定、管理ユーザー追加

```
docker exec -it keycloak bash

$ keycloak/bin/kcadm.sh config credentials \
--server http://localhost:8080/auth \
--realm master \
--user admin \
--password admin

# レルム「test」のSSL requiredを「NONE」に変更
$ keycloak/bin/kcadm.sh update realms/test -s sslRequired=NONE

# レルム「test」の管理ユーザー作成
# レルム名「test」、ユーザー・パスワード「testadmin」
$ keycloak/bin/add-user-keycloak.sh -r test -u testadmin -p testadmin

$ exit
$ docker restart keycloak
```

# レルム「test」の情報をエクスポート
```
#「 services are lazy, passive or on-demand)」の表示が出たらCtrl+C
$ docker exec -it keycloak keycloak/bin/standalone.sh \
  -Djboss.socket.binding.port-offset=100 -Dkeycloak.migration.action=export \
  -Dkeycloak.migration.provider=singleFile \
  -Dkeycloak.migration.realmName=test \
  -Dkeycloak.migration.usersExportStrategy=REALM_FILE \
  -Dkeycloak.migration.file=/tmp/test.json

$ docker stop keycloak
$ docker rm keycloak
```

# レルム「test」の情報をインポート
```
$ docker run -d -p 18080:8080 \
  -e KEYCLOAK_USER=admin \
  -e KEYCLOAK_PASSWORD=admin \
  -e KEYCLOAK_IMPORT=/tmp/test.json \
  -v $(pwd)/tmp/test.json:/tmp/test.json \
  --name keycloak \
  jboss/keycloak:7.0.0

$ docker exec -it keycloak bash

# Admin CLI コマンドで「SSL required」を「NONE」に変更
# Keycloakのデフォルト設定だと「SSL required」項目により、SSL通信が必須
# HTTP通信で使うために設定を変更
# 管理者ID（ここではadmin）で認証情報を設定する

$ keycloak/bin/kcadm.sh config credentials \
--server http://localhost:8080/auth \
--realm master \
--user admin \
--password admin

# レルム「master」のSSL requiredを「NONE」に変更
$ keycloak/bin/kcadm.sh update realms/master -s sslRequired=NONE

$ exit
```

ブラウザでKeycloakの管理画面にログイン(admin/admin)
http://IPアドレス：18080/auth/admin
Session Managerでプライベートサブネット上のEC2にSSHする方法

![Screenshot from 2019-09-14 00-45-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/d622600e-e9d2-258f-7374-203416bd1a0d.png)

JAWS-UGにて踏み台を作らなくてもプライベートサブネット上のEC2にSSHが出来ることを教えてもらったので実践してみました。
これで**踏み台サーバーのパッチ等の管理、キーペアの管理から卒業**できるかも？

# 環境作成手順
1. VPCを作成、このとき「DNS有効化」にチェックを入れる
2. プライベートサブネット作成
3. セキュリティグループの作成。80と443ポートを設定。22ポートは設定しない。わかりやすいようにEC2用とエンドポイントアタッチ用の２つ作成。
4. VPCにエンドポイントを追加「ssm」「ssmmessages」「ec2」の3つを作成
5. プライベートサブネット内にEC2を作成　>　パブリックIPがないEC2が作成されました。

![Screenshot from 2019-09-14 01-40-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/57defebc-f942-9e90-40de-4731ec41f3a7.png)


# セッションを開始してみる

- System Manager　>　セッションマネージャーを選択　>　セッション開始
![Screenshot from 2019-09-14 00-46-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/0b2a0ae6-89ed-f0c8-cf9b-12bc0a900f98.png)

- 無事セッションが開始されました。
![Screenshot from 2019-09-14 00-52-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/e6e5f641-6473-f3b7-7906-5036e29fabe3.png)

# さいごに補足
- s3にセッションマネージャーのログを残す場合はs3のエンドポイントもアタッチしたほうが良さそうです
- Amazon Linux2以外を選択するときはエージェントのインストールと有効化が必要ですのでユーザーデータなどで設定してください。
- 今回はマネジメントコンソールからのみ実施しましたが、`aws-cli`もプラグインを入れることでCLIからセッションマネージャーが使えるようになります。
- Windows ServerでリモートデスクトップもCLIのコマンドから可能です。
- セッションマネージャーだとIAM経由のため、IAMパスワードのローテーションや運用方法の周知など踏み台サーバーにはなかったデメリットもいくつかありますので踏み台の運用を駆逐するような話ではありません。
【Rails】アセットパイプラインって何？

#はじめに
Railsのディレクトリ内の構造についての理解が乏しいので備忘録として書きました。
##前提として
Webブラウザには、Webページを表示するために**複数のファイルを結合する機能**は備わっていません。そのため、開発者がファイル（CSS,JavaScript,画像ファイル）をディレクトリに分けてしまうと、それらをそのままひとつのWebページとして扱うことができなくなってしまいます。
##そこで考えられたアセットパイプライン
アセットパイプラインはRailsのアプリケーション内で使用したい`JavaScript`や`CSS`、`画像ファイル`を「開発作業がしやすいようにファイルを分割してコーディングができるようにしつつ、**最終的に一つのファイルに連結・圧縮する**」仕組みです。
![noro20160104.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285114/57a9dcdc-55bb-a05f-c017-3643e3d7c97c.gif)
ひとつのファイルに連結・圧縮され、erbテンプレートからHTML化されたファイルとひも付いてからWebブラウザ画面上に表示されるようになります。この仕組みによって、Webアプリケーション内への効率的にアクセスすることもできます。

##参考
Rails初学者がつまずきやすい「アセットパイプライン」
https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/
システムまぎちゃんへの道～MPIを入れるまで～

さて、前回は[CentOS のインストール](https://qiita.com/evakichi/items/c938e35db99eb65a1cc1)まででしたが、今回はシステムまぎちゃんの大事なアプリケーションになる、OpenMPI のインストールまで書きたいと思います。

私は、ラズパイを純粋な計算機として扱っています。ですので、ゴテゴテした GPIO とか USB がどうのこうの、といった話は一切出てきません。

ちなみにシステムまぎちゃんは、某アニメに出てくる 3 台のスーパーコンピュータになぞらえて作成するものです。

システムまぎちゃんは基本的に4台のラズパイからなります。

* コントローラー(マスター)：1台
* 計算サーバ(スレーブ)：3台

ですので、コントローラと計算サーバではちょっと設定が違ってきます。
まずは、コントローラの設定。コントローラには 64 GBytes の USB フラッシュドライブを搭載しました。
これを各スレーブと NFS で共有するホーム領域とします。
はじめに fdisk をおこなった後 mkfs でフォーマットします。次に blkid コマンドで UUID を取得します。
USB はその特性から、再起動のたびに /dev 以下の名前が変更になる場合があるので、UUID を取得するのは
大変重要です。

```
# fdisk /dev/sda
d
n
w

# mkfs.ext4 /dev/sda

# blkid
```

取得した UUID を使って /etc/fstab に一行書き加えます。

```
# vi /etc/fstab

#以下を追加
UUID=44a8d2f4-450e-48b5-b76e-91e6b69160af /home ext4    defaults,noatime 0 0
```

では、本題に移ります。まずは YUM の EPEL リポジトリを登録します。話は簡単です。
[ここ](https://wiki.centos.org/SpecialInterestGroup/AltArch/armhfp)に書かれているとおりに実行します。

```bash
$ cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0

EOF
```

リポジトリの記述ができたなら、次は YUM のアップデートをおこないます。OS はいつでも最新がキホンです。

```bash
$ yum update
```

でもってリブート。･･･の前に、せっかくリブートするのだからもうひとつ、タイムゾーンの変更もおこなっておきましょう。

```
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# reboot
```

その次に、

ここまできたら、あとはひたすら MPI のインストールをおこなえばオーケーです。MPI で普段使われているものとして 2 種類あります。
ここでその差異を述べるのは控えますが、

* MPICH
* OpenMPI

どちらもほぼ同一のコマンド体系を持っていますのでどちらでもいいのではないかと思います。
今回は、OpenMPIを入れてみます。

```
# yum install -y openmpi openmpi-devel openmpi3 openmpi3-devel gcc-c++ wget rpm-build bzip2-devel openssl-devel zlib-devel autoconf automake libtool make hdf5-openmpi hdf5-openmpi-devel hdf5-devel hdf5 man2html freeipmi-devel lua-devel mariadb-devel pam-devel readline-devel rrdtool-devel ncurses-devel gtk2-devel hwloc-devel libssh2-devel pmix-devel openssl perl-ExtUtils-MakeMaker which
```

ちょっと長いですが、私の初期の記述から掘り起こしてみたところ、こういう結果になりました。
これは、後ほど入れる tarball のために入れているものがほとんどです。

あとは、もう 1 回リブートして終わりです。

```bash
# reboot
```

今回はここまで。次は ジョブスケジューラやバッチシステムと呼ばれる SLURM のインストールを目指します。

参考 URL：
https://wiki.centos.org/SpecialInterestGroup/AltArch/armhfp