OmniAICreator/Qiita-1.07M huggingface dataset:
200519,25学習記録：CSSを使ったレイアウト②－２　フレックスボックス/CSSグリッド

https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet

Mana本

**フレックスボックス**

divで親要素、子要素を作る。親要素のCSSに```display:flex;```のプロパティをあてる。
下は390PXの親要素のボックスの中に120pxの子要素のボックスを入れて、横並びにしている。

```
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
```

```
.container{
  display:flex;
  width:390px;
  border-width:thick;
  border-style:solid;
}

.item{
  width:100px;
  height:100px;
  margin:5px;
  padding:10px;
  background:#000;
  color:#fff;
}
```
**親ボックス内の子ボックスの位置**

〇display:flexを使った場合、子ボックスは横並びになる。
この状態を「主軸は横」「交差軸は縦」と言う。

主軸つまり横方向の位置の設定はjustify-contentプロパティを使う。
交差軸つまり縦方向の位置の設定はalign-itemsプロパティを使う。

〇display:flexを使ってフレックスボックスにしたのちに
flex-direction:columnで横並びに戻した
この状態を「主軸は縦」「交差軸は横」と言う。

主軸つまり横方向の位置の設定はalign-itemsプロパティを使う。
交差軸つまり縦方向の位置の設定はjustify-contentプロパティを使う。

つまりこういうことね。

```
.page-header{
  display:flex;
  flex-direction:column;
  align-items:center;
  width:190px;
  height:190px;
  padding:5px;
  background:#9334;
}
```

でもこれなんのためにやっているのかよくわからんので、通常はメディアクエリを使った場合。
例えば↓で子要素を横並びにした

```
.page-header{
  display:flex;
  justify-content: space-between;
}
```
それをメディアクエリで560px以下の場合は、子要素を縦並びにして中央揃えにすると

```
@media(max-width:560px){
  flex-direction:column;
  align-items:center;
}
```
とこんな感じ。
通常はjustify-contentで横並びの均等配置
560px以下の場合はalign-itemsで縦並びの中央揃い


**CSSグリッド**

divで親要素、子要素を作る。親要素のCSSに```display:gird;```のプロパティをあてる。
```grid-template-columns```のプロパティで子要素の一列の数とサイズを指定。
下は640PXの親要素のボックスの中に200pxの子要素のボックスを入れて、1列3つで横並びにしている。


```
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
</div>
```

```
.container{
  display:grid;
  grid-template-columns:200px 200px 200px;
  gap:10px;
  padding:10px;
  width:620px;
  border-width:thick;
  border-style:solid;
}

.item{
  padding:10px;
  background:#000;
  color:#fff;
}
```
PHP - array_pushで躓いたこと

#環境
ARM（といってもIntel SoC）
Linux（intel SoC向けディストリビューションPoky）
サーバはlighttpd
PHPバージョンは5.6.38
#何が問題だったか
@rana_kualu 様からスッキリ回答いただきました！
私は一体何をみて、勘違いをしていたのでしょう。。。
PHP 4.x以降から可能だと思っていました。

**末尾コードのカンマは、PHP7.3以降です。**

ローカルでApacheとか最新のサーバを立てて、うまく動いて、
いざ組み込みとなった時に、PHPのバージョン全然古いじゃない、パターンでした。


##早速本題
ajaxからPHPをPOSTしてデータをやり取りしていました。
以下のコードではエラーが出てしまい、POSTデータが取れませんでした。

```php:NG_code
$arr = array();
:
:
array_push($arr, $_POST['data1'], $_POST['data2'], $_POST['data3'], );
```

エラー内容は、鍵括弧の終わり「　）」がダメだよのエラー

##PHPって最後にカンマ付けても問題ないはず
※それはPHP7.3以降のお話でした。

```php:OK_code
$arr = array();
:
:
array_push($arr, $_POST['data1'], $_POST['data2'], $_POST['data3']);
```
EC-CUBEの開発環境構築

開発環境はMacです:blush:

##[SymfoyCLI](https://symfony.com/download)のダウンロード

```sh
#symfonyをインストール
$ curl -sS https://get.symfony.com/cli/installer | bash

#パスを通す
$ export PATH=$HOME/.symfony/bin:$PATH
```

##SSLの設定

```sh
#証明書をインストール
$ symfony server:ca:install

#証明書が入っているか確認
$ ls ~/.symfony/certs/
default.p12	rootCA-key.pem	rootCA.pem	trusted
```
##サーバー起動

```sh
symfony server:start
```

[https://127.0.0.1:8000](https://127.0.0.1:8000)にアクセスしてEC-CUBEの画面が表示されればOK。

##参考サイト
先人の教えに感謝:pray_tone1:
[【2020年度版】EC-CUBE の開発環境の作り方](https://qiita.com/nanasess/items/de9f5450717cc8ede51a)
[ローカル環境でEC-CUBEをhttpsで動かす方法](https://amidaike.hatenablog.com/entry/2018/12/15/121816)
C++ Builder 10.2 Tokyo > EOutOfMemoryが起きる条件 > TStringGrid | TStringListでSaveToFile()

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
4GB RAM
```

## EOutOfMemoryが出る条件

EOutOfMemoryが発生する条件を調べてみた。
環境によって変わるので、目安としての情報である。

### TStringGrid

-  20万レコード x 10カラム: OK
- 100万レコード x 10カラム: OK
- 500万レコード x 10カラム: EOutOfMemory

それぞれのカラムには20文字の文字列を設定

### TStringListのSaveToFile()

上記で生成したTStringGridの文字列をTStringListに入れてSaveToFile()した。

- 100,000 : OK
- 300,000 : OK
- 500,000 : EOutOfMemory
- 1000,000 : EOutOfMemory


### 関連

- [C++ Builder 10.2 Tokyo > FastReport > TfrxLineViewerで線を引く > performance:20万本の描画は不可能](https://qiita.com/7of9/items/2d16bfe53196ddddf59a)


### 備考

エラーが出るAPIについてはそれ以外の実装で回避できるかもしれないが、普段使っているものとして上記を調べた。
【Oracle】自スキーマ内のfunctionの作成と実行

## 作業内容
1. 対象ユーザへの「create procedure」権限の付与
2. 自スキーマ内functionの実行
3. 自スキーマ内functionの削除

## 1. 対象ユーザへの「create procedure」権限の付与
functionもprocedureと同様に「create procedure」権限の付与で良い。

```linux:権限付与前
$ sqlplus USER/USER
SQL> create function testfunction(num in number) return number
  2  is
  3  twice number;
  4  begin
  5  twice := num * 2;
  6  return twice;
  7  end;
  8  /
create function testfunction is
*
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています

SQL> 

```

```linxu:権限付与
$ sqlplus / as sysdba
SQL> grant create procedure to USER;

権限付与が成功しました。

SQL> exit
```

## 2. 自スキーマ内functionの実行
自スキーマ内のfunctionであれば、追加権限なしで実行できる。

```linux:権限付与後
$ sqlplus USER/USER
SQL> create function testfunction(num in number) return number
  2  is
  3  twice number;
  4  begin
  5  twice := num * 2;
  6  return twice;
  7  end;
  8  /

ファンクションが作成されました。

SQL>
SQL> select testfunction(100) from dual;

testfunction(100)
-------------
          200

SQL> exit
$ sqlplus / as sysdba
SQL> set lin 300
SQL> col owner for a10
SQL> col object_name for a15
SQL> col object_type for a15
SQL> select owner,object_name,object_type from dba_objects where object_type='FUNCTION' and owner='USER';

OWNER      OBJECT_NAME     OBJECT_TYPE
---------- --------------- ---------------
USER       TESTFUNCTION    FUNCTION

SQL>
```

## 3. 自スキーマ内functionの削除
自スキーマ内のfunctionであれば、削除も追加権限なしで良い。

```
$ sqlplus USER/USER
SQL> drop function testfunction;

ファンクションが削除されました。

SQL>exit
$ sqlplus / as sysdba
SQL> select * from dba_objects where object_type='FUNCTION' and owner='USER';

レコードが選択されませんでした。

SQL>
```

そのうち、他スキーマ内のfunctionのパターンも。
Unity C#はEXE化すれば標準入力を受け取れる

タイトルの通りです。動機とか実行例を載せておきます。

# 動機
Windows環境のUnityでプロセス間通信（IPC）する！

`NamedPipeServerStream`が使えない[^1]んだが！！！！どうせ`AnonymousPipeServerStream`も使えないんだろ？TCPやUDPは違う。何か実装できそうな（面白い）方法はないか・・・・・・・・・・・・・・・・標準入力いけるか？


[^1]: C#をdll化すれば使えなくもない（[sh-akira/UnityNamedPipe: 名前付きパイプでUnityを外部アプリからコントロール](https://github.com/sh-akira/UnityNamedPipe) ・[Lachee/unity-named-pipes: A native named pipe wrapper for Unity3D](https://github.com/Lachee/unity-named-pipes)）。Unity内のC#ではないと思ったので採用は見送った。

# 環境

- Windows 10
- Unity 2018.4.9f1

# コード・ビルド・テスト

- `Assets\Scripts\StdinReader.cs` を作成

```csharp:Assets\Scripts\StdinReader.cs
using UnityEngine;
using System;
using System.Threading.Tasks;

public class StdinReader : MonoBehaviour
{
    void Start()
    {
        Task.Run(() =>
        {
            string line;
            Debug.LogError("WhileStart");
            while ((line = Console.ReadLine()) != null)
            {
                Debug.LogError("GetLine:" + line);
            }
            Debug.LogError("WhileEnd");
        });
    }
}
```

- Main Cameraにコンポーネントを追加
- [File]→[Build Settings...]の `Development Build` を☑して `Build`、適当にフォルダを作成して選択

![コメント 2020-05-13 114434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/507e1796-8cdb-55be-be37-0718c845581c.png)

- `UnityStdinTest.exe`が生成できていることを確認
- Powershellから起動

```powershell
echo "first line `n second line `n" | .\UnityStdinTest.exe
```

![コメント 2020-05-14 134220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/8ead0bf2-24a4-cbbc-14f7-b21f81653adf.png)

![コメント 2020-05-14 134604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/8c799fb1-67cd-012e-17de-bd1e76c45a5b.png)

- WSLの実行結果も持ってこれます

![コメント 2020-05-14 135209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/1fcdd733-47f7-cb51-5400-666e7690321a.png)

# 参考

- [unity3d - Fastest way to do local IPC between a Unity process and another C# process - Stack Overflow](https://stackoverflow.com/questions/32632645/fastest-way-to-do-local-ipc-between-a-unity-process-and-another-c-sharp-process)
- [Unityで別プロセスを実行し、ログを受け取る](https://gist.github.com/tsubaki/6822293)

# 感想

出来た時は爆笑した。基本的には参考の2番目のように子プロセスを作って標準出力を読み込めばいいと思う。
attr_accessorメソッドについて

よくわかってないattr_accessorに関して学んだことのメモ。

※本記事は更新中で変更の可能性があります
※2020/5/14時点

以下、今回のサンプルコードです。
※attr_accessorはコメントにしてます

```ruby
class User
# attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi

```

まず、自分で定義するインスタンス変数(@name)に関しては外部からアクセスすることはできない。
ここでいう外部と内部ですが、アクセスできる範囲としては
サンプルコードでいうと、

```ruby
class User
# attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

```

ということになるかと思います。

そして、newでインスタンスを作成し、sayhiメソッドを呼び出した場合、
sayhiメソッドが直接、インスタンス変数をみにいくのでattr_accessor :nameはコメントアウトのママでもOK。

上記サンプルコードをコンソールで吐き出すと

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
```

となる。

続いてサンプルコードに、「外部」からインスタンス変数にアクセスしようとするコードを追記。

```ruby
class User
# attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi

# 追記箇所（attr_accessorメソッドはコメントのママ）
user.name ="bob.jr"
p user.name
```

これをコンソールで吐き出すと、、、

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
Traceback (most recent call last):
hello.rb:89:in `<main>': undefined method `name=' for #<User:0x0000000002973f40 @name="bob"> (NoMethodError)
```

エラーがでます。
これは外部から直接、nameにアクセスしようとしているからです(先ほどのメソッド経由とは異なります)

なので、これができるようにするには、セッターゲッターを含む
attr_accessorメソッドのコメントをとり、有効にしてあげると、、、

```ruby
class User
attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi

# 追記箇所（attr_accessorメソッドはコメントをはずす）
user.name ="bob.jr"
p user.name
```

こうなり、コンソールで吐き出すと

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
"bob.jr"
```

見事に書き換え&表示に成功。

念のため、書き換え前の出力も追加してみる。

```ruby
class User
attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi

# 追記箇所
p user.name

user.name ="bob.jr"
p user.name
```

すると

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
"bob"
"bob.jr"
```

いい感じ。

上書きされた状態でメソッドを呼び出すコードを追加。

```ruby
class User
attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi

p user.name
user.name ="bob.jr"
p user.name
#　追加部分
user.sayhi
```

すると

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
"bob"
"bob.jr"
hi.bob.jr
```

上書きされた形でメソッドを呼び出せた！

こんな感じで「外部」からインスタンス変数の値にアクセスしたい場合に
attr_accessorメソッドを用いるとよい、らしい。
MBDynのインストール方法について(Linux Ubuntu)

### MBDynのインストール方法

Linux初心者の備忘録です。
MBDynというツールはマイナーらしく日本語のインストール解説サイトが一つも見つかりませんでした。
おそらくLinuxというツールを使い慣れている人にとっては当たり前のことですが自分のために書き出しておきます。（後々忘れて思い出すのに苦労するので）

まず公式サイト( https://www.mbdyn.org/?Software_Installation )の Software Installationの欄を見ると詳しく解説されていますのでそちらを参照します。


必要なコマンドを列挙していきます。詳細は公式サイトを参照してください。

#### 具体的な手順
apt update
apt install make gcc g++ gfortran

apt update
apt install libltdl-dev liblapack-dev libsuitesparse-dev libnetcdf-dev libnetcdf-cxx-dev

wget https://www.mbdyn.org/userfiles/downloads/mbdyn-1.7.3.tar.gz
（mbdyn-1.7.3の部分は欲しいバージョンに各自読み替えてください）

tar xzvf mbdyn-1.7.3.tar.gz
cd mbdyn-1.7.3/

次にリポジトリを公式サイトからローカル（自分の作業環境）に複製します。
方法は二つ書いてありますがここではgit cloneを用いて行います。

まずディレクトリを作成します。
mkdir -p ~/mbdyn-1.7.3/git
cd ~/mbdyn-1.7.3/git
git init

ここに
git clone https://public.gitlab.polimi.it/DAER/mbdyn.git
cd mbdyn
git checkout develop
（正直なぜブランチを作っているのかがわかりませんわかる方いましたら教えていただけると助かります）

sh bootstrap.sh

ここでソースツリーに戻りconfigureを実行します
cd ~/mbdyn-1.7.3
./configure
make

sudo make install
(make installするのならば上のmakeはいらないのでしょうか？)

以上です。

間違いなどありましたら指摘して頂けると大変助かります。
Railsをやって、最近まなんだ事をまとめてみる

## はじめに
自分が最近Railsで、制作していて忘れそうなことをメモ感覚で残したものなので、
頭おかしいこと書いてあるかもしれないのでご了承ください。

## STI(単一テーブル継承)
1つのテーブルを継承したクラスを作成することができる。
継承することによって、子クラスは親クラスと同じカラムを使うことができるので、似たようなクラスを作って増やしたいときに、カラムの定義を1つずつ行わなくてよくなるので、手間も少なくなるので便利です。カラムを追加することもできます。

※ 親クラスには、`string型`の`type`をカラムとして追加することを忘れないように、気を付けましょう！

[使い方の参考記事](http://mikamisan.hatenablog.com/entry/2016/06/05/152738)



## モデルの関連付けについて
1対1とか、1対多などの関係定義などを行うときに、いろんなファイル内に設定を書き込まないといけないので、結構大変です。
簡単に、こんな時にこう書く的なのをまとめます。

* 1対1のつながり(従属)
    * `belongs_to` を従属するモデルに書く
* 1対1のつながり(含む、所有など)
    * `has_one` を所有するモデルに書く
* 1対多のつながり
    * `has_many`を所有するモデルに書く
* 従属する(マイグレーションファイル)
    * `references :従属されるモデル(単数形)` を従属する側のモデルのマイグレーションファイルに書く
 
大体こんな感じだと思います。
[Railsガイド- Active Recordの関連付け](https://railsguides.jp/association_basics.html)


## バリデーションなど
よく使うやつと個人的に思うものをまとめます。
バリデーションで、データを確認することにより、保存したいデータのみを保存することができる。

* `presence`
    * 指定した値が空かどうかを確認
* `format`
    * 正規表現などを利用して、データの内容(文字など)を検証する
* `length`
    * 長さを検証
        *  `maximum` : 最大値を指定
        *  `minimum` : 最小値を指定
        *  `in` : 値の範囲を指定できる(以上、以下の指定ができる)
        *  `is` : 等しくないといけないように指定できる

## 最後に
Railsで開発するときに、すごい悩まされたのがデータベース設計でした。今までは、本に書いてあることをそのまま作ればよいだけでしたが、自分で開発する際には、データベースのカラムに何が必要か、どんな制約を付けるか。などとても悩む部分が多かったです。でも、いろんなことにチャレンジすることはいつか自分のためになると思うので、皆さんも頑張ってください！！
メモ: OpenGrok (ソースコード全文検索)

## 起動

* https://hub.docker.com/r/opengrok/docker/

```yaml:docker-compose.yml
version: '3'
services:

  opengrok:
    image: opengrok/docker:1.3.15
    volumes:
      - .:/opengrok/src:ro
    ports:
      - 127.0.0.1:8080:8080
```

* http://localhost:8080

```sh
# 全てUTF-8に変換
find . -type f -exec nkf -w --overwrite {} \;
```


## GitLab から乗り換えた理由

* 軽い (GitLabは メモリ 3.5GBほど必要だが、OpenGrokは500MBほど)
* 定義にジャンプ出来、またサクサク動く。
* (注意) 文字コードはUTF-8のみ対応

## 画面

Androidソースコード検索サービス さんのページで動作を確認が出来る。

* https://sites.google.com/site/devcollaboration/codesearch
200514学習記録：CSSを使ったレイアウト②2カラム、3カラム　wrapper とか clearfix とか inline-blockの使い方

TechAcadmy　lesson3 10.webページのレイアウト

◆レイアウト手順まとめ（詳しくは以下の2カラム、3カラムを見る）

１．headerとfooterの間に```<div id="wrapper"></div>``` を作る
２．wrapper の中に、カラムとして横に並べたい div や aside などを作る
３．横に並べてもカラム落ちしないように width を調整する （ % や px で値を決める）
４．カラム用の要素に float プロパティを設定する
５．CSS に clearfix を追加して、wrapper に class="clearfix" をつける
　※cssで#wrapperに「overflow:hidden;」というプロパティと値をあてる方法もある。

◆2カラムレイアウトを作る

[header]
[div#main][aside]
[footer]

という構図のレイアウトを作る

▽【css】mainとasideに「floatプロパティ」をあてる

```
main{
 float:left;
 }
aside{
 float:right;
}
```

▽footerが回り込まないようする

〇【html】mainとasideを一つのdivボックスにまとめる
id=wrapperというidを指定することが多い。

```
<div id="wrapper">
    <div id="main">
        メイン
    </div>
    <aside>
        サイドバー
    </aside>
</div>
```
〇【html】wrapperのdivに「class="clearfix"」を加える

```
<div id="wrapper" class="clearfix">
```

〇【css】「.clearfix::after」セレクタを作る

```
.clearfix::after {
    content: '';
    display: block;
    clear: both;
}
```

◆３カラムレイアウトを作る

clearfixのところは2カラムと同じ

〇【html】3つのブロックをつくる
asideのタグに「left」「right」のクラス指定をする

```
<aside class="left">左サイド</aside>
<div id="main">メイン</div>
<aside class="right">右サイド</aside>
```

〇【css】mainとasideのサイズを指定する

```
div#main{
 width:34%;
 height:100px;
 }
aside{
 width:33%;
 height:100px;
 }
```

〇【css】それぞれに「floatプロパティ」を指定する

```
div#main{
 float:left;
 }
aside.left{
 float:left;
 }
aside.right{
 float:right;
 }

```

◆ナビゲーションメニューを横並びにする

▽【html】リストでナビゲーションのボタンを並べる

```
<nav>
<ul>
 <li>ホーム</li>
 <li>会社概要</li>
 <li>サービス</li>
 <li>お問い合わせ</li>
</ul>
</nav>
```

▽【CSS】displayプロパティにinline-blockという値を入れる

```
nav ul li{
 display:inline-block;
 }

```
Django Girlsのデプロイで躓いたところのメモ

pythonanywhereのコンソールで、「python manage.py createsuperuser」を実行するとSyntaxErrorに。
![synerr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616103/7bd07dd3-54e9-60b6-3a65-1f443eb54db1.png)

調べてみると、どうやらPython2で実行されてしまったため上記のエラーが出るらしい。

![py3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616103/e4d88f76-c703-cf65-d075-3736ebcac40d.png)

頭をpython3に置き換えてあげればOK。
関数ポインタの配列

[前回の記事](https://qiita.com/sunadandy/items/ee106895c698535dd364)の類似問題。
変数操作により実行する関数を切り替えるというのが解決したい問題。
例えば下図のように、FuncPtrArray[0]とすれば関数Aが実行され、FuncPtrArray[1]とすれば関数Bが実行されるといった具合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389843/d1ae2f14-9066-84b7-e366-b2d35a85eb87.png)

## 実装
```c

#include <stdio.h>

static void function_A(void){   printf("hello");  }
static void function_B(void){   printf("bye");    }
static int function_C(void){    return 1;   }

// 関数へのポインタを指し示す配列
void (* const FuncPtrArray[])(void) = {
    function_A,
    function_B,
    function_C,
};

int main(void)
{
    FuncPtrArray[0]();
    FuncPtrArray[1]();
    printf("%d", ((int (*)(void))FuncPtrArray[2])());
}
```

ここで、FuncPtrArrayとfunction_Cは型が異なるので要注意。
処理系次第では正しく実行できるかもしれないが、下記のようなwarningが出ると思われる。

```
warning: initialization of 'void (*)(void)' from incompatible pointer type 'int (*)(void)'
```


```c
{
    void (* pfunc)(void);

    pfunc = (void (*)(void))function_C;
    printf("%d", ((int (*)(void))pfunc)());
}
```

このように実装すればwarningは出ないんだけど、変数操作で切り替えるという目的を達成できないんだよな～。
何か良い方法あるのだろうか。

----
### 追記(20200514)
頂いたコメントを元にコードを修正しました。
@SaitoAtsushiさん、@@fujitanozomuさん、ありがとうございます。
Pythonで簡単にお洒落な表を作成してみない？

# Pythonって便利
Pythonって便利です．
グラフはmatplotlibで簡単に作れるし，数値計算もnumpyがあれば事足りる．
最近は機械学習系の研究に使われたり，なんならゲームなんかも作れちゃうPython．

そんなとき，私は「Pythonで図は作れるけど表も作れるんだろうか？」とふと疑問を抱いた．

# matplotlib
答えはここにあった．
どうやらmatplotlibには表を作成するための関数があるらしい．
書くならばこんな感じ．

```python
import matplotlib.pyplot as plt
import pandas as pd


if __name__ == '__main__':
    data = {
        'a': [1.0, 2.1, 3.5, '-', 2.0, 1.0, 2.1, 3.5, 4.0, 2.0, ],
        'b': [5.7, 6.1, 7.2, 8.3, 1.2, 5.7, 6.1, 7.2, 8.3, '-', ],
        }

    df = pd.DataFrame(data)

    fig, ax = plt.subplots(figsize=(3, 3))

    ax.axis('off')
    ax.axis('tight')

    ax.table(cellText=df.values,
             colLabels=df.columns,
             bbox=[0, 0, 1, 1],
             )

    plt.show()
```
![pytable](https://hirlab.net/nblog/wp-content/uploads/2020/05/table_0.png)

表作るまでが少し面倒くさいし，表のデザインを変えるのも簡単にはいかない．
デザインを変えるには，

```python
import matplotlib.pyplot as plt
import pandas as pd


if __name__ == '__main__':
    data = {
        'Tokyo': [27, 23, 27, 24, 25, 23, 26],
        'Osaka': [26, 23, 27, 28, 24, 22, 27],
    }

    df = pd.DataFrame(data)

    fig, ax = plt.subplots(figsize=(3, 3))

    ax.axis('off')
    ax.axis('tight')

    tb = ax.table(cellText=df.values,
                  colLabels=df.columns,
                  bbox=[0, 0, 1, 1],
                  )

    tb[0, 0].set_facecolor('#363636')
    tb[0, 1].set_facecolor('#363636')
    tb[0, 0].set_text_props(color='w')
    tb[0, 1].set_text_props(color='w')

    plt.show()

```

こんな感じにする必要がある．
![pytable](https://hirlab.net/nblog/wp-content/uploads/2020/05/Figure_6-1.png)

ちょっとわざとらしいが，やっぱりデザインを凝るのならば面倒くさい．
そこで，この**matplotlibのtable関数をもとに，簡単にお洒落な表を作れるライブラリを作ろう**，となった．
ついでにPyPIにも挑戦してみたかったので，`pip install`もできるようにもしてみた．

# pyTable
なんともシンプルな名前だが，とりあえず作成してみた．
もちろんPyPIにも登録済みなので，

```shell
$ pip install pytab
```
でインストール可能だ．
本当は**pytable**にしたかったけど先約が居たので妥協．
(しばらく更新されていないやつPyPIから消して欲しいよね．)

そして以下のように引数を指定して，簡単かつお洒落な表が作れる．

```python
import pytab as pt


if __name__ == '__main__':
    data = {
        'Tokyo': [27, 23, 27, 24, 25, 23, 26],
        'Osaka': [26, 23, 27, 28, 24, 22, 27],
    }

    pt.table(
        data=data,
        th_type='dark',
        table_type='striped'
    )

    pt.show()
```
![pytable](https://hirlab.net/nblog/wp-content/uploads/2020/05/qiita_4-1.png)

その他細かく表を定義できるが，簡易なドキュメントは以下にまとめたので，気になった方は見て欲しい．
[pyTable ドキュメント](https://hirlab.net/nblog/category/programming/art_845/)

# Source
Github: [HiroshiARAKI/pytable: pytable is the library to plot table easily.](https://github.com/HiroshiARAKI/pytable)
PyPI: [pytab · PyPI](https://pypi.org/project/pytab/)

Documentation: [pyTable ドキュメント](https://hirlab.net/nblog/category/programming/art_845/)

# あとがき
ソースコードを見るとわかるが，そんな大したコードは書いていません．
これで**ライブラリ**なんて，よくそんなに堂々と名乗れるな，と自分でも思う．
ただmatplotlibをラップしただけだろ！と言われると反論できません．笑

まあでも，まだまだ発展途上なライブラリなので，今後さらに利便性を上げていく予定です(たぶん)．
気になった方は，**pyTable是非使ってみてください!!**
Firebase Emulator SuiteでCloud Functionsのデバッグをする

Firebase Emulator SuiteでCloud Functionsのデバッグを行うには`firebase emulators:start --inspect-functions`を実行します。ポート番号も続けて指定できますが多くの場合デフォルトの9229番で問題ないでしょう。
これを調べるのに猛烈に時間がかかったのですが[リファレンス](https://firebase.google.com/docs/emulator-suite/install_and_configure#startup)に載っていました・・・。

これだけだと寂しいので自分の`launch.json`を晒しておきます。

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Firebase Emulator",
      "runtimeExecutable": "firebase",
      "runtimeArgs": [
        "emulators:start",
        "--inspect-functions"
      ],
      "port": 9229,
      "skipFiles": [
        "<node_internals>/**"
      ],
      "console": "integratedTerminal"
    },
    {
      "type": "node",
      "request": "attach",
      "name": "Attach to Firebase Cloud Function Emulator",
      "processId": "${command:PickProcess}",
      "skipFiles": [
        "<node_internals>/**"
      ]
    }
  ]
}
```

`attach`のほうはまあいつも通りなのですが`launch`のほうが少々トリッキーです。`launch`リクエストには通常`program`を指定するのですが、今回はこのprogramがグローバルインストールされた`firebase-tools`です。そしてこの`program`は絶対パスを要求してくるので困りものです。
そこで`runtimeExecutable`を使用します。こちらはPATHを解決してくれるので幸せになれます。ただエミュレータはfunctionsのディレクトリをwatchして変更があるとプロセスの再起動が行われるため、デバッガーとの接続が切れます。なので基本的には`attach`のほうを使用すればいいかと思います。
Java 変数のスコープ（有効範囲）

この記事は、他の言語でプログラミングしていた人が、Javaでプログラムを組んでみると言う人に向けて書いた記事です。

### スコープとは
スコープとは使える範囲のことです。変数に限らず有効範囲をスコープと言います。今回は変数のスコープについての実例を記載します。
例1）
<img width="548" alt="スクリーンショット_2020-05-14_11_33_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/e6252362-d4bb-f828-0b72-cdfe9a9dbf3d.png">
このように、mainからchainの変数を直接持ってくることはできません。
つまり、chainのiのスコープはchain内、mainのiのスコープはmain内ということです。
例2）
<img width="574" alt="スクリーンショット_2020-05-14_11_49_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/154b2f3e-4791-5224-47b7-cd6fbd6104d2.png">
if文の中で宣言した値はif文内のみで使用できます。もし他でも使用したい場合は、if文のそとで宣言した値をif文内で操作するように変更すれば問題ありません。
<img width="451" alt="スクリーンショット_2020-05-14_11_50_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/5d2b6b67-d447-e235-61e8-7486e9e9df22.png">

#### グローバル変数とローカル変数
変数にはグローバル変数とローカル変数の2つがあります。
ローカル変数はこれまで出てきたように範囲内でしか使えない値（=スコープが有限）です。それに対してグローバル変数はスコープに制限のない変数です。Javaにはグローバル変数そのものは存在しませんが、グローバル変数と同じ状態にすることができます。
記載方法は public static 変数の記載 です。
例）
<img width="692" alt="スクリーンショット_2020-05-14_13_07_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/8bf152c3-87b0-9a7e-9af4-cc20e7ec7d73.png">
グローバル変数はどこからでも参照できるので、他のクラスなどから値の変更などができます。影響度が非常に大きいので、必要な時のみ使うようにして、できるかぎりローカル変数を使いましょう。

### public と static
グローバル変数は public static 変数の記載 と書くと記載しましたが、
それはこのpublic と static の2つがそれぞれ使える箇所（スコープ）を拡張するからです。この２点についても説明します。

##### アクセス修飾子
publicはアクセス修飾子というものの1つです。
一つずつあげていきます。
・public（公的な）は制限をつけません。
・protected（保護された） はクラスか、クラスを継承したサブクラス内部からのみアクセスを許可します。
・何もつけない場合は、同じパッケージ内のすべてのクラスからアクセスできます。
・private（私的） はクラス内部からのみ、アクセスが可能です。

このうちprotected変数以外では動きが確認できましたが、protectedの動きが想定外だったため、一旦protected以外の条件です。
確認用プログラム

```practice.java

class Main {
  public static String pubstr = "公的";
  protected static String prostr = "保護された";
  static String str = "なし";
  private static String pristr = "私的";
  
  public static void main(String[] args) {
    System.out.println(pubstr); // 公的
    System.out.println(str); // なし
    System.out.println(pristr); // 私的

    check();
    Sub subclass = new Sub();
    subclass.sub();
  }

  public static void check() {
    System.out.println(pubstr); // 公的
    System.out.println(str); // なし
    System.out.println(pristr); // 私的
  }
}

class Sub {
  public void sub() {
    Main m = new Main();
    System.out.println(m.pubstr); // 公的
    System.out.println(m.str); // なし
    System.out.println(m.pristr); // privateは取得できないのでエラー
  }
}
```

##### static
static（静的な）とは、staticメソッド（staticがついているメソッド）にでも使用可能にするものです。具体例を表示します。

```practice.java
class Main {
  public int ni = 10;
  public static int si = 7;
  int di = 999;
  
  public static void main(String[] args) {
    System.out.println(ni); // niはstatic変数でないのでエラー
    System.out.println(si); // siはstatic変数なので7が出力
  }

  public void check(String[] args) {
    System.out.println(ni); // checkはstaticメソッドでないので10が出力
    System.out.println(si); //checkはstaticメソッドでないので7が出力
  }
}
```

このように、staticとついたメソッドではstaticのついた変数のみ使用可能です。
別のアカウントでgit cloneする

既出だと思いますが、自分用にメモ残します。

# 基本構文

```
git clone https://username@github.com/username/repository.git
```

# 別のアカウントでgit clone
`username` ... git の username
`password` ... git の pass

```
git clone https://username:password@github.com/username/repository.git
```
GET送信とPOST送信の違いを簡単にまとめてみた

プログラミング初心者の備忘録。
#GET送信とPOST送信の違いを簡単にまとめる
GET送信、POST送信ともにHTTPの通信方法のひとつ。
2つの送信方法が曖昧だったので備忘録として簡単にまとめておく。

||送信方法|処理速度|特徴|
|---|---|---|---|
|GET送信|webブラウザからwebサーバーへリクエストとパラメータを同時に送る|速い|URLにパラメータが表示される|
|POST送信|webブラウザからwebサーバーへリクエストとパラメータを別々に送る|遅い|同時に送信できるデータの容量が多い|



#GET送信とPOST送信の使い分けは？
GET送信はデータ量が少ないものを素早く送るときに、
POST送信はデータ量が多いときに使う。

以上
Azure DatabricksのデータソースとしてAzure Blob Storageを用いる場合の接続方法

Azure DatabricksからAzure Blob Storage内のデータにアクセスする際どのように行えばいいのか調べてみたところ思ったより複雑だったため、まとめておきます。

基本的には2種類あり、

- Databricks File System(DBFS)にBlob Storageをマウントする
- Databricksのセル内にBlob Storageへのアクセスキーを記載し接続する(非セキュア)

今回は前者に関して見ていきます。

# 各種リソースの作成
- Azure Storage account
- Azure Databricks
- Key Container：DatabricksとBlob Storageの間の認証に使うKeyVault用 

今回はDatabricks側にシークレットのスコープ(キーのコレクション)を登録することで、Blob Storageと接続します。

まずは、Storage Accountに対するアクセスキーをシークレットとしてKeyVaultに格納します。作成したStorage Accountから、[アクセス キー]に移動しkey1をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/4bccd74c-fddb-6037-317d-a3333ba12475.png)
次にそのキーをキーコンテナ―にシークレットとして配置します。作成したキーコンテナ―から、[シークレット]に移動し[生成/インポート]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/631afae4-2d1a-9b3e-23f8-9636b8782086.png)

- アップロードオプション：手動
- 名前、コンテンツの種類：任意
- 値：ストレージアカウントのアクセスキー

を設定し、作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/4f56007a-16b5-c65b-0e26-455379cb3930.png)

続いてDatabricks側の設定に移ります。
Azure Databricks instanceの[概要]から、URLを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/8cce0b40-666b-c97f-2f76-76c5cb8824b6.png)

そのURLに対し以下のような形でアクセスします。

```
https://<your_azure_databricks_url>#secrets/createScope
```
キーコンテナーの[プロパティ]から各種値をコピペして設定します。Manage PrincipalはCreatorにするとエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/32df8235-0f6b-c9da-3eca-6cef20bdb22b.png)
設定後[Create]します。これにより、KeyVaultがDatabricksのScopeに登録できました。

続いて、sampleデータをBlob Storageのコンテナにアップロードしておきます。ここでは`samplecontainer`を作成し、`sales.txt`をアップロードしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/0c8cbffc-2a48-7b55-c84a-5fcca838ef02.png)

最後に、Databricksのnotebookから接続を確認します。クラスターは適宜作成してください。ノートブックのセルに対して以下コードを実行します。

```
dbutils.fs.mount(
  source = "wasbs://<container-name>@<storage-account-name>.blob.core.windows.net",
  mount_point = "/mnt/<mount-name>",
  extra_configs = {"fs.azure.account.key.<storage-account-name>.blob.core.windows.net":dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>")})
``` 
mount関数に対してTrueが帰れば成功です。Cmd2の方では中身の確認をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/852f092c-192b-781a-0e32-c0216581f05c.png)


# reference
https://docs.microsoft.com/ja-jp/azure/databricks/data/data-sources/azure/azure-storage
Delphiの例外処理を理解する

JavaやらPHPとかの例外処理をやっていたら、Delphiの例外処理って特殊というか、誤って理解している部分があったと認識しましたので、改めてまとめてみました。

# Javaの例外処理

Javaの例外処理はスッキリしている（と思います）。

```Java:Java
try {
    例外が起きるかもしれない処理
} catch(AException e) {
    例外AExceptionが発生した場合の処理
} catch(BException e) {
    例外BExceptionが発生した場合の処理
} catch(CException | DException e) {
    例外CExceptionかDExceptionが発生した場合の処理
} finally {
    例外が起きても起きなくても行う処理
}
tryブロックを抜けたら行う処理
````

catch節は、捕捉する例外に応じて続けることができます。finally節は、処理が不要なら省略できます。
なお、Java 7以降ではtry～catch～resources文が使えるようになっているそう。これはfinally節で明示的に行っていたリソースの解放を明示的な記述なしに行える書式ですが、この投稿の趣旨とは関係ないので省略します。

# PHPの例外処理

PHPの例外処理は、Javaに倣って作ったのか、構文も動きもほとんど同じです（多分）。catch節で、捕捉する例外をパイプ（|）で結んで複数指定できるのもJavaと同じです。

# Delphiの例外処理

これに対して、Delphiの例外処理はちょっとややこしいです。まず、書式が2つあること。

```Delphi:try～except文
try
    例外が起きるかもしれない処理
except
    on E:AException do 例外AExceptionが発生した場合の処理
    on E:BException do 例外BExceptionが発生した場合の処理
end;
tryブロックを抜けたら行う処理
````

```Delphi:try～finally文
try
    例外が起きるかもしれない処理
finally
    例外が起きても起きなくても行う処理
end;
tryブロックを「何事もなく」抜けたら行う処理
````

双方が合わさったtry～except～finallyというものは存在しないのです。

しかも、try～finallyでは例外が起きてもっとも外側のfinallyブロックの中身を実行したら、プロシージャなり関数なりからも抜けてしまう、つまりexitしてしまうので要注意です。つまり、finallyブロック以降に書かれた処理は実行されません。本当に、「最後に」実行する処理になります。

そういう意味では、try～finallyは厳密には例外処理ではないかもしれません。処理されない例外を捕捉して、後処理までやってあげたよ。けど処理を続けても意味がないので抜けるね、という感じでしょうか。

んじゃ、Javaなんかのようにするにはどうしたらいいの？ということですが、これはtryブロックを入れ子にするしかないようです。

````Delphi
try
    try
        例外が起きるかもしれない処理
    except
        on E:AException do 例外AExceptionが発生した場合の処理
        on E:BException do 例外BExceptionが発生した場合の処理
    end;
finally
    例外が起きても起きなくても行う処理
end;
tryブロックを抜けたら行う処理
````

内側のtryブロックで例外が発生したら、そこのexceptブロックにある例外処理が実行されます。そして、例外の有無にかかわらず外側のfinallyブロックに処理が移ります。ここで大事なのは、外側のtryブロックを抜けても処理が継続するということです。内側のtryブロックで例外が発生しても、それはexceptブロックで処理されて例外がクリアされているので、finallyブロックにとっては例外が発生していないよ、ということになります。ややこしいですね。

とはいえ、これでJavaのような例外処理が実装できるわけです。

ちなみに、tryブロック内でexitしても、すべてのfinallyブロックが実行されますが、もっとも外側のfinallyブロックより後の処理は実行されません。つまり、exitするけど、すべてのfinallyをやっておくよ、ということになります。

ということで、何重にも入れ子になったtry～endは可読性を下げそうなので、できるだけ避けたほうが無難ですね。
Golang の modules 管理 [Docker, go mod]

# はじめに
バックエンドは Ruby, TypeScript 等を触ってきて、「Go やるか！」と思って手を出してみたものの、みごとにハマりました。(悪い意味で)

[他言語から来た人がGoを使い始めてすぐハマったこととその答え](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)
こちらの記事を読ませていただいて、そこでやっと色々と解決できました…

ここには、上記の記事を読むだけでは解決できなかった課題に立ち向かった記録を残しておきます。

# 使用環境

- macOS Catalina 10.15.4

# Docker で環境構築

Docker コンテナ内で動かしたいので、golang の公式イメージを使って環境を作ります。
テキストエディタの補完だったりに必要そうであればローカルにもインストールしておきます。

Go には「`GOPATH` 以下に作業環境を作る」という特徴があるようで、ここが第一つまづきポイントでした。
Docker で作業する場合でも、これに従った構成にします。

## docker-compose

```yml
version: "3.8"
services:
  go:
    image: golang:1.13.10
    working_dir: /go/src/github.com/{ユーザー名}/{リポジトリ名}
    volumes:
      - .:/go/src/github.com/{ユーザー名}/{リポジトリ名}
```

## GOPATH

```
$ docker-compose run go /bin/bash -c "go env"
...
GOPATH="/go"
```

## ディレクトリ構成

```
/go
 └── src
     └── github.com
         └── {ユーザー名}
             └── {リポジトリ名}
                 ├── docker-compose.yml
                 └── main.go
```

# モジュール管理

プロジェクト内に使用するモジュールの一覧を保持して、git で管理して、というようなことをやりたかったのですが、手順がよくわからずまた少し詰まっていました。

以降の操作はすべて、[dockerコンテナ](#docker-%E3%81%A7%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89) 内での実行を前提としています。

## go1.13 未満
go のバージョンが 1.13 未満の場合、後述する `go mod init` 等のコマンドをそのまま実行しようとすると、下記のエラーが出て実行できません。

```
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
```

環境変数を設定してから実行することで正常に実行できます。

```
$ export GO111MODULE=on
```

## go.mod の作成

プロジェクトで `go mod` 系のコマンドを初めて実行する場合、まず `init` で初期化します。

```
$ go mod init
```

すると、 `go.mod` のファイルが作成されます。

## vendor でモジュール管理
```
$ go mod vendor
```

このコマンドで、必要なモジュールを `vendor` ディレクトリに保持します。
未ダウンロードのモジュールがあった場合は、モジュールのダウンロードプロセスが先に走ります。

`vendor` フォルダと `go.sum` ファイルが作成されれば成功しているはず。
これで各種モジュールが使えるようになります。

vendor を作成したくない場合は `go mod download` 等のコマンドだけ使えば良さそうです。
`go mod download` のあとに `go mod vendor` すると、download で引っ張ってきたモジュールが既にローカルにあるので、ダウンロード処理は走らず、ささっと vendor のみが作成されます。

# 他言語に置き換えると？

|         | 使用モジュールの管理 | 依存性管理         | 本体           |
| ------- | ---------------- | ----------------- | ------------- |
| Go      | go.mod           | go.sum            | vendor        |
| Node.js | package.json     | package-lock.json | node_modules  |
| Ruby    | Gemfile          | Gemfile.loc       | vendor/bundle |

こんな感じの関係性になるのかなと思っています。

## ディレクトリ構成

```
/go
 └── src
     └── github.com
         └── {ユーザー名}
             └── {リポジトリ名}
                 ├── docker-compose.yml
                 ├── go.mod
                 ├── go.sum
                 ├── main.go
                 └── vendor
                     ├── 各種モジュール
                     └── modules.txt
```

# さいごに
なにぶん初学者ゆえ、『ちげぇよコノヤロー！』な箇所があればやさしくご指摘お願いしたいですm(_ _)m
[Raspbian] python3 + eog で画像表示！

ラズパイ初心者のまおです★

ラズパイでpythonスクリプトで計算した値を読んで画像を表示することにめちゃ苦戦したので、簡単にpythonスクリプトで画像を表示する方法紹介します😋

##挑戦したこと
- Raspbianでpythonスクリプトを実行して画像を表示したかったのでopencvやpillowライブラリなどで画像表示スクリプトを書いてみたが、画像ビューワーがうまく動かなかった
- shellの方ではeogコマンド(GUI環境で画像ファイルを表示するコマンド)で簡単に画像表示できた
- pythonスクリプトでeogコマンド(shellコマンド)が使えれば楽勝なのに！！！！

## Python3でsubprocessライブラリを使う★

そこでpythonスクリプトで他のプロセスを呼び出すsubprocessライブラリを使うことにしました！
subprocessの[公式ドキュメント](https://docs.python.org/ja/3/library/subprocess.html)もぜひチェキしてください！
それでは、pythonのsubprocessでeogコマンドを実行する例を見ていきましょう。

##手順

###shellでの実行
1. Raspbian shellでeogパッケージをインストール

```
$ sudo apt install eog
```
2.eogをshellで使ってみる

```
$ eog /home/pi/test.png
```
ここで画像が表示されたらOK

```
$ eog /home/pi/test.png
```
3.次にpipでsubprocess.runパッケージをインストールします

```
$ pip install subprocess.run
```

###python3での実行

```
>>> from subprocess import run
>>> subprocess.run(['eog','/home/pi/test.png'])
```

ここで画像が実行されます★

画像表示をフル画面にしたい場合は'-f'を追加するだけ

```
>>> from subprocess import run
>>> subprocess.run(['eog','/home/pi/test.png','-f'])
```

これでフル画面で画像が実行されたはず^^
graphql/dataloaderを使うときに足りないデータにnullを入れたり、順番を調整するのに使える

https://github.com/graphql/dataloader#batch-function
を応用すればいいだけ。
自分のjavascriptのレベルが低いときはスルーしてた

```javascript
const users = [{
  id:3,
  name: "jone"
},{
  id:6,
  name: "paul"
},{
  id:8,
  name: "anna"
}];

const userIds =[6, 3, 8];

const mapped = userIds.map(
  userid => users.find(e => e.id === userid) || null
);

console.log(mapped);
/*
[
  { id: 6, name: 'paul' },
  { id: 3, name: 'jone' },
  { id: 8, name: 'anna' }
]
*/
```
pythonで寿司打を自動化してみた

## 概要
こちら、[寿司打](http://typingx0.net/sushida/play.html?soundless)の[Q&A](http://neutralx0.net/about.html)の

> ※寿司打は個人のタイピングの練習や上達を応援するサイトです。
それ以外の目的での使用や、外部ツールを使用した実験などは行わないでください。

という箇所に違反しているというご指摘がありましたので、内容を削除させていただきました。

利用規約違反になりますので、本記事や他の記事をご覧になっても真似をして自動化しないでください。

ご迷惑をおかけいたしました。

---
- [寿司打 WebGL版](http://typingx0.net/sushida/play.html?soundless)
- [寿司打 Q&A](http://typingx0.net/sushida/qa.html)
- [寿司打 利用規約](http://neutralx0.net/about.html)
【Ruby】引数のデフォルト値設定の書き方について


#はじめに
デフォルト値ってこんな感じだったよな、、

```ruby
class ApiSuggest
  def self.suggest(keyword, suggest_max_count = 99)#ここ
    Product::Suggest.where('keyword like ?', "#{keyword}%").limit(suggest_max_count).pluck(:keyword)
  end
end
```
ってすると。
rubocopから軽く怒られた。のでその対処について。

#怒られ方

>　Do not use default positional arguments. Use keyword arguments or an options hash instead.Airbnb/OptArgParameters(RuboCop)

>　デフォルトの位置引数は使用しないでください。代わりにキーワード引数やオプションハッシュを使用してください。

ここで’キーワード’が出てきてなんとなく’：’を使うのかなと思った。
更に、上の英語で検索する。
と、[こちら](https://techracho.bpsinc.jp/hachi8833/2018_10_03/62672)がヒットし、大変参考になった。

こういった細かいところも、自然と正しくかけるように継続してrubocopの指摘に注目していきたい。

###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
新人君向けの課題（ROT13）

フレッシャーズの皆さん、教育担当の皆さんジャンボ！！！！

最近、全然ブログ書けてなかった。。。

今回は、連想配列を使ってほしくてROT13という単換字式暗号（シーザー暗号）を課題として出してみました。


## 課題

```
    /**************************************************
     * 課題２: ROT13関数を作成
     *
     * ・起動引数で入力した文字列をROT13の仕様で暗号化する
     *   https://ja.wikipedia.org/wiki/ROT13
     * ・str_rot13は、使ってはなりませぬ
     * ・try-catch、throw Exceptionを使用する
    **************************************************/
```

## 私が書いた模範？解答です

```php
<?php
    try {
        // エラーチェック
        if (!isset($argv[1])) {
            throw new Exception('引数が不正です');
        }

        echo "IN : \n";
        echo "OUT: ".new_rot13($argv[1])."\n";
    } catch (Exception $e) {
        // 異常終了
        echo "*** Error: ".$e->getMessage()."\n";
        exit(1);
    }

    // 正常終了
    exit(0);


    // ROT13
    function new_rot13($in) {
        // 変換テーブル
        $_convert_table = [
                            'a' => 'n', 'b' => 'o', 'c' => 'p', 'd' => 'q', 'e' => 'r',
                            'f' => 's', 'g' => 't', 'h' => 'u', 'i' => 'v', 'j' => 'w',
                            'k' => 'x', 'l' => 'y', 'm' => 'z', 'n' => 'a', 'o' => 'b',
                            'p' => 'c', 'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g',
                            'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 'y' => 'l',
                            'z' => 'm',
                            'A' => 'N', 'B' => 'O', 'C' => 'P', 'D' => 'Q', 'E' => 'R',
                            'F' => 'S', 'G' => 'T', 'H' => 'U', 'I' => 'V', 'J' => 'W',
                            'K' => 'X', 'L' => 'Y', 'M' => 'Z', 'N' => 'A', 'O' => 'B',
                            'P' => 'C', 'Q' => 'D', 'R' => 'E', 'S' => 'F', 'T' => 'G',
                            'U' => 'H', 'V' => 'I', 'W' => 'J', 'X' => 'K', 'Y' => 'L',
                            'Z' => 'M',
        ];

        try {
            $ary = str_split($in);

            $out = "";
            foreach ($ary as $chr) {
                if (preg_match('/[a-zA-Z]/', $chr)) {
                    $out .= $_convert_table[$chr];
                } else {
                    $out .= $chr;
                }
            }

            return $out;
        } catch(Exception $e) {
            throw $e;
        }
    }
?>
```

## 動作検証

```bash
$ php ./rot13.php asdhfakj34829sakjfkdjah
asdhfakj34829sakjfkdjah
nfqusnxw34829fnxwsxqwnu
$ php ./rot13.php AAAAAAA111111KJAFDHJKjsahfkjsahsf1892341579
AAAAAAA111111KJAFDHJKjsahfkjsahsf1892341579
NNNNNNN111111XWNSQUWXwfnusxwfnufs1892341579
$ php ./rot13.php あいうえお
あいうえお
あいうえお
$ php ./rot13.php あいうえおsaldkjfalsdkjfJKFDLKJ47588738
あいうえおsaldkjfalsdkjfJKFDLKJ47588738
あいうえおfnyqxwsnyfqxwsWXSQYXW47588738
```
<br>
<br>
現場からは以上です。
FirestoreやStorageのセキュリティルールにはv2から変数が使えるぞ【今世紀最大の驚き】

タイトルのままなのですが、おそらく世の中の99%の人が知らない知識です。(私調べ)


## 変数の使い方

条件
- `rules_version = '2';`
- functionの中でのみ使える

使い方

```firestore.rules
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    function isAuthorOrAdmin(userId, article) {
      // こんな感じでletが使えちゃう
      let isAuthor = article.author == userId;
      let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
      return isAuthor || isAdmin;
    }

    match /articles/{article_id} {
      match write: if isAuthorOrAdmin(request.auth.uid, resource);
      match read: if request.auth != null;
    }
  }
}
```

びっくりですね〜！

ですが、この例の場合は、 `isAdmin` がisAuthorがtruehyの時にも呼び出されてしまうので、もったいないです。
遅延評価を活用して、呼び出しを抑制してみましょう。

```firestore.rules


rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin(userId) {
      return exists(/databases/$(database)/documents/admins/$(userId));
    }
    function isAuthorOrAdmin(userId, article) {
      let isAuthor = article.author == userId;
      // `||`を活用して isAuthorがfalseの場合のみisAdminが呼ばれる
      return isAuthor || isAdmin(userId);
    }

    match /articles/{article_id} {
      match write: if isAuthorOrAdmin(request.auth.uid, resource);
      match read: if request.auth != null;
    }
  }
}
```

これで、無駄に呼ばれることがなくなったのでいい感じです。

このletが使えるのはFirestoreだけでなくStorageでも利用できるようです！

## 変数の制限
- Functionの中で10個まで宣言できる
- Functionの終了は絶対returnしないといけない


## まとめ
変数を使って可読性の高いルールを書いていきましょう。

[実践Firestore](https://amzn.to/3fM3ouy)というFirestoreのルールやら設計やらの参考になりFirestoreやるならマストバイな良本があるのですが、それにも載ってないぐらい恐らく誰にも知られていません。

<a href="https://www.amazon.co.jp/dp/B0851BGDQG/ref=as_li_ss_il?_encoding=UTF8&btkr=1&linkCode=li2&tag=serinuntius-22&linkId=47d7e37ab9f9cfc621bc4e1231b21597&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0851BGDQG&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=serinuntius-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=serinuntius-22&language=ja_JP&l=li2&o=9&a=B0851BGDQG" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 参考文献
https://firebase.google.com/docs/rules/rules-language
簡単な SIQR モデルの表示

SIR モデルを改良した SIQR モデルを表示してみました。
次の記事を元にしました。
[新型コロナウイルスの蔓延に関する一考察](http://mercury.yukawa.kyoto-u.ac.jp/~bussei.kenkyu/wp/wp-content/uploads/2020-082101.pdf)

隔離率　0.0 の場合
![siqr_may1401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/adbacd8a-cea1-b97f-f6a4-377f42983301.png)

隔離率　0.1 の場合
![siqr_may1402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/64dfbac7-6d7b-b952-5fe5-a9a72a38ed67.png)

```py:siqr01.py
#! /usr/bin/python
#
#	siqr01.py
#
#						May/14/2020
#
# ------------------------------------------------------------------
import matplotlib.pyplot as plt
import numpy as np
import	sys

# ------------------------------------------------------------------
def plot_graph(period,r0,p_kakuri,l_ss,l_ii,l_qq,l_rr):
    plt.rcParams["font.family"] = "TakaoExGothic"
    # plt.rcParams["font.family"] = "IPAGothic"

    plt.figure()
    str_out = "基本再生産数 : {}".format(format(r0,".3f"))
    str_out += "  "
    str_out += "隔離率 : {}".format(format(p_kakuri,".3f"))
    plt.title(str_out)
    plt.xlabel('時間')
    plt.ylabel('比率')

    x = np.linspace(0, 100, period+1)
    plt.plot(x, l_ss, label="未感染者")
    plt.plot(x, l_ii, label="感染 非隔離者")
    plt.plot(x, l_qq, label="感染 隔離者")
    plt.plot(x, l_rr, label="回復者")
    plt.legend()
    plt.show()
# ------------------------------------------------------------------
def next_state(beta,nu,p_kakuri,ss, ii, qq, rr):
    q_kakuri = 0.0
    beta_ss_ii = beta * ss * ii
    delta_ss = - beta_ss_ii
    delta_ii = (1 - qq) * beta_ss_ii - p_kakuri * ii - nu * ii
    delta_qq = q_kakuri * beta_ss_ii + p_kakuri * ii - nu * qq
    delta_rr = nu * ii + nu * qq
    ss = ss + delta_ss
    ii = ii + delta_ii
    qq = qq + delta_qq
    if ss < 0:
        ss = 0
    if 1.0 < ii:
        ii = 1.0
    rr = 1.0 - ss - ii - qq
#
    return ss, ii, qq, rr
#
# ------------------------------------------------------------------
def calc_proc(beta,nu,p_kakuri,period):
#
    ii = 0.01
    qq = 0
    rr = 0
    ss = 1 - ii - rr

    l_ss = [ss]
    l_ii = [ii]
    l_qq = [qq]
    l_rr = [rr]
    r0 = beta*ss/nu

    for t in range(period):
        ss, ii, qq, rr = next_state(beta,nu,p_kakuri,ss, ii, qq, rr)
        l_ss.append(ss)
        l_ii.append(ii)
        l_qq.append(qq)
        l_rr.append(rr)
#
    return r0,l_ss,l_ii,l_qq,l_rr
#
# ------------------------------------------------------------------
sys.stderr.write("*** start ***\n")
beta = 0.5
nu = 0.3
p_kakuri = 0.0
period = 100
#
sys.stderr.write("beta = %f\n" % beta)
sys.stderr.write("nu = %f\n" % nu)
sys.stderr.write("p_kakuri = %f\n" % p_kakuri)
#
r0,l_ss,l_ii,l_qq,l_rr = calc_proc(beta,nu,p_kakuri,period)
plot_graph(period,r0,p_kakuri,l_ss,l_ii,l_qq,l_rr)
#
p_kakuri = 0.1
sys.stderr.write("p_kakuri = %f\n" % p_kakuri)
r0,l_ss,l_ii,l_qq,l_rr = calc_proc(beta,nu,p_kakuri,period)
plot_graph(period,r0,p_kakuri,l_ss,l_ii,l_qq,l_rr)
#
sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```
Listから複数要素を削除する際に注意する点

## 何が起きた
リスト内に削除する要素が複数あり、何も考えずにループしながら削除して行ったら条件に一致するのに削除されない要素が見つかった。

## 原因
至ってシンプルで、リストの先頭から走査して削除したため、インデックスと要素の組み合わせがおかしくなり、本来削除される要素が残ってしまった。

## 対処方法
リストを逆順から走査するよう変更

### 対処前

```python
lst = [1, 2, 3]
for i in lst:
    if i in (1, 2):
        lst.remove(i)
print(lst)
```

```
# 実行結果
[2, 3]
```

### 対処後

```python
lst = [1, 2, 3]
for I in reversed(lst):
    if i in (1, 2):
        lst.remove(i)
print(lst)
```

```
# 実行結果
[3]
```

## 解説
リストの頭から削除すると要素が詰められるがインデックスはそのまま。
このため削除された次の要素が詰められてしまい処理されない。
リストを後ろから削除することで次に判定される要素が詰められることを防ぐ。

### 検証
#### 対応前
``` python
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(lst):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             lst.remove(l)
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:1, list:[1, 2, 3]
index:0, value:1, list:[2, 3]
index:1, value:3, list:[2, 3]
index:1, value:3, list:[2, 3]
```

indexが`1`の時点でvalueが`3`になっているため、本来であれば判定で除去されなければならない`2`が処理されていない。(元のリスト通りならindexが`1`の時、valueは`2`)
これを逆順で行う。

#### 対応後
```python
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             lst.remove(l)
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
index:2, value:1, list:[3]
```

### 気をつけるべき事柄
ここまでは**要素**で削除を行った場合。
気をつけなければならないのは、**インデックス**で削除を行う場合。
**インデックス**で削除する場合、この書き方ではエラーになってしまう。

```python
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             del lst[i]
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
IndexError: list assignment index out of range
```
この場合は以下の以下のようにすれば対応できる。

```python
>>> lst = [1, 2, 3]
>>> for i, l in reversed(list(enumerate(lst))):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             del lst[i]
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:2, value:3, list:[1, 2, 3]
index:2, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:0, value:1, list:[1, 3]
index:0, value:1, list:[3]
```
docker内のアプリにjmxremoteする

絶対に忘れそうなので、備忘録を兼ねて。
spring-boot + docker-compose で試しました。

## docker内で動くアプリには下記の設定をしておく

```bash
-Djava.rmi.server.hostname=0.0.0.0
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10080
-Dcom.sun.management.jmxremote.rmi.port=10080
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
```

10080 port で jmxremote したいので、 docker は -p 10080:10080 とかして起動しておきましょう。

## 手元のマシンからアプリが動いてるサーバにsocks proxyを張る

```bash
ssh -fN -D 7777 接続したいサーバ
```

## jconsoleでつなぐ

```bash
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 service:jmx:rmi:///jndi/rmi://localhost:10080/jmxrmi -J-DsocksNonProxyHosts=
```

終わり。

【参照】
https://stackoverflow.com/questions/15093376/jconsole-over-ssh-local-port-forwarding
https://shinpei.github.io/blog/2015/03/28/use-jmx-over-ssh
特定の文字列が含まれるファイルのみgit addする


以下のコマンドで、カレントディレクトリ以下にある **TargetFileName** がファイル名に含まれるものを `git add` できます。

```
git ls-files . | grep 'TargetFileName' | xargs git add
```

// Example
`/DirectoryA/TargetFileName/Text.txt`
`/TargetFileName/Text.txt`
`/DirectoryB/TargetFileName.txt`

# 各コマンド解説
#### `git ls-files [path]`

[path] で指定されたディレクトリ以下のファイル一覧を取得します。

#### `grep [string]`

[string] が含まれる行のみをフィルターします。

#### `xargs [command...]`

パイプより前の実行結果を [command...] に渡します。
IQ Bot的「落ちないBotの作り方」（番外編：CRとIQ Bot同梱の場合）

先日、IQ Botにおける[「落ちないBotの作り方」](https://qiita.com/IQ_Bocchi/items/5d435b1db96f9fb21d9a)の記事を公開しました。

そこでは、[CRとIQ Botのサーバーは分離しましょう](https://qiita.com/IQ_Bocchi/items/5d435b1db96f9fb21d9a#cr%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8iq-bot%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E5%88%86%E9%9B%A2)と言っていて、たとえ検証用途であってもその環境が調達できるなら分離するに越したことはないです。

とはいえ現実的には、検証用途となると１台のサーバに同梱したいケースも多いはず（理想と現実のせめぎ合い……）。

……ということで、この記事は番外編として、どうしても同梱にせざるを得ない場合の「落ちないBotの作り方」を紹介します。

#理想的な回答：同梱に耐えうるスペックのマシンに乗せる

ベンダー公式の製品ドキュメントサイトには、
[IQ Botに関するハードウェア・ソフトウェアの要件](https://docs.automationanywhere.com/bundle/iq-bot-v6.5/page/iq-bot/topics/iq-bot/install/iq-bot-hardware-and-software-requirements.html)の他に、[CR側のハードウェア・ソフトウェア要件](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-architecture-implementation/deployment-planning/requirements-server-hardware.html)についても記載されています。

同梱の場合は、IQ Bot側の要件を満たすだけでは不十分で、IQ Bot＋CRを載せるのに十分なスペックのマシンが必要になるという意味です。

##とはいえ……

そんなスペックのマシンを調達できるくらいなら、分離してるわ！！！　……という話もありそうですね。

……ということで、もうひとつ、現実的な解決策を載せてみます。

#現実的な回答：Bot Insightを落とす！

RPAに特化したBI機能ということで、Automation Anywhereのプラットフォームの中では重要な位置を占めるBot Insightですが、こちらもまたIQ Botと並んでメモリをよく使うサービスです。

分離環境であれば、Bot InsightはCRサーバーで、IQ Botは専用のサーバーで動くので問題ないのですが、１台のマシンにこれらが併存するのはかなり厳しい……＞＜！

……ということで、IQ Botを検証するためにCRとIQ Botを同梱させている場合は、**Bot Insightは落としておく**のが定石です。

##Bot Insight関連のサービスをまるっと落とす方法

Windowsのサービスから「Automation Anywhere Bot Insight Service Discovery」というサービスを停止すると、関連するサービスをまるっと停止することができます。

![Bot Insight.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/37bcfae5-2397-9ebe-1347-22dae69abe7f.jpeg)
↓↓↓
![関連サービス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/53394733-2c28-d67a-8b3e-02939f5a5f2f.jpeg)

#補足

この記事の話は、**検証目的でやむを得ず同梱環境にする場合で、IQ Botが検証の主な対象となる場合**はBot Insightを落としましょうという話でした。

同じ検証目的でも、「IQ Botで帳票を読み取る　→　読み取った帳票のデータを分析してビジュアライズ」というようなケースを検証したい場合は、やはり別建てをお勧めします。

その他の「落ちないBotの作り方」については、[本編](https://qiita.com/IQ_Bocchi/items/5d435b1db96f9fb21d9a)をご覧ください。