OmniAICreator/Qiita-1.07M huggingface dataset:
【小ネタ】Ansibleでpingを飛ばせない場合の対処方法

# はじめに
Mac上にbrewでAnsibleをインストールしました。(Ansible勉強中)
そこで、pingの実行に少々苦戦をしましたので、対処方法を載せたいと思います。


# 事象

1つの対象にpingを実行すると、下記のようなエラーが表示される。


```zsh:実行結果
% ansible -i 192.168.56.51 all -m ping --connection=local 
[WARNING]: Unable to parse /Users/satton/etc/ansible/192.168.56.51 as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
% 
```

# 対処方法

IPアドレスの後に`,`を付ける。

```zsh:実行結果
%  ansible -i 192.168.56.51, all -m ping --connection=local
[WARNING]: Platform darwin on host 192.168.56.51 is using the discovered Python interpreter at
/usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more
information.
192.168.56.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
% 
```

<br>

※複数ホストにpingを実行することも可能

```zsh:実行結果
% ansible -i 192.168.56.51,8.8.8.8,8.8.4.4 all -m ping --connection=local
[WARNING]: Platform darwin on host 8.8.4.4 is using the discovered Python interpreter at
/usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more
information.
8.8.4.4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform darwin on host 192.168.56.51 is using the discovered Python interpreter at
/usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more
information.
192.168.56.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform darwin on host 8.8.8.8 is using the discovered Python interpreter at
/usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more
information.
8.8.8.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
% 
```


# 参考
[[小ネタ] Pythonのバージョンを指定してAnsible実行時に表示される警告を消す](https://dev.classmethod.jp/articles/ansible-without-inventory/)
boostrapの罠

現在、絶賛ポートフォリオ作成中です。

Bootstrapを導入し、見た目を整えようとしたときのこと。

```ruby:Gemfile
gem 'boostrap-sass'

```

Gemfileを更新し、bundle installしても
全く、反映されない。。

dockerで環境を構築しているので
「imageのキャッシュが使われたのかな。」
と思い

```
$ docker-compose build --no-cache
$ docker-compose up -d
```
を行うも
反映されない。

画面上はひたすら

```
@import "bootstrap-sprockets";
```
を読み込むことができない、というエラーが出るだけです。

「バージョンを指定していないからか。。？」
と思い、バージョンを指定してみると

```
Could not find gem 'boostrap-sass (~> 3.4.1)' in any of the gem sources listed in your Gemfile.
```
そんなバージョンはねえ！と言っています。
gemを見にいってみました。

<img width="677" alt="スクリーンショット 2020-07-05 11.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660132/d5b24a13-f268-dcbf-a25f-c8c060530b45.png">

なんだこいつは！
偽物？

Gemfileを「bootstrap」に書き直したところ、普通に反映されました。笑

ただのタイピングミスでしたが、めちゃくちゃ時間かかりました。
おかげで、どういうふうに読み込みされているのかわかるようになりました。
感謝。boostrap

boostrapの罠にみなさまもお気をつけて。（引っかかる人もいないと思いますが。。）
Tableau DesktopからMicrosoft Analysis Servicesへ接続した場合のデータ抽出不可について

## 注意事項
本情報は、2020年7月5日時点での情報です。
最新情報については、Tableauのドキュメントをご確認ください。

## 概要
Tableau Desktopから、Microsoft Analysis Servicesに接続した場合、データ抽出は実施できないようです。この結論に至った経緯を説明します。

下記のサービスも同様の結論になりそうです。

- Power BI Premium（XMLA エンドポイント）
- Azure Analysis Services
- SQL Server Analysis Services

## 調査内容
### Microsoft Analysis Servicesの位置付け
Tableauにおけるキューブデータソースの１つとして扱われております。
> キューブ データ ソースは、階層や集計がキューブの設計者によって事前に作成されたデータ ソースです。

>Tableau でサポートされるキューブ データ ソース:
- Oracle Essbase
- Teradata OLAP
- Microsoft Analysis Services (MSAS)
- SAP NetWeaver Business Warehouse
- Microsoft PowerPivot

引用元：[キューブ データ ソース](https://help.tableau.com/current/pro/desktop/ja-jp/cubes.htm)

### 抽出の制約について
SAP BW以外のキューブデータソースでは、データ抽出をサポートしていないようです。
> ほとんどの場合、キューブ データ ソースから抽出を作成することはできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/91ea3fbf-1a38-5582-56ea-5c0822fc3dea.png)

引用元：[キューブ データ ソース](https://help.tableau.com/current/pro/desktop/ja-jp/cubes.htm)

## 結論
Microsoft Analysis Serviceを、データソースにした場合には、データ抽出は不可能なようです。

Tableau Serverにおいて下記の記載があるので、キューブデータソースをおそらく利用できません。
> ただし、データ ソースを使用するには、データ ソースを Tableau Desktop にダウンロードし、それをローカルで使用する必要があります。

引用元：[キューブ データ ソース](https://help.tableau.com/current/server/ja-jp/datasource_cube.htm)

Tableau Onlineにおいては、ドキュメントの記載がなく、パブリッシュしようとすると下記のメッセージが表示されるため、キューブデータソースをおそらく利用できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/14c71a4c-495c-06b7-8d01-e9f747201804.png)


## 所感
Tableauに対してデータモデリング機能が弱い印象があり（2020.02バージョンにデータモデル機能が追加された現在においても）、複数のファクトテーブルを分析可能なキューブデータソースにてデータ抽出に制約があることは残念です。


もしかしたら、cdata社のODBCドライバーを利用すれば、実施可能かもしれませんが、検証は実施しておりません。

Azure Analysis Services ODBC Driver
https://www.cdata.com/drivers/azureanalysisservices/odbc/

一時的なデータ抽出で良いのであれば、下記で紹介されている方法で、テキストファイルに抽出することは可能です。

Power BI Desktop上のテーブルのデータをテキストファイル（CSV、TSV）にエクスポートする方法
https://qiita.com/ryoma-nagata/items/26a9d678a7531c85cfbc
minikube start --vm-driver=virtualbox でエラーした備忘録

# 現象

チュートリアルにしたがってやってみたがうまくいかない

```zsh

% minikube start --vm-driver=virtualbox
😄  Darwin 10.15.5 上の minikube v1.11.0
💥  The existing "" VM was created using the "" driver, and is incompatible with the "virtualbox" driver.
👉  To proceed, either:

1) Delete the existing "" cluster using: 'minikube delete -p '

* or *

2) Start the existing "" cluster using: 'minikube start -p  --driver='

💣  終了しています
```

書いてある通り、 `minikube delete -p ` / `minikube start -p  --driver=` もやってみたがうまくいかない

# 対処法

これやったらあっさりうまくいった

```zsh

% rm -rf ~/.minikube
```

以前、中途半端にやったときのゴミが残っていたのかな？

## 成功したときのログ

```zsh

% minikube start --vm-driver=virtualbox
😄  Darwin 10.15.5 上の minikube v1.11.0
✨  設定を元に、 virtualbox ドライバを使用します
💿  VM ブートイメージをダウンロードしています...
    > minikube-v1.11.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.11.0.iso: 174.99 MiB / 174.99 MiB [] 100.00% 3.94 MiB p/s 45s
👍  Starting control plane node minikube in cluster minikube
💾  Kubernetes v1.18.3 のダウンロードの準備をしています
    > preloaded-images-k8s-v3-v1.18.3-docker-overlay2-amd64.tar.lz4: 526.01 MiB
🔥  Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Docker 19.03.8 で Kubernetes v1.18.3 を準備しています...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"

❗  /Users/f/Tools/google-cloud-sdk/bin/kubectl is version 1.15.11-dispatcher, which may be incompatible with Kubernetes 1.18.3.
💡  「 minikube kubectl -- get pods 」で、一致するバージョンを表示することができます
```
Railsの単数形/複数形の変換の定義

`Money` っちゅうmodelを定義したらDBのテーブルが `money` になって、そういえばmoneyの複数形は `moneys`じゃなくて `money`だったなと中学生ごろの記憶を思い出す。

で、ふとRailsのこの辺の処理ってどうやってるんだろ？と疑問が沸いたので軽くググったら答えが出てきた。ここでやってるぽい。

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflections.rb


なんか変わった複数形の単語を発見したら、ここに追加したPR投げてみるのもいいかも。
Deep Learning Specialization (Coursera) 自習記録 (C4W3)

# はじめに
[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) の Course 4, Week 3 (C4W3) の内容です。

# (C4W3L01) Object locatlization
## 内容

- What are localization and detection?
    - classification ; 何か?
    - localization ; どこにあるか? (1 object)
    - detection; どこにあるか? (multiple objects)
- localization の output
    - classification の出力 (何か?)
    - bounding box ($b_x, b_y, b_h, b_w$)
- locatiozation の output をより具体的に
    - $p_c$ ; is there any object? (yes; 1, no; 0)
    - $b_x$
    - $b_y$
    - $b_h$
    - $b_w$
    - $c_1$ ; is it pedestrian?
    - $c_2$ ; is it car?
    - $c_3$ ; is it motorcycle?
- $p_c = 0$ (何もない) ときは，それ以外のパラメタは不定
- Loss fuction ; $L(\hat{y}, y)$
    - $\sum_{i=1}^{8} (\hat{y}_i - y_i)^2$ (if y1=1)
    - $(\hat{y}_1 - y_1)^2$ (if y1=0)




# (C4W4L02) Landmark detection
## 内容
- 顔であれば目尻や顔の輪郭，体であれば手足の位置などを検知する


# (C4W3L03) Object detection
## 内容
- sliding windows detection の説明
- まじめに window を slide すると，computation cost が大きくなる



# (C4W4L04) Convolutional implementation of sliding window
## 内容

- sliding windows detection を，convolutional neural network 内に実装する方法の説明
- 途中の MAX POOL の s (stride) が window を slide させる幅に対応する (と思う)

# (C4W4L05) ビデオ無し
- YouTube に映像がありませんでした

# (C4W4L06) Intersection over union
## 内容
- 2 つの bounding box が overlap しているとき，両者の積 (intersection) を両社の和 (union) で割ったものを IoU という
- IoU $\ge$ 0.5 なら習慣的に bounding box は correct と判断する



# (C4W3L07) Non-max suppression
## 内容
- 各物体を 1 個だけ認識することを保証するアルゴリズム
- discard all boxes with $p_c \le 0.6$
- while there are any remaining boxes:
    - pick the box with the largest $p_c$, output that as a prediction
    - discard any remaining box with IoU $\ge 0.5$ with the box output in the previous step

# (C4W3L08) Anchor boxes
## 内容
- 1 つのセルで複数の物体を認識したいときに，2 つの anchor box を設定する
- Previously:
    - Each object for training image is assigned to grid sell that contains that object's mid-point
- With two anchor box:
    - Each object in training image is assigned to grid cell that contains object's mid-point and anchor box for the grid cell with highest IoU


# (C4W3L09) Putting it together: YOLO algorithm
## 内容
- $y$ ; 3 x 3 x 2 (#anchor) x 8 (5 + #classes)
    - 3 x 3 のグリッドを想定したが，一般的には 19 x 19 とか
    - 5 + #classes ; $p_c$, $b_x$, $b_y$, $b_h$, $b_w$, $c_1$, $c_2$, $c_3$
- Outputting the non-max suppression output
    - For each grid call, get 2 prediction bounding box
    - Get rid of low probability predictions
    - For each class (pedestrian, car, motorcycle), use non-max suppression to generate final predictions


# (C4W3L10) Region Proposal (Optional)
## 内容

- Region Proposal : R-CNN
    - sliding window をすべてに適用させない
    - 領域分割して，何かありそうなところだけ適用する
    - Segmentational algorithm ($\sim$ 2000)
- R-CNN ; Propose regions. Classify proposed regions once at a time. Output label + bounding box.
- Fast R-CNN ; Propose regions. Use convolution implementation of sliding window to classify all the proposed regions.
- Faster R-CNN ; Use convolutional network to propose regions.


# 参考
- [Deep Learning Specialization (Coursera) 自習記録 (目次)](https://qiita.com/satomshr/items/dc4ae752c558798bbef6)
contextlib.ExitStack

```py
import contextlib


def is_ok_job():
    try:
        print('do something')
        raise Exception('error')
        return True
    except Exception:
        return False


def cleanup():
    print('clean up')


def cleanup2():
    print('clean up2')


# try:
#     is_ok = is_ok_job()
#     print('more task')
# finally:
#     if not is_ok:
#         cleanup()


with contextlib.ExitStack() as stack:
    stack.callback(cleanup)
    stack.callback(cleanup2)

    @stack.callback
    def cleanup3():
        print('clean up3')


    is_ok = is_ok_job()
    print('more task')

    if is_ok:
        stack.pop_all()
```
実行結果：

```txt
do something
more task
clean up3
clean up2
clean up
```
[4] : C#(ASP.NET core)でWeb APIを作って(以下略)[レスポンス(XML)編]

# 概要
これまで、
リクエストボディのXMLをオブジェクトに変換、EntityFrameworkCoreを用いたDBアクセスを学んできました。
今回は、処理結果に応じたレスポンスの返し方を実装していきます。

## Controllerの戻りを以下のように設定

```c#
// GET: api/Cat/5
[HttpGet("{id}", Name = "Get")]
public IActionResult Get(int id)
{
    // table[memotype]からmmsb = id{/api/cat/{mmsb}}のものを検索
    var result = _context.MemoTypes.Single(x => x.Mmsb == id);

    if (result == null)
    {
        var xml = $"<result><value>{"Hello World"}</value></result>";
        return new ContentResult
        {
            ContentType = "application/xml",
            Content = xml,
            StatusCode = StatusCodes.Status500InternalServerError // 500
        };
    }
    else
    {
        return Ok(); //200
    }
}
```

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587970/672ae510-6a07-3723-2816-0ace764a7f58.png)
## あとは？

所定のXML形式で返せるよう実装しよう！

---

## 参考資料

[ASP.NET Core Web API のコントローラー アクションの戻り値の型](https://docs.microsoft.com/ja-jp/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1)
[Github{ここまでの実装はこちらを参考に}](https://github.com/myantyuWorld/netcore_sample)
FizzBuzz問題ーPHP初級編ー

##はじめに
FizzBuzz問題、1度は耳にしたことがある方が多いのではないかと思います。
今回はそのFizzBuzz問題を解説していきたいと思います。

##そもそもFizzBuzz問題とは
英語圏で行われている言葉遊びの一種のようですね。
>プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3の倍数では「Fizz」（Bizz Buzzの場合は「Bizz」）、5の倍数では「Buzz」、両者の公倍数（すなわち15の倍数）では「Fizz Buzz」（Bizz Buzzの場合は「Bizz Buzz」）を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

引用：[Fizz Buzz - Wikipedia](https://ja.wikipedia.org/wiki/Fizz_Buzz)

このゲームをプログラミングに応用したものが「Fizz Buzz問題」です。
プログラマーの基本的な知識を確認するのに、面接の小テストで用いられることもあります。

##早速FizzBuzz問題を解いてみよう
【問題】
- 1から100までの数をプリントするプログラム
- 3の倍数の時には数の代わりに「Fizz」とプリントする
- 5の倍数の時には数の代わりに「Buzz」とプリントする
- 3と5両方の倍数の時には数の代わりに「FizzBuzz」とプリントする

【回答】
※今回は理解しやすい簡単なものを例に挙げています。
※PHPのバージョンは7系を前提としています。

```php
//そのファイル内での関数呼び出しの際に厳密モードでの型検査が行われるようにする
declare(strict_types=1);
 
//1から100までの数を繰り返す
for ($i = 1; $i <= 100; $i++) {
    //3と5両方の倍数の（15の倍数）なら
    if ($i % 15 === 0) {
        echo 'FizzBuzz';
    //3の倍数のなら
    } elseif ($i % 3 === 0) {
        echo 'Fizz';
    //5の倍数のなら
    } elseif ($i % 5 === 0) {
        echo 'Buzz';
    //上記以外
    } else {
        echo $i;
    }
    //見やすいように改行
    echo PHP_EOL;
}
```

##おわりに
いかがでしたでしょうか。
いったん1つの言語で理解すれば他の言語にも応用がきくと思うので仕組みを理解しておくことは大事でしょう。
（Android Studio）Gradleのプロキシ設定のやりかた

#エラーの概要
学校や職場では、ネットワークにプロキシ（Proxy）サーバーが使われている。その環境下でAndroid開発を行うと、プロキシサーバーエラーになってしまう。
僕の場合は、学校のネットワークで開発を行っていました。Android studioのプロキシ設定は、**[File]→[settings]→[Appearance&Behavior]→[System Settings]→[HTTP Proxy]**から設定できます。

しかし、僕の場合はこれでは解決しませんでした。Gradleエラーになっていまうのです。

#解決策
**Android Studio 4.0**で確認できました。
こちらを参考にしました。 https://qiita.com/hishida/items/9479fb64a016032c0938

##1.gradlewかgradlew.batに以下を記述

```
set JAVA_OPTS=-DproxyHost=myproxy.co.jp //プロキシサーバーのアドレス
              -DproxyPort=8080          //ポート番号（ほぼ8080だからそのまま記述）
　　　　　　    //Http通信
              -Dhttp.proxyUser=****     //プロキシサーバーのユーザー名
              -Dhttp.proxyPassword=**** //プロキシサーバーのパスワード
　　　　　　　　//Https通信
              -Dhttps.proxyUser=**** 　　//プロキシサーバーのユーザー名（Httpと一緒でOK）
              -Dhttps.proxyPassword=****　//プロキシサーバーのユーザー名（Httpと一緒でOK）
```

##2.gradle.propertiesに以下を記述
1を設定しただけでは、またエラーがでたので以下を記述。
※注意点は、gradle.propertiesは2つあって、**Project Properties**と**Grobal Properties**の両方に記述すること

```
//Http通信
systemProp.http.proxyHost=myproxy.co.jp　//プロキシサーバーのアドレス
systemProp.http.proxyPort=8080　　　　　　//ポート番号（ほぼ8080だからそのまま記述）
systemProp.http.proxyUser=****　　　　　 //プロキシサーバーのユーザー名
systemProp.http.proxyPassword=**** 　　　//プロキシサーバーのパスワード
//Https通信
systemProp.https.proxyHost=myproxy.co.jp　//プロキシサーバーのアドレス（Httpと一緒でOK）
systemProp.https.proxyPort=8080　　　　　　//ポート番号（ほぼ8080だからそのまま記述）
systemProp.https.proxyUser=****　　　　　　//プロキシサーバーのユーザー名（Httpと一緒でOK）
systemProp.https.proxyPassword=****　　　　//プロキシサーバーのユーザー名（Httpと一緒でOK）
```

##3.その他
僕の場合は、壊れていなかったのでやっていませんがZipファイルが壊れている場合があるようなので、その場合は、https://qiita.com/hishida/items/9479fb64a016032c0938
を参考にしてください。
マッスルRuby on Rails 1日目~環境構築~

# Rubyとは
- 動的プログラミング言語
- 全てがオブジェクト
  - 全ての情報の塊、コードにはプロパティ(インスタンス変数)とアクション(メソッド)を与えることができる 
-  Rubyの柔軟性
  - ユーザーは自由にコアな部分まで変更ができる
- ブロック：表現豊かな機能
  - メソッドにどのように振る舞うか記述したブロックを付け加えることができる
  - ブロックは関数型言語に影響されてある

# Ruby on Railsとは
- Rubyプログラミング言語で書かれたwebアプリケーションフレームワーク

# 環境構築-準備
## Homebrew
- Mac上でのソフトフェアのパッケージ管理システム
  - ソフトウェアをパッケージの依存を関係なくインストールしてくれる

## rbenv
- Rubyのバージョン管理システム
  - Rubyのバージョンを簡単に切り替えれる 

## Ruby
- 省略 

## Ruby on Rails
- 省略

## gem 
Rubyのパッケージ（ライブラリともいいます）としてのgem
パッケージとは、プログラムの部品で便利な機能をひとまとめにしたもの

## bundler
bundlerとはgemを管理するためのツールで、bundler自体もgemの一種
bundlerを使うことで、複数のgemの依存関係を保ちながらgemの管理ができる

# 環境構築-手順
> https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07

```言語:注意点1(rbenv)
$ ruby -v
でVersionが変化しないとき、
対処法として、下記のコードをたたく
$ vi ~/.bash_profile
一番下に
eval "$(rbenv init -)" を追加
最後に以下のコマンドをたたく
$ source ~/.zshrc
```


```言語:注意点2(Railsアプリ起動)
$ cd プロジェクト名
$ rails server
```
YYYYMMDD形式のファイルを連番にリネーム

職場のサーバーに2008年1月から毎日更新している画像データを実直に保存していたので
ファイル名を連番にリネームしてffmpegで動画にしてみた。

- 元ファイル status_20080101.pngから
- 変換後　status_0001.png等

YYYYMMDDは一旦Date形式に変換して比較してソートしてからリネームかなぁ？
と思ったらもっと楽だった。
globのsortedで日付け順にきちんとリスト化してくれた
　

``` rename.py
import os
import glob

file_list = sorted(glob.glob('status_????????.png'))

for num,filename in enumerate(file_list):
    os.rename(filename , 'status_' + '{0:04d}'.format(num) + '.png')
```

ffmpegで連番画像をソースにする方法は以下を参照した（Qiita)
[ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~](https://qiita.com/livlea/items/a94df4667c0eb37d859f)

NOAA(アメリカ海洋大気庁）が公開している海洋表層の氷のグリッドデータを動画にしたので
季節によって極域の氷が増減する様子が判って面白かったのだがQiitaに動画が貼れない？のでとりあえずここまで。
【Folio LSP】まとめ記事

#:sparkles:随時更新:sparkles:
:bee: 図書館業務システムのオープンソースプロジェクトであるFOLIO Library Services Platform (LSP)のまとめ記事です。

##概要編
- [FOLIO Library Services Platform (LSP)のコンセプト](https://qiita.com/ayungn/items/6d0bdceced8cf0b21d72)
- [FOLIOをざっくり](https://qiita.com/ayungn/private/651f415844914798deda)
- [プロジェクトで必要な技術的スキル](https://qiita.com/ayungn/items/491f83d5cb66f8a0cbd7)
- [Okapi-Stripes Platformとは](https://qiita.com/ayungn/items/b5b32e741e8b8049d29d)
- [Stripes CLI](https://qiita.com/ayungn/items/71b5950cb072f8dc1633)




##チュートリアル
1. [ワークスペースを作ってVMを立ち上げる](https://qiita.com/ayungn/items/45c3f8bbe419308106a6)
2. [VM概要](https://qiita.com/ayungn/items/8db10b01c2561008a1b7)
3. [VMを触ってみる](https://qiita.com/ayungn/items/18f5e1fa3ef1d2ab38e4)
4. [ローカルでの開発](https://qiita.com/ayungn/items/009053ce4e21d5b759c8)

##チュートリアル Platform-core
1. [Single Server Deployment-VirtualBoxで](https://qiita.com/ayungn/items/f84e55893b7817af15a7)
2. [Single Server Deployment-EC2で](https://qiita.com/ayungn/items/bedf45ab7375f6e25185)

##チュートリアル Platform-complete
3. [Single Server Deployment-EC2で](https://qiita.com/ayungn/items/f432fa68b34a1daf94cf)

##画面操作
- [画面操作 101](https://qiita.com/ayungn/private/f87f75848c0869eb670d)
- [契約・ライセンス 101](https://qiita.com/ayungn/private/ce44aa4482bf02d4b5a3)

##参考情報
- [チュートリアルで出てくるCURLオプション](https://qiita.com/ayungn/items/f713f3a142f093a63e0e)
- [Dockerをざっくり](https://qiita.com/ayungn/items/78afaac66f4c6eeaccc1)
- [Lokalise（翻訳ツール） 101](https://qiita.com/ayungn/private/a687096cefec3269a08d)
- [Folioリンク集](https://www.notion.so/Folio-e471f74e8aa7474691429b4c4799e5ee)
- [Folio FAQ](https://www.notion.so/FAQ-239451082d024dcea3409b23f5dc9aa0)
Django_環境構築

# 項目
1. 前準備
2. Djangoインストール、動作確認

# 1.前準備
- 拡張機能から`Python`と`Python Extension Pack`をインストール

# 2.Djangoをインストール
- GitHubで作業ディレクトリを作っておく
- もちろんVSCodeにGitHubから引っ張ってくる

```bash:VSCodeのターミナル
# <-------------------------------------->
# 作業ディレクトリを作成
$ mkdir myapp

# 作業ディレクトリへ移動
$ cd myapp
# <-------------------------------------->
# Gitから引っ張ってきた場合は上２つはやらないで、そのままターミナルを開いてOK

# 仮想環境を作成(python3で怒られるならpython,pyとか色々試す)
$ python3 -m venv myenv
```
- 上にあるツールバーの`表示`から`コマンドパレット`を選択、`Python: Create Terminal`を入力
- ターミナルが仮想環境上で動く様になる

```bash:VSCodeの仮想環境ターミナル
$ cd myapp

# Djangoをインストール
$ pip install django

# 一応モジュールにある確認
$ pip freeze

# myappへ移動
$ cd myapp

# プロジェクト作成
$ django-admin startproject test_project

# test_projectへ
$ cd test_project

# サーバ起動
$ python manage.py runserver
```
- `http://localhost:8000/`か`https://localhost:8000/`にリンクしてこいつが出れば終了
<img width="653" alt="スクリーンショット 2020-07-05 10.30.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649647/0db19d41-0eb3-b5dd-bf8e-424f4f10e3d3.png">

- VSCodeのターミナルで`Ctrl + c`忘れずに
- めっちゃ時間かかりそうだけど環境そのままGitHubにプッシュしてもいいかも

# 3.終わりに
- 終了

## 追記
- オススメは出来ないがプロジェクトの`settings.py`で`ALLOWED_HOSTS = ["*"]`してもいいかもしれない
Mac Javaホームディレクトリ

Macで、Javaのバージョンアップをする際に、毎回ホームディレクトリの場所を忘れてしまう。

.bashrc に記載している環境変数を見て、「そーだった」と納得しつつ、覚えられない自分がいる。

```bash
export JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home"
```

ついでに brewでのJavaインストールコマンドも残しておきます。

```bash
brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk14
```
https://github.com/AdoptOpenJDK/homebrew-openjdk
【Folio LSP】プロジェクトで必要な技術的スキル

#プロジェクトで必要としている人材

具体的なロールと、何時間の稼働が求められるかはこちら[Confluenceの募集ページ「Technical Skills in Demand」](https://wiki.folio.org/display/TC/Technical+Skills+in+Demand)をご確認ください。

##バックエンド開発者
- Java 8 と オブジェクト指向設計・プログラミング
- マイクロサービスモデル(RAML, JSON, XML)でのRESTful interfacesの実装
- データベース（SQLとNoSQLの両方） 特にPostgreSQL
- 仮想化– Docker,Vagrant

## フロントエンド開発者
- クライアントサイド Javascript (React) と関連するテストツール/フレームワーク

## フロントエンド開発者・バックエンド開発者共通
- テストツール/フレームワーク
- CI/CD – Jenkins
- サーバーサイドJavaScript (Node JS)と関連するテストツール/フレームワーク
- セキュリティ– SSO, OAUTH, SAML, LDAP等
- ソフトウェア構成管理（SCM） - Git/GitHub


##DevOpsエンジニア
※Folioで使っているツールセットを使って、CI/CD環境をコーディングするエンジニア

- ソフトウェア構成管理（SCM） - Git/GitHub
- CI/CD – Jenkins 
- 仮想化– Docker, Vagrant
- インフラ自動化 – Ansible, Puppet, Chef
- オーケストレーション– Kubernetes/ECS, Rancher
- セキュリティ-- – SSO, OAUTH, SAML, LDAP
- クラウド  - AWS, GoogleCloud


##システム管理者

- Linuxベースシステムの管理
- Slack/Github/Confluence/JIRAのためのアプリケーション管理（ユーザ、グループ、アプリケーション設定、ライセンシングなど）

#参考
https://wiki.folio.org/display/TC/Technical+Skills+in+Demand

#変更履歴

2020年7月5日　新規作成
ActiveModelのvalidateが発火されない時に

最近RailsのViewを使うケースより、APIの開発ケースが増えたので、ActiveModelの使う機会が以前より、グーと増えた気がした。が、すごく簡単なことで、ハマってしまったので、メモ形式で共有します。

例えば、ActiveModelを使った以下のような簡単なクラスがあるとしよう。

```ruby
class SearchForm
  include ActiveModel::Model
  attr_accessor :from_date, :to_date
  validate :check_something

  def check_something
    ・・・
  end
end
```

Controller側では以下のように利用するとしよう。

```ruby
form = SearchForm.new(params)
```
インスタンスの作成時、当然、カスタムバリエーション用のメソッドが実行されない。
「えっ？なぜcheck_somethingが実行されないの？」という簡単なミスにハマったことがあった。
valid? or invalid?を呼ばない限り、発火しないのは当然のことだが、、、ORZ

以下のように

```ruby
form.valid? 
# or
form.invalid? 
```
みなさんは、このような経験がないでしょうか？
Chrome拡張で将来的にSameSiteとみなされない件について

下記のエラーが発生する
chrome拡張でスクレイプしたさいに下記表示が発生する

A cookie associated with a cross-site resource at https://mgstage.com/ was set without the `SameSite` attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/feature/5088147346030592 and https://www.chromestatus.com/feature/5633521622188032.
Tableau DesktopからAzure Analysis ServicesにMFAが設定されているユーザーでログインする方法

## エラー概要
Tableau Desktopから、Azure Analysis Servicesに接続しようとすると下記のメッセージが表示されました。原因は、認証に利用しているAzure ADアカウントにて、MFA（多要素認証）の設定が実施されていることでした。

> データベース エラー 0x80004005: OLE DB プロバイダーでエラーが発生しました。 指定された資格情報を使って認証トークンを取得できません。Active Directory テナント管理者によって多要素認証が構成されている場合、またはアカウントが Microsoft アカウントの場合は、'ユーザー名' と 'パスワード' のフィールドに空の値を指定してから、再試行してください。そうすると、資格情報を入力するように求められます。
サーバーに接続できません。サーバーが実行中であり、要求したデータベースへのアクセス権を持っていることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0f12934c-1afe-0341-087e-e729d228825e.png)

## 対応策
エラーメッセージにて、空の値を指定すると記載があるのですが、正確にはスペースを入力することで対応できました。

### 1. ユーザー名とパスワードに、半角スペース（ ）を入力し、"サインイン"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6906ba0b-209b-dab3-2e56-138e2aa6423d.png)

### 2. Azureのログインウィンドウが表示されることを確認し、ユーザー情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8ce31266-8f7d-d8df-e2f6-daf8b54dec34.png)

### 3. Azure Analysis Servicesに接続していることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cc7cbdce-34b2-9628-fcde-cfa21a7cd408.png)
高位合成言語NSL その4

#概要

windowsでiverilogやってみた。
nslやってみた。
全加算器、書いてみた。

#サンプルコード


```
declare ha {
	input a;
	input b;
	output c;
	output o;
}
module ha {
	{
		c = a & b;
		o = a ^ b;
	}
}
declare fa {
	input a;
	input b;
	input c;
	output o;
	output s;
}
module fa {
	ha ha0;
	ha ha1;
	{
		ha0.a = a;
		ha0.b = b;
		ha1.a = ha0.o;
		ha1.b = c;
		o = ha1.o;
		s = ha0.c | ha1.c;
	}
}

```

#テストベンチ


```
module test;
	reg clk,
		rst;
	reg a,
		b,
		c;
	fa u(.clk(clk), .rst(rst), .a(a), .b(b), .c(c), .o(o), .s(s));
	always #1 clk = ~clk;
	integer i,
		j,
		k;
	initial
	begin
		clk = 0;
		rst = 1;
		#1
			rst = 0;
		#1
			rst = 1;
		$display("a b c o s");
		$monitor("%b %b %b %b %b", a, b, c, o, s);
		for(i = 0; i < 2; i = i + 1) begin
			for(j = 0; j < 2; j = j + 1) begin
				for(k = 0; k < 2; k = k + 1) begin
					a = i;
					b = j;
					c = k;
					#1;
				end
			end
		end
		$finish;
	end
endmodule

```

#実行結果


```

a b c o s
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1


```


以上。
高位合成言語NSL その３

#概要

windowsでiverilogやってみた。
nslやってみた。
半加算器、書いてみた。

#サンプルコード


```
declare ha {
	input a;
	input b;
	output c;
	output o;
}
module ha {
	{
		c = a & b;
		o = a ^ b;
	}
}

```

#テストベンチ


```
module test;
	reg clk,
		rst;
	reg a,
		b;
	ha u(.clk(clk), .rst(rst), .a(a), .b(b), .c(c), .o(o));
	always #1 clk = ~clk;
	integer i,
		j;
	initial
	begin
		clk = 0;
		rst = 1;
		#1
			rst = 0;
		#1
			rst = 1;
		$display("a b c o");
		$monitor("%b %b %b %b", a, b, c, o);
		for(i = 0; i < 2; i = i + 1) begin
			for(j = 0; j < 2; j = j + 1) begin
				a = i;
				b = j;
				#1;
			end
		end
		$finish;
	end
endmodule

```

#実行結果


```

a b c o
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0


```

以上
ターミナルを使ったGitの方法

# この記事について
プログラミングど初心者が、現役プログラマーさんに教えていただいたgitの基礎をまとめてみました。同じGit初心者の方の何かお役に立てれば嬉しいです。Macを使用しているので、Mac寄りの表記になっています。

# Gitとは？
プログラムソースや文書など、パソコンの中にある様々な制作物の変更履歴を管理するシステムです。「保存ボタンを押してしまったけれど、前回までの状態に戻したい！」時にとても便利です。ローカル環境（自分のパソコンなど）に、全ての変更履歴を含む完全なリポジトリの複製が作成されます！
私の説明ではなかなかGitの概念が伝わりにくいと思いますので、以下の漫画がとてもわかりやすく、おすすめです。

湊川あい「漫画で分かるGit」
https://next.rikunabi.com/journal/tag/webdesign-manga/page/2/?fbclid=IwAR0vpRwn1C55tFk5s38Jqy8n2bMhIAFNr_pQgQwF14I69jTlvps9vMO4Tdo


# 用意するもの
ターミナル（windows:コマンド プロンプト）のみ！

Gitは「Source　Tree」などのソフトウェアもありますが、もともとパソコンに内臓されているターミナルでも行うことができます。

ターミナルの表示方法（Macの場合）
１　command + スペースキー　を押し、検索画面を表示させます。
２　「ターミナル」とカタカナで入力すると出てきます！

# Gitの手順
以下のようなターミナルの黒い画面を出したら、
<img width="571" alt="スクリーンショット 2020-07-05 8.42.50.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/0434c0a5-0b80-876e-5c3b-7ef8531e70c7.jpeg">
~$ の後ろにコマンドを打っていきましょう！

1 まずはホームに移動
```cd ~
```cdの後に半角スペースが入ります。

2 バージョン管理したいフォルダへ移動
```cd フォルダ名
```
3 フォルダをgitの対象にする
```git init
```このコマンドを打つことで、対象フォルダの中に、.gitという拡張子がついた隠しフォルダが作られ、そこにバージョンを記録していきます。

4 フォルダ内の全てのファイルを記録対象に追加する
```git add .
```
特定のファイルのみ記録する対象にする場合は . の代わりにファイル名を書きます。
```git add ファイル名
```

5 先ほど対象にしたファイルをgitに記録
```git commit -m "first commit"
```初めての記録の場合は"first commit"がお決まりのフレーズ。
毎回 " "の中にメッセージを入れます。

6 バージョンが記録されている確認
```git log
```ここで、"first commit"と表示されていたら、記録成功です！

# 覚えておくと便利なコマンド
```git status
```２回目以降の記録の際に、バージョン管理下に置かれているフォルダ内に変更があったかどうか、状態を表示します。
"nothing to commit, working tree clean"と出てきたら、前回から変更がないという意味です。


vim
先ほどの５番目の手順　```git commit -m "（commitの名前）"
```でcommit名を入れ忘れると、vimというファイル編集ソフトが開き、以下のような画面になります。
<img width="749" alt="スクリーンショット 2020-07-05 9.08.10.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/3502bd1b-539f-126f-1e69-27c10cdf8ef3.jpeg">
こうなってしまった時は、```:q```でvimのモードを終了できます。


#終わりに
いかがでしたか？手元のパソコンの機能だけで、Gitを利用することができるんです。Gitを教えていただいてから作業の安心感が違います！Gitってすごい！（笑）
次回は、ローカルでデータを消してしまったときも安心！のGit hubの使い方をまとめてみたいと思います。
【Folio LSP】FOLIO Library Services Platform (LSP)のコンセプト

チュートリアルの前提となる知識を書いていきます。
ざっと読んでからチュートリアルに進んだほうがいいかもしれない。
##LSPとは
Library Service Platformの略。

##Folio LSP 基本モジュール（Folio LSP Base）

Folioにおいてモジュールは選択可能ですが、以下の基本モジュールは相互依存する可能性があります。

- ユーザ管理、インベントリー（蔵書）、貸出・返却系モジュール
    - mod-circulation
    - mod-inventory
    - ui-checkin/checkout
    - ui-users
    - ui-inventory
    - ui-calendar
- 選書・購入系モジュール (例):
    - ui-orders
    - ui-vendors

- ERM(E-resource Management)系モジュール

##Folio LSP拡張アプリ

- 考えられるアプリの例
    - コレクション分析ツール
    - 物理的保存とデジタル保存活動を追跡するための報告ツール
    - LMS(Learning Management System)との統合
    - キュレーション価値評価の記録と関連文書
    - 組織内でのアイテムの移動記録（一般的には博物館のコレクションに使用されます）
   


##プラットフォーム、LSP Base、Extended Appの違い

|                      | Okapi-Stripes Platform | 基本モジュール                  | 拡張モジュール |
|----------------------|------------------------|---------------------------------|----------------|
| 開発チーム           | コア                   | Product Councilがコーディネート | オープン       |
| テクノロジースタック | Tech Councilが承認     | Tech Councilが承認              | チームによる   |
| 完了定義の厳守       | 厳密                   | 厳密                            | 推奨される     |
| プルリクエストの管理 | コア                   | モジュールモデレータ            | オープン       |
2020-07-04 PYNQ > Tutorial: Reduilding the PYNQ base overlay > 失敗したところ

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### 概要

PYNQのBase overlayをVivadoを使って生成しなおす。
(base.bitとは違うデザインを試したい時に、base overlayから生成すると、HDMIなど細かい部分を自分でデザインしなくて済む。)

### 参考

- [Tutorial: Rebuilding the PYNQ base overlay](https://discuss.pynq.io/t/tutorial-rebuilding-the-pynq-base-overlay/61)

### 不明点とはまった点

Tutorialを5回くらい試してようやく成功。

- Q. どのVivadoのバージョン?
    - A. v2019.1 (2020年7月4日現在)
- Q. Application Exception: Top module not set for fileset ...
    - A. Create HDL Wrapperしてない
- Q. IO関連でたくさんのエラー
    - A. base.XDCをconstraintに指定してなかった
- Q. プロジェクトを作ってからtclを実行するのか?
    - A. プロジェクトを作らずにVivadoを開いた状態でtclを実行
    - (用意したフォルダ以下に関連ファイルが生成されるのだろう)

### 手順

1. https://github.com/Xilinx/PYNQ からzip取得
    - `PYNQ-master.zip`
2. フォルダ作成
    - `C:\pynq_proj_2020-05-23\2020-07-04_1037_baseOL`
3. 1のzipファイルのPYNQ-masterより「下」のフォルダとファイルをコピー
    - コピー先: 手順2のフォルダ
    - コピー対象: 以下のフォルダとファイル
        - .github/
        - boards/
        - doscs/
        - ...
4. Vivado 2019.1を起動
    - 下に「Tcl Console」が見える
5. IPの生成: tclコンソールにて以下を実行
    - `cd C:/pynq_proj_2020-05-23/2020-07-04_1037_baseOL/boards/Pynq-Z1/base`
    - `source ./build_base_ip.tcl`
    - =>
    - 「`HLS IP builds complete`」というメッセージが出て完了する
6. Block designの生成: tclコンソールにて以下を実行
   - (手順5と同じ位置)
   - `source ./base.tcl`
   - => Block Designが生成される
7. Create HDL Wrapperをする
    - Sourcesタブ のDesign Sources > baseにて右クリックで「Create HDL Wrapper」
        - Let Vivado manage wrapper and auto-update でOK
8. base.xdcファイルをConstraintsに足す
    - Sourcesタブの Constraints > constrs_1にて右クリックで「Add Sources」
    - Add or create constraints
    - Add Files
    - `C:\pynq_proj_2020-05-23\2020-07-04_1037_baseOL\boards\Pynq-Z1\base\vivado\constraints\base.xdc` 選択
    - Finish
9. Run Simulation以降の処理を実行して、bitstream生成まで行う

Core i7-6700K 4GHzでbitstream生成までに45分くらいかかる。

### 画像

手順7
<img width="306" alt="コメント 2020-07-04 120911.png (17.0 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2020/07/04/21741/60a33219-29c2-4424-9b64-8890e5a2c0fb.png">

生成されるBlock Design
<img width="688.5" alt="コメント 2020-07-04 130648.png (70.8 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2020/07/04/21741/88581bf8-66ab-402d-84db-3e9cbe28a701.png">


### 次回起動時

生成したVivadoプロジェクトを次回起動する方法は`C:/pynq_proj_2020-05-23/2020-07-04_1037_baseOL/boards/Pynq-Z1/base/base/base.xpr`を開く。
【Swift】ズボラな通知音変更

# こんにちは。 いるべさんです。

Firebaseを使ってユーザ間の通知を行う実装をしていたとき、馴染みのある「ティロリン♪」ってやつしか使い方分からなくて困っていた。

通知音をインポートして再生するやり方はよく見かけた。
~~が、めんどくさがり屋ないるべさんは**そんなことしたく無い！！！**~~

今回はAudioToolbox使って通知音とする様にした。
ただ、こんなことしなくてもちゃんとしたやり方がありそう。

# 構成仕様
構成としては、ユーザがCloud FireStoreにデータを突っ込んだらそれをClound Functionsが検知して購読しているユーザに通知を送るよくある普通の実装。

通知を受け取ったら通知情報からsoundの項目を引っ張ってきてAudioToolboxに再生してもらう簡単仕様。

なので、通知を送るFunctionsのpayloadのsoundの項目にSoundSystemIdの値、もしくは通知ごと、ユーザごとに通知音を変えたいならその識別子を入れておく。

# 実装
### Functions
まずはCloud Functionsの関数を作成する。大事そうなところだけピックアップして記載しておく。
今回の話の肝になるのはpayloadのsound。
ここにAudioToolboxに通用するSystemSoundIdを入れておく。

```javascript:index.js
exports.sendNotifications = functions.firestore.document('/notifications/{userId}/messages/{messageId}').onCreate((snapshot, context) => {
~~ 省略 ~~

var payload = {                                       
    notification: {
        title: data.username,
        body: data.detail,                                                  
        badge: "1",                                                         
        sound: "1020"                                                       
    }                                                                     
};

~~ 省略 ~~
return admin.messaging().sendToTopic(topic, payload, options)
    .then(function(response) {
        return console.log(response);         
    })
    .catch(function(error) {  
        return console.log(error); 
    }); 
```

### 通知を受け取る側
まぁ何も難しいことはしてなくて、通知から必要な情報取り出してAudioToolboxに突っ込んでいるだけ。
普通にやる場合はcompletionHandlerに.soundを入れる形なのでそのやり方で今回と同じ様なことができたらなぁと思う。ご存知の方、ぜひ教えてください！

```swift:SceneDelegate.swift
func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        
        if let aps = userInfo["aps"] as? [String: Any] {
            let soundId: SystemSoundID = SystemSoundID(aps["sound"] as! String) ?? 1007
            AudioServicesPlaySystemSound(soundId)
        }
        
        completionHandler([.alert, .badge])
    }
```

これでユーザが通知を受け取ったとき、今回で言えば設定したid:1020が鳴るというわけです。

~~やり方が正しいかは分からないけど思い通りの実装ができたので今のところはヨシ！！！~~

# お読み頂き、ありがとうございました。
Alwayon構成のプライマリレプリカからDBを削除しようとしてエラーになった

AlwayonからDB削除後、レプリカのDBを消さずにAlwayonにDBを登録しようとして失敗。セカンダリからDBを削除しようとしたが、エラーが出る事象が発生。OS再起動で解消…。
手順って大事…。
Gatsby.jsからWordPressに移行した話

# 始めに
非公開の身内向けのブログをGatsby.jsで構築して結局ついていけなくなって、WordPressに移行したというお話です。

# 経緯
仲間内のメモ共有のためのブログが必要だったのですが、万一見られても問題ないのでガッツリ認証とかイントラネットのような者は必要ない。とはいえ既存ブログサービスを使うのも「ちょっと」と言うことになって、静的サイトジェネレーターを採用しようかという話になりました。

# 未知の技術はしんどい
GatsbyはReactを採用したツールですが、当初は技術力の向上に役立つと思って採用しましたが、結局Vueばかり使っていてReactは採用しませんでした。そのためカスタマイズもままならず、記事が増えるにつれて記事探すのも面倒になってしまいしました。さらに「マークダウンの書き方がわからん」という声やら、メタデータを書き間違ってデプロイに失敗したケースや、そもそもデプロイに時間が掛かるなどデメリットの方が目立ってきました。ぶっちゃけ、閲覧数は少ないのでハックされると言われても（今で公式サイトもクローズして脆弱性のデメリットがあったとしても）SQLite Integrationを導入して自動でバックアップをするシステムを取れば問題ありませんでした。

#結局技術は手段
というわけで、WordPressで移行しました。やはり技術は手段ということを痛感しました。とはいえ機会があればVueベースの静的サイトジェネレーターを使いたいですがね･･･。
【Folio LSP】Okapi-Stripes Platformとは

チュートリアルの前提となる知識を書いていきます。
ざっと読んでからチュートリアルに進んだほうがいいかもしれない。

# Okapi-Stripes Platformとは

- Folio LSPプロジェクトのインフラストラクチャとして開発されたもので、Okapi、Stripesとその他のコンポーネントで構成されています。
- OSみたいなもので、Folioの基本的な部分です。

# Okapi-Stripes Platformのいいところ

- マルチテナント
- 拡張可能（テナントがそれぞれ、ニーズに合わせてアプリを選択できる）

# Okapi-Stripes Platformの決まりごと

- 機能をアプリに分割すること。例：請求書のアプリ、ベンダーのアプリ、支払いのアプリ　など
- 個々のアプリはそれぞれビジネスロジックとデータストレージを持っています。
- アプリ同士は、APIを通じて通信します。※APIは同じバージョンでないといけない

逆を言うと、他のアプリが持っているデータを、SQLとかで直接データを取るようなアプリはダメよ、ということです。

# Okapi-Stripes Platformのコンポーネント

####①ランタイム・コンポーネントとフレームワーク
- バックエンドは、マイクロサービス・アーキテクチャで、Okapiと呼ばれています。
- マイクロサービスのAPI Gatewayパターンを採用しています。
    - 詳しくはhttps://github.com/folio-org/okapi/blob/master/doc/guide.md 
- RAMLモジュールビルダー（RMB）フレームワークを使ってOkapiを作成・保守します。


####②基本的なアプリケーションのビルディングブロック

Okapi-Stripes Platformが提供する機能

- mod-users: システム内のユーザーの詳細の管理
- mod-permissions: 要求された操作が許可されているかどうかを判断する機能
- mod-authtoken: セッション管理
- mod-configuration: 構成管理

####③ソフトウェア開発のライフサイクルのプラクティスとユーティリティ
- モダンな開発をします。
- 以下のプラクティスが、インフラ管理コード（folio-infrastructure、folio-ansible、folio-install）とドキュメントに書かれています。
    - 継続的インテグレーション/継続的デリバリーパイプライン（CI/CD）
    - 自動テスト
    - ツール標準化
    - 期待されるコードカバレッジ
    - デプロイメントパターン
    - 開発チームが新しいコードや機能を統合できるように確立された環境（多分Dockerとかのこと）
- プラットフォームでの開発に便利な、以下のCLI（Command Line Tool）があります。
     - Okapi-CLI
     - Stripes-CLI

#補足
- RAMLとは： RESTful API Modeling Languageの略でYAMLベースのRESTful APIを設計するためのモデリング言語です。
    - 詳しくはhttps://en.wikipedia.org/wiki/RAML_(software)
- RMBとは：RAMLファイルやスキーマファイルでAPIやオブジェクトを定義すると、RMBがコードを生成してくれます。
    - 詳しくはhttps://github.com/folio-org/raml-module-builder
- Ansibleとは：レッドハットのオープンソースの構成管理ツール
   - 詳しくはhttps://ja.wikipedia.org/wiki/Ansible_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

#参考
- Folio Project「Definition of the Okapi-Stripes Platform, FOLIO LSP Base and FOLIO LSP Extended Apps」(https://wiki.folio.org/display/TC/Definition+of+the+Okapi-Stripes+Platform%2C+FOLIO+LSP+Base+and+FOLIO+LSP+Extended+Apps)


#変更履歴
2020年7月5日　新規作成
Swift PKCanvasView、データ取得／読込

# データ取得

```swift
@IBOutlet weak var pKCanvasView: PKCanvasView!
```

```swift
let data: Data = self.pKCanvasView.drawing.dataRepresentation()
```

Data型を取得出来ます。
取得後、UserDefaults、CoreData等に保存出来ます。

# データ反映

```swift
do {
    self.pKCanvasView.drawing = try PKDrawing(data: page)
}
catch {
    let nserror = error as NSError
    fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
```

保存したData型を使用してPKDrawingを生成、設定します。
aws configure profileはenvの前に無力

# 環境
macOS Catalina 10.15.5
zsh

# tl;dr
[AWS CLIの設定切替方法と、AWS_DEFAULT_PROFILEとAWS_PROFILEの違いについて](https://qiita.com/shonansurvivors/items/1fb53a2d3b8dddab6629) でAWSのPROFILEを切り替えようとして切り替わらなかった原因と対策

## 切り替わらないよ？
Valueのところが「default」から「personal」に変わっているのに、access_keyとsecret_keyが切り替わらない。

```zsh
% aws configure list                
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  default           manual    --profile
access_key     ****************^-^v              env    
secret_key     ****************^-^v              env    
    region           ap-northeast-1              env    AWS_DEFAULT_REGION

% export AWS_DEFAULT_PROFILE=personal

% aws configure list                
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                 personal           manual    --profile
access_key     ****************^-^v              env    
secret_key     ****************^-^v              env    
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

## 原因

環境変数で指定されている（`~/.zshrc` の export で指定している等）と、「Type = env」で切り替わらない

## 対策

① `~/.zshrc` のexport部分をコメントアウト
② 既存の値を unset

```zsh
unset AWS_DEFAULT_REGION
unset AWS_ACCESS_KEY_ID 
unset AWS_SECRET_ACCESS_KEY
```

## 解決

```zsh
% aws configure list                
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  default           manual    --profile
access_key     ****************^-^v shared-credentials-file    
secret_key     ****************^-^v shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config

% export AWS_DEFAULT_PROFILE=personal

% aws configure list                 
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                 personal           manual    --profile
access_key     ****************;^-^ shared-credentials-file    
secret_key     ****************;^-^ shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

「Type = shared-credentials-file」になっていると、 ~/.aws/credentials や ~/.aws/config から値を取得してくれる。（環境変数に`AWS_ACCESS_KEY_ID`や`AWS_SECRET_ACCESS_KEY`が設定されているうちは、そちらを優先的に参照するらしい）
getsとgets.chompについて

Rubyでコード書いてて大したことじゃないけど見落としててハマった話を。

#getsとgets.chompの違いはわかっていたつもりだったけど

getsは改行コードが後ろに入っていて、gets.chompは改行コードが入らない、というのは知っていたつもりだったけど、、、

```ruby
input = gets
array=['cat','cat1','cat2','cat3','dog','tomcat']
array.each do |a|
  puts a.include?(input)
end
```

とすると、全てfalseで帰ってくる。
冒頭にも書いた通り、getsには改行コードが後ろに入っているので、include?メソッドはcatプラス改行コードで一致するものを探しているので、falseとなるわけです。

```ruby
input = gets
array=[]
for i in 1..6 do
  array_input=gets
  array << array_input
end
array.each do |a|
  puts a.include?(input)
end
```
として、配列にcat,cat1,...と前述のコードの配列と同じ要素を順に入力すると最初と最後（catとtomcat）だけtrueで帰ってくる。(これでハマった)
これはfor文で回している部分のgetsで入力した値がcatで終わっているものは最後に改行コードが入るので一致する、ということです。catで終わっていないものは一致しないと認識されています。

#解答
input=gets.chompとすれば最初に入力した文字列に改行コードが入らないので意図した結果が得られる。

```ruby
input = gets.chomp
array=['cat','cat1','cat2','cat3','dog','tomcat']
array.each do |a|
  puts a.include?(input)
end
```
[Rails]migrateファイルの変更(rails db:rollback STEP=)


こんにちは、tt_tsutsumiです。
今回もmigrateファイルの変更方法についてです。
こちらの記事が何方かのお役に立てると嬉しいです。

https://qiita.com/tt_tsutsumi/items/ea8bc346d5b9cb21e05b

↑↑↑

前回の記事でmigrateファイルの変更等は行えるようになりました。
その中でファイルを１つずつしかdownに出来ないという話が出て来ましたが、
今回は任意のファイルまでまとめてdownさせる方法を記載致します。
##1. rails db:migrate:status
まずは前回と同様に現在作成しているアプリケーションのmigrateの稼働状況の確認を行いましょう。
コンソールにて下記コードを入力します。

```
$　rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     year/month/day  Devise create users
   up     year/month/day  Create spots

```

##2. rails db:rollback STEP=2

前回の **rails db:rollback** の後に **STEP=2** を追加し実行。
このコードの意味は現段階のファイルから **2段階前までファイルをdown** するという意味です。
実行を行うと下記のようになります。

```
$　rails db:rollback STEP=2
$　rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   down     year/month/day  Devise create users
   down     year/month/day  Create spots

```

複数のファイルをまとめて変更や削除したい際はSTEPを使用した方が早いと思います。
ですが確認を行ってから使用をしないと全てdownになる可能性もあるので注意が必要です。
##3. rails db:migrate

変更が終了したら保存をし、**rails db:migrate**　を行います。
STEPで何段階か戻っていたとしても1回のmigrateで全てupに変更になります。

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

Status   Migration ID    Migration Name
--------------------------------------------------
   up     year/month/day  Devise create users
   up     year/month/day  Create spots
```

これでmigrateファイルの一括変更と保存は終了です。
ご覧いただきありがとうございました !!
tableのcellの間隔を開ける


#tabelの子要素同士（td,th）の間隔を開ける方法

```
table {
       border-collapse: separate;
       border-spacing: 20px 0;
}
```
tableに上記のプロパティをセットする。

***border-spacingの上下左右の指定方法が、marginやpaddingとは順序が逆なので注意***
Nuxt.jsを使ったTypescriptの記述方法

Vuetifyのv-data-table を使用して簡単に、
名前やら性別を表示できるようにしてみました。
data-tableへ挿入するデータを手打ちで入れていく場合は、
連想配列を使用する形になります。
下記に作成してみたものとなります。

```Nuxt.js/Typescript
<template>
  <v-content>
    <v-row>
      <v-layout column justify-center align-center>
        <v-flex xs12 sm8 md6>
          <div class="text-xs-center">
            <h1>Hello Nuxt</h1>
          </div>
        </v-flex>
      </v-layout>
    </v-row>
    <v-row>
      <v-col cols="12">
        <v-data-table :headers="headers" :items="items" :items-per-page="5" class="elevation-5"></v-data-table>
      </v-col>
    </v-row>
    <v-row>
      <v-col cols="6">
        <a v-bind:href="google">検索</a>
      </v-col>
      <v-col cols="6">
        <v-btn></v-btn>
      </v-col>
      
    </v-row>
  </v-content>
</template>

<script lang="ts">
import { Component, Vue } from "nuxt-property-decorator";

@Component
export default class index extends Vue {
  public google:string='https://google.com';
  public headers =[
    {
      text:'名前',
      align:'start',
      sortable:'false',
      value:'name'
    },
    {text:'性別',value:'sex'}
  ]
  public items =[
    {name:'太郎',sex:'♂'},
    {name:'治郎',sex:'♂'},
    {name:'サクラ',sex:'♀'},
    {name:'史郎',sex:'♂'},
    {name:'いっこう',sex:'♂♀'}
  ]
}
</script>
```
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630652/f6109b57-9c76-034c-2e2d-4ed7ea3e0147.png)
Could not locate Gemfile or .bundle/ directoryと出たときの対処法

日々学んだことやつまずいたことについてまとめていきます。
記載に誤りがありましたら、ご指摘していただけると助かります！
いつも他のかたの記事に助けられているので、少しでもお役に立てればと思います。

##どういうエラーなのか
Gemfileが見つからないというエラー。
##どんなときに起こるのか
作成したアプリのディレクトリに移動していない状態で、

```
bundle exec rake db:create
```
などのコマンドを実行した時に起こる。
##対処法
cdコマンドで、作成したアプリのディレクトリに移動してから実行する。
contextlib.redirect_stdoutとcontextlib.redirect_stderr

#ファイルに書き込みます

```py
import contextlib
import logging
import sys

# x = input('Enter:')
# print(x)

with open('stdout.log', 'w') as f:
    with contextlib.redirect_stdout(f):
        print('hello')


with open('stderr.log', 'w') as f:
    with contextlib.redirect_stderr(f):
        logging.error('Error!')
```
EclipseからIntelliJへの移行（途中）

#はじめに
ついにIntelliJを購入！なんて思ってたんですが....
元々Eclipseを使ってた人向けのキーバインドもあるのですがそれでも完全ではなかったので備忘録代わりにしようと思います。
ついでに個人的な設定情報も書いておきます。

#キーコンフィグ
まずは本題のキーコンフィグですが現在でもよく書き換えているので暫定的ですが以下を変更しました。

- キーマップのプリセットをEclipseに変更
- エディタアクション
    - フォントサイズを縮小 【Alt + マイナス】
    - フォントサイズを拡大 【Alt + プラス】
- メインメニュー
    - ファイル
        - 新規 【Ctrl + N】
    - コード
        - コードの整形 【Ctrl + Shift + F】
    - リファクタリング
        - ファイル名変更 【Ctrl + R】
    - プラグイン
        - Java
            - GetterとSetter 【Alt + S, Alt + R】
            - toString 【Alt + S, Alt + S】
        - JavaScript and TypeScript
            - GetterとSetter 【Alt + S, Alt + R】
            - toString 【Alt + S, Alt + S】
        - Kotlin
            - toString 【Alt + S, Alt + S】

こんな感じです。
ちなみに被ったキーコンフィグは削除しています。

ファイル名変更は最近のmacbookのファンクションキー(F1 ~ F12)が押しづらいため Ctrl + Rになってます。
また、フォントサイズに関しては画面サイズの違う開発環境でもすぐ対応できるように設定してあります。

# フォント設定
フォント設定についても少し悩んだ部分があったので書いておきます。

Windowsの場合外部フォントは全ユーザにインストールしないと使用できない様です。
ここで1時間ぐらい悩んでました・・・

# プラグイン
- Japanese Language Pack (日本語化)
- Material Theme UI (マテリアルテーマ)
- Atom Material Icon (アイコンのマテリアル化)
- Rainbow Brackets (括弧に色付け)

# 最後に
ここまで読んでくださってありがとうございます。
現在設定は他にも少しいじってますが大きく変更した点は以上の項目です。

私の個人設定なので参考になるか微妙ですが備忘録として残しておきます。
それではまたどこかで・・・
requestsで日本語(Shift-JIS)に対応したPOSTリクエストをコールしたい場合の方法

# 概要
- pythonのrequestsモジュールを使ってPOSTメソッドでリクエストをする場合、URLエンコードをするが、日本語のパラメータ値を渡す場合には注意が必要。


- サイトによってはShift-JIS形式でデコードするものがあり、その場合は、リクエストする側もShift-JIS形式でエンコードしてコールする必要がある


- requests.postにdict形式で渡すとデフォルトのエンコードが行われるため、urllibモジュールを使いURLエンコードを行いstr型にして直接requestsに渡すことで、デフォルトのエンコードも回避し、Shift-JISでエンコードしたパラメータを渡すことが可能です。


# 解決法
```
import requests
import urllib.parse

# postパラメータの値（例）
item = 'ほげ'
post_data = {'KEY1':item}

# shift-jisでエンコードし、str型にする
urlencode_post_data = urllib.parse.urlencode(post_data, encoding='shift-jis')

headers = {'content-type': 'text/html; charset=Shift_JIS'}
response = requests.post(<対象URL>, urlencode_post_data, headers=headers)

```


# 終わりに
- 日本語を扱うと、このような文字コードの問題が出てきます。解決策を検索しても、日本語圏以外のサイトには当てはまる解決法が見つけられず、自力で試行錯誤をして解決しました。少しでもお役に立てればと投稿します。
Flutter Desktop Windows / msix

Flutter Desktop Windows / msix
===
(自分メモ)久々Flutterだが目的はmsixインストーラの作成

## 環境
<details><summary> Windows 11 (msixを作成するには開発者モード有効化が必要)</summary>

```:管理者コマンドプロンプト
start ms-settings:developers
// 開発者モード➔有効
```
</details>

- [Flutter SDK](https://docs.flutter.dev/get-started/install/windows) 3.3.4
- VSCode + Flutter plugin (F1➔Flutter doctor➔☑Windows(desktop)を確認)


## プロジェクト履歴
##### プロジェクト作成
 VSCode➔F1➔Flutter New Project
```:MSI作成パッケージ追加
flutter pub add --dev msix
```
```yaml:pubspec.yaml - MSIX用設定
msix_config:
  display_name: Flutter App
  msix_version: 1.0.1.0
  certificate_path: build\mycertificate.pfx // 署名ファイルを指定
  certificate_password: changeit            // 署名ファイルのエクスポートパスワード
```

## デバッグ実行
VSCode➔
F1➔Flutter:Select Device
F5

## ビルド
```
flutter build windows
```
`build\windows\runner\Release`以下に.exeファイルが生成される。

## ビルド・msixパッケージ作成
```
flutter pub run msix:create
// 署名を要求される。テスト用署名(test_certificate.pfx)生成を選択。
```
`build\windows\runner\Release`以下に.msixファイルが生成される。


<details><summary>自己署名の生成とWindowsに登録</summary>

```bash:bash:オレオレ署名作業
cd build
openssl genrsa -out mysecret.key 2048
openssl req -new -key mysecret.key -out certsignreq.csr
openssl x509 -in certsignreq.csr -out mycertificate.crt -req -signkey mysecret.key -days 3650
openssl pkcs12 -export -out mycertificate.pfx -inkey mysecret.key -in mycertificate.crt
```

生成された.pfxファイルをダブルクリック➔証明書のインストール➔信頼されたルート証明機関に登録
</details>

## 参照
https://zenn.dev/mrwk_sts/articles/1494ea37a77c73

https://pub.dev/packages/msix
Django debug=false で　error 500と出て デプロイできない時

先ほどこのエラーでかなり沼ったのでまとめ

```settings.py

debug = True

```
で問題なく動くのに

debug = falseの時

```
$ python manage.py collectstatic
```
コマンドを打っても

server error(500)が出た方はみてみてください

##本題

```settings.py

debug = false

```
に変え、デプロイの工程が終了かと思いきや

server error(500)

ため息混じりで、仕方なくググっていると


$ python manage.py collectstatic
コマンド打ても変わらず

唯一のエラーは
$ cat /var/log/apache2/error.log

```
Exception ignored in: <bound method BaseEventLoop.__del__ of <_UnixSelectorEventLoop running=False closed=False debug=False>>
Traceback (most recent call last):
  File "/usr/lib/python3.6/asyncio/base_events.py", line 526, in __del__
NameError: name 'ResourceWarning' is not defined
```

だけ、その場合は

```settings.py

debug = True

--------略----------

# STATIC_URL = '/static/'

# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
```

とやってエラーが出たhtnmlの行を消してみると動いたりします。
勿論、そのせいでstatic cssは適応されませんが。

今回の問題は指定したtemplatesにcss staticが反映されていないからなので、一度ローカルでstaticのエラーを直してから再度デプロイするのがいいかもしれません。

html templateのエラーを取り除いたあとはstaticの記載のコメントアウトを外すのは忘れずに。(adminが動かなくなる)
Google Colaboratoryの90分制限の自動対策（バッチファイルver）

[こちらの記事](https://qiita.com/enmaru/items/2770df602dd7778d4ce6)で紹介されている、Google Colaboratoryセッション切れ対策のシェルスクリプトをWindowsコマンドプロンプト用のバッチファイルに改良したものである。

```access_colab.bat
@echo off

setlocal
set url=<<ノートブックのURL>>

for /l %%i in (1,1,12) do (
  timeout 3600 /nobreak && echo %%i && start %url%
)
endlocal
```

主な点は以下の２つ。

- <<ノートブックのURL>>部分を変更すればよい。
- ちなみに、timeoutの後の数字は更新間隔の秒数を表している。（今回は3600秒で1時間ごと）