OmniAICreator/Qiita-1.07M huggingface dataset:
【python】2番めに小さな値を求める。

#【python】2番めに小さな値を求める。
個人メモです。

・与えられた数値と名前を入れ子の配列化(nested list)
・2番目に小さい数値を持つ人の名前をアルファベット順で抜き出す


▼sample input

```
5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39
```

▼my answer

```python
if __name__ == '__main__':

    #値を格納する配列を準備
    nameScores=[]
    scores=[]

    for _ in range(int(input())):
        name = input()
        score = float(input())
    
        scores.append(score)
        nameScore=[name, score]
        nameScores.append(nameScore)
    
　　#名前のアルファベット順にソート
    nameScores = sorted(nameScores) 
        
    #2番めに小さい値求める
    secondlow = sorted(set(scores))[1]
    
    #最小値を持つ名前を抜き出す
    names=[]
    for nameScore in nameScores:
        if nameScore[1]==secondlow:
            print(nameScore[0])
```

・`配列.append(値)`
配列に値を追加

・`sorted(配列)`
配列を昇順ソート（ネストの場合は0番目の要素）
アルファベット＝a~
数値=0~

オプションで降順、キーとなる要素を指定可能。
・降順： reverse=True
・キー指定：ラムダ式で指定。
`key=lambda val:val[インデックス番号]`
`key=lambda x:x[キー名]`


・`set()`
重複する値を削除
set型
HackerRnakメモ

#HackerRnakメモ
個人メモです

###基本使用言語
python3


・`raw_input()`
キーボード入力(python2)
python3の場合はinput()

n = input()
n = int(input())



・`.strip()`
空白文字(スペース、タブ、改行)の削除

input().strip()


・`sprit()`
指定した文字で区切り配列にする。
()内に指定がない場合は、スペースやTABで区切る

input().split()


・`STDIN`
キーボード入力された値
標準入力

・difference
差分
difference of the two numbers (first - second).


・puroduct
掛け算
product of the two numbers.


・`a//b`
割り算。商を整数で返す
小数点以下は切り捨て

・`for文`
for 変数 in シーケンス

```
n = int(raw_input())

for i in range(n):
   print(i*i)
```

・`range(n)`
i<n
i=0から
nは含まない。

range(3) = [0,1,2] 


・Leap Day
うるう年
We add a Leap Day on February 29.


・intercalary day 
差し込まれた日
The leap day is an extra, or intercalary day.

・evenly divided by ~
~で割り切れる
The year can be evenly divided by 4, is a leap year.

・`if文`
if, elif, elseの後に「:」必須。

・`sum(配列)`
合計値を算出

```
list = range(5)
print(sum(list)) 
```


・`str()`
文字列に変換

```
n = int(input())

a=""
for i in range(n):
   a =a+str(i+1)
print(a)

#出力
a=12345~
```


・arithmetic operations
算術演算子。 +-*%のこと


・runner-up
準優勝
you are required to find the runner-up score.


・`(lambda 変数:処理)(引数)`
ラムダ関数
１行で関数を作れる(def相当)
(lambda 変数:処理)(引数)
　└ 引数を処理に代入する
　└ 引数は複数可。順位処理内の変数に入る。

```
print((lambda a,b,c:a*100+b*10+c*1)(1,2,3))

#出力
123
```



・`map(関数, 配列)`
map関数
配列の要素一つ一つに関数を実行する。
出力はmapオブジェクト
→ list(map())でlistオブジェクトに変換

・map関数を使って配列を整数に変換する
map = (int, 配列)

```
arr = map(int, input().split())
```



・`x**y`
べき乗。xのy乗

10**0 = 0
10**3 = 1000


・`set()`
配列から重複する値を削除
set型

```
arr=[2,3,6,6]
print(set(arr))

{2,3,6}
```


・`sorted()`
配列を昇順に並べる

n番目に大きい値を抜き出す
sorted()[-n]

```
#2番目に大きい値を抜き出す
arr=[2,3,6,6,5]

sorted(set(arr))[-2]

#出力
5
```

・order their names alphabetically
アルファベット順に並べる
order their names alphabetically and print each one on a new line.
すばらしきかな、名前付き引数

C#入門記事を記載させていただいております。
[Windows10+VSCode+.NET CoreでC#開発環境を作ろう！](https://qiita.com/mekemeke421/items/102b76fdb1c2eb879901)
[初めてC#を学習する方へのおすすめサイト](https://qiita.com/mekemeke421/items/95a6e925a6e273355564)

# あるある。引数の順番を間違えてしまう
C言語で以下のような関数を書いたとします。

``` introduce_miss.c
#include <stdio.h>

static void introduce(char *country, char *name)
{
    printf("%sです。 %s出身です。\n", country, name);
}

int main(void)
{
    introduce("東京", "太郎");
    return 0;
}
```

自己紹介の関数ですね。
実際に使用してみましょう。

``` output
東京です。 太郎出身です。
```

盛大に間違えてますね。
太郎さんは「東京出身の太郎です。」と出力されると思っていたようです。
今回のように、型が同じ関数だと、順番を間違えていてもコンパイラ等では判断できません。
テストするまで、間違えが残ってしまいます。

# なんとかして順番ミスをなくしたい
## C言語なら構造体を引数に
C言語で無理やり解決しようと思うとこんな感じでしょうか。

``` introduce_type.c
#include <stdio.h>

typedef struct {
    char *country;
    char *name;
} Profile;

static void introduce(Profile profile)
{
    printf("%sです。 %s出身です。\n", profile.name, profile.country);
}

int main(void)
{
    introduce((Profile){.country="東京", .name="太郎"});
    return 0;
}
```

順番ミスしなくはなりましたが・・・関数毎に構造体作るわけにもいきませんね。
ちょっとしんどい。

## オブジェクト指向言語ならメソッドチェーン
C++であれば、クラス・メソッドを使用できるので以下のようなセッタを作成すると
引数を可視化してコーディングできます。

``` introduce.cpp
#include <iostream>
#include <string>

using namespace std;

class IntroduceClass
{
public:
    string _country;
    string _name;

    IntroduceClass()
    {
        _country = "日本";
        _name = "名無しの権兵衛";
    }
    IntroduceClass& setCountry(string country)
    {
        _country = country;
        return *this;
    }
    IntroduceClass& setName(string name)
    {
        _name = name;
        return *this;
    }
    static void introduce(const IntroduceClass& ic)
    {
        cout << ic._name + "です。 " + ic._country + "出身です。" << endl;
    }
};

int main()
{
    IntroduceClass::introduce(IntroduceClass().setCountry("東京").setName("太郎"));
    return 0;
}
```

メソッドチェーンと言われる記載方法ですね。
ちなみに関数呼び出し時に引数名を明示するためのイディオムを名前付きパラメータ・イディオム（Named Parameter Idiom）といいます。

C言語のケースと違ってクラス化を前提としているため、
「関数毎に作る」必要はなくなりました。
ただ、C言語よりも長くなった感じは否めない。

## C#なら名前付き引数
C#の場合は、以下のようになります。

``` Introduce.cs
using System;

namespace NamedArguments
{
    class Introduce
    {
        static void Main(string[] args)
        {
            introduce(name: "太郎", country: "東京");
        }
        static void introduce(string country = "日本", string name = "名無しの権兵衛")
        {
            Console.WriteLine(name + "です。" + country + "出身です。");
        }
    }
}
```

すばらしくスッキリ！
また、引数が増えてしまった場合だとしても

``` Introduce.cs
            introduce(
                name: "太郎",
                country: "東京"
            );
```

関数呼び出し部分を改行して整形することで、~~JSONのような~~スッキリした見栄えになります。
また、サンプルのように初期値を指定しておくことで、
必要なパラメータのみ記載して呼び出すことが可能です。
・・・毎回全パラメータ入力が必要ないのもすばらしい

# まとめ
今回は名前付き引数をご紹介させていただきました。
これを使えば、もう引数の順番を気にすることもなければ、
メソッドに引数追加が必要になった際にもある程度安心できますね。
[JavaScript] innerText により想定外の DOM が挿入される問題のメモ（手品が如し）

# 概要

* DOM 要素に文字列を入れると、HTML タグが勝手に挿入されるケースがあり、それの忘備録としてコードを記しておきます。

# 再現手順

1. `<body>` の中身が空の `.html` ページを用意。
2. 以下のコードをブラウザのコンソールで実行。

```JavaScript
document.body.innerText = 'aaa\nbbb\nccc'
console.log(document.body.innerHTML)
// 'aaa<br>bbb<br>ccc'
```

# 回避策

* `textContent` では起きません。

```JavaScript
document.body.textContent = 'aaa\nbbb\nccc'
console.log(document.body.innerHTML)
// `aaa\nbbb\nccc`
```
初心者によるプログラミング学習ログ 335日目

#100日チャレンジの335日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
335日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>　335日目　1.5h<br>・ポートフォリオ作成<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1268629560402182145?ref_src=twsrc%5Etfw">June 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
live html preview

ラフ画像を元にフレームワーク作成しまして
Vscodeでviewが出せず確認しながらの作業が出来ません。
commandからやる方法や
command+shift等試しましたがどれも出来ずです。

ちなみにMac使用です。

![Screenshot_20200605-024008_Gallery.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640511/a84272d3-f567-c40f-8c3c-a1107368da49.jpeg)
Haskellに入門してみる


「関数型プログラミングをやってみたい」と思ったのでHaskellを始めることにしました。

環境はLinux OS(Ubuntu)です。

# インストール方法
以下のサイトで自分のOSを選択するとインストール方法が表示されます。
https://www.haskell.org/platform/
Ubuntuの場合は

```bash
sudo apt-get install haskell-platform
```
これでインストールされました。

# 起動と使い方

以下の記事に使い方がありました。
http://walk.northcol.org/haskell/setup/

対話環境(REPL)を起動する場合ではターミナルで以下のように打ちます。

```bash
ghci
```

書いたスクリプトを実行する場合は

```bash
runghc <ファイル名（hsファイル）>
```
です。これでコンパイルと実行を両方やってくれます。

# 文法

以下の記事が大変参考になります。
https://qiita.com/7shi/items/145f1234f8ec2af923ef

対話環境で関数の記述するとエラーになりますが、
コードをhsファイルに書いて実行していくことで動かすことが出来ました。

有名なのが以下にある５行でクイックソートする関数ですね。
ただしこの書き方では計算量が多くなるため良くないようです。

```haskell
num = [2, 10, 3, 4, 7, 12, 8, 5, 6, 1, 11, 9] -- list of number
-- Quick sort on 5 lines
qsort []     = []
qsort (n:xs) = qsort sm ++ [n] ++ qsort lg
    where
        sm = [x | x <- xs, x <  n]
        lg = [x | x <- xs, x >= n]
-- main function
main = do
  print $ qsort num
```
AWS Certified Solutions Architect Associate - Section2

# regionとAZとedge location
- 19 regions 57 availability zones
    - 1 region = 2~ availability zones
    - availability center = data center
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/e14590ea-c8ba-da2b-a7fd-3e42818cca40.png)
- 150 Edge location = キャッシュしたコンテントを保持する場所
    - CloudFront, CDNからなる
    - Edge locations > AZ
    - S3パートで詳しく見る


# 備考
- 数は正確でない(TODO: 更新)
PSoC4M Kick offのChips

# PSoC4Mが来た
[ Cypess Shore ]( https://japan.cypress.com/cypress-store )に注文した CY8CKIT-043 PSOC4M-Serises KITが届きました。
このキットは[ CY8C4247AZI-M485 ]( https://www.digikey.jp/product-detail/ja/cypress-semiconductor-corp/CY8C4247AZI-M485/428-3577-ND/5761481?utm_adgroup=&utm_source=google&utm_medium=cpc&utm_campaign=Dynamic%20Search_JP_RLSA_Buyers&utm_term=&productid=&gclid=CjwKCAjwt-L2BRA_EiwAacX32URyUndn4PLe37ESDPKvGtugD0phCfZ_yZ_A96ROoro-Avah-QVsWhoCP80QAvD_BwE ) 搭載の開発基板です。

# 開発するには
[ PSoC Creator ]( https://japan.cypress.com/products/psoc-creator-integrated-design-environment-ide ) が必要です。
私は、PSoC4用に作ったプロジェクトをPSoC4Mに移したのですが、PSoc Creatorから直接書き込めるようになり、操作性は向上しました。

# いきなりエラー
そのまま4⇒4Mにマイグレーションしたはずなのにエラーが出ました。何でもクロックが高過ぎるとか。PSoC4は24MHzだったものが48MHzになったはずなのですが、ワーニングが出ました。ワーニングですので無視してもいいのですが、気持ちが悪いので"Clocks"で45MHzに落としたら収まりました。

# UART はいずこ？
KipProgにつながる、UARTの説明がちょっと不親切です。UART Tx⇒P7[1]; Rx⇒P7[0]にすればよいのですが、設定中にエラーが出てビビったりします。有無を言わさず設定すればOKです。

# KitProgあれこれ
Kitは本体とKitProgにカッターで切って分離することができます。このKitProg部分はPSoC Debbugerの [ MiniProg3 ]( https://japan.cypress.com/documentation/development-kitsboards/cy8ckit-002-psoc-miniprog3-program-and-debug-kit ) と同等の機能を持っていて、自作基板に乗せたPSoC4, PSoC4M, PSoC5をProgramできます。はい、MiniProg3はもはや不要です。

# 型番
PSoC4にCY8CKIT-049という商品があり廃止になりました。後継はCY8CKIT-043です。日本人感覚として信じがたいのですが、VerUPで型式Downです。さらに信じがたいのですが、PSoC5 KITのADCはPSoC4より低速です。

# 結論
- 相手が日本人じゃなければ日本の常識は通じない。
- スペックは憶測ではなくスペックシートを見よう
- 一個目のエラーで怖気づいてはならない。最後までやってからエラーを見よう。
【Linux】Mecabの文字化けを直す

#はじめに
結論から言うと**Mecab側の文字コードをターミナル側の文字コードに合わせてあげる**と文字化けしなくなります．
**Homebrew**でMecabをインストールする場合Mecabの文字コード設定がEUC-JPになることがあります．
開発環境等で特別な事情がなければ，文字コードの設定はUTF-8にすることを推奨します．

#変更前の状態

<img width="536" alt="スクリーンショット 2019-12-07 15.13.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/1e6857ae-0a00-0b52-d8bb-56e20d4aa770.png">
文字化けしてます．
とりあえず実験として一時的にターミナルの文字コードを「**UTF-8**」から「**EUC-JP**」に変更して再度Mecabしてみます．

<img width="668" alt="スクリーンショット 2019-12-07 15.19.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/413b6501-07ef-b57b-a739-02cd6da1496a.png">

<img width="583" alt="スクリーンショット 2019-12-07 15.21.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/03c922b2-a498-7ac5-ef1c-1f7d0626515e.png">

文字化けすることなく形態素解析できてます．
つまり原因はターミナル側が「**UTF-8**」でMacab側が「**EUC-JP**」の設定になっているから．
というわけでこれからMecab側の設定を**UTF-8**に変更します．
やることとしてはMecabをUTF-8で再設定して**ipadic辞書**の**dicrc**の設定(Config）をUTF-8に変更します．


#MecabをUTF-8でインストール

[こちら](http://taku910.github.io/mecab/#download)を参考にMecabをインストールします．
```./configure```のときに```--with-charset-=utf8```（オプション）をつけます！
Xの部分はダウンロードしたMecabのバージョンによって変わるのでそこだけ変えてください．

```
$ cd [インストール先のディレクトリ]
$ cd mecab-X.X
$ ./configure --with-charset=utf8
$ make
$ make check
$ sudo make install
```

#ipadic辞書のインストール
同様にipadic辞書もインストールします．

```
$ tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
$ cd mecab-ipadic-2.7.0-XXXX
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```
#ipadic辞書ディレクトリ内の拡張子がcsvまたはdefのファイルをUTF-8に変換する

EUC-JPで書かれたcsvおよびdefファイルを全てUTF-8に変換して上書き保存します．
```nkf```コマンドが使えることを前提に進めます．
```nkf```は```$ brew install nkf```でインストールできます．
一個一個のファイルに対してコマンド打って変更してもいいのですが面倒なのでいっぺんに処理します．
まずは```csv```ファイル

```bash

# csvファイルを一括でUTF-8に変換
$ foreach f ( *csv ) 
$ nkf -w --overwrite $f
$ end

# UTF-8になっていることを確認
foreach f ( *csv )
nkf -g $f
end
```

```f``` は変数なのでなんでも構いません．

同様に```def```ファイルも変換します．

```bash
# defファイルを一括でUTF-8に変換
$ foreach f ( *def )
$ nkf -w --overwrite $f
$ end

# UTF-8になっていることを確認
$ foreach f ( *def )
$ nkf -g $f
$ end
```

　```foreach```で一括処理してもいいですが，こっちのがシンプルでいいかもです．

```bash

$ nkf -w --overwrite *.csv
$ nkf -w --overwrite *.def
```


#dicrcの編集

　```ipadic```辞書のディレクトリ内に
　```dicrc```という設定ファイルがあるはずなので以下の箇所を編集します．

```
- config-charset = EUC-JP
+ config-charset = UTF-8
```


#ipadic辞書の設定変更を有効にする
インストール

```
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

これでうまく直りました！(°▽°)


```
$ mecab
おはようございます
おはよう    感動詞,*,*,*,*,*,おはよう,オハヨウ,オハヨー
ござい   助動詞,*,*,*,五段・ラ行特殊,連用形,ござる,ゴザイ,ゴザイ
ます  助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
```

#おわりに

　```mecab-neologd```辞書にdicrc等の設定ファイルはなかったのでネオログ辞書は設定しなくても大丈夫です．


#参考
https://nymemo.com/sakura/258/
Vue.jsでページ離脱時に「このサイトを離れますか？」を表示する

このダイアログの表示機能をVueのmixinsとして実装していきます。
![](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2350160ede91e1d24bfc1e071250d330.png)

まず、あのアラート表示の実態はwindowオブジェクトの`beforeunload`イベントです。
それをEventListenerに登録/解除する処理をVue.jsのmixinsに切り出します。

ポイントを順番に解説していきます。
まず、ページ離脱時に出したい場合、Componentのライフサイクルフックではリロードなどに対応できないため、Vueのナビゲーションガードを用います。該当するのは`beforeRouteLeave`です。
`beforeRouteLeave`はvue-class-componentを用いてComponentに登録することで使用することができます。
__そのためmixins的な機能ですが、今回はvue-mixin-decoratorを使わず実装しました__

```ts
Component.registerHooks(['beforeRouteLeave']);
```

beforeRouteLeaveでルーティングをブロックできるようにフラグを用意しておきます

```ts
  enabledWhenUnloadConfirm: boolean = false;

  beforeRouteLeave({ next }): void {
    if (this.enabledWhenUnloadConfirm) {
      next(false);
      return;
    }
    next();
  }
```

ダイアログの出現条件はそれぞれ`enableConfirm`, `disableConfirm`を実行することで制御できるようにします。

```ts
  enableConfirm(): void {
    this.enabledWhenUnloadConfirm = true;
    window.addEventListener('beforeunload', this.onBeforeunloadHandler, false);
  }
  disableConfirm(): void {
    this.enabledWhenUnloadConfirm = false;
    window.removeEventListener(
      'beforeunload',
      this.onBeforeunloadHandler,
      false
    );
  }
```

Componentのライフサイクルフックに合わせてbeforeunloadイベントの登録と解除を自動的に行うようにしておきます

```ts
  created() {
    window.addEventListener('beforeunload', this.onBeforeunloadHandler, false);
  }
  beforeDestroy() {
    window.removeEventListener(
      'beforeunload',
      this.onBeforeunloadHandler,
      false
    );
  }
```

また、度々出現している`onBeforeunloadHandler`は自前の関数で、__現在IEとEdgeのみ__ですがダイアログのメッセージをカスタムできるのでしています。他ブラウザはセキュリティの観点でメッセージが固定されています。

```ts
  onBeforeunloadHandler(evt: BeforeUnloadEvent): void {
    evt.returnValue = '編集中の内容は失われます。よろしいですか？';
  }
```

これらをまとめた最終的なファイルは以下のようになります。

```ts:mixins/ConfirmWhenUnload.ts
import Vue from 'vue';
import Component from 'vue-class-component';

Component.registerHooks(['beforeRouteLeave']);

@Component
export default class ConfirmWhenUnload extends Vue {
  enabledWhenUnloadConfirm: boolean = false;

  created() {
    window.addEventListener('beforeunload', this.onBeforeunloadHandler, false);
  }
  beforeDestroy() {
    window.removeEventListener(
      'beforeunload',
      this.onBeforeunloadHandler,
      false
    );
  }
  beforeRouteLeave({ next }): void {
    if (this.enabledWhenUnloadConfirm) {
      next(false);
      return;
    }
    next();
  }
  onBeforeunloadHandler(evt: BeforeUnloadEvent): void {
    evt.returnValue = '編集中の内容は失われます。よろしいですか？';
  }
  enableConfirm(): void {
    this.enabledWhenUnloadConfirm = true;
    window.addEventListener('beforeunload', this.onBeforeunloadHandler, false);
  }
  disableConfirm(): void {
    this.enabledWhenUnloadConfirm = false;
    window.removeEventListener(
      'beforeunload',
      this.onBeforeunloadHandler,
      false
    );
  }
}
```

これを、ダイアログを表示したいページで呼んで適宜

```ts
this.enableConfirm();
this.disableConfirm();
```

を実行することでダイアログの出現を制御できるようになります :tada:
JupyterNotebookで日本語文字化けイライラ...

#環境
Anacondaという開発環境のパッケージをインストールしていることが前提です。
Windows、jupyter notebook環境下での設定方法です。
(最後にはVisual Studio Code上のJupyter Notebookで動作確認しています。)

##文字化け解消のための3つ手順！！
###1:IPAexフォントをダウンロード
以下のサイトをクリックし、IPAexゴシック(Ver.003.01)をダウンロードして下さい。
https://ipafont.ipa.go.jp/node26#jp

![qiita記事_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/71895693-abb3-6938-26bf-f2785023b9b8.jpeg)

ダウンロードしたzipファイルを解凍すると、**ipaexg**というファイルがあります。
![qiita記事_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/01474847-0c11-7441-61a8-c35fced82fc2.jpeg)
この**ipaexg**ファイルを
**C:\Users\[ユーザー名]\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttf**
に**コピー**する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/9a47284a-ae9a-96d4-3401-b91519000792.png)


###2:メモ帳を開いて編集
**C:\Users\[ユーザー名]\Anaconda3\Lib\site-packages\matplotlib\mpl-data**の中にある**matplotlibrcファイル**をダブルクリックして**メモ帳**で開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/7e2486cb-57b9-9a51-7336-358540d09cd9.png)

font.family:sans-serif→**font.family:IPAexGothic**に変更する。
![qiita記事_LI (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/ab3c0e10-850d-359c-80c9-9bb1f04b7a39.jpeg)

変更が完了したら**matplotlibrcファイル**を**上書き保存**して閉じる。

###3:ファイルを削除
**C:\Users\[ユーザー名]\.matplotlib**にある
・**fontList.cache**
・**fontList.py3k**
・**fontList.json**
を削除。

そうすると、以下の状態になります。(**fontList**は無くても大丈夫です。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/c02b91d2-000a-76ee-6d7d-2d6bbfc42d88.png)

**C:\Users\[ユーザー名]\Anaconda3\Lib\site-packages\matplotlib\mpl-data**

の中にある**matplotlibrcファイル**をコピーして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/957ee798-94f2-ffd9-12ed-95e258a010bb.png)

**C:\Users\[ユーザー名]\.matplotlib**の中に貼り付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/00267852-65d9-1322-7651-b63fd0fcb1a9.png)

#最後に確認
以下の**モジュール**を使っています。
import matplotlib.pyplot as plt
import numpy as np
**import matplotlib as mpl**
**mpl.rcParams['font.family']='IPAexGothic'**
%matplotlib inline

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/6c5014d3-c5e0-09de-a2c8-6e565a818c89.png)
グラフタイトル、x軸タイトル、y軸タイトルのそれぞれの名前が文字化けしていないので成功です。
Angular9でOpenLayersを使う

##Angular9 + OpenLayersで地図を表示させる
AngularとOpenLayersを使ってWebアプリケーションを作る機会がありましたので、クイックスタートガイドとして使えるようにまとめてみました。今回はAngularにOpenLayersを導入して地図を表示するところまで紹介します。本記事ではオンラインIDEを使用するため、npm等を使用したパッケージインストールに関しては記述しません。
##使用ライブラリ等
- Angular9: https://angular.io/
- OpenLayers v6.3.1: https://openlayers.org/
- CodeSandbox: Online IDE: https://codesandbox.io/

##Angularとは
Googleと個人や企業のコミュニティによって開発されているTypeScriptベースのオープンソースのフロントエンドWebアプリケーションフレームワークである(https://ja.wikipedia.org/wiki/Angular)
##OpenLayersとは
ブラウザで地図データを表示する、JavaScriptで組まれたオープンソースライブラリである(https://ja.wikipedia.org/wiki/OpenLayers)
##プロジェクトを作成する
1. CodeSandboxでAngularプロジェクトの作成を選択する。
2. 画面左下のadd dependencyをクリックするとポップアップウインドウが表示されるので、検索のテキストボックスにolと入力し、検索結果からOpenLayersをインストールする。![Screen Shot 2020-06-04 at 17.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343061/65be9a83-45e3-f657-0d27-7862600c9a5c.png)
![Screen Shot 2020-06-04 at 17.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343061/0c402463-2b4c-8665-a3fb-e9b5ca5b2199.png)

これでライブラリのインストールは完了です。
ディレクトリ構成（使う部分のみ）は以下のようになっています。
src
├ app
　　├ app.component.ts
　　├ app.component.css
　　├ app.component.html
 　　└ (app.module.ts)

##OpenLayersを使って地図を表示する
OpenLayersの公式サイトのチュートリアルのコードに手を加えて使いました。
https://openlayers.org/en/latest/doc/quickstart.html
Angularではクロスサイトスクリプティング対策として、htmlファイル内でscriptタグの使用をデフォルトで禁止しています。そのため上記のチュートリアルのコードをhtmlファイルに直接コピーペーストして使うことができません。その代わりにタイプスクリプトファイル内で実装して呼び出せるようにしてあげましょう。
####パッケージのインポート
```
//app.component.ts
import { Component, OnInit } from "@angular/core";
import "ol/ol.css"; //地図のスタイル用css
import { Map, View } from "ol";  
import { OSM } from "ol/source"; //Layer source for the OpenStreetMap tile server.
import { fromLonLat } from "ol/proj";  //Transforms a coordinate from longitude/latitude to a different projection.
import { Tile } from "ol/layer";
```

OnInitに関して詳しいことはAngularのライフサイクルについて参照してください。コンポーネントの初期化時に一度のみ呼び出されるメソッドです。

####ngOnInitの実装
```
//app.component.ts

export class AppComponent implements OnInit {
  title = "OpenLayers";
  //東京スカイツリーの経度緯度
  skytree = [139.81083333, 35.71000138];
  
  map:Map;

  ngOnInit() {
    this.map = new Map({
      target: "map", //id="map"を含むhtmlタグをターゲットに指定
      layers: [
        new Tile({
          source: new OSM()
        })
      ],
      view: new View({
        center: fromLonLat(this.skytree),
        zoom: 15
      })
    });
  }
}
```


####htmlファイル
```
<!--app.component.html-->

<div class="navigation">
  <h1>
    {{ title }}
  </h1>
</div>

<!--マップの埋め込み-->
<div id="map" class="map"></div> 
```


####cssファイル
```
.navigation {
  color: white;
  text-align: center;
  line-height: 50px;
  height: 7vh;
  background-color: black;
}

.map {
  width: 100%;
  height: 93vh;
}
```
地図の高さはウインドウの大きさの93%に設定しています。app.component.ts内でol.cssも追加しています。

####地図の表示
CodeSandboxでは右半分のウインドウに自動で実行結果を表示してくれます。下の写真のようになっていれば正常に動作しています。
![Screen Shot 2020-06-04 at 18.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343061/a1df4148-fc78-833e-0187-9bdd0ace1bed.png)

###続きのコンテンツ
地図上でのマーカー表示の仕方: 「[Angular9でOpenLayersを使う(2)](https://qiita.com/ayato077/items/81a3402cba687474a53c)」
Docker(for mac)のインストール

###Dockerとは
アプリケーションを実際に動かす際に、本番環境とローカル環境では大きく動作が異なる場合がある。
環境設定の差で本番環境で動かなくなるケースも多々ある。
なので開発するさいにはなるべく本番環境に近い状態で行うのが好ましい。
その本番環境に近い状態でアプリケーションを実行するためにDockerを使用する。
Dockerは起動スピードに優れている他、AWSやGoogle Cloud Platformなどのクラウドサービスでコンテナを実行できるという利点がある。



###Dockerのインストール
まずは[Docker](https://www.docker.com/)のホームページを開く
次に上部タブのProductsをクリック
<img width="1434" alt="スクリーンショット 2020-06-04 23.20.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/34966ec2-9913-b189-99df-5522ef491ba4.png">

現在はそのProducts画面の最下部にあるGet Startedをクリックするとインストールページに遷移します。
<img width="1438" alt="スクリーンショット 2020-06-04 23.22.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/4ffc7c68-ce3c-710c-982c-2344293d2389.png">

そちらに各種ダウンロードボタンがあるので、Macの人はMac用のダウンロードボタンから取得する
<img width="1143" alt="スクリーンショット 2020-06-04 23.23.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/6963fba2-2943-1b19-66a3-d34216a1e66b.png">

インストールしたらアプリケーションに入れましょう
<img width="719" alt="スクリーンショット 2020-06-04 23.30.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/9bb7bf77-d4a9-e28a-02f4-375ef2adab1d.png">

アプリケーションを開くと以下のような画面になる
<img width="1029" alt="スクリーンショット 2020-06-04 23.53.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/b3927d25-569c-3c02-1c38-0dd39b0e7806.png">

またターミナルで以下のコマンドを打つとDockerのバージョン表示がでるので、これが表示されてれば問題ない。

```
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false

```

Dockerを起動してみる

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

上記でHello from Docker!と表示されている。
これでDockerが起動していることがわかる。
rails tutorialでmysqlを使用したら出たエラー

cloud9でmysqlを使用したところ以下のエラーが出た。
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

下記コマンドを実行したところ解決した。
`$ sudo /etc/init.d/mysqld start`

ちなみに止めるコマンドは
`$ sudo /etc/init.d/mysqld stop`

参考URL
https://qiita.com/kanohisa/items/564035efd74d9c75bdcb
https://style.potepan.com/articles/18698.html
ブラウザに好きな検索エンジンを追加する

忘備録です。正確な情報が知りたい方は回れ右。

Firefoxの検索窓に好きなサーチエンジンを登録する方法のメモ。
「w <単語>」でwikipedia検索できたりと、便利ですよね。

ググったけどあまり記事が見当たらない。皆使わないのかな。
もっといい方法あれば教えて下さい。

# 環境
OS: Windows10 1909
Browser: Firefox 77.0 64bit
WSL: Ubuntu 18.04.2 LTS

# OpenSearchプラグインの作成
プラグインのXMLファイルを生成してくれるサイトを利用します。

Ready2Search
http://ready.to/search/make/
http://ready.to/search/jp/

アイコンはファビコンを落としてきて、GIMP等でpngに変換すると良いです。

- F12でブラウザの開発ツールを呼び出して`.ico`を検索、直接アクセスして保存
- GIMPのメニューからエクスポートを選択。`.png`拡張子で保存する


# ブラウザに登録する
直接Firefoxに仕込んだりするのはややこしいっぽいので、Webページとして公開、
アクセスして登録します。

## Webサーバーの準備
使えるサーバーが無かったので建てます。

1. WSLを起動
2. apache2をインストール
     
    ```bash
    # apt update -y
    # apt install apache2
    ```

3. 初期設定 - ホスト名の設定(fqdn.conf)

    1. fqdn.confを作成

        ```bash
        # echo"ServerName <FQDN>" > /etc/apache2/conf-available/fqdn.conf
        ```
    
    2. fqdn.confの有効化
    
        ```bash
        # a2enconf fqdn
        ```

1. Apache再起動
    WSLはsystemdではなくUpstart？

    ```bash
    # service apache2 restart
    ```

## OpenSearchプラグインを配置
ページにOpenSearchプラグインを埋め込んでおくと、ブラウザに登録ボタンが現れるようです。

1. 参照用ページの作成

    `<HEAD>`セクションに以下のタグを挿入します。

    ```html
<link rel="search" type="application/opensearchdescription+xml" title="openSearch" href="＜プラグインのパス＞">
    ```


    適当なところにディレクトリを作って配置します。
    自分の場合は`/var/www/html/openSearch/index.html`
    
    中身はこんな感じ
    
    ```html
<html>
<heard>
        <title>openSearch</title>
        <link rel="search" type="application/opensearchdescription+xml" title="searchTitle" href="./＜プラグインファイル＞.xml">
</heard>
<body>
        <p>plugin download page.</p>
</body>
</html>
    ```

2. プラグインファイルの配置

    同じディレクトリにOpenSearchプラグインのxmlファイルを持ってくる。


## ブラウザへ登録

ブラウザで開く。
`http://localhost/openSearch/`

すると`検索エンジンを追加`という項目が表示される。クリックして登録完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233978/dcff94f1-da13-737a-af55-779a0da000e4.png)


古いfirefoxでは虫眼鏡アイコンが表示されたらしいが、これは全く目立たない・・・

# 参考
apache設定：http://www.yamamo10.jp/yamamoto/comp/home_server/WEB_server3/apache/index.php
OpenSearch登録：https://developer.mozilla.org/ja/docs/Creating_OpenSearch_plugins_for_Firefox
Gatsby + Netlify + NetlifyCMS で運用しているブログのRepositoryを公開しました

タイトルの通りなのですが、[Gatsby + Netlify + NetlifyCMSで運用しているブログ](https://shinya-it.com/?link=qiita)のRepositoryを公開しました。

みんな見てね😀

[Repositoryはこちら](https://github.com/shinyasato0728/gatsby-blog-shinya)
webpをjpgかpngに変換するブックマークレット

あったら良いなと思って勉強がてら作ってみました。Chromeで動きました。
新しいタブで画像を開いた時に使えます。末尾を弄ると保存する時の名前とか形式とかを変えられるようにしてみました。

```javascript
javascript:(({quality, fileName, format}) => {

  let img = document.getElementsByTagName('img')[0];
  let make = (t, p) => Object.assign(document.createElement(t), p);
  let cv = make('canvas', { width: img.naturalWidth, height: img.naturalHeight });
  cv.getContext('2d').drawImage(img, 0, 0);
  cv.toBlob(b => make('a', { href: URL.createObjectURL(b), download: fileName }).click(), 'image/' + format, quality - 0);

})({quality:0.92, fileName:'tempoName', format:{0:'png', 1:'jpeg', 2:'webp'}[1]});
```
ランダムで画像が切り替わるオシャレなメインビジュアル風見出しを作成する

## はじめに
2020年もまだまだ流行っていますね「タイポグラフィ」
メインビジュアルの役割にも使えますし、何よりおしゃれですし…
そんなわけでなんちゃってタイポグラフィも詰め込んだ__「メインビジュアル風見出し」__の実装方法をお教えしたいと思います！

※ あくまで、自分のサイトに組み込む際に使用したアイデアです。
よかったらみなさんも使用してただけたらと思います😷
https://toya-onodera.github.io/blog/ （ここで使用してます）

## ランダムな画像を提供してくれる Unsplash Source
Unsplash Source とは、無料画像素材サイト Unsplash さんが提供している画像 API です。
オシャレな感じの画像を提供してくれます
<img width="1748" alt="Unsplash Source のサイト画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276546/f4954785-e273-fc22-0620-78871fcc8a72.png">
https://source.unsplash.com/

## 画像の呼び出し方
``` html
<img src="https://source.unsplash.com/random" alt="Unsplash Source のサイトから持ってきた画像">
```
これだけでランダムないい感じの画像を表示できます。
めっちゃ楽でいいですね！！！

## オシャレなメインビジュアル風見出しを作成する
それでは本題に移って、「オシャレなメインビジュアル風見出し」を作成していきましょう！

実際に例を挙げながら説明していきたいと思います。

作成イメージとしては、
1. 画像レイヤーを後ろにして見出し文字を手前のレイヤーとして表示する
2. 画像は若干ぼかして表示する
3. その画像の上に半透明の黒レイヤーをかけて被せる
となります。

コードイメージは以下の通りです。

``` html:HTML
<div class="typo-heading">
    <div class="main-visual">
        <!-- この要素に CSS で画像が入るイメージ -->
    </div>

    <h3>
        <!-- 見出しとして入れたい文字を入れる -->
    </h3>
</div>
```

``` css:CSS
.typo-heading {
    position: relative; /* 見出しの文字を絶対配置で指定するので使用する */
    height: 30vh; /* 30vh くらいがいい感じのサイズだったので採用 */
    width: 100%;
    padding: 16px;
    overflow: hidden; /* 画像をぼかす際に縁がぼやけるのでその対策を行う */
}

.main-visual {
    /* 画像のぼかし対策を行う */
    position: absolute;
    width: calc(100% + 20px);
    height: calc(100% + 20px);
    top: -10px;
    left: -10px;
    filter: blur(5px);

    /* 背景画像の指定を行う */
    background-image: url("https://source.unsplash.com/random");
    background-size: cover;
    background-position: center;
}

/* 半透明の黒レイヤーをかけて被せる
   こうするとどの画像が表示されても文字が読みやすくなる */
.main-visual::before {
    position: absolute;
    display: block;
    content: "";
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    background-color: rgba(0, 0, 0, 0.2);
}

/* 見出し文字
   今回は右下に配置したらいい感じになったので採用 */
.typo-heading > h3 {
    position: absolute;
    right: 16px;
    bottom: 16px;
    z-index: 5;
    color: #FAFAFA;

    /* Google Fonts の「さわらび明朝」を採用
       個人的にはもっと太い明朝体フォントを使用したかった… */
    font-family: "Sawarabi Mincho", serif;
}
```

これだけで「オシャレなメインビジュアル風見出し」を作成することができます。

## 動作例
上でも記載しましたが、私のサイトにてこの見出しを実装しているので、もしよかったらアクセスして確認をどうぞ！
https://toya-onodera.github.io/blog/

下に実際の動作例を何枚か貼っておきます👀
![スクリーンショット 2020-06-05 0.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276546/0a8843e4-a8ea-12a3-ff3f-32ac2ab7be6a.png)
![スクリーンショット 2020-06-05 0.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276546/c675a747-23e7-e534-5d18-bf4a01574f67.png)
![スクリーンショット 2020-06-05 0.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276546/ddffaed5-a8ee-a096-7dcf-c691a22c5a16.png)

## まとめ
たまたま見つけたサービスでしたが、オシャレな画像も多いしいい感じの見出しを実装できて非常に満足しています。
Unsplash Source ではランダムの中でも __ユーザーを指定して表示__ や __キーワードを指定して表示__ などの画像絞り込み機能も実装されているのでいろいろ試してみるのも良いかもしれません！
また良いサービスを見つけて自分のサイトにどんどん組み込んでいきたいなあ💪
AWSソリューションアーキテクトアソシエイト の復習1

##AWS認定資格を利用してAWSを理解してみる
今、AWSもちょこちょこと勉強中なのですが、
復習の意味も込めて、
ルーティン的に小テスト形式で
演習問題を使用した解説を纏めてみます。
私はこちらの書籍を使用して絶賛勉強中です。

>https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07M7S9GDL

####グローバルサービスに該当するものは次のうちどれか(2つ選択)。
- Amazon CloudFront
- Amazon Route 53
- Amazon RDS
- Amazon EBS

**AWSのサービスの範囲は３つに分類される**

・グローバルサービス
リージョンに依存しない共通のサービスを指す。
**AWS Identity and Access Management(IAM)**
**CloudFront**
**Route 53**
のこれらが該当。

・リージョンサービス
特定のリージョン内でのみ利用するサービスを指す。
**Amazon Virtual Private Cloud(VPC)**
**Amazon DymanoDB(DynamoDB)**
**AWS Lambda(Lambda)**
のこれらが該当。

・アベイラビリティーゾーンサービス
特定のAZ内で利用するサービスを指す。
**VPCのサブネット**
**EC2**
**Amazon RDS**
のこれらが該当。

ということで、この問題では
**Amazon CloudFront**
**Amazon Route 53**
の２つが正解となります。
シンテレワークシステムをmacbookで動かした


※本記事は2020年6月に書いたものです。
#はじめに

最近、テレワークやリモートワークといった働き方が広がりつつあります。
感染を拡大させない手段としてとてもいい流れではないでしょうか

本記事ではmacbookでのシンテレワークシステム利用方法を書いていきます
お金はかかりますが、感染拡大の防止、リスクを軽減できると思えば安いもんです
macしか持っておらず、シンテレワークシステムを諦めたという方は参考にしてください


#背景

会社でついにシンテレワークシステムの利用が認められる(条件・期間あり)ことがありました！

早速使ってみよう！！！！....しかしここで問題発生です。
>※ 誠に申し訳ございませんが、現在のところ、macOS には非対応です。

(引用:[NTT 東日本 - IPA 「シン・テレワークシステム」  入門 - 今すぐ使ってみよう](https://telework.cyber.ipa.go.jp/manual/)より）

なるほど...
私はmacbookしか所持しておりません
...ですがここで諦めません

ここをよく読むと

>対応 OS
Windows XP, Vista, 7, 8, 8.1, 10
Windows Server 2003, 2008, 2012, 2016, 2019 (R2 を含む)

若手ならではの柔軟(安直)な発想がここで浮かび上がりました
「macbookにWindows10をインストールすれば良いのでは」

その安直な発想は見事的中しました
以下その接続方法です


#方法
**1.bootcampを使用する方法**
**2.parallels displayを使用する方法**

ここでは「1.bootcampを使用する方法」を書いていきます（2は後々追記するかもしれません）

##手順

1.bootcampでwindowsイメージを作成
2.サーバ側にシンテレワークシステムをインストール・設定
3.クライアント側にシンテレワークシステムをインストール・接続

とても簡単でした

###1.bootcampでwindowsイメージを作成
私は外付けHDDにwindowsイメージを作成しました
インストールした手順などは[前回の記事](https://qiita.com/Kaka24yooooo/items/064c20db0d1852de0171)を参考にしてください

インストールが完了したらwindowsを立ち上げておきます

###2.サーバ側にシンテレワークシステムをインストール・設定
次にオフィスのPCに「シン・テレワークシステム」 をインストールします
ダウンロードページは[こちら](https://telework.cyber.ipa.go.jp/download/)

ダウンロード後、その中の「ThinClient.exe」をクリックし実行します

あとはこちらの手順（[NTT 東日本 - IPA 「シン・テレワークシステム」  入門 - 今すぐ使ってみよう] (https://telework.cyber.ipa.go.jp/manual/)）や
会社のマニュアルに沿って環境設定を行ってください

###3.クライアント側にシンテレワークシステムをインストール・接続
続いて１で作成したPCに「シン・テレワークシステム」 をインストールします
[こちら](https://telework.cyber.ipa.go.jp/download/)のダウンロードページにある<img width="1145" alt="スクリーンショット 2020-06-04 23.57.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647693/27b28c33-7ecd-a3a9-d13c-223d90ee2cf8.png">
こちらをインストールします

インストールしたzipファイルを展開すると
いくつかファイルがあると思います

これらは同じフォルダに置いておいてください
インストーラーのみ違う場所に置くと、起動しない可能性があります

インストーラーを起動すると↓の画面が表示されるので、「シン・テレワークシステム クライアント」を選択し、「次へ」
<img width="544" alt="スクリーンショット 2020-06-05 0.09.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647693/550215e8-415c-cd05-fff5-1e4d45416843.png">

するとデスクトップに「シン・テレワーク　クライアント」というショートカットが作成されので
クリックします

<img width="531" alt="スクリーンショット 2020-06-05 0.12.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647693/01535ae8-429f-1358-b496-b5a92fe9c4d8.png">
↑のような画面が表示されれば成功です
あとは2.で設定したIDを入力し、パスワード等を表示に沿って入力すればリモートで接続できます

###おまけ：問題点と解決
リモートで接続後、モニターをつないでみたのですが複製しかされませんでした
ディスプレイの詳細設定を見ると「このディスプレイ設定はリモートセッションから変更できません。」
との表示が...

シンテレワークシステムのBeta3で、「仮想マルチディスプレイ機能」が追加されたはずなので
オフィスのPCにモニターが接続されていなくてもできるはず...

<img width="541" alt="スクリーンショット 2020-06-05 0.28.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647693/58aabde7-d8fa-f108-e4ef-40965587944f.png">
（引用：[NTT 東日本 - IPA 「シン・テレワークシステム」 - 仮想マルチディスプレイ機能](https://telework.cyber.ipa.go.jp/multi_display/)より）

こちらの問題にあたった方はリモートで接続する前(Windows起動後)にモニターを一度接続してください
これでオフィスのPCにモニターが接続されていなくても複数のディスプレイを使用することができます

#おわりに
macにWindowsをのせることでシンテレワークシステムを利用することができました
費用としては20,000円ほどかかりました

この記事を参考にテレワークを利用する人が増えれば幸いです
Wordpressのパーマリンクからindex.phpを消す方法

# はじめに
wordpressを用いてブログを作成した時にパーマリンクのカスタムで「index.php」を消したかったのですが、書かないと404エラーが出てしばらく悩んでしまいました。
同じところで詰まった人の参考になれば幸いです。

# 解決方法
いろいろ試しましたが解決方法は単純です。

1. Apacheの設定ファイルのhttpd.conf内で.htaccessファイルがあるディレクトリの所のAllowOverrideをNoneからAllに変更する。
2. httpdをrestartする。

以上です。

# 簡単な解説
wordpressではパーマリンクを変更すると.htaccessファイルにデフォルトでリダイレクトの処理を記述してくれます。
しかし今回は、.htaccessファイルを利用する設定になっていなかったので404エラーが出てしまいました。
そこで、.htaccessファイルを利用する設定にしてあげることで問題を解決できます。
Goのsortパッケージ

# sortパッケージ
https://golang.org/pkg/sort/
### 基本的なソート

#### Intのスライスを昇順でソートする

```go
items := []int{7, 2, 3, 1, 4, 5, 6}
sort.Ints(items)
fmt.Println(items)

[1 2 3 4 5 6 7]
```

#### Intのスライスを降順でソートする

```go
items := []int{7, 2, 3, 1, 4, 5, 6}
sort.Sort(sort.Reverse(sort.IntSlice(items)))
fmt.Println(items)

[7 6 5 4 3 2 1]
```

#### Stringのスライスを昇順でソートする

```go
items := []string{"c", "a", "b", "e", "d"}
sort.Strings(items)
fmt.Println(items)

[a b c d e]
```

#### Stringのスライスを降順でソートする

```go
items := []string{"c", "a", "b", "e", "d"}
sort.Sort(sort.Reverse(sort.StringSlice(items)))
fmt.Println(items)

[e d c b a]
```

#### structのソート

- スコアの昇順でソート

```go
score := []struct {
	PlayerId int
	Score    int
}{
	{1, 50},
	{2, 20},
	{3, 100},
}
sort.Slice(score, func(i, j int) bool { return score[i].Score < score[j].Score })
fmt.Println(score)

[{2 20} {1 50} {3 100}]
```
【Laravel】laravel-excelでエクセルをエクスポートする際に外部のURLから画像を貼り付けて出力する方法

公式：https://laravel-excel.com/

laravelで簡単にExcelをいじれるでおなじみlaravel-excelを使って
excelをエクスポートする際、画像を出力したかったが簡単にはいかなかった。

# 環境
laravel5.8
laravel-excel3.1



# 最初にやったこと

公式のドキュメントにdrawingsという項目があるので確認
https://docs.laravel-excel.com/3.1/exports/drawings.html

```php:
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\WithDrawings;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

class InvoicesExport implements WithDrawings
{
    public function drawings()
    {
        $drawing = new Drawing();
        $drawing->setName('Logo');
        $drawing->setDescription('This is my logo');
        $drawing->setPath(public_path('/img/logo.jpg'));
        $drawing->setHeight(90);
        $drawing->setCoordinates('B3');

        return $drawing;
    }
}

```

`setPath`
というメソットがあるのでそこに画像のパスを入れればいいぽい
`$drawing->setPath("https://hogehoge.jp/img/test.jpg");`

でもこれだとうまく出力されなかった。

# 画像を取得しているコードを確認

追ってみるとDrawing.phpに該当の場所があった。
`vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php`


```php:Drawing.php
/**
 * Set Path.
 *
 * @param string $pValue File path
 * @param bool $pVerifyFile Verify file
 *
 * @throws PhpSpreadsheetException
 *
 * @return $this
 */
public function setPath($pValue, $pVerifyFile = true)
{
    if ($pVerifyFile) {
        if (file_exists($pValue)) {
            $this->path = $pValue;

            if ($this->width == 0 && $this->height == 0) {
                // Get width/height
                [$this->width, $this->height] = getimagesize($pValue);
            }
        } else {
            throw new PhpSpreadsheetException("File $pValue not found!");
        }
    } else {
        $this->path = $pValue;
    }

    return $this;
}
```

`$pValue`に画像のパスが入ってきててそれを`file_exists` でファイル確認してる。


これだと内部のファイルしか `true` が返ってこない。。

# 結果どうしたか

テンポラリディレクトリに画像を置いて出力した

```php:
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\WithDrawings;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

class InvoicesExport implements WithDrawings
{
    public function drawings()
    {
        // 出力したい外部の画像
        $image_url = "https://hogehoge.jp/img/test.jpg";
        // 一時保存するファイルを指定
        $file_name = sys_get_temp_dir() ."/test.jpg";
        // ファイルを書き込みモードで開く
        $out_fp = fopen($file_name, "w");
        // 対象の画像を読み込みモードで開く
        $fp = fopen($image_url, "r");
        // 書き込み
        while ($str = fgets($fp)) fputs($out_fp, $str);
        fclose($out_fp);
        fclose($fp);

        $drawing = new Drawing();
        $drawing->setName('Logo');
        $drawing->setDescription('This is my logo');
        $drawing->setPath($file_name); // 一時保存したパスを指定
        $drawing->setHeight(90);
        $drawing->setCoordinates('B3');

        return $drawing;
    }
}
```

これでいけた
pythonでソートアルゴリズム -シェルソート

# はじめに
プログラミング初心者がソートアルゴリズムを自分なりに理解し、コーディングしてみたものの忘備録になります。
間違いもあるかもしれませんがご了承ください＆ご指摘いただけると助かります…。
ここでは、**シェルソート**を扱います。
参考にした本と記事はこちら
→https://www.codereading.com/algo_and_ds/algo/
→https://book.impress.co.jp/books/1118101057

# シェルソート
シェルソートは[挿入ソート](https://qiita.com/owo_comm/items/25193d9b557a4e03a5ba)をさらに効率化したものです。
一定間隔の要素ごとにソートを行い、間隔を狭めていくことで全体をソートしていきます。
あらかじめ配列の頭のほうに小さい数字が集まるので、挿入できた時点で終了する挿入ソートによって効率化が図れます。

## 手順
下手に私の書いた手順を見るより、この動画を見るほうが手っ取り早いです(クリックで見れます)。
[![シェルソート](http://img.youtube.com/vi/CmPA7zE8mx0/0.jpg)](https://youtu.be/CmPA7zE8mx0)

この動画シリーズ、他のソートのものも存在するのですが、踊ってるを見るのが楽しくて好きです。

## 比較回数
### 最大値
間隔の取り方によって変わります(たぶん)。
もし間隔を3で一度挿入ソートし、その後間隔1で挿入ソートを行う場合、2回目のソートは3個先は小さい値が入っていることがわかっており、最悪2回の比較で済むはずなので、最悪の値は

```math
\frac{1}{2} * \frac{1}{3}n(\frac{1}{3}n-1) * 3 + 2(n-2) + 1
```

・・・？
きちんと考えられていないので違う気がします。またほかの考えが浮かんだら追記します…。

## プログラム
```python:shell_sort.py
a = [4,6,1,2,3,8,5]

gap = len(a) // 2

while gap > 0:
    for i in range(gap, len(a)):
        j = i
        # gapの間隔で挿入ソートする
        # gap間隔で比べるし、gap下の値が0以上じゃないといけない
        while j-gap >= 0 and a[j] < a[j-gap]:
            a[j], a[j-gap] = a[j-gap], a[j]
            j -= gap

    # 一通りソートしたらgapを半分にしてもう一度ソートする
    gap //= 2

print(a)
```

## 計算量
forとwhileで2重になっていますが、配列の長さ分回るわけではないので、計算量が少し変わってきます。
計算量も間隔の取り方によって変わりますが、平均O(n^1.25)らしいです(受け売り)。

#おわりに
シェルソートについてまとめました。
挿入ソートを最初に勘違いしていたため、シェルソートで？？？になりましたが、動画をみたらなるほどねとなりました。
やはり動いているものはわかりやすいですね。
Numpyで特定のindex以外を抽出する方法

あるarrayから特定のインデックス以外を抽出する方法です。

```Python
# 0~99の数字からランダムに10個取ってくる
arr = np.random.randint(0, 100, 10)
# > array([74, 29,  6, 79, 76, 13,  3, 56, 25, 50])

# 奇数番目の数値をarrから除外したい
odd = [1,3,5,7,9]

# 方法① リスト内包表記
index = [i for i in np.arange(len(arr)) if i not in odd]
arr_even = arr[index]

# 方法② True/Falseでマスキングする
index = np.ones(len(arr), dtype=bool)
index[odd] = False
arr_even = arr[index]

# 方法③ np.delete
arr_even = np.delete(arr, odd)

```

方法③が一番スッキリしていますが、~~どれも時間的にはあまり変わらないのでお好きな方法でどうぞ。~~
そんなわけありませんでした！

@nkay さんが検証してくれました。（コメント参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/988267ac-d7fd-e9f7-e3cf-f15e0ce50c3e.png)

方法②と方法③はあまり変わらないですが、方法①はarrayのサイズが大きくなると遅くなってしまいますね。

コードも置いておきます。
https://github.com/si1242/machine_leraning_experiments/blob/master/20200605_comparison_qiita.ipynb
Ubuntuの「VPNとremminaの接続設定を施した状態」のLiveUSBの作成の要所(暫定版)

#仕様
- ユーザ"ubuntu"を使用
- VPN方式はOpenVPNを想定.
    - OpenVPN鯖に自動接続
    - 今回、認証方法はユーザー名+パスワードでやる(ルータ内蔵VPN機能を使用)
        - この時ユーザー名・パスワードの手入力をしないで済ます
- remminaの接続時に接続先アドレス・ユーザー名・パスワードを聞かれないようにする

#はじめに
- filesystem.squashfsを適当な場所に展開する。以下、ROOTFS/ とする
- とりあえずsquashfsの展開・編集・リマスタリングのやり方はここでは触れない
    - 今回はDistroshare Ubuntu Imagerのスクリプトを改造し、「各々のユーザーで異なる部分」を別ディレクトリからROOTFS/にコピー、ISOイメージ化が終わったらROOTFS/内から削除するように変更した。
    - 1からスクリプトを書き直して
        - ROOTFS/の作成
        - ROOTFS/内に個人設定をコピーしsquashfsに圧縮してISO化→個人設定削除(ここだけがユーザーの数だけスクリプトが必要)
        - クリーンアップ
    -位に分割した方が良い気がする。

##NetworkManagerの設定
- 証明書ファイル(~/.cert/nm-openvpn/*.pem)を適当な場所にコピーする。筆者はROOTFS/etc/NetworkManager/cert/nm-openvpn/以下にした
- NetworkManagerの接続設定ファイルをコピーし、編集。
 
>$sudo cp /etc/NetworkManager/system-connections/*VPNの接続設定ファイル* \
ROOTFS/etc/NetworkManager/system-connections/*VPNの接続設定ファイル*
>$sudo nano  ROOTFS/etc/NetworkManager/system-connections/*VPNの接続設定ファイル*

以下の行を追加/編集する
>[vpn] セクション
ca=*新しいCA証明書* #/etc/NetworkManager/cert/nm-openvpn/*新しいca.pem* とか
ta=*新しい静的鍵* #/etc/NetworkManager/cert/nm-openvpn/*新しいtls-auth.pem* とか
username=*vpn接続で使うユーザー名*

>[vpn-secrets] セクション
password=*vpn接続のパスワード*

####注意点
- VPNのユーザー名とパスワードが平文で保存されてしまう.

###VPNへの自動接続
- [connection]セクションの`autoconnect`は作動しないので、デスクトップ環境へのログイン時に何らかの方法で　`nmcli connection up <VPN_UUID>` が実行されるようにする。
    - ROOTFS/etc/skel/.config/autostart/ 以下に適当な.desktopファイルを作成する

##remminaの設定(横着版)
- とりあえず作業環境上でユーザ"ubuntu"を作成する
- ユーザ'ubuntu"上でremminaの接続設定を行う
- /home/ubuntu/.local/share/keyringsと、/home/ubuntu/.local/share/remminaを ROOTFS/etc/skel/.local/share/以下にコピーする
    - keyrings周り、もっと良いやり方が有れば知りたい
【Rails】deviseのレイアウト変更が反映されない場合

# deviseのレイアウトが変更されない場合に確認すること

### 目次
1. レイアウトを変更したのに反映されていない
2. ```config/initializers/devise.rb``` を修正する

## 1. レイアウトを変更したのに反映されていない
認証機能を実装するため、```gem 'devise'``` をインストールしました。
まずは、ログイン画面のレイアウトとデザインの変更を完了させ、ブラウザで確認をしようとログイン画面を表示!... 何も変わっていない...
サーバーを再起動！やっぱり変わっていいない...
そもそも変更するファイルを間違えいたのかな？（そんなに天然ではないww どうしよう？）
deviseの初期設定が記述されている```config/initializers/devise.rb``` を確認してみよう！

## 2. ```config/initializers/devise.rb``` を修正する
見つけました！
以下の記述に注目して下さい。（デフォルトではコメントアウトされています）

```config/initializers/devise.rb
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = false  
``` 
falseからtrueに変更してみましょう！

```config/initializers/devise.rb
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = true
``` 
※ サーバを再起動してブラウザで確認

無事レイアウトが変更されていました。
以上で、deviseのレイアウト変更が反映されない場合の対応となります。
pythonで特定のフォルダ内のExcel一覧を再帰的に取得してExcelに書き出す。


```python

# import libraries 
import os
import pandas as pd
from glob import glob

# Configure Folder path 
mybooks = glob(r"FOLDERPATH\**\*.xls*",recursive=True)

df = []
for mybook in mybooks:
    df.append([mybook,os.path.basename(mybook)])

# Exchange ListObject to Dataframe
df = pd.DataFrame(df)

# Dump to ExcelFile
outputFilename = "filename.xlsx"
outputFolder = r"filepath"
outputFileFullpath = outputFolder  + "\\" + outputFilename
df.to_excel(outputFileFullpath,'List')

print(
    "ファイルを出力が終了しました。 \n\n\n" +
    "ファイル出力場所：　" + outputFolder + "\n" +
    "ファイル名：　" + outputFilename    
)
```
AWS LightSailにサーバー環境構築してVSCodeで開発

# TL;DR
AWS Lightsailインスタンスの立ち上げ～VSCodeでssh接続してみるだけ。画像多めでお送りします。
環境構築系は沼りやすいので、似たような記事は他にもありますが自分用に記録。
なお、Lightsailに限らずEC2などでも（接続の部分に関しては）同様の手順になります。[こちら](https://qiita.com/dairappa/items/8347fe7faf89b6ba364e)や[こちら](https://qiita.com/hystking/items/c1b23ff0c7cc727e7385)も参照。

# 環境
Windows10

# ブラウザでの作業

## Lightsailを開く
アカウントは作成してある前提です。まずログインして、赤丸クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/aa93509a-89f4-d432-283e-291919359fbe.png)


## ガイドに従ってインスタンスを作成する
次に、LightSailのページでインスタンスを作成をクリック（初めての場合は真ん中あたりに大きく出るはず。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/af4fe1ef-c550-1cee-946a-b9a1059bbbef.png)

あとはガイドに従いながらポチポチと作成しましょう。今回はOSにLinux, 環境にNode.jsを選びました。ここはお好みで。
※LightSailは最小プランなら3.5USDからなのでさほど問題は起きないでしょうが、料金はしっかり見ましょう。初月無料枠があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/bfdcc081-2b3d-fcff-ab15-4dadb0bed2fb.png)

今回はあくまで玩具なので、最小プランを選択です。
これでインスタンスができました。

## 秘密鍵DL

作成したインスタンスの名前をクリックして、さらに赤丸をクリック。
このとき、「パブリックIP」と「ユーザー名」を控えておいてください。SSH接続する際に必要になります。
※補足：わざわざ隠しましたが、ユーザー名は基本`bitnami`ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/09e55e12-de81-0489-b5bc-1af18b998f16.png)

さらに移動先で赤丸クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/55edf05e-3df7-d2c5-922e-8d1795c9ac88.png)

ダウンロードされたファイル(LightsailDefaultKey-ap-northeast-1.pem)は後で必要になります。
`C:\Users\ユーザ名\.ssh\`配下あたりに置いておきましょう。

ここまででブラウザ側での作業は完了です。お疲れさまでした。

# VSCodeでの作業

## Remote - SSHのインストール

拡張機能アイコンをクリックして、検索欄に「ssh」と入力。おそらく一番上に出てくる下記の拡張機能をインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/0c254301-d1d5-420d-a068-7e08dcd00d65.png)

## ssh設定ファイルの記述

インストールできたら、VSCode左下に出てくる「><」みたいなかわいいアイコンをクリック。すると、こんな画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/6e256aab-5272-269c-9d81-6d7442e7b7ab.png)

`Remote-SSh:Open Configuration File...`をクリックして、設定ファイルを選択しましょう。
Windowsの場合は、`C:\Users\ユーザ名\.ssh\config`とかになります。ない場合はファイルを作成しましょう。

作成したファイルに、下記を記入。ここでブラウザ側で控えた「パブリックIP」「ユーザー名」「秘密鍵ファイル」を使用します。

```config
Host lightsail1(ここは自由にわかりやすい名前で)
    HostName パブリックIP
    User bitnami
    IdentityFile C:\Users\ユーザー名\.ssh\LightsailDefaultKey-ap-northeast-1.pem（先ほどダウンロードした秘密鍵のパス）
```

これで設定は完了です。

## 接続

ファイルを保存したら、もう一度「><」をクリック。今度は`Remote-SSh:Connect To Host...`をクリックします。
先ほどHostで指定した名前が選択肢に出るはず。これをクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602411/d2bdced1-e9da-f726-97d7-85f2b5f3711f.png)

すると、別のウィンドウが立ち上がります。うまくいけばこれで接続作業は完了です。
後はいつも通り、ターミナルからコマンドをたたくなり、ディレクトリを作成して「フォルダを開く」から作業フォルダを開いたりしてください。お疲れ様でした。