OmniAICreator/Qiita-1.07M huggingface dataset:
Java Excel挿入と画像抽出

Spire.XLSは豊富な画像処理機能をサポートしています。添加、回転、抽出、削除などです。本論文では、Spire.XLS for Javaを使って、Excelドキュメントに画像を挿入して抽出する方法を紹介します。

使用ツール：Free Spire.XLS for Java （無料版）
https://www.e-iceblue.com/Introduce/free-xls-for-java.html

Jarファイルの取得と導入：

Method 1：ホームページを通じてjarファイルのカバンをダウンロードします。ダウンロード後、ファイルを解凍して、libフォルダの下のSpire.xls.jarファイルをJavaプログラムに導入します。
https://www.e-iceblue.com/Download/xls-for-java-free.html

Method 2：maven倉庫設置による導入。

https://www.e-iceblue.com/Tutorials/Licensing/How-to-install-Spire.PDF-for-Java-from-Maven-Repository.html

画像をExcelに挿入します

```java
import com.spire.xls.ExcelPicture;
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class InsertImage {
    public static void main(String[] args){
        // Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Input.xlsx");

        //1番目のシートを取得
        Worksheet sheet = workbook.getWorksheets().get(0);

        //シートの指定位置に画像を追加します
        ExcelPicture pic = sheet.getPictures().add(4, 1,"image.jpg");
        // 画像の幅と高さを設定します
        pic.setWidth(500);
        pic.setHeight(300);

        //文書を保存
        workbook.saveToFile("InsertImage.xlsx", ExcelVersion.Version2013);
    }
}
```

![Insert Image to Excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/eebac173-2e4e-79c3-8eb9-d0a019a19c44.png)


画像を抽出

```java
import com.spire.xls.ExcelPicture;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ReadImage {
    public static void main(String[] args) throws IOException {
          //Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("InsertImage.xlsx");

        //1番目のシートを取得
        Worksheet sheet = workbook.getWorksheets().get(0);

        //シートの最初の画像を取得し、指定されたパスに保存します
        ExcelPicture pic = sheet.getPictures().get(0);
        BufferedImage loImage = pic.getPicture();
        ImageIO.write(loImage,"jpg",new File("output/ReadImage.jpg"));
    }
}
```
![Extract Image from Excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/e18ddb46-0cb8-6e51-02fc-d487f4f64bc3.png)
Deviseを使ってController側からログアウトさせる

## 1. 経緯

userテーブルにflgを持たせて、0以外の人はログインさせたくないなぁ・・・
ということで調べてみたところ以下の内容でできました:raised_hands:

## 2. 結果

```appllication_controller.rb
  before_action :sign_out_user,  if: :user_signed_in?
  protected
    # ログイン後のパス
    def after_sign_in_path_for(resource)
      root_path
    end
    # flgが0以外はログアウトさせる
    def sign_out_user
      sign_out_and_redirect(current_user) if current_user.flg == 0
    end
```

## 3. 詳しい内容

- after_sign_in_path_for
ユーザーがログイン後、どこに飛ばすか
https://rubydoc.info/search/github/plataformatec/devise/master?q=after_sign_in_path_for

- sign_out_and_redirect
ユーザーがログイン後、ログアウトさせる
https://rubydoc.info/github/plataformatec/devise/master/Devise%2FControllers%2FHelpers:sign_out_and_redirect

## 4. ネットの記事
ネットの記事見てると以下の内容とかもあったんですが、サインアウトはHTTPリクエストからしか
受け付けないみたいで以下の書き方をしてもダメでした・・・。

```
redirect_to :controller=>"user/sessions", :action=>"destroy"
```

## 4. 最後に
いいね！もらえると励みになるのでよろしくお願いします！:v:
macOSをCatalinaにしたらAmazon EMRのJupyterHubにアクセスできなくなった

# ざっくり
* macOSをCatalinaにアップデートしたら自己署名証明書を信頼しなくなる（らしい）
* この影響か、Chromeで「詳細情報→このページにアクセスする（安全ではありません）」というUIが消えていた。→「あれ、いつもの方法でアクセスできない！」となった。
* Chromeのウインドウがアクティブな状態で「thisisunsafe」と打つと行けた。
* （やってない&できるかわからないけど）本当は自分の信頼する証明書をどこかにおいておき、それをJupyterHubに登録するようなブートストラップアクションを作ったりするほうが良い？

# 参考
1. [macOS Catalina Chrome Self-signed Certificate Issues](https://vninja.net/2019/12/03/macos-catalina-chrome-cert-issues/)
2. [iOS 13 および macOS 10.15 における信頼済み証明書の要件](https://support.apple.com/ja-jp/HT210176)
3. [Chromiumのエラーリスト](https://cs.chromium.org/chromium/src/net/base/net_error_list.h)
4. [マスターノードとノートブックサーバーに接続する -- Amazon EMR公式ドキュメント](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-jupyterhub-connect.html)

# もうちょっと詳しく
EMRやJupyterHubの話じゃなくなっていきますが…笑

## Catalinaにする前
macOSをアップデートする前から、EMRのJupyterHubに接続する際にセキュリティの警告は出ていました。
が、ChromeのUIから「詳細情報を表示→〜〜〜〜.comへアクセスする（安全ではありません）」をクリックすれば、そのまま飛べました。
<img width="675" alt="スクリーンショット 2020-01-07 10.34.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248166/9c021da6-c8bf-c2b0-0971-2823cb1ffd73.png">

よく見ると、このときのエラーコードは `NET::ERR_CERT_AUTHORITY_INVALID` となっています。

## Catalinaにした後
先述のUIが消え、いつものやり方でアクセスできなくなりました。
<img width="658" alt="スクリーンショット 2020-01-06 17.00.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248166/307d3e27-fdfa-8964-0227-6f03269aa026.png">

よく見ると、エラーコードが `NET::ERR_CERT_INVALID` に変わってます。
OSが返す例外の種類が変わって扱い方が変わっているみたいです。

## 解決方法
参考にも挙げた[このサイト](https://vninja.net/2019/12/03/macos-catalina-chrome-cert-issues/)にあるやり方は、下記の3通りで、JupyterHub on EMRに限らず使えます。
1. Chromeのウインドウをアクティブにして「thisisunsafe」と打ち込む
2. 証明書を落としてきて、信頼済み証明書のリストに追加する
3. chromeを `-ignore-certificate-errors` オプションで起動する
一旦私は「1」の方法で対応しました。（2の方法をEMRを立ち上げるたびに毎回実施するのは相当な手間ですし、3の方法だと事故が恐ろしかったので。）

ただ、[AWS公式](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-jupyterhub-connect.html)にもある通り、「自分の信頼済みの証明書とキーを使用」するのが一番良さそうです。

おそらく
0. 証明書をどこかにおいておいて、（S3で良いかな？）
1. EMR起動時にそれをノートブックサーバーにダウンロードして、
2. それをJupyterHubで利用するコマンドを叩く
だと思うので、1と2をやってくれるようなブートストラップアクションを作るのが良いのかな…？まだ良くわかっていません。
もしこの部分も対応したらこの記事を編集しようと思います。
gdb上で再現しないセグフォをgdbで追跡する

ごくたまにGDB上で再現しないバグに遭遇することがある。
自分の場合は並列バグが問題で、gdb上だとタイミングが変わってしまいバグが再現しなくなった。

なので、gdbを介さずにプログラムを普通に走らせておき、セグフォが発生した時点でgdbを起動して検死できるようにしたい。
アイデアとしては、プログラム自体にシグナルハンドラを仕込んでおき、`SIGSEGV`が発生した時点で`sleep`を呼んで停止、あとは手動で`gdb attach`をかける。

# 手順

## 1. `SIGSEGV`を捕捉するシグナルハンドラをプログラムに追加

まずはシグナルハンドラを定義。後からgdbでattachできるように十分な時間sleepするようにする。

```c
void segv_handler(int sig) {
  sleep(100000000);
}
```

次に`sigaction()`コールを使ってシグナルハンドラを登録しておく。

```c
struct sigaction sa;
sa.sa_flags   = 0;
sa.sa_handler = segv_handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGSEGV, &sa, NULL);
```

## 2. セグフォが起きるまで待つ

## 3. gdbでattachする

セグフォが発生してsleepし始めたら適当にpidを調べ、

```
$ gdb attach <pid>
```

でattach。これでセグフォをgdbで追跡可能。

# サンプルプログラム

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void segv_handler(int sig) {
  /* printf() cannot be used because it's not async-signal-safe */
  write(2, "segfault\n", 9);
  sleep(100000000);
}

int main() {
  /* register a signal handler for SIGSEGV */
  struct sigaction sa;
  sa.sa_flags   = 0;
  sa.sa_handler = segv_handler;
  sigemptyset(&sa.sa_mask);
  if (sigaction(SIGSEGV, &sa, NULL) == -1) {
    perror("sigaction");
    exit(1);
  }

  /* raise SIGSEGV */
  int* a = 0;
  *a = 1;

  return 0;
}
```

コンパイルして実行、`segfault`と表示されたら`gdb attach`で追えるはず

# おわりに

セグフォじゃなくても他のシグナル（`SIGFPE`とか）を捕捉することも可能。

あとcoredumpでも同じようなことができるような気はするが、プログラムが大きくなってくるとdumpのファイルサイズが大きすぎて大変なことになったりするのでこっちの方がシンプルで良い気がする。

gistにも書いた
[Debug segfaults that only happen outside of gdb](https://gist.github.com/s417-lama/527671aef58eccfa335ba01266f0d89e)
Calibreで、自炊した画像ファイルを右開きの電子書籍にする方法

#事前準備

設定　→　入力オプション　→　コミックス入力　の画面で、
”コミックスの処理をしない”にチェックをつける。

設定　→　共通オプション　→　ページ設定　の画面で、

出力プロファイル：Tablet

入力プロファイル：Default Input Profile
                 余白は上下左右　0.0ポイントに設定する。

設定　→　ディスクに保存　の画面で、
”空白をアンダースコアに置換する”　にだけチェックをつけ、
”テンプレートの保存”に{title} - {authors}と入力する。

ディレクトリに画像ファイルを入れ、（この際、画像ファイルは英語とアルファベットだけの名前にして、表紙から順に連番にする。）そのディレクトリをzipファイルに圧縮する。　

→　その後、そのzipファイルの拡張子をcbzに変える。

```例
mv -v ＜変更前のzipファイルの名前＞.zip   ＜変更後のcbzファイルの名前＞.cbz
```

注意：設定を保存するのを忘れないように
注意；画像の名前は半角のアルファベットと数字だけにする。
　　　文字コードの問題なのか、漢字などの文字が名前に入っているとうまくいかない場合がある。

#最初に、左開きの本に変換

”本を追加”のボタンを押して、先ほどのcbzファイルをインポートする。

追加したcbzファイルを選択して、”本を変換”のボタンを押して、cbzファイルをepubファイルに変換する。

”ディスクに保存”で、適当な場所（デスクトップなど）に変換したファイルを保存する。

#左開きの本を右開きに変更する。

最初に、epubファイルをzipファイルに変換する。

```例
mv -v title.epub title.zip
```

できたtitle.zipを解凍する

```例
unar title.zip
```

解凍した中のcontent.opfファイルを、emacsでもvimでも何でもいいので、エディタを使って、以下のように編集する。

```edit
    <spine toc="ncx">
を
<spine toc="ncx" page-progression-direction="rtl">
に変更する。
```

content.opfを変更したら、再びzipファイルに圧縮し、そのzipファイルをepubファイルにする。

```example
mv -v title_changed.zip title_changed.epub
```

できたepubファイルを再びcalibreにインポートし、書籍情報をダウンロードしたのちにさらにepubファイルに変換する。（ダウンロードした表紙は、一度変換しないと反映されない。）

すると、元のepubファイルがoriginal_epubになっているため。
右クリック　→　本を削除　→　選択した本の指定したフォーマットを削除
を使って、orginal_epubのみ削除する。

その後、”ディスクに保存”で好きな場所に保存する。


#追記

この度、私のホームページでもこの内容でページを作成いたしました。
制作者本人なので、転載ではありません。

https://peraichi.com/landing_pages/view/gejxa
〈初心者向け〉エンジニアから見たペルソナって？

#前提
SIerを想定して書いていますが、BtoCでも、イベントの企画でも、どこでも何にでも使える考え方です。実践してみることで必要な考え方だと身に滲みてきます。

# ペルソナとは？
システムを実際に使用するユーザ像のことです。「20代男性」というターゲットレベルではありません。

![8199BF6D-4D84-4CCD-A615-36376453EFED.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347716/9967352a-e9ee-2e49-6539-3dfe3c107d3e.jpeg)
「29歳男性、佐藤雅人(さとうまさと)、独身、彼女あり、東京在住、埼玉出身、営業マン、東洋大学(社会学部)、小学校から高校まで野球部、小さい頃は大人しい真面目な性格だったが野球を始めてよく話すようになった、、、」

とユーザをイメージできるよう細かいところまで定義されているものです。最初のターゲットと比べて明確にイメージが湧くかと思います。また、誰が見ても同じイメージになります。「20代男性」だけだと人それぞれイメージするユーザ像が異なります。「20代男性」だけだと20歳の大学生もいれば、29歳のサラリーマンもいます。今の時代はダイバーシティ(多様化)というように29歳サラリーマンだけでも色んな人がいます。趣味嗜好や生活習慣、考えていることなど全く違いますよね？「20代男性」だけでは情報が不十分なんです。明確に共通の認識を持てるユーザ像をペルソナと言います。

# 何で必要？
システムを使うターゲットとなるユーザはどんな人ですか？と聞くと平気で「全員」と答える方もいるかと思います。もちろん、みんなに使って欲しい気持ちは分かります。でも、全員をイメージしてシステムを作ると、何を軸にしていいか分からないですよね。作る人によって軸にするユーザ像が違うかもしれません。その結果、どうなるでしょうか？そう、なんだか統一感のない使いにくい誰向けなのかよく分からないシステムのできあがりです。

(例)
スマホのSNSアプリを作るとします。
JKと高齢者はITリテラシー(スマホの操作スキル、慣れなど)が異なります。また、欲するアプリも変わってきます。
JKは流行りに敏感なので既に存在する写真のSNSには見向きもしないでしょう。それでは、どんなSNSならJKの中で流行るでしょうか。声だけのSNS？動画だけのSNS？カップル限定のSNS？など、JKがハマりそうなことを考える必要があります。
逆に高齢者向けのSNSでは、操作が難しくない、同年代の情報交換になる、1人暮らしでも寂しくない(1日一度は人と話せる)などを考えて作った方がいいかもしれないですね。
また、JKと高齢者向けのUIは全く異なります。JK向けは小さなボタンでもアイコンでも理解できますが、高齢者は大きなボタンや文字で表現してあげた方がいいかもしれません。インタラクション(操作の反応)にしてもJK向けは素早く、高齢者向けはゆっくりにするなど、真逆です。
これでも本当に全員向けのシステムを作ります、と言えますか？

# プラグマティックペルソナ、プロトタイプペルソナとは？
ペルソナとの違いは実際の調査や統計情報から抽出したものかどうかです。プラグマティック(プロトタイプ)ペルソナは経験や想定から抽出して作ります。システムを作る人や営業、マーケティング、お客様だけであまり時間もお金も掛けずに作ることができます。本当のペルソナを作るのは時間もお金も掛かります。なぜかというと実際のユーザにインタビューをしたり、統計情報を分析したり、といったプロセスが必要となるからです。確かに本物のペルソナがいた方がいいかもしれませんが、目的はペルソナを作ることではありません。いいものを作りたい、それだけです。まずはいいものを作るための使いものになるペルソナを作ってみよう、という気軽な気持ちで始めてみてはいかがでしょうか。プラグマティックペルソナはブラッシュアップして本物に近付けることができます。偽物だからと怪しまず、ちょっと仲良くなってみましょう。

# 共感
UXでは必ず話に挙がる、共感(エンパシー)と共感(シンパシー)。これを勘違いしてはいけません。
シンパシーは「思いやり、同情、気の毒に思うこと、共感、共鳴」という意味。エンパシーは「人の気持ちを理解する、共感、共鳴」という意識。似てますよね。「同情するなら金をくれ」と有名なセリフがありますよね。シンパシータイプは「大変だ可哀想だ」と同情します。エンパシータイプは大変だなと思ってお金をくれます。シンパシーは大変だ気の毒だという気持ちは分かっていますが他人事なところがあります。エンパシーは自分が同じ立場だったらと置き換えて同情されるよりお金をもらった方が有難いと考えることができます。同じ共感でも少しニュアンスが異なります。UXの考え方としてはエンパシー(共感)できるようになることが大切です。

# 効果
ペルソナを作ったからといって、すぐに効果は出ないと思っていませんか？思っている以上に、効果が出るものです。
実際に私はエンジニア、営業、マネージャーチームでプラグマティックペルソナを作ってみました。その大きな効果として下記が挙げられました。

1. 全員の共通認識ができ、判断基準となるためブレない
2. 全員がきちんとユーザの気持ちになって考えられる
3. 検証の基準ができる(ユーザビリティテストなどに役立つ)

# プラグマティック(プロト)ペルソナの作り方
色んな方法がありますが、今回は既にシステムが決まっている前提で書きます。

1. インプット情報の収集:まずはインプットとなる情報をできる限り集めてみましょう。または、ユーザを知っている人を連れてきてもいいですね。ユーザを知っているメンバばかりのチームの場合は当ステップは不要です。また、プロジェクトの方針、目的など全体感が分かる情報があれば、それもみんなで確認しましょう。
2. 方向性の決定
大雑把にどういう人をターゲットとしているのか、したいのかの方向性を決定します。
3. 属性情報の検討
名前、年齢、性別、出身地、居住地、家族構成、出身大学など
4. ストーリーの検討
高校、大学や就職先の決め方、小さい頃、部活での様子、結婚までのストーリーなどを考えてみます。属性や他のストーリーとかけ離れないように注意してください。
5. まとめ
人物像がはっきりしてきたら、誰がみても分かるようにまとめましょう。メンバの入れ替えが激しいプロジェクトだと特にまとめておいた方が共有しやすいです。

3つのチェックポイント

 - 矛盾はないですか？
(例)大人しい性格なのに飲みサークルに入っていた、出身地も居住地も東京なのに熊本大学出身など。
 - 全員に違和感はないですか？
一人でも違和感のある人がいたら、きちんと主張してみてください。理由を含めてなんかしっくり来ないと。
 - 実在しそうな人をイメージできていますか？
全員がイメージできて、全員が同じ人をイメージできることが理想です。

# あとがき
あくまで考え方の話なので、ペルソナが必須だと言うつもりはありません。何でもいいのです。ペルソナはあくまでユーザの共通認識を持つためのフレームワークの一つとして知っていただけたら嬉しいです。
php7.3からの新関数array_key_firstとarray_key_lastについて

配列の最初のキーを取得する際に
php7.3から**array_key_first*という関数が追加されました。

```php
<?php
$array = ['a' => 1, 'b' => 2, 'c' => 3];

$firstKey = array_key_first($array);

var_dump($firstKey);
?>
```

```
--　出力結果
string(1) "a"
```

php7.2以前は配列の先頭要素を取り出そうとする際には
配列をreset()して…keys()で指定して取り出す…というようなことをしていましたが
この関数があれば配列の内部ポインタを変更する必要もなく一発で取得できるので便利ですね。


参照
https://www.php.net/manual/ja/function.array-key-first.php
Power BI Tips - 時系列データの最新値を簡単に表示する

#概要
ある案件で、温度時系列データの最新値をカードで表示する必要があったんですが、
クエリーで最新値テーブルを作ろうとか、DAXでデータを出そうと頑張って・・・
結局挫折して、フィルターで簡単にできましたと言う話。


#データ
[Power BIでIoTデータの可視化（初級編）](https://qiita.com/yossihard/items/bf47a06236a8afb656e7)と同じデータです。

| ID | SensorID| MeasDate            | Temp |
|:---|:--------|:-------------------:|-----:|
|   1|Sensor A | 2019/09/21 00:00:00 |  20.4|
|   2|Sensor A | 2019/09/21 00:00:01 |  20.3|
|   3|Sensor B | 2019/09/21 00:00:01 |  21.3|
|・・・|・・・|・・・|・・・|


ID：データログID
SensorID：センサーを区別するためのID
MeasDate：計測日時
Temp：温度

#手順
まず、カードをレポートに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8f3285ba-324d-fd2d-6c66-011249e19c4c.png)

Tempデータをカードのフィールドプロパティにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/76f9a631-a199-c788-d4e5-328257c3496c.png)

次にフィルターをセットしていきます。

先に、カードに表示するセンサーを指定してます。
SensorIDを、「このビジュアルでのフィルター」の「ここにデータフィル―ドを追加してください」にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/83469cc0-2c4d-d2e3-e2b7-e308e5877281.png)

フィルターの種類を基本フィルターにして、
表示したいセンサーを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/3d3e032d-7900-14c7-1013-04c674332efd.png)


続いて、フィルターを使って、計測日時を指定します。
MeasDate（計測日時）を、「このビジュアルでのフィルター」の「ここにデータフィル―ドを追加してください」にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5c84ef4c-c3ce-6690-4796-ffc65398ebbe.png)

フィルターの種類を「上位 N」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/129d9eab-a8c5-073a-c81c-592d80d6f315.png)

アイテムの表示のドロップダウンを「上」隣のエディットボックスを「１」、
値の欄には、MeasDateをドラッグ＆ドロップして、ドロップダウンから「最も遅い」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f6a9e072-129a-4299-473d-1720e88902b2.png)


これでカードに計測日時が最も遅い（＝最新）の値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ec62a5f6-30b7-8f0d-4906-ebddd08b14e7.png)
google magentaのインストール方法

#installation

[公式のInstallationを参考](https://github.com/tensorflow/magenta)

基本的には``` pip install magenta```でmagentaをInstallすれば大丈夫。

しかし
>```Assertion failed: (PassInf && "Expected all immutable passes to be initialized"), function addImmutablePass, file /Users/*/*/*/*/work/lib/IR/LegacyPassManager.cpp, line 849.
```

とエラーが。。

どうやらpyarrowをupdateしないといけないみたい。
```pip install -U pyarrow```で解決！

# fluidsynthを最新にする

magentaはfluidsynthを使っている場合があるので、最新にする必要がある。

>```File "/*/*/*/*/python3.6/site-packages/pretty_midi/instrument.py", line 428, in fluidsynth
    fl = fluidsynth.Synth(samplerate=fs)
AttributeError: module 'fluidsynth' has no attribute 'Synth'
```

### よくある間違い
```pip install fluidsynth```で解決と思いきやそうではない。
```brew install fluidsynth```とやる必要があります。すでに```fluidsynth```がある場合は、```brew upgrade fluidsynth```で大丈夫でした。

[参考](https://github.com/craffel/pretty-midi/issues/157)
【Python】演算子(算術、比較、文字列)

#算術演算子( + , - , * , / , % , // , ** )
数値型の変数や数値に対して次の演算子で算術演算を行うことが出来る。


| 演算子             | 意味       | 
|:----------------------------|:------------------|
| +            | 足し算 | 
| -           | 引き算 | 
| *            | 掛け算 | 
| /           | 割り算 | 
| %            | 剰余 | 
| //           | 切り捨て除算 | 
| **            | べき乗 | 

```python:sample.py
a=5
b=2
print(a+b) #output=7
print(a-b) #output=3
print(a*b) #output=10
print(a/b) #output=2.5
print(a%b) #output=1
print(a//b) #output=2
print(a**b) #output=25

```

他にも、pandasなどのライブラリを使うことで行列の内積、外積、行列式の演算といったことも可能になる。

#比較演算子( ==, > , < , >= , <= , is , in , is not , not in)

**比較演算子はTrueまたはFalseを結果として返す。**
（if文などの条件分岐では、このTrue/Falseによりif文内の処理が実行されるかどうかが決定される。）
このようなTrue/Falseを値として持つ変数を**ブール型変数**と呼ぶ。

| 演算子             | 意味       | 
|:----------------------------|:------------------|
| a == b            | a,bが同じ値をもつときTrue | 
| a>b           | a>bのときTrue | 
| a<b             | a<bのときTrue | 
| a>=b               | a>=bのときTrue | 
| a<=b             | a<=bのときTrue |
| a is b          | aとbが同じidを持つときTrue（同一オブジェクトを指すかどうか） |   
| a in b          | aがbの要素であるときTrue（同一の値を持つかどうか） | 
| a is not b          | aとbが同じidを持たないときTrue（同一のオブジェクトをささないか） | 
| a not in b          | aがbの要素でないTrue（同一の値を持つかどうか） | 
 
```python:comp.py
a=1
b=1.0
print(id(a)) #output=140722308489616
print(id(b)) #output=1234075931664
print(a==b) #output=True
print(a is b) #output=False
```

**ブール型変数同士の演算として以下のものがある。**

| 演算子             | 意味       | 
|:----------------------------|:------------------|
| A and B            | A,BがともにTrueならばTrue | 
| A or B           | AまたはBがTrueであればTrue | 
| not A             | Aの真偽を逆にする |

```python:boolean.py
a=True
b=False
print(a and b) #output=False
print(a or b) #output=True
print(a and not b) #output=True
```
#文字列演算( + , * , [ start : end ] )

str1、str2を文字型変数、numを整数とする。

| 演算子             | 意味       | 
|:----------------------------|:------------------|
| str1 + str2            | str1とstr2が合体した文字列が生成される | 
| str1*num           | str1がnum個生成される | 
| str1[ start : end : step]       | str1のstart文字目からend文字目までをstep-1個飛ばしで取得 |
```python:sample.py
a="abc"
b="def"
print(a+b) #output=abcdef
print(a*2) #output=abcabc
print(a[1:]) #output=bc
print(a[:1]) #output=a
print(a[::2]) #output=ac
```
[docker-compose] ローカルから踏み台経由で外部DBにアクセスする

# はじめに

docker-composeでローカルで開発するとして、DBだけは外部（例えばクラウドに置いてあるDBなど）を使いたい…というときありますよね？

SSHトンネルを踏み台に張れば実現できるのですが、docker-composeを使っているならSSHトンネルもコンテナを使って掘りましょう！
いちいちトンネルを掘ったり埋めたりしなくて済むので地味に便利です。

# やり方

使うのはkingsquareさんのdocker-tunnelです。
[kingsquare/docker\-tunnel: a \(simple\) dockerized ssh tunnel](https://github.com/kingsquare/docker-tunnel)

3つほど手順を踏む必要があります。

## 1. `ssh (踏み台ホスト名)` で踏み台ホストにログインできるようにする

$HOME/.ssh/configにログイン用の情報を書きます。

```config:$HOME/.ssh/config
Host (踏み台ホストログイン用任意の名前)
    HostName        (踏み台ホストのIPアドレスもしくはホスト名)
    Port            (踏み台ホストのSSH用ポート)
    User            (踏み台ホストのSSH用ユーザ)
    ServerAliveInterval 20
    IdentityFile    (踏み台ホストのSSH用秘密鍵のパス)
```

この時点で`ssh (踏み台ホストログイン用任意の名前)`というコマンドで踏み台ホストにログインできるようになります。

## 2. docker-composeの設定

docker-compose.ymlにdocker-tunnelの設定を書きます。
ここでは仮にdb-tunnelと名前をつけます。

ポイントはホストマシン(ローカル)の.sshとdocker-tunnelコンテナの.sshをバインドマウントするところです。
これによりdocker-tunnelはホストマシンのSSH設定、秘密鍵を使うことができます。

```yml:docker-compose.yml
    db-tunnel:
      container_name: db-tunnel
      image: kingsquare/tunnel
      ports:
        - "(ローカルで使うDBポート番号):(外部DBで使っているDBポート)"
      volumes:
        - ${HOME}/.ssh:/root/.ssh
        - ${SSH_AUTH_SOCK}:/ssh-agent
      environment:
        - SSH_AUTH_SOCK=/ssh-agent
      command: "*:(ローカルで使うDBポート番号):(外部DBのIPアドレスもしくはホスト名):(外部DBで使っているDBポート) (踏み台ホストログイン用任意の名前)"
```

`docker-compose up`などでdocker-tunnelを立ち上げておきます。

## 3. 利用時の設定

DBの接続先に以下の設定を入れるとDBに接続できます。

```
ホスト名: db-tunnel
ポート番号: (ローカルで使うDBポート番号)
```

参考までにLaravelの場合は次のようにします。

```
DB_HOST='db-tunnel:(ローカルで使うDBポート番号)'
```

以上
New – Amazon Comprehend Medical Adds Ontology Linking 和訳してみた

##はじめに
Danilo Poccia 氏が2019年12月16日に投稿した「New – Amazon Comprehend Medical Adds Ontology Linking」の記事を翻訳し、まとめてみました。

■本記事 URL
[New – Amazon Comprehend Medical Adds Ontology Linking](https://aws.amazon.com/jp/blogs/aws/new-amazon-comprehend-medical-adds-ontology-linking/)

##Amazon Comprehend
###Amazon Comprehend とは
Amazon Comprehend は自然言語処理サービス（NLP）で、機械学習を用いて非構造化された文章の中から洞察を見つけるサービスです。本サービスは機械学習の知識が無くとも利用でき、そしてユーザ自身でカスタマイズすることが可能です。
※当サービスは東京リージョンでは利用できませんのでご注意ください（2020年1月6日現在）

そして昨年、AWS では医学用語にも対応できるよう Amazon Comprehend Medical という新サービスを紹介しました。こちらのサービスを用いることで、機械学習を利用して関連する医学情報を非構造化テキストから抜き出すことが、より簡単になります。Amazon Comprehend Medical を使用すれば、医療情報を素早く、そして正確に集めることができます。


##オントロジー
オントロジーはドメインの宣言型モデルを提供し、そしてそのドメインに内在する関係性や属性といったコンセプトを定義し、表しています。
通常は知識ベースで表され、知識の使用、あるいは共有の必要があるアプリで利用が可能です。健康情報学的には、オントロジーは健康関連ドメインのフォーマルな記述です。

Amazon Comprehend Medical でサポートされているオントロジーは以下の2つです。

- [ICD-10-CM](https://www.cdc.gov/nchs/icd/icd10cm.htm)
 - 病状をエンティティとして識別する
 - 診断、重症度、解剖学的区別などの関連情報を、エンティティの属性としてリンクする

- [RxNorm](https://www.nlm.nih.gov/research/umls/rxnorm/index.html)
 - 薬物をエンティティとして識別する
 - 用量、頻度、強度、投与経路などの属性を、エンティティにリンクする

それぞれのオントロジーに対して、Comprehend Medical はランク付けされた潜在的マッチングリストを出します。ユーザは信頼度スコアを通じて、どのマッチングが意味が通じるかを判断したり、また、より深く検討するために何が必要なのかを判断することができます。

###オントロジーのリンクの利用
オントロジーのリンクがどの様なものか、試して見ます。 Comprehend Medical コンソール上で利用することができます。

非構造化された医者のメモを、Input に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/78cd6325-a394-e9df-815f-b4de7e294e05.png)

はじめに、Comprehend Medical で既に利用可能な機能を使用して、医療や保護された健康情報（PHI）エンティティを検出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c79395c0-1749-c9dd-3268-abcc0264a84b.png)

認識されたエンティティの中には、症状や薬品なども認識されていました。薬品はジェネリック、あるいはブランドとして認識されているので、これらのエンティティをより具体的なコンセプトと結びつけましょう。

新しい機能を使用し、これらのエンティティを 医薬品の RxNorm コンセプトとリンクさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/6c16d2a9-9019-73d8-31b3-3ca901c92bba.png)
テキストでは、医薬品について触れている部分だけが検出されました。回答の詳細には、より多くの情報が載っています。詳しく見てみましょう


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e048778d-085b-bb1e-3da5-ab24b5a68ea1.png)
- 最初に登場した “Clonidine” は RxNorm オントロジーの一般的な概念と結びついてます
- 2回目に登場した “Clonidine” は具体的な投与量と結びつきいており、RxNorm オントロジーの投与量を含むより規範的な形式とリンクしてます


ICD-10-CM コンセプトを使用したメディカルコンディションを見るために、先程とは異なるインプットを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/936a37ac-87a9-40cc-e7be-64416dcf80ad.png)

症状や診察といった、特定のコンセプトと検出されたエンティティをリンクさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/43ab4cda-c462-f5e0-c732-b9b3e0aa7a16.png)

予想通り、症状や診察などはエンティティとして検出されました。詳細な結果では、それらのエンティティは ICD-10-CM オントロジーのメディカルコンディションとリンクされていました。例えば、入力テキストにある2つの主な症状はトップの結果であり、オントロジーの特定の概念はComprehend Medicalによって推測され、それぞれ独自のスコアがついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2b2e0984-b072-8c16-78f1-cdcf77a94b80.png)


##おわりに
Amazon Comprehend Medical はAWS CLI 、AWS SDK 、そしてコンソール上から利用することができ、従量課金となっております。医療分野で AWS の利用を考えている方は、この機会に是非このサービスを利用してみてください。
スプレッドシートを使って、iOS開発の効率を上げる

## はじめに
アプリ開発の中でデバッグは時間がかかる作業である。
動的に変わる処理のデバッグはさらに時間がかかる。
AndroidとiOS両プラットフォームで展開しているサービスであるとさらに時間がかかる。
その解決手段としてスプレッドシートを使った方法を紹介します

## なぜスプレッドシートを使うのか
- 誰でも容易に変更、閲覧ができる
- 簡単なAPIとして扱える
- プラットホーム関係なしに扱える

## 実践してみる
### 準備
- シートを作成
- ファイル → ウェブに公開を選択

![Screenshot 2020-01-08 at 12.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63985/00d3bfbe-9b8e-514a-4101-de7c647eb652.png)

- 公開範囲を指定する
![Screenshot 2020-01-08 at 12.19.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63985/8c8bb688-027b-cd73-88a7-8e561c8a9e2d.png)

### 文言の管理をまとめる [xvrh/localize-with-spreadsheet](https://github.com/xvrh/localize-with-spreadsheet)
- スプレッドシートで定義した文言をStringファイルに変換するツール
- Android、iOSの文言の共通管理できる

### スプレッドシートの値をアプリで呼び出す [t-osawa-009/SpreadsheetClient](https://github.com/t-osawa-009/SpreadsheetClient)
- スプレッドシートの値をアプリで呼び出すためのライブラリを自作した物を活用します。

#### カスタムスキームの定義とデバッグ
- スプレッドシートをカスタムスキームのドキュメントとして使える
- 定義したURLをアプリで取得し、UniversalLink, カスタムスキームを処理するメソッドを呼び出すことでデバッグを簡単に行える
- シートを更新することでUniversalLink, カスタムスキームのパラメータも動的に変更可能

<img width="424" alt="Screenshot 2020-01-07 at 10.51.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63985/5b5fd54b-77be-9e5b-8b03-8f9c2b3bf0bc.png">

### デバッグ用のアカウント管理
- アカウント情報のAPIとして活用できる

<img width="335" alt="Screenshot 2020-01-07 at 11.16.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63985/67a2f238-cf27-c881-b785-800ff863d4e1.png">

## 注意点
- スプレッドシートをURLを知っていると誰でも情報取得可能。公開されても問題ないもののみ扱う方がいいと思われる

## まとめ
- スプレッドシートを使うことで簡単に開発効率を上げられる
- ドキュメントのデータとアプリで実行するデータを一致した値で扱える


## 環境
```
Xcode 11.3
Apple Swift version 5.1.3 (swiftlang-1100.0.282.1 clang-1100.0.33.15)
Target: x86_64-apple-darwin19.0.0
```
vue.js this が使えない場合 例えば html2canvasにて

こっちにまとめた
https://qiita.com/ma7ma7pipipi/items/08461145731f1a09ce4a

vue.jsを使っていると時々、thisが使えないときがある。
入れ子になっているときとかね。


その時は、 this を let vc に格納して、利用する。

```

<script>

    document.getElementById('preview').style.display = "block";

    //画像が生成されたあとに動作させることができない。

    let vc = this;

    html2canvas(document.querySelector("#preview_inner")).then(function(canvas){

        var result = document.querySelector("#result");
        result.innerHTML = '';
        result.appendChild(canvas);



        // document.getElementById('preview').style.display = "none";
        // document.getElementById('result').style.display = "none";
        //
        //

        var dataURI = canvas.toDataURL('image/png');

        let dataform = new FormData();

        const message_tmp = document.getElementsByName("message");
        dataform.append('body',message_tmp[0].value);
        dataform.append('img',dataURI);

        message_tmp[0].value = "";

        vc.$message({
            message: '質問を送信しました',
            type: 'success',//or 'warning'
            customClass: 'message-margin'
        });


        axios.post('/question/add/', dataform).then(e => {


            vc.dialogVisible = false;
            vc.message = '';
            vc.clearStorage();
            vc.$router.push('/question/'+e.data, () => {}, () => {});


        }).catch((error) => {
            console.log(error);
            console.log("エラー");
        });

    });
    
</script>


```
Laravelのバリデーションで、正規表現のパイプが使えない件

# Laravelのバリデーションで、正規表現のパイプが使えない件

### Laravelのバリデーション
Laravelには、いくつかのバリデーションルールが用意されており、パイプ区切りで実行したいルールをvalidateメソッドへ渡すことで、複数のルールを利用することができる。

[バリデーションルールの例]

| ルール | 説明 |
|:-:|:-:|
| email | フィールドがメールアドレスとして正しいことをバリデートする |
| ipv4 | フィールドがIPv4アドレスの形式として正しいことをバリデートする |
| required | フィールドが入力データに存在しており、かつ空でないことをバリデートする |
| regex | フィールドが指定された正規表現にマッチすることをバリデートする |

``` php:sample.php

// バリデーションの利用例(パイプ区切り)
 $validateRules = [
    // 必須入力, 英数字のみ
    'user_name'=>'required|regex:/^[0-9a-zA-Z]+$/',
    // 必須入力, メールアドレス形式
    'mail'=>'required|email',
  ];
```

### 正規表現のパイプが使えない
通常、正規表現ではパイプ(|)を用いて「OR条件」を利用することができるが、Laravelでは複数のルールを区切るためにパイプを使うため、上記の書き方では正規表現のパイプを利用することができない。
バリデーションルールをパイプ区切りではなく、配列で書くことで正規表現のパイプを利用できるようにする。

``` php:sample.php
// バリデーションの利用例(配列)
 $validateRules = [
    // 必須入力, 「大阪」か「東京」のいずれかのみ
    'location'=>['required','regex:/(大阪|東京)/'],
  ];
```
LTのススメ


趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト](https://www.rymansat.com)」がお送りする[リーマンサット・プロジェクト　新春アドベントカレンダー2020](https://qiita.com/rsp-dgkz/items/497225739b88c817a90c)です。


# 挨拶
みなさん、こんにちはこんばんわ
リーマンサットプロジェクトRSP01サブミッション地上系の人です。
40手前のおじさんです。

# メンバー
リーマンサットのメンバーって400人超えちゃってるんです。

これってどういうことかっていうと、人が多くて覚えられないよ！って事になるんです。

# 定例会
でもね、定例会って人増えるでしょ？
既存メンバーももちろんいっぱいいるでしょ？
ってことはさ、インパクトないと覚えないじゃん。
定例会っていつも「なんでもプレゼン」ってあるのよ。
そうそう、つまり自分がみんなを覚えるのは辛いので（覚えてもいいんだけどね。

# ここで本題LTのススメ
## LTって？
よく勉強会とかでやっている5分でテーマ決めて話すやつ。

L：ライトニング
T：トーク
です。

## つまり
- リーマンサット・プロジェクトの定例会には「なんでもプレゼン」って枠がある。
- なんでもプレゼンはやりたい人ができる。
- 5分で自己紹介枠抑えちゃえばいいじゃん。
- 自己紹介スライドをpptで作って。
- 大谷さんになんでもプレゼンしたいって言っちゃえばいいじゃん。

## 人前で話すこと
- 大事なことだけどなかなかできない。
- 恥ずかしい
- でも自己紹介なら自分のことを知ってもらういい機会

## ちなみに
僕ははじめて定例会に出たその日に壇上で発表しました。（異例
（※大体自己紹介するんだろうなーってところから予想してあらかじめ作ってあった。）
こんなに（態度と身体が）でかいのでみんなにすぐ覚えてもらえました。
覚えるよりも覚えてもらうほうが仲良くなる近道かもしれない。

インパクト大事。

## 紹介
前回は、 @rsp-dgkz さんの [またしてもショートケーキを作った話](https://qiita.com/rsp-dgkz/items/83268377f8309ddb10f3)でした。面白いのでぜひ一度読んでみてください。

次回は、@mepsteindrive さんです。お楽しみに。

## 
リーマンサット・プロジェクトは「普通の人が集まって宇宙開発しよう」を合言葉に活動をしている民間団体です。
他では経験できない「宇宙開発プロジェクト」に誰もが携わることができます。
興味を持たれた方は [こちら](https://www.rymansat.com/join) からお気軽にどうぞ。
MuleSoftのバッチジョブの中に２つバッチステップがあった場合の動きを確認しよう！

# はじめに
　MuleSoftの動きを確認するために備忘録の目的で記述します。
　確かめたことは、MuleSoftのバッチ機能のバッチスコープ内に２つのバッチステップを作成し、バッチステップがどのように実行されるか、バッチジョブ内の変数の値を確認しました。

# 作成フロー
　HTTPLisnerでリクエストを受け、バッチジョブを実行します。
　バッチジョブの中にはバッチステップが２つ設定し、バッチ内の変数に値を設定します。各ステップ毎に変数をログに出力します。
<img width="1247" alt="スクリーンショット 2020-01-06 20.08.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/5d59da6d-f4a4-49d4-454f-1fa5f39b2379.png">

# 動作確認
　各バッチステップ連続してそれぞれPayloadの配列数分実行されている事が確認できました。
　ただしバッチステップは、実行回数毎スコープで変数値を保持している事がログからわかります。すごい！！
<img width="1440" alt="スクリーンショット 2020-01-06 20.07.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/289dda4f-a364-bc30-fa8a-ed47c2feef7e.png">
　バッチジョブの外に後続処理としてログ出力処理を入れたところ、バッチジョブ前に">>> Finish"ログが出力されていることを確認できました。バッチは非同期処理なのでバッチ起動処理の後にすぐ動きます。当たり前か！
<img width="614" alt="スクリーンショット 2020-01-07 13.04.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/17eb955a-66dc-cc50-6d84-cf5c692f57a7.png">

# 最後に
いかがだったでしょうか、バッチジョブの中にバッチステップが２つあった場合の動き面白かったですね。
ではーーーー


[Mule メッセージ構造](https://docs.mulesoft.com/jp/mule-runtime/4.2/about-mule-message)
[Mule アプリケーションの変数](https://docs.mulesoft.com/jp/mule-runtime/4.2/about-mule-variables)
emun のform select対応　実際に使えたもの


上記ものもを日本語対応させたい場合、下のように書く

```rb

<%= form.select :status, Post.statuses.keys,class:"form-control" %>
```

```rb

<%= form.select :status, Post.statuses.keys.map {|k| [I18n.t("enums.post.status.#{k}"), k]} ,class:"form-control" %>
```
WooCommerceの住所入力画面で送料を更新

# はじめに
WooCommerce、はじめて使ってみましたが、とても便利ですね。そして、なぜか無料...すごい。

さて、WooCommerceお決まりの請求先情報、お届け先住所入力画面にて、送料を更新したいと思います。
正確にいうと、「お届け先住所を指定」のチェックボックスをつけたり外したりすると、送料の更新処理が走りますが、都道府県を変更しても送料は更新してくれません。

画面右側にある、ご注文詳細の送料のことですね。
今回の試みは、都道府県を変更すると送料も自動で計算し直してくれるようにすることです。
（900円だと思っていたら、完了画面で1,600円とか表示されると辛いので...）

![prefecture_update-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/6a00578a-e406-4049-c131-053d821385e2.png)

# ソース

jsのファイルは、子テーマの好きなところに配置してください。

``` js
//都道府県を変更したときに、送料を更新する（請求先）
$('#billing_postcode').on('blur', function() {
    $( document.body ).trigger( 'update_checkout' )
})

$('#billing_state').on('change', function() {
    $( document.body ).trigger( 'update_checkout' )
})

//都道府県を変更したときに、送料を更新する（お届け先）
$('#shipping_postcode').on('blur', function() {
    $( document.body ).trigger( 'update_checkout' )
})

$('#shipping_state').on('blur', function() {
    $( document.body ).trigger( 'update_checkout' )
})

```

``` php:functions.php
if(is_page('checkout')) {
    wp_enqueue_script( 'checkout-js',  get_theme_file_uri( '/js/checkout.js' ), ['jquery'], '1.0', true);
}
```

これで完了です。

# ちょっと解説
プラグインフォルダ > woocommerce > assets > js > frontend > checkout.jsの中を読んでみてください。
（私はほとんど読んでいません...）

``` js
$( document.body ).bind( 'update_checkout', this.update_checkout );

$( document.body ).trigger( 'update_checkout' );

```

`update_checkout_action`このメソッドの中で、送料の更新などをしているようだったので、そのメソッドを呼び出している`update_checkout`を呼び出せばOKかなと。
ちゃんと`document.body`にイベントを登録してくれてあるので、別のjsのファイルからでもメソッドが呼び出せました。神！！


# その他
WooCommerceで、デザイナーの出してくれたデザインに合わせようと思って、jsとcssでこねこねしていましたが、実は、
`子テーマ/woocommerce`のディレクトリを作って、そこに`プラグイン/woocommerce/templates/`のファイルをコピーしてきて、そのファイルの中身を変えれば文言の修正などは簡単にできましたね。。

クール便の料金の追加とかもできるし、地域別に料金の設定もできるし、すごいなぁ...
[クール便の料金の設定方法](http://blog.ddwnet.com/archives/1653.html)

発送メールなどは、日本語を修正するために文章を考えるのがちょっと大変だったかな...
あとはクレジットカードでの決済方法を追加するのも、ちょっと大変かも？
（私はPAY.JP用の[プラグイン](https://wcpn.jp/product-list/woocommerce-pay-jp/)を購入してもらって、それを追加しました）
Ubuntuで時刻同期の設定 (timesyncd.conf)

## きっかけ

今まで `ntpdate` を使っていたが、`deprecate` になっていた。
`sntp` を使うようにとあったが、`systemd`で提供があった。

## 設定

* /etc/systemd/timesyncd.conf

```apache:/etc/systemd/timesyncd.conf
[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp
```

## サービスのリスタート

```sh
systemctl restart systemd-timesyncd

systemctl status systemd-timesyncd
```
OracleのTEMP表領域をBIGFILE表領域に変更したときのメモ的なやつ

### TEMP表領域が足りない…

無駄にTEMP表領域を使用するので、デフォルトで作成される容量じゃ足りない、となった。

標準で作成されるTEMP表領域はSMALLFILE表領域とのことで、最大サイズが決まっているらしい。

あまりSMALLFILEやBIGFILEについて考えたこともなかったので、かんたんに調べてみると、

Oracle 10g 以降は普通の表領域がSMALLFILE表領域として扱われるようになっている。

とのことですが、単に名前がそう呼ばれるようになっただけで、BIGFILE表領域という約30TBも扱えるでっかいファイルが登場したからだそうです。

SMALLFILE表領域が約30GBに対してBIGFILE表領域が約30TBと、扱えるサイズが1000倍?になっているらしい。

流石に今回30TBも使用はしませんが、30GBは超えるのでBIGFILE表領域へ拡張していきます。

### 方法

方法としては

1. 表領域を一度ExportしてTEMP削除してBIGFILEで作り直してImportする。
2. 一時使用するダミーの表領域を作成してTEMP削除してBIGFILEで作り直して元に戻してダミーを削除する。

簡単さで考えると①ですが、あえて②でやってみました。

TEMP表領域の名前はデフォルトから変更していないのでTEMPです。
ファイル名はTEMP01.DBFです。

### 手順

①まず一時的にメインにするダミーの表領域を作成します。

`CREATE TEMPORARY TABLESPACE HOGE TEMPFILE
'V:\oracle\hoge\HOGE01.DBF`

②ダミーの表領域をデフォルトの表領域に指定します。

`ALTER DATABASE DEFAULT TEMPORARY TABLESPACE HOGE;`

③TEMP表領域を作り直すため削除しますが、再起動を挟まないと処理が終わらなくなったので挟みます。

`shutdown immediate`
`starutp open`

④DROP TABLESPACEします。

`DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;`

⑤BIGFILE表領域として再作成します。とりあえず1GBで無制限に

`CREATE BIGFILE TEMPORARY TABLESPACE TEMP TEMPFILE
'V:\oracle\hoge\TEMP01.DBF SIZE 1000M AUTOEXTEND ON;`

⑥デフォルト表領域をもとに戻します。

`ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;`

⑦再起動を挟んでダミーとして使用したHOGEを削除します。

`shutdown immediate`
`starutp open`
`DROP TABLESPACE HOGE INCLUDING CONTENTS AND DATAFILES;`

おしまい

### あとがき

SMALLFILEからBIGFILEへ直接変更出来たらいいんだけどなーと思いました。
cakephp3.6.12でphp73にしたらUndefined variable: eTagMatchesのエラー

cakephp3.6.12でphp73にしたら下記のエラー。

* cakephp3.6.15にあげたら治りました。
* https://github.com/cakephp/cakephp/issues/12536

php73はcompactで未定義でNotice吐くようになったみたいです

* https://devblog.thebase.in/entry/2018/12/05/113000
* https://www.php.net/manual/ja/migration73.incompatible.php

compactの動作を確認しました。

```
<?php
$a = '123';
compact('a', 'b’);
```

エラーが発生します

```
Notice: compact(): Undefined variable: b in scratch_2.php on line 3
```
PHP foreach文まとめ

# 目的

- foreach文の書き方をまとめる

# 書き方の例

- foreach文は配列や連想配列に対し、先頭のデータを使用して順にループ処理を実行する。
- 下記にforeach文の書き方を記載する。(変数`city`には任意のデータが格納されているものとする。)

```php
foreach ($city as $キー名 => $キー名にリンクする配列に格納された値が格納される変数){
  ループで実行される処理
}
```

```php

foreach ($city as $配列が順に格納される変数名){
  ループで実行される処理
}
```

# 具体的な書き方の例

- 連想配列`$scores`には任意のキーが設定されており、それぞれ任意の値が格納されているものとする。

```php
//連想配列定義
$scores = array("数学IA" => 70, 
                "化学A" => 90,
                "世界史B" => 85
)

//ループ処理
foreach ($scores as $key => $value){
  echo "{$key}は{$value}点です。";
}

//出力結果
数学IAは70点です。化学Aは90点です。世界史Bは85点です。
```

- miriwo, mirimiri, mirimaru３人の所持金をforeach文で取り出す。

```php
//変数格納
$money = [
    "miriwo" => 1000,
    "mirimiri" => 1200,
    "mirimaru" => 0
];

//foreachを記載(keyを指定してvalueを格納したものは$key => $valueと必ず書く)
foreach ($money as $key => $value) {
    echo $key;
    echo $value;
}
```

- keyをしていせずにvalueを格納した場合にforeach文で取り出す。

```php
$money = [1000, 1200, 0
];

//keyを指定していない場合はvalueのみ記載する。keyは出力できない。
foreach ($money as $value) {
    echo $value;
}
```

# コロン構文での書き換え

- コロンとendを使用すると前述のforeach文を下記のように記載書き換えることができる。

```php
foreach ($money as $value) :
    echo $value;
endforeach;
```
viコマンド入門（覚書き）

## はじめに
ターミナルなどで作業をすることが増えてきたため、個人的なメモとして（最小限の）操作用コマンドをまとめてみた。
調べてみると大量のコマンドがあるが、入門編としてこのあたりからマスターしていきたい。
※随時、追記修正する可能性あり。



## 編集モードへの切り替え

- 「i」カーソルの位置で編集モードになる
- 「a」カーソルの一文字右で編集モードになる
- 「o」カーソル行の下に一行追加・移動して、編集モードになる
- 「O」カーソル行の上に一行追加・移動して、編集モードになる
- 「Shift+i」 行頭へ移動して編集モードになる
- 「Shift+a」 行末へ移動して編集モードになる



## 編集モードの終了・ファイルの保存

- 「ZZ」or「:wq」保存して終了
- 「:q!」保存せずに終了
- 「:q」終了



## Vimの設定

- 「:set number」行数を表示させるkkkk



## カーソルの移動

### 上下左右

- 「k」上に移動（↑）
- 「j」下に移動（↓）
- 「h」左に移動（←）
- 「l」右に移動（→）

### 単語
- 「w」次の単語の先頭へ移動
  - 「3w」３つ先の単語の先頭へ移動
- 「b」前の単語の先頭へ移動
  - 「3b」３つ前の単語の先頭へ移動

### 行
- 「^」行頭へ移動
- 「$」行末へ移動

### 段落
- 「{」段落の先頭へ移動
- 「}」段落の末尾へ移動

### その他
- 「gg」先頭行へ移動
- 「G」最終行へ移動
- 「:行番号」指定した行にカーソルが移動
- 「Ctrl + f」or「Ctrl + e」下スクロール
- 「Ctrl + b」or「Ctrl + y」上スクロール



## 検索

- 「/文字列」＋（n/N）文字列検索（次/前）



## 編集

### コピー＆ペースト
- 「yy」or「Y」行のコピー（Yank）
- 「3yy」カーソル位置から３行をコピー
- 「dd」行の切り取り
  - 「3dd」カーソル位置から３行を切り取り
- 「p」次の行にペースト（Put）

### 削除
- 「x」一文字削除

### その他
- 「u」直前の操作を取り消し
条件付きバリデーション(特定の状況においてバリデーションを発生させる方法)

##実現したいこと
PostモデルのFormにてGenreモデルのnameはuniquenessかつnameは空でもバリデーションに引っかからないようにしたい。そして空のデータは表示させたくない。

整理すると、
1. カラムはuniqueness、しかしカラムが空であった場合でもデータ送信ができる。
2. 空の状態を保存したものは出現させない。

課題
カラムが空であった場合データ送信ができる＝空の場合uniquenessのバリデーションには引っかからないようにする。

解決策
**条件付きバリデーションを作成する**

## 前提
新規投稿を作るformに置いてPostモデルとGenreモデルの２つのデータ送信を同時に行いたい。

Formの一部(ここでPostモデルのFormでGenreモデルのデータも同時に送信)

```rb

<%= fields_for @genre, :genres do |form| %>
        <%= form.label :新しくジャンルを作る %>
        <%= form.text_field :name, class:"form-control" %>
      <% end %>
```

Form全体

```rb

<div class="container">
  <%= form_with(model: [:mypage, post], local: true) do |form| %>
    <% if post.errors.any? %>
      <div id="error_explanation">
        <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>

        <ul>
          <% post.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
        </ul>
      </div>
    <% end %>
    <div class="form-group">
      <%= form.text_field :title, class:"form-control", placeholder:"タイトル" %>
    </div >
    <div class="form-group">
      <%= form.text_area :body, class:"form-control", placeholder:"自分の辞書をマークダウン記法で記入してみよう" %>
    </div>

    <div class="field">
      <%= form.label :status %>
      <%= form.select :status, Post.statuses.keys,class:"form-control" %>
    </div>

    <div class="field">
      <%= form.label :posted_at %>
      <%= form.datetime_select :posted_at %>
    </div>

    <div class="form-group">
      <%= form.text_area :reason, class:"form-control", placeholder:"メモした経緯を書いてみよう" %>
    </div>

    <div class="field">
      <%= form.label :rank %>
      <%= form.select :rank, Post.ranks.keys, class:"form-control" %>
    </div>

    <div class="form-group">
      <%= form.label :summary %>
      <%= form.text_field :summary, class:"form-control" %>
    </div>

    <div class="form-group">
      <%= form.label :URL %>
      <%= form.text_field :url, class:"form-control" %>
    </div>

    <%= form.label :genre, 'ジャンル' %>
      <%= form.collection_check_boxes(:genre_ids, current_user.genres.where.not(name:""), :id, :name) do |genre| %>
        <%= genre.label do %>
          <%= genre.check_box %>
          <%= genre.text %>
        <% end %>
      <% end %><br>
      <%= fields_for @genre, :genres do |form| %>
        <%= form.label :新しくジャンルを作る %>
        <%= form.text_field :name, class:"form-control" %>
      <% end %>

    <div class="actions">
      <%= form.submit class:"btn btn-info" %>
    </div>
  <% end %>
</div>


```

Genreモデルでの条件付きバリデーションの作成
これによってから以外でuniquenessが発動するようになった

```rb

validates :name, uniqueness: true, unless: :name_check?
def name_check?
    return true if self.name == ""
  end
```

空は表示させない
where.not

```rb
<%= form.collection_check_boxes(:genre_ids, current_user.genres.where.not(name:""), :id, :name) do |genre| %>
```
[トリビアの種] TaskQueueはオーバーフローするのか？結果は…ｫｱﾌﾝ

この記事は、私が素朴な疑問を抱いたところから検証してみたまでの一部始終です。
勘違い等がありましたら、ご指摘いただけますと幸いです。

<details><summary>結果だけを知りたい方はこちら。</summary><div>
エラーは発生しなかった。
</div></details>

## 今回のお便りはこちら
ある日、JavaScriptの非同期処理について勉強していた時にスタックとキューの存在を知りました。[^1]
これが「スタックにタスクが積まれすぎてオーバーフローになるのか！」と膝を打ちました。
それと同時に、キューオーバーフローって聞いたことないなと疑問に思いました。
そこで、キューオーバーフローになるようにあえてコードを実行するとどうなるのでしょうか？
これって種になりませんか？よろしくお願いします。

[^1]: https://developer.mozilla.org/ja/docs/Web/JavaScript/EventLoop

## このトリビアの種つまりこういうことになります
キューオーバーフローになるようにあえてコードを実行すると結果は、、、「ｫｱﾌﾝ」。

## スタックオーバーフローとは
wikipedia先生お願いします。
> スタックオーバーフロー (英: stack overflow) は、コンピュータプログラムにおいて、コールスタック領域の限界を超えたデータプッシュにより発生する、バッファオーバーフローの一種である。[^2]

[^2]: https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC

## 専門家に聞いてみた（現場の先輩）
Q. どのように確認すれば良い？
A. エラーの発生を確認する。若しくはブラウザ上で操作に影響があればそれがオーバーフローしていると判断して良いでしょう。

Q. 実行環境は？
A. JavaScriptは一般的にブラウザで実行されるので、最もメジャーであるChromeで確認すれば良いでしょう。

## 検証方法
- Chrome\(バージョン:78.0.3904.108\)
- 実行時エラーが発生するか
- ブラウザの挙動に変化はないか

## まずはスタックオーバーフローを発生させてみた

### 今回検証に使用するコードはこちら

```js
function push() {
  try {
    return push();
  } catch (e) {
    console.log(e);
  }
}
push();
```

### 結果
エラーが発生した。
`RangeError: Maximum call stack size exceeded`
<img width="326" alt="スクリーンショット 2020-01-07 10.00.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528526/fc5c73a4-8cb9-f5b8-47a8-5fd512c5a1d2.png">

## キューオーバーフローが発生するか検証してみた

### 今回検証に使用するコードはこちら
`enqueue()`を抜け無ければ、延々とキューにタスクを詰め込む。

※無限ループに注意。

```js
function enqueue() {
  while (1) {
    try {
      setTimeout(() => {console.log('詰めまくり！')}, 0);
    } catch (e) {
      console.log(e);
    }
  }
}
enqueue();
```

### 結果
エラーは発生しなかった。

無限ループで固まってしまったため強制終了。
<img width="377" alt="スクリーンショット 2020-01-07 10.01.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528526/a6b6b59a-f85a-69be-dd1d-b2c2c21cd471.png">


## ここに新たなトリビアが誕生した
キューオーバーフローになるようにあえてコードを実行すると、、、エラーは発生しない。

## 番外編
キューに積みまくった状態でスタックへぶち込むとどうなるのか検証してみた。

まずはこちらで最大値を計測する。

```js
let n = 0;
function push() {
  try {
    ++n;
    return push();
  } catch (e) {
    console.log(`${n}個目のタスクでエラーでした。`);
  }
}
push();
```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528526/f51cea1a-d0d3-1059-183f-587c2764929b.png)

### 続いてこちらを実行する
ループ処理はこちらを参考にさせていただいた。[^3]
想定では、`enqueue()`を抜けた後にキューに詰められたタスクがスタックに積まれるはずだが。。

[^3]: https://www.sejuku.net/blog/24629

```js
function enqueue() {
  for (let i = 0; i < 10452; i++) {
    try {
      setTimeout(() => {() => {console.log('詰めまくり！')}}, 0);
    } catch (e) {
      console.log(e);
    }
  }
  // キューに積み切るまでの時間稼ぎ
  const ms = new Date();
  while (new Date() - ms < 100000);
}
enqueue();
```

### 結果
エラーは発生しなかった。

<img width="381" alt="スクリーンショット 2020-01-07 9.38.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528526/2f80720a-734e-adee-7c3d-37cfe969cc47.png">

## 感想
あくまで予想だが、オーバーフローしないようにある程度分割してスタックに積んでいるのだろうか...？
はたまた、webapisが上手いことやってくれている...？
検証は以上となります。
Magentoで商品ページURLに絶対にカテゴリパスを付けない方法

Magento2系で開発をしていると、商品ページへの導線を設置しないといけないことがあります。
ところが、正直に商品データを取ってきてURLを取得すると、商品が所属するカテゴリのパスがURLについたりつかなかったりすることがあり、キレイに1つに定まらないことがあります。
もちろんMagentoではCanonical URLの設定を有効にしておくことで重複URLをGoogleから指摘されることはなくなるが、URLがブレるのはなんだかとても釈然としない思いをします。
（これはたとえ設定で商品URLにカテゴリパスを付けない設定にしていても起きます）

#普通に書くとどうなるか

何も考えずに商品データからURLを取得すると、以下のようになることが多いでしょう。
($this->productRepositoryは\Magento\Catalog\Api\ProductRepositoryInterfaceを利用するクラスにDIしている前提）

```
$product = $this->productRepository->get($sku);
$url = $product->getProductUrl();
```

この書き方をすると、状況によってはURLが以下のようにいくつかのバリエーションを持ってしまいます。

+ http://ドメイン名/foo.html
+ http://ドメイン名/bar/foo.html

#なぜ複数のパターンがあり得るか

\Magento\Catalog\Model\ProductのgetProductUrl()の実装を見ていくと、以下の順に処理をしていることがわかります。

1. \Magento\Catalog\Model\Product\Url::getProductUrl()
2. \Magento\Catalog\Model\Product\getCategoryId()

この\Magento\Catalog\Model\Product\getCategoryId()がクセモノで、定義をみると以下のように書かれています。

```
public function getCategoryId()
{
    $category = $this->_registry->registry('current_category');
    if ($category && in_array($category->getId(), $this->getCategoryIds())) {
        return $category->getId();
    }
    return false;
}
```

この処理の中に出てくる、$this->\_registryというのはMagento\Framework\Registryクラスのインスタンスです。
Magento内部でクラスをまたいだ変数の引き回しによく使われています。既にこのクラスにはdeprecatedがつけられていますが、未だにコア実装のあちこちで使われていて、このクラスを使わないと始末できないような処理もかなり存在します。
先の処理では他のクラスで登録されているかもしれないcurrent_categoryというキー値の値を取得し、値がセットされていて、かつ商品が属しているカテゴリIDにその値があるかをみています。

さらに\Magento\Catalog\Model\Product\Url::getProductUrl()の処理を読みすすめると、以下のことがわかると思います。

- カテゴリIDがある場合はURL書き換えデータの検索にカテゴリIDを併用する
- カテゴリIDがない場合はURL書き換えデータの検索は商品IDだけになる

#カテゴリパスを付けたくないときはどうするか
ここまで処理を読んできましたが、getProductUrl()には大事な箇所があります。それが以下の部分です。

```
if (!isset($params['_ignore_category']) && $product->getCategoryId() && !$product->getDoNotUseCategoryId()) {
    $categoryId = $product->getCategoryId();
}
```
\Magento\Catalog\Model\Product\Url::getProductUrl()は定義上以下の2つの引数を取ります。

- \Magento\Catalog\Model\Product
- オプションパラメータ配列

$categoryIdに値がセットされるのを防ぐためには、\Magento\Catalog\Model\Product\Url::getProductUrl()の第2引数を

```
$params['_ignore_category'] = true;
```
という構成にするか、\Magento\Catalog\Model\Product::getProductUrl()を呼び出す前に、

```
$product->setDoNotUseCategoryId(true);
```
とすればOKです。
実際、関連商品やアップセル・クロスセル商品のリストを表示する処理ではsetDoNotUseCategoryId(true)が呼ばれています。

#まとめ

- Magentoで商品URLを取得する際は、たとえカテゴリパスをつけない設定にしていてもカテゴリパスがつくことがある。
- 商品URLにカテゴリパスをつけたくない場合は商品オブジェクトに対してsetDoNotUseCategoryId(true)を行う。
- または、URL生成処理に与えるパラメータに_ignore_categoryをtrueで含める。

というほんの僅かな対応で解決できます。
Raspberry Pi3のスクリーンを常時ONにする方法

Raspberry Piのスクリーンが無操作で10経過すると勝手にOffになってしまうので、常時ONにする方法を自分用にメモ。

■環境
　- Raspberry Pi3

■手順
１．端末を起動
２．下記ファイルをnanoで編集

```Bash
sudo nano ~/.config/lxsession/LXDE-pi/autostart
```
３．下記4行を```autostart```ファイルに追記

```Bash:autostart
@xset s 0 0
@xset s noblank
@xset s noexpose
@xset dpms 0 0 0
```
４．```Ctrl+x```、```y```で保存
５．```sudo reboot```で再起動

■補足
上記はスクリーン常時点灯だけでなく、
　・OSをスリープしない
　・スクリーンロックをしない
も設定しているので注意

■参考リンク
https://www.raspberrypi.org/forums/viewtopic.php?t=147311
基本情報技術者　テクノロジ系　第1章　コンピューター科学基礎理論

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


手始めに一つずつやっていこうと思います。


# ビットとバイト
2進数1桁を1ビットとなり
8ビットをまとめて1バイトと呼びます。

# 二進数と十六進数

二進数・・・2の段階で繰り上がる
　　　　　1011(2進数) → 11(10進数)

十六進数・・・16の段階で繰り上がる、11進数以上はアルファベットを使用
　　　　　　123456789abcdef と一桁が構成され  aが10 eが14にあたります。

格進数の表現は

(1011)2  や　(a1)16 と括弧外に表示されます。本来ならもう少し字を小さくできれば良いですが

# 進数変換

## 16進数から10進数の場合

例
1桁目はそのまま、2桁目は16をかけ
3桁目はさらに16をかけた256をかけて
(4桁目以降は16かけるを続けて行きます)
合算すれば出てきます。

(1AF)16 → 1x256 + 16x10 + 1x15 = 431　

## 10進数を2進数の場合

2で割りながらあまりを並べていく方法です。

例
231を変換する場合

231/2 = 115 余り 1
115/2 = 57 余り 1
・
・
・
1/2  = 0 余り 1

最初の余りを一桁目として
11100111

となります。

# 2進数の負数表現

基本PCでは
0から始めれば正の数
1から始まれば負の数

と表現されます。

00001101 → 13

これを0と1を反転させて一桁目に1を足せば

11110011 → -13 

となります。

# 固定小数点表現
2進数の小数点ありの場合で
小数点に入ると
0.5(1/2)  0.25(1/4) ・・・・
と続いて行きます。

# 浮動小数点表現
累乗で表現していく方法です。

1.23x　10の7乗

1.23を仮数
10を基数
7を指数

と呼びます。

## 正規化
これだと、0.123でも123でも基数と指数の表現で
同じでもバラバラの表現になってしまうので
1.23と始め方を統一する方法です。

# 計算誤差

情報落ち・・・桁数限界が原因で小さな数が抜ける
桁落ち・・・浮動小数点の計算で有効桁数が減る

# 論理演算

AND(論理積)両方成立
OR(論理和)片方だけで成立
XOR(排他的論理和)両方成立はだめ、片方だけ
NOT(否定)反転
の種類があります

# シフト演算
桁を移動させる演算
サーバーサイドエンジニアがフロントエンドに挑戦

初投稿なので、ひとまず軽く自己紹介がてら…

投稿時で大体7年弱のエンジニア経験があり、内訳は
3年ほど大手企業の子会社に当たるシステム開発会社で正社員として、システム開発に従事。
その後半年弱、自己学習などもかねて自分でアプリ開発に挑戦してみるなどした後に転職し、1年半ほど小規模なソフトハウスで正社員として、システム開発に従事。
計4年半近くの正社員としての経験を積み独立してフリーランスに転身しました。
現在2期目になり、まもなく3期目を迎えようとしています。

おおまかなスキルセットですが
バックエンドはJavaでの経験が主で、6年程度。正社員では主にエンプラ系の業務システムに携わっていましたが、フリーになってからはWebサービスなどを中心に参画しています。FWはSpring系が一番経験として多くなります。
また、独学と実務経験1年弱ではありますがRubyの経験もあります。こちらはRuby on Railsを取り扱っておりました。

また、フロントエンドですが過去の経験はテンプレートエンジン(Thymeleafなど)やJSPなどを使っての開発が多く、ここ最近React.jsやVue.jsを使う機会も増えてきました。

Javaの技術や、これから使うことの増えそうなReact、Vue、Nuxt辺りの技術を中心に発信できればと思います。
フロント関連は正直まだやりながらなので、間違った認識などもあるかと思いますがその際はご指摘いただければと思います。
また、あまり文章書くのが得意でもないので読みにくいなどありましたらご指摘いただけますと修正いたします。
よろしくお願いします。
nginx ドメイン移転

ドメイン移転したい。
どんなときの移転方法。

参考
http://xn--vps-hz3g941m.uvs.jp/operation/nginx301

# nginxの301リダイレクト設定

```default.conf

server{
server_name old-domain.com;
rewrite ^(.*)$ http://new-domain.com$1 permanent;
}

```


# リダイレクト例

http://old-domain.com　→　http://new-domain.com

http://old-domain.com/hoge/hoge.html　→　http://new-domain.com/hoge/hoge.html



# 一時的な移転
一時的な移転の場合、以下のように記載します

```

server{
server_name old-domain.com;
rewrite ^(.*)$ http://new-domain.com$1 redirect;
}

```

「permanent」が「redirect」に変わっています。
これによりhttpステータスが301から302に変わり、一時的な移転だとユーザや検索エンジンに伝えることができます。
[Hyperledger Iroha]irohad起動方法メモ

#記事の内容
Hyperledger Irohaのirohad（irohaデーモン）の起動コマンドについてメモ

※環境構築方法はこちらを参照
https://iroha.readthedocs.io/en/latest/getting_started/index.html

記事の内容はirohaコンテナ内で行います。

#起動方法
##初回起動

~~~
irohad -config config.docker -keypair_name node0 -genesis_block genesis.block
~~~
ポイントは「-genesis_block」
ジェネシスブロックのオプションを指定することを忘れない。
irohaのジェネシスブロックにはユーザーの権限情報などを事前に設定しておくことが可能です。
このあたりは柔軟なアカウントの権限管理が可能なirohaらしさかなと思います。

##二回目以降

二回目以降は「-genesis_block」を指定しないだけ

~~~
irohad -config config.docker -keypair_name node0
~~~

##ブロックを初期化する場合

~~~
irohad -config config.docker -keypair_name node0 -genesis_block genesis.block -overwrite_ledger true
~~~

「-genesis_block」と「-overwrite_ledger true」を忘れない。
「-overwrite_ledger」はデフォルトだとfalseになっているのでtrueを指定する。
これでブロックが上記のコマンドで指定したジェネシスブロックだけになる。
pythonで九九表を表示する方法

##pythonで九九表を表示する方法

pythonの学習の為に九九表を作成しました。

コードは下記の通りです。

```python:main.py
def multiplicationTable():
    for a in range(1,10):
        for b in range(1,10):
            ans = str(a * b)
            result = ans.rjust(4)
            print(result,end=" ")
        print('')

if __name__ == "__main__":
    multiplicationTable()
```
rjsutメソッドでインデントを揃えています。

```terminal:terminal
   1    2    3    4    5    6    7    8    9 
   2    4    6    8   10   12   14   16   18 
   3    6    9   12   15   18   21   24   27 
   4    8   12   16   20   24   28   32   36 
   5   10   15   20   25   30   35   40   45 
   6   12   18   24   30   36   42   48   54 
   7   14   21   28   35   42   49   56   63 
   8   16   24   32   40   48   56   64   72 
   9   18   27   36   45   54   63   72   81 
```