OmniAICreator/Qiita-1.07M huggingface dataset:
前はできたのに...EC2へのSSH接続ができない

プログラミング初心者です。
macのターミナルから、前回はssh接続できたのに、何故か全く同じコマンドを打っても接続できないという現象を解決したので共有します。

# いざ、EC2へSSH接続！
```
$ ssh -i [SSHキーのパス/SSHキーのファイル名].pem ec2-user@[EC2インスタンスのパブリックIP（例10.20.30.40）]
```
を入力しenter。しかし、ログインできず、しばらくしてタイムアウト。前回と全く同じコマンドを入力しているのに、何故だ？

# EC2インスタンスを確認してみる
AWSのコンソール画面へログインして、EC2のインスタンスを確認してみる（下図）

![スクリーンショット 2020-02-29 16.07.26 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/14c96a66-b2f5-bc33-6191-7c8f72342b2b.png)


# 確認事項１　EC2インスタンスの状態
もし、インスタンスの状態がrunningになっていなければ、停止になっていたら、「アクション」→「インスタンスの状態」→「起動」をクリックして起動するまで待って、再度SSH接続を試してみましょう。

# 確認事項2　パブリックIP
SSH接続する時の[パブリックIP]が合っているか確認しましょう。
Elastic IPで関連付けしていない場合、再起動するたびにパブリックIPが変わるので注意です。

# 確認事項3　セキュリティグループのインバウンド設定
ローカルPCのグローバルIPアドレスが変わった場合は、セキュリティグループのインバウンド設定を変更する必要があります。
![スクリーンショット 2020-02-29 16.43.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/5ae25935-dff7-d453-1457-8cdff232b5c4.png)

EC2のインスタンスに設定しているセキュリティグループのページへ飛んで、インバウドのSSHのソースのIPアドレスを確認してみましょう。
ちなみに、ローカルPCの現在のグローバルIPは、ターミナルで、

```
$ curl ifconfig.io
```
と入力することで確認できます。
間違えていれば、編集を押して、インバウンドのルール編集画面でSSHのソースをマイIPにして、保存します。
![スクリーンショット 2020-02-29 16.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/51299fa2-34a1-a7c9-0c56-a834540a5e79.png)

再度、ローカルのターミナルからSSH接続してみましょう。
jQuery メモ

*※ jQueryについて勉強したことをまとめたノートみたいなものです😎*
###HTMLにjQueryを読み込ませる。
    //<body>の自分で作成したjsファイルよりも前にjQueryのjsファイルの読み込みを指定する。
   
     <body>
        <script src="jquery-3.4.1.min.js"></script>
        <script scr="ファイル名.js"></script>
    </body>

###基本的な書き方
全部書いたコード↓

    $(document).ready(function(){
        // ここに実行させたい処理を記述していく。
    });

省略可能なコードを削ったもの↓  こちらでOK👌
    
    $(funcution(){
         // ここに実行させたい処理を記述していく。
    });

###セレクタとメソッド
jQueryの基本の構文は「**セレクタ**」「**メソッド**」で成り立っている。

    $(funcution(){
         $(.text).css("color","#ff7c89");
    });

- **セレクタ** = **メソッドを実行する要素** 要素を取得する際「**$()**」で取得。
複数の要素を指定したい場合は「,(カンマ)」で区切る。
- **メソッド** = **処理内容** 「**.css()**」はjQueryオブジェクトのメソッド。
- jQueryのセレクタ指定に使用できる記号

|記号|例|意味|
|:--|:--|:--|
|>|ul > li|ul要素の直下のli要素|
|,|ul,li|ul要素とli要素|
|+|ul + li|ul要素に隣接したli要素|
|半角スペース|ul li|ul要素の子要素以下のli要素|

- 要素を指定するメソッド

|header1|header2|header3|
|:--|:--|:--|
|メソッド|例|意味|
|parent()|$(li).parent()|li要素の親要素|
|children()|$(li).children()|li要素の子要素|
|next()|$(li).next()|li要素の次の要素|
|prev()|$(li).prev()|li要素の前の要素|
|siblings()|$(li).siblings()|li要素の同列の兄弟要素|
文系出身エンジニアが学ぶDockerのDBサーバにクライアントツールからログインできない時の対処法

# 環境
OS :macOS Catalina version: 10.15.13
MySql：　version: 5.7.26
クライアントツール： Sequel Pro

# 事象
クライアントツールでDockerコンテナにあるDBサーバーにアクセスできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513534/5955b508-c68f-c186-3d70-f04c4d0e50cc.png)

# 原因
docker-compose.ymlでDBサーバのポートを指定をしていなかったため。

```docker-compose.yml
db:
  image: mysql:5.7
  volumes:
    - db-volume:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: password
```

# 解決策
ポートを追加する。
ホストのOS(自分のPC)から繋ぐ時はポートが必要。

```docker-compose.yml
db:
  image: mysql:5.7
  # 下記のようにポートを指定
  ports:
    - 3306:3306
  volumes:
    - db-volume:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: password
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513534/c4228865-160a-7eef-8ffe-c3bf97d1bd78.png)

# ちなみに、、、
下記コマンドでDockerコンテナに入り、

```
$ docker-compose exec db bash
```

mysqlコマンドでログインすると、**ポート番号なしでもログインできます**

```
root@******:/# mysql -u root -h 127.0.0.1 -p
```

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

また、**MySQLのver8以降の場合SequelProで接続出来ない**ようです。
私は今回version: 5.7だったのであまり詳しくは触れませんが、その場合は下記を参考にしたら良いかもしれません
[Sequel ProでMySQLにログインできない](https://qiita.com/yusuke_dev/items/7f0ca12ced72363f9448)
素数の出力プログラム


#素数を出力するプログラムをマクロで作ってみた

こんにちは、Mottyです。

##概要
関数あるいは漸化式で表すことができるような単純な数であれば出力は簡単ですが、
そのような規則性がないものの場合、各値に対して真偽を判定させる必要があります。
今回は素数の出力をVBAで行ってみました。

##素数
素数の定義は約数を"自分と1"の２つ以外に持たない数の集まりです。
ある数が素数かどうかを調べるには、１からある数まで順番に割り切れるかどうかを調べる
必要があります。

次の２つ(100,97)が素数かどうか調べたいと思ったときは
下記のようなプログラムになります。

```prime.bas
Sub Main()

   Call prime(100) '
   Call prime(97) '

End Sub

Sub prime(Byval i As Long)

'素数判定がTrueなら出力
If IsPrime(i) Then
    debug.print(i）
End If

End Sub

'---素数判定---
Function IsPrime(Byval num As Long) As Boolean
Select Case num
   Case 1:
      IsPrime = False   
   Case Is >1:

      cnt = 2
      Do While cnt = num - 1
         If num Mod cnt = 0
            IsPrime = False
         End If
         cnt = cnt + 1
      Loop

      IsPrime = True

End Function
```

戻り値としてほしい場合は、Functionプロシージャーに変えていただければOKです。
以上、VBA系の作品もちょくちょく投稿していきたいです。
MAMPのhostに繋がらなくなったらFWも疑え

個人的メモです。

# 問題
MacBook12インチで、今まで普通に使えていたのにMAMPのどのhostにも繋がらなくなった。

# 症状/調査

- MAMPのGUI上ではApacheは起動している
- ブラウザでアクセスしてもがタイムアウトする

```
このページは動作していませんlocalhost からデータが送信されませんでした。
ERR_EMPTY_RESPONSE
````
- どのhostも、WebStartも表示されない
- `curl localhost`  返答なし
- logs/apache_error.log にも特にエラーが表示されない

```
[Sat Feb 29 16:06:03 2020] [notice] Digest: generating secret for digest authentication ...
[Sat Feb 29 16:06:03 2020] [notice] Digest: done
[Sat Feb 29 16:06:03 2020] [notice] FastCGI: process manager initialized (pid 7428)
[Sat Feb 29 16:06:03 2020] [notice] Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.4.2 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.24.0 configured -- resuming normal operations
[Sat Feb 29 16:07:52 2020] [notice] caught SIGTERM, shutting down
[Sat Feb 29 16:08:03 2020] [notice] Digest: generating secret for digest authentication ...
[Sat Feb 29 16:08:03 2020] [notice] Digest: done
[Sat Feb 29 16:08:03 2020] [notice] FastCGI: process manager initialized (pid 7821)
[Sat Feb 29 16:08:03 2020] [notice] Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.4.2 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.24.0 configured -- resuming normal operations
```
- `ping localhost` 返答あり

```
ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=29.155 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.129 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.104 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.123 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.069 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.102 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.186 ms
^C
--- localhost ping statistics ---
8 packets transmitted, 8 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.069/3.750/29.155/9.602 ms
```

- MAMP Proの再インストールしたが変化なし
- hostsにはきちんとMAMPの書き込みがある
- MySQLの動作は正常 → Apacheがおかしい？

# 原因判明！

EeetのパーソナルファイアウォールをOFFにしたら表示された。
FWのせいだった…

記憶にないが、Esetのアップデートがあったのだろうか…。

## 気づいたきっかけ

[この記事](https://html.developreference.com/article/14351799/Unable+to+open+up+localhost+in+Chrome+using+MAMP%2C+getting+%E2%80%9CERR_EMPTY_RESPONSE%E2%80%9D)の下記部分をみてEsetを疑った。
> it turns out this was a proxy issue and just had to allow localhost:8888 ...



## 課題

FWは起動しておきたいので、とりあえずは「対話式で」逐一「許可」をしているが、いちいち操作が必要で大変。
↓
EsetのFWをOFF。
MacデフォルトのFWをON。
としました。

追記: [この手順](https://eset-support.canon-its.jp/faq/show/1583?site_domain=default)でEsetのFWをONにしたままMAMPの通信を許可することもできました。
Lispの入門テキスト

[●テキスト本体（PDF形式115ページ:718KB）](http://www.k-techlabo.org/www_lisp/LispText.pdf)　2020/02/29更新
　[（→ミラーサイトからDL）](https://ktechlabo.xsrv.jp/www_lisp/LispText.pdf)
－－－－－－－－－－－－－－－－－－－－－
　
(2020/02/29)
学校でプログラミング教えています．既に何かの言語を学んだ人が初めてLispを学ぶための入門テキストという位置づけで作りました．Common LispとSchemeを対象としています．
　
まだ完成度が低いですが，実際に教育現場で使いながら内容を修正・増補していきます．
　
無料で公開しますので，ご意見いただけたら嬉しいです．
誤った箇所を見つけられましたら是非ご一報くださいませ．修正を施して再度アップロードします．（連絡先はテキストの裏表紙に記載しています）
　
[（テキスト中のサンプルプログラムなどはこちら）](http://www.k-techlabo.org/blog2/?page_id=1471)

-----
written by 中村勝則
[備忘録]Railsにおけるテスト

## テストとは
記述したコードが意図した通りに動作するかを確認するもの
テストを行わないで世に出るサービスは無い
Rspecを利用する
利用する際にはGemのrspec-railsのGemをインストールすることで使用できる。
### メリット
仕様漏れを防げる
リファクタリングや機能追加がしやすくなる
### 心がけること
必然的に記述コードが増えるので開発時間が長くなるのは仕方ない、しかしそれを超えるメリットやリスクヘッジがある
同じような記述のコードが増えるがリファクタリングしすぎてしまうと何のテストかわからなくなってしまうので、テストコードはわかりやすさ重視で記述する。
### 種類
単体テストと統合テストがある
## RSpecの設定
```:ターミナル
$ rails g rspec:install
```
RSpecの設定ファイルを作成
下記のファイルが作成される

```:ターミナル
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```
共通の設定はrails_helper.rbに記述し
spec_helper.rbも同じく共通の設定を記述するところですがRails無しで使用する際のもの

RSpecに以下を追加

```:.rspec
--format documentation
```

### RSpecの動作確認
```:ターミナル
$ bundle exec rspec
```
下記のような出力があれば準備完了

```:ターミナル
No examples found.


Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
```

## テストコードの例
1+1が2になることをテストする場合

```ruby:sample_spec.rb
describe "hogehoge" do
  it "1 + 1は2になること" do
    expect(1 + 1).to eq 2
  end
end
```
describeというキーワードでテストをグループ化
テスト1つ(example)として評価されるit do ~ endのブロックの中に、
expect(X).to eq Yという形式の式を記述。
これがテストが成功するかどうかチェックされる式(エクスペクテーション)。

describe
describeは、直後のdo ~ endまでのテストのまとまりを作る。
describeの後に続く""の中にはそのまとまりの説明を書く。

itとexample
itはexampleと呼ばれる実際に動作するテストコードのまとまりを表す。
itの後に続く""の中にはそのexampleの説明を書く。

エクスペクテーション
実際に評価される式。
it do ~ endの間に書く。
上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーション。

xpect(X).to eq Y
エクスペクテーションの文法。
xの部分に入れた式の値がYの部分の値と等しければ、テストが成功。
eqの部分を、マッチャと言う。

マッチャ
エクスペクテーションの中で、テストが成功する条件を示す。
例えばeqは「等しければ」という意味になる。
他にもinclude(含んでいれば)、valid(バリデーションされれば)など複数のマッチャが存在する。

valid?メソッド
valid?メソッドを利用すると、ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめることができる。

errorsメソッド
valid？メソッドの返り値はtrue/false、valid?メソッドを利用したインスタンスに対してerrorsメソッドを利用すると、バリデーションにより保存ができない状態である場合なぜできないのかを確認できる。

includeマッチャ
includeマッチャは、引数にとった値がexpectの引数である配列に含まれているかをチェックすることができるマッチャ。
Qiitaよね、早めのPython♪

「Pythonプログラミングを始めたいんだけど、何からやればいい？」

という質問をもらうことが多いので、初学者用のQiitaページをまとめてみました。最初は

* Python そのものの文法
* Numpy の使い方
* Pandas の使い方
* matplotlib の使い方

の４つを一通り見てみるのがいいと思います。

# Python そのものの文法

* [Pythonウォーミングアップ](https://qiita.com/maskot1977/items/0e01439e4f58fb49a4a7)
* [Python 基礎 まとめ](https://qiita.com/shizuma/items/f4601aa8b526f95e68b0)
* [Python基礎学習](https://qiita.com/RyuUramoto/items/e17a3d755faf19d5bf24)

# Numpy の使い方

* [NumPy 入門](https://qiita.com/sqrtxx/items/f37d99991e40a35ee4e0)
* [NumPy基礎](https://qiita.com/tseno/items/3b7ef7e36eab64d42753)
 
# Pandas の使い方

* [Pandas を用いた演算](https://qiita.com/maskot1977/items/fb36c861aee02ea18755)
* [pandas 入門](https://qiita.com/sqrtxx/items/a5e234c9deb5e503ca7b)

# matplotlib の使い方

* [Matplotlib を用いた可視化](https://qiita.com/maskot1977/items/520fac964122786ccd50)
* [matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)
* [matplotlib入門](https://qiita.com/studio_haneya/items/774c15237e5f677ac7ef)
* [matplotlibマスター](https://qiita.com/Makano/items/571f45846d3d1deae700)

# 今後

この手のまとめ記事はちょくちょく出てくるので、また良さそうな記事が出てきたら追記しようと思います。
[Python3 / numpy] pandasで並列演算するよりも、frompyfuncが高速？（でも不便だった）

# Environment

|      |version|
|:-----|:------|
|OS    |CentOS7|
|python|3.8.1|
|pandas|1.0.1|
|numpy |1.18.1|

# 概要

結論を一言でいうと、**使いどころは微妙**でした
pandasの並列演算を`numpy.frompyfunc()`で置き換えようとした時の記録です。

# 経緯

とある開発中、pandasで並列演算していた部分を他メソッドからも使い回して呼びたくなり、`numpy.frompyfunc()`を使った。

ソースの変更内容を簡略化すると、こんな感じ。

```python
import numpy as np
import pandas as pd

# 元々の処理 － pandasによる並列演算を使った処理
def intercomparison_between_dataframes_old(...):
    # 略 ...
    y_exceed_x_series = df1['x'] < df2['y']
    return y_exceed_x_series 

# 書き換え後 － frompyfuncによる処理
def intercomparison_between_dataframes_new(...):
    y_exceed_x = np.frompyfunc(compare, 2, 1)
    y_exceed_x_series = y_exceed_x(df1['x'], df2['y'])
    retutn y_exceed_x_series 

def compare(x, y):
    return x < y


# ※注
#   書き換え前と書き換え後では、処理結果が若干異なる
#
intercomparison_between_dataframes_old(...)

0    False
1    False
2    False
dtype: bool <-

intercomparison_between_dataframes_new(...)

0    False
1    False
2    False
dtype: object <- 速いけど dtype が object になってた
```

こうすると何が嬉しいかというと、`compare()`メソッドを呼び出せすことで、比較ロジックだけを使い回すことができる。

`Series`同士の並列計算ではなく、1対1で比較したいこともあるのです（←当初の目的）
~~ほ、本当は引数が6個もある複雑な比較処理なんだからね！（>д<;）~~

# 速度を測ってみた

この処理変更によって速度が低下しないか心配だったので、念のため以下の記事の方法で速度測定してみた。

[【Python】処理にかかる時間を計測して表示](【Python】処理にかかる時間を計測して表示)

## 結果

old_dealtelapsed_time が元々の処理の処理時間
new_dealtelapsed_time が書き換え後処理の処理時間

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/19f198b7-b36c-e553-27e7-2530586298c4.png)

「え、 **pandasよりfrompyfuncの方が速い** じゃん♪(^^*)ﾗｯｷｰ」

処理時間が約7分の1になりました。
想定外の収穫でした。

ちょっと気が早いですが、
「もう並列演算は全部 frompyfunc でいいんじゃないか....（｀・д´・;）」
と思ってしまいました。

ところが...

## 更なる調査で分かったこと 

処理結果を調べていて分かったことがあった。

frompyfuncに渡すメソッドの戻り値が2個（以上）の時、戻り値の型がタプル（tupple）になる。

たとえば今回の例でいえば、`compare()`メソッドの戻り値が2個だったとしたら戻り値がこんな感じになる

```python
>>> intercomparison_between_dataframes_new(...)

(0            True
1            False
2            True
3            False
4            False
          ...   
1553    True
1554    True
1555    True
1556    False
1557    True
Length: 1558, dtype: object, 0           True
1           False
2           True
3           False
4           True
         ...   
1553    True
1554    False
1555    False
1556    True
1557    False
Length: 1558, dtype: object) <- tupple かよぉ....
```

numpyのメソッドだから二次元のndarrayを返してくれると思ったのに...

frompyfunc()に渡すメソッドの戻り値が1個の時しか、速度改善は望めなさそう。


# もし使うとしたら

* frompyfunc()に渡すメソッドの戻り値が1個ならそこそこ使えそう。
* 
もしかしたら...  
処理によっては速度に大差なかったり、逆に`frompyfunc`の方が遅いこともあるかもしれない。  
とはいえ、結構な差がついているので、基本的には`frompyfunc`の方が速そう。

実際に簡単な処理でも調査したら追記しようと思う。
Float to String の format メモ

Floatの文字列変換のフォーマットをよく忘れののでメモ。

## code
```swift
        let num: Float = 3.33333
        print("3.33333")
        print(String(format: "[2f] %.2f", num))
        print(String(format: "[2F] %.2F", num))
        print(String(format: "[2e] %.2e", num))
        print(String(format: "[2E] %.2E", num))
        print(String(format: "[2g] %.2g", num))
        print(String(format: "[2G] %.2G", num))
        print(String(format: "[4f] %.4f", num))
        print(String(format: "[4F] %.4F", num))
        print(String(format: "[4e] %.4e", num))
        print(String(format: "[4E] %.4E", num))
        print(String(format: "[4g] %.4g", num))
        print(String(format: "[4G] %.4G", num))
        let num2: Float = 3
        print("3")
        print(String(format: "[2f] %.2f", num2))
        print(String(format: "[2F] %.2F", num2))
        print(String(format: "[2e] %.2e", num2))
        print(String(format: "[2E] %.2E", num2))
        print(String(format: "[2g] %.2g", num2))
        print(String(format: "[2G] %.2G", num2))
        print(String(format: "[4f] %.4f", num2))
        print(String(format: "[4F] %.4F", num2))
        print(String(format: "[4e] %.4e", num2))
        print(String(format: "[4E] %.4E", num2))
        print(String(format: "[4g] %.4g", num2))
        print(String(format: "[4G] %.4G", num2))
```

## Log
```
3.33333
[2f] 3.33
[2F] 3.33
[2e] 3.33e+00
[2E] 3.33E+00
[2g] 3.3
[2G] 3.3
[4f] 3.3333
[4F] 3.3333
[4e] 3.3333e+00
[4E] 3.3333E+00
[4g] 3.333
[4G] 3.333
3
[2f] 3.00
[2F] 3.00
[2e] 3.00e+00
[2E] 3.00E+00
[2g] 3
[2G] 3
[4f] 3.0000
[4F] 3.0000
[4e] 3.0000e+00
[4E] 3.0000E+00
[4g] 3
[4G] 3
```
bashで祝日を含めた休日の判定

# 目的 : bashを用いて祝日を含めた休日の判定をする
シェルなどを平日のみ動作させたい、祝日を含めて休日のみ動作させたい場合、
土曜日・日曜日だけでなく、祝日も考慮する必要があります。
本記事は、そのケースの実現方法の説明です。


# 環境
- Linux
- bash

# 祝日の一覧を入手する
祝日の一覧は、内閣府が公開しています。
> https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

祝日の一覧を記述したcsvファイルが公開されていますが、
2020年2月29日現在、2021年までしか記述されていません。

そのため、下記を使用します。
> holiday-jp様のリポジトリ
https://github.com/holiday-jp/holiday_jp/blob/master/holidays.yml
>
`...
2019-11-03: 文化の日
2019-11-04: 文化の日 振替休日
2019-11-23: 勤労感謝の日
2020-01-01: 元日
2020-01-13: 成人の日
2020-02-11: 建国記念の日
2020-02-23: 天皇誕生日
2020-02-24: 天皇誕生日 振替休日
...
`

ここでは、上記のyml形式のファイルを使用しましたが、他プログラミング言語用のモジュールもあるので、
他環境で使用したい場合は、上記のリポジトリを探してみてください。

## 祝日を随時更新して休日判定する場合
祝日は変更になることがある(最近だと天皇誕生日の祝日の変更など)ので、
下記のcurlコマンドをcrontabなどで定期的に実行することで、自動的にダウンロードします。

```bash
# "トークン"の箇所に、OAuthTokenを入力
curl -H 'Authorization: token トークン' -H 'Accept: application/vnd.github.v3.raw' -L https://api.github.com/repos/holiday-jp/holiday_jp/contents/holidays.yml > holidays.yml
```

なお、下記が満たされていることが前提です。

- 休日判定する環境がインターネット接続可能であること
- GitHubのリポジトリが最新の祝日一覧に更新されていること
- GitHubのアカウントを作成済みで、OAuthTokenを発行していること

OAuthTokenは、
1. [Personal Access Tokens](https://github.com/settings/tokens) にアクセス
2. `Generate new token`をクリック
3. `Note`に任意の文字列を入力
4. `public_repo`にチェック
5. `Generate token`をクリック
で作成できます。


## 祝日を随時更新せずに休日判定する場合
holiday-jp様のリポジトリから祝日の一覧のファイル(holidays.yml)をダウンロードし、使用します。
こちらは、休日判定する環境がインターネット接続不可でも構いません。

**注意点**
祝日に変更があった場合、再度祝日の一覧ファイルをダウンロードする必要があります。

# 休日を判定する
ここでは、シェルを実行する際に日付の引数を取り、休日の判定結果(と祝日の場合は祝日名)を返す形としました。

```bash:example.sh
#!/bin/bash

#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)

#祝日の場合
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
	#祝日名を取得
	public_holiday_name=$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST | /bin/awk -F ':' '{print $2}')
	echo "$target_date は祝日:$public_holiday_name です."
#休日(土曜日,日曜日)の場合
elif [ -n "$(/bin/date -d $target_date | /bin/grep -E "[土日]曜日")" ] ; then
	#曜日を取得
	day_of_the_week=$(/bin/date -d $target_date | /bin/awk '{print $4}')
	echo "$target_date は$day_of_the_weekです."
#平日の場合
else
	echo "$target_date は平日です."
fi
```

```:result
$ ./holiday.sh 2020-01-13
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200113
2020-01-13 は祝日: 成人の日 です.
$ ./holiday.sh 20200114
2020-01-14 は平日です.
$ ./holiday.sh 20200112
2020-01-12 は日曜日です.
$ ./holiday.sh 20200211
2020-02-11 は祝日: 建国記念の日 です.
```

# おまけ : 独自の祝日を判定したい場合
一般的な祝日の一覧ファイルとは別に、以下の形式で記述し、if文を変更すればOK
> 2020-01-14: 大事な記念日
2020-02-05: 重要な記念日

```bash:original.sh
#祝日の一覧を記述しているファイル
PUBLIC_HOLIDAY_LIST='./public_holidays.yml'
#独自の祝日を記述しているファイル
ORIGINAL_HOLIDAY_LIST='./original_holidays.yml'
#休日、祝日を判定する対象の日付
target_date=$(/bin/date +"%Y-%m-%d" -d $1)

#祝日の場合
#if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] ; then
if [ -n "$(/bin/grep $target_date $PUBLIC_HOLIDAY_LIST)" ] || [ -n "$(/bin/grep $target_date $ORIGINAL_HOLIDAY_LIST)" ] ; then
# ...
fi
```
>>>EOFについて

参考書を進めていて、

```
$html = <<<EOF
<html>
   <head>
     なんやらかんやら
   </head>
   <body>
　　　なんやらかんやら
   </body>
</html>
 
EOF;

```

こんな文章がさも当然のように出てきた。
EOFとはなんぞや。

End Of File（エンド・オブ・ファイル）」の略で「EOF」だそうです。
そして具体的な使い方は、

```
$変数 = <<<終了の文字列
 
「文字列を記述」
 
終了の文字列;

```

なんだってよ。
rubocopの使い方を紹介！インストール時のエラーを解決する方法も（途中）

## Rubocopとは？

Rubyのコードを自動修正してくれるツール。

## インストール方法
ターミナルで上記を入力する。
gemfileに書く方法もあるがこっちの方が早い。

```
gem install rubocop
gem install rubocop-performance
gem install rubocop-rails
```

[参考](https://kitsune.blog/rails-rubocop)


## 使用方法

```
rubocop
```

これを実行すれば、ディレクトリに存在するrubyファイル（.rbで終わるファイル）はすべて解析してくれる。


## 結果の見方

```
11 files inspected, 42 offenses detected
```

11個のファイルをみたら、42箇指摘する場所が見つかった。

## 5段階のエラーのレベルについて

```F``` Fatal
```E``` Error
```W``` Warning

↑ 修正すべき
--- 壁 ---
↓ コードは動くけどちょっとおかしいよ（直さなくて良い物がほとんど）

```C``` Convention
```R``` Refactor



## 発展的な使用方法

```
# W以上のみ出力する
$ rubocop --fail-level W --display-only-fail-level-offenses
```





## よくあるインストール時のエラーと解決法

```
cannot load such file -- rubocop-rails
```

→ターミナルで```gem install rubocop-rails```

を実行すれば解決。


```
cannot load such file -- rubocop-performance
```

→ターミナルで```gem install rubocop-performance```

を実行すれば解決。
トラブルシューティング(デバッグ)について実体験から学んだこと

この間、トラブルシューティング（デバッグ）に参加する機会があった。
そこで、気づいたこと・得た教訓を記録しておく。

# 気づいたこと・教訓

* 作った人/直す人以外の人がデバッグするのもよい
 * 作った人/直す人以外の人がデバッグすると、冷静にやれるし、バイアスがかかりにくい（思い込みの罠にはまりにくい）。
 * 作った人は、自分の問題ではないと思いたい。直す人は、早く問題を特定したいと、焦る。

* 急がない
 * 地道に仮設検証が大事。
 * 間違った仮説を一つづつ積み上げ、調べる範囲を狭めていく。（原因を一発で見つけようとするのではなく、原因でないことを一つづつ見つけ積み上げていく）
 * 原因は現象からすごく離れたところに存在していることもあるので、注意。
 * まずは、問題を明らかにしようとするのではなく、メカニズムを明らかにする。

* 記録する
 * 検証したこと・検証することは記録することが大事。同じ検証を繰り返さないように。「本当なの？あれ確認してたっけ？念のためもう一回確認してみよう。」などと、無駄に調べる行動が、抑制される。
 * 仮説をツリー状に（FTAのような形式で）書いていくとよい。

* 仮説検証を停滞させない（そのために以下が大事）
 * 自分の仮説に固執しない。
 * 1人ではなく3人くらいでやる。新たな仮説が、誰かから出てくる。
 * そもそも前提としていたことを疑う。
 * 調査で使うツールも疑う。調査結果が間違っていることもある。
 * 人の見解ではなく、目に見えている事実（コードとデータ）をもとに分析する。人の言葉を信用しない。
 * わからないことは後回し、わかることから分析する。
 * ちょっと休憩する。

* その他注意点 
 * うまくいくときとうまくいかないときを比較するのは重要だが、比較しているデータに原因を示すものが含まれていない、または原因を示すものに目が向けられていなければ、結局原因に辿りつけない。差は、原因ではなく、現象である可能性もある。

# 参考文献
[1] 金子龍三，「先端技術者のためのトラブルシューティング技術―組込みシステムの品質問題をこの一冊で原因究明」，日科技連出版社，2005，https://bookmeter.com/books/1345074
[2] J. マイヤーズ，M. トーマス，T. バジェット，C. サンドラー，「ソフトウェア・テストの技法」，近代科学社，2006，https://bookmeter.com/books/4071

# Qiitaユーザーさんたちが展開されているデバッグのコツ

https://qiita.com/Takashi_INOUE/items/eaa4c55abe412c14bdd5

https://qiita.com/gotchane/items/4588c34873719f40aac8

https://qiita.com/tetr4lab/items/c558de2cc26324930ba9

https://qiita.com/gotchane/items/ea8513e7b47f3e2a568b

https://qiita.com/iketomo1207/items/74a720fe9d8c4a3d89e1

https://qiita.com/nogitsune413/items/a2e1dc373210932407c8

https://qiita.com/e869120/items/8be6521e72025d7b2a13
【React Navigation】StackNavigatorの入れ子したcomponentにpropsを渡す


React Navigationで`<Stack.Screen name="Home" component={HomeScreen}>`という風にcomponentを渡すときに、どうやって`HomeScreen`にpropsを渡すのか迷ったのでメモ

## 結論

```HomeScreen.js
export default function HomeScreen({ navigation, count, setCount }) {
  return (
    <View>
      <p>You clicked {count} times</p>
      <Button
        title="カウント"
        onPress={() => {
          setCount(count + 1)
        }
        />
    </View>
  );
}
```

```HomeNavigator.js
const Stack = createStackNavigator()
export default function HomeNavigator() {
  const [count, setCount] = useState(1)
  const navigation = useNavigation()

  return(
    <Stack.Navigator>
      <Stack.Screen name="Home">
        { () => <HomeScreen navigation={navigation} setCount={setCount} count={count} /> }
      </Stack.Screen>
    </Stack.Navigator>
  )
}
```

Stack.Screenの入れ子として`{ () => <HomeScreen /> }`を渡し、propsで値を渡すようにする

## 詰まって表示されたエラー

### Got an invalid value for 'component' prop for the screen 'hogehoge'. It must be a a valid React Component.  


```HomeNavigator.js
export default function HomeNavigator() {
  return(
    <Stack.Navigator>
      <Stack.Screen name="Home">
        <HomeScreen />
      </Stack.Screen>
    </Stack.Navigator>
  )
}
```

上記のようにするとエラーがでる
`<HomeScreen />`と書かかずに`{ () => <HomeScreen /> }`関数として渡すようにする


### Looks like you're passing an inline function for 'component' prop for the screen 'Home' (e.g. component={() => <SomeComponent />}). Passing an inline function will cause the component state to be lost on re-render and cause perf issues since it's re-created every render. You can pass the function as children to 'Screen' instead to achieve the desired behaviour.



```HomeNavigator.js
export default function HomeNavigator() {
  return(
    <Stack.Navigator>
      <Stack.Screen name="Home" component={() => <HomeScreen />} />
    </Stack.Navigator>
  )
}
```

componentで関数で渡すようにしても動くには動くけど警告がでる

## 終わり

React Navigationのgithubのexampleを見たら、最初に書いたような書き方をしたので解決した。React Native関連はまだまだ発展途上でどんどん変わっていくので公式の資料を見るのが一番早い

https://github.com/react-navigation/react-navigation/blob/master/example/src/Screens/MaterialBottomTabs.tsx#L31
Ruby on RailsでGoogle Books APIを叩く

## 動機
本のレビューサイト的なもの(厳密には違いますが、説明が楽なため)をポートフォリオとして作っています。

本の情報を取得はAPIで行うわけですが、本のAPIにも色々あります。
[書籍検索APIは結局どれが一番いいのか](https://qiita.com/Hidekazu-Karino/items/3c2edbadbcbf1551c6cf)

上の記事ではopenbdが勧められていますが、私はGoogle Books APIを使うことにしました。実装が比較的楽みたいです。(今のところ困っていません)
公式:
[Google Books API - Google Developers](https://developers.google.com/books/docs/v1/getting_started?hl=ja)

で、RubyでGoogle Books APIを叩いたドキュメントを探していて、しかし見つからなかったというのが、本記事を書くに至った動機になります。
[Google Books APIとVue.jsを使ってシンプルなBook Finder appを作る](https://qiita.com/_ayk_study/items/08ad9606a9bafd9a3f58)
[【Python3】Google Books APIを使ってみる](https://techracho.bpsinc.jp/katayama-yuuki/2018_01_29/51416)
[Google Books API からJSONデータを取得してjQueryで処理する](https://qiita.com/TakeshiNickOsanai/items/2d9c30cedcba21f36669)

## 実装

本にはISBNという主キーのようなものがあります。
例: 9784839962227 => [現場で使える Ruby on Rails 5速習実践ガイド](https://book.mynavi.jp/ec/products/detail/id=93905)

例えば、Google Books APIではこのISBNを通じて、以下のようなJSONを得ることができます。
https://www.googleapis.com/books/v1/volumes?q=isbn:9784839962227

ruby 2.6.5

#### ISBNからJSONを返す

```ruby:
  def get_json_from_isbn(isbn)
    JSON.parse(Net::HTTP.get(URI.parse(
      "https://www.googleapis.com/books/v1/volumes?q=isbn:#{isbn}"
    )))
  end
```

#### インスタンス変数にJSON情報を入れる(例)

```ruby:
json = get_json_from_isbn(9784839962227)
@book = Book.new(
  author: json["items"][0]["volumeInfo"]["authors"][0],
  description: json["items"][0]["volumeInfo"]["description"],
  image_url: json["items"][0]["volumeInfo"],
  published_at: json["items"][0]["volumeInfo"]["publishedDate"],
  title: json["items"][0]["volumeInfo"]["title"],
)
```
JSONと見比べれば、本の情報を取得できていることが分かるかと思います。

## なんでサーバーサイドのRubyでAPIを叩いたか?
- ~~Ruby以外よく分かってないためです~~
- 本のISBNを送ってもらうだけにして、ユーザーにはその結果(本の情報)をいじってほしくなかったです。
- Google Books APIには、本の検索に対するAPIもあります(まだ触ってませんが)。よって、サーバーサイドで叩く、で十分と判断しました。

あと初記事です:wink:

#### 追記
本記事を書いておいてアレですが、ISBNで叩くのは良くなかったと思ってます。

以下が理由
1. ISBNがAPIの情報として入ってないことがある
2. ISBNが13桁でintegerが使えない(biginitを使うらしい)
3. 表記の仕方も色々ある(9784774142357とか、978-4-7741-4235-7とか)

特に1.が致命的で、主キーとしての機能が期待できないことになってしまいます。


Goole Books APIでは以下のようなIDが本ごとに用意されています
8rtiRwAACAAJ
扱いとしてはstringを使えばいいだけなので、比較的楽だと思います。

```ruby:
def url_from_id(googlebooksapi_id)
  "https://www.googleapis.com/books/v1/volumes/#{googlebooksapi_id}"
end

def get_json_from_url(url)
  JSON.parse(Net::HTTP.get(URI.parse(url)))
end
```

ついでに、urlを返すロジックとjsonを返すロジックをわけました。
こうすることで以下のような、検索を行うurlに対しても再利用できます。

```ruby:
def url_from_keyword(keyword)
  "https://www.googleapis.com/books/v1/volumes?q=#{keyword}&country=JP&maxResults=20"
end
```
Image Captioning メモ

# About Image Captioning

画像からキャプションを生成する技術。

![image-capitoning-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285938/56db7c70-e399-2dbe-eeaa-bb5cd24a3e69.png)

[Image is from [pytorch-tutorial](https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/03-advanced/image_captioning) by [yunjey](https://github.com/yunjey), licensed under [MIT](https://github.com/yunjey/pytorch-tutorial/blob/master/LICENSE)]

# Links

* [Tensorflow Tutorial](https://www.tensorflow.org/tutorials/text/image_captioning)
* PyTorch Tutorial
  - [yunjey/pytorch-tutorial - Image Captioning](https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/03-advanced/image_captioning)
  - [a-PyTorch-Tutorial-to-Image-Captioning](https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning)
* [Awesome Image Captioning](https://github.com/zhjohnchan/awesome-image-captioning)
* [(Paper) A Comprehensive Survey of Deep Learning for Image Captioning](https://arxiv.org/pdf/1810.04020.pdf)

# Dataset

* [COCO](http://cocodataset.org/#home)
  - [Creative Commons Attribution 4.0 License](http://cocodataset.org/#termsofuse)
* [STAIR captions](http://captions.stair.center/)
  - 日本語データセット
  - [Creative Commons Attribution 4.0 License](https://github.com/STAIR-Lab-CIT/STAIR-captions)
gunicorn, uwsgi x falcon, flask, responder を評価してみた

# 目的

MLのWebAPI(REST API)を作るときに、どのWSGI/ASGIサーバが良いかの参考として、評価しておく

# 概要

- 以下のパターンについて、h2load でストレステストを実行
    - gunicorn x falcon
    - gunicorn x flask
    - gunicorn x responder
    - uwsgi x falcon
    - uwsgi x flask
- リクエスト数：2000
    - 1クライアント1リクエスト
    - 最大同時リクエスト数：50
    - クライアントスレッド数：4

# 結論/総評

- 同時処理を優先したい場合
    - 多少（今回の条件では数百ms程度）待たせても、同時に処理したい場合
    - または、安定したスループットを提供したい
        - 今回の条件では、常時 2～3 req/s 程度
    - 例：チャットボットなどUIと連携する
    - gunicorn x responder を選択する
- 1リクエストの処理時間を優先したい場合
    - 1リクエストに対して、受け付けたら待たせたくない（極力すぐ返したい）場合
    - 例：システム連携するWebAPI
    - uwsgi x falcon または、uwsgi x flask を選択する
        - falcon, flask では、大きな差はない

# コード

- https://github.com/tkosht/wsgis.git


# 実行

## 上記、コードをclone

```
git clone https://github.com/tkosht/wsgis.git
```

## 実行環境（コンテナ環境）のビルド

```
cd wsgis
make
```

## 負荷テストを実行

```
make stress
```

# 結果例

実行（`make stress`）によって、多少結果がぶれますが、何度か確認した限り見方や結論は変わらなそうでした。

結果のログは、wsgis/log 配下に出力されます。

## トータル処理時間

gunicorn.responder のトータル処理時間は、371.47ms と、他の 1s 強に比べて圧倒的な速さです。

```
wsgis/log/stats$ egrep '^finished' *.log
stats.gunicorn.falcon.log:finished in 1.25s, 1606.07 req/s, 290.16KB/s
stats.gunicorn.flask.log:finished in 1.43s, 1401.95 req/s, 264.23KB/s
stats.gunicorn.responder.log:finished in 371.47ms, 5384.03 req/s, 578.36KB/s
stats.uwsgi.falcon.log:finished in 1.11s, 1807.62 req/s, 174.76KB/s
stats.uwsgi.flask.log:finished in 1.14s, 1760.44 req/s, 183.95KB/s
wsgis/log/stats$ 
```

## 1リクエスト当たりの処理時間

1リクエスト当たりの処理時間の平均（mean）は、uwsgi.falcon の 108.98ms、uwsgi.flask の 112.47ms とgunicorn のいずれよりも短い。

```
                     min         max         mean         sd        +/- sd
gunicorn.falcon:     13.49ms       1.21s    612.36ms    347.35ms    58.45%
gunicorn.flask:      11.15ms       1.40s    707.55ms    405.06ms    57.40%
gunicorn.responder: 267.17ms    355.10ms    316.35ms     26.91ms    58.75%
uwsgi.falcon:          609us    267.04ms    108.98ms     80.43ms    58.20%
uwsgi.flask:          1.39ms    268.18ms    112.47ms     79.67ms    59.85%
```

トータル処理時間が最も短かったgunicorn.responder は、gunicorn.falcon, gunicorn.flask よりも短いが、それでも、uwsgi の約3倍弱の316.35ms と、uwsgi よりも長い。

トータル処理時間が短く、1リクエスト当たりの処理時間が少し伸びるということは、同時処理数（並列処理数）が他のよりも高く、うまくCPU リソースを使えているともいえる。（実際、top で確認すると感覚的に上昇していることがわかる。）

## スループット

スループットの平均（req/s）は、uwsgi.falcon の 9.12 が最も多い。
一方で、gunicorn.responder の 標準偏差（sd）は、0.26 と非常に安定したスループットであると分かる。（ほとんど、秒間のスループットがぶれていない。% を踏まえると、正規分布よりは広い分散を持つといえる。）

```
                     min         max         mean         sd        +/- sd
gunicorn.falcon:      0.81       31.92        3.16        4.30    90.50%
gunicorn.flask:       0.71       34.23        2.86        4.13    90.95%
gunicorn.responder:   2.70        3.56        3.07        0.26    58.55%
uwsgi.falcon:         0.91       62.41        9.12       10.19    86.80%
uwsgi.flask:          0.89       44.07        8.47        9.01    86.75%
```
Pythonでプログラムからの相対パスでファイルを読み込む

実行ファイルのパスは`__file__`で取得できるので、`os.path.dirname`を使ってディレクトリにし、
`os.path.join`を使って欲しいファイルへのパスをつなげるとOK.

```tree
.
└── some_dir
    ├── products.json
    └── test.py

```

```python:test.py
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'products.json')
with open(filename) as f:
    print(f.read())
```
動的メモリmallocの使い方

# malloc
- みんなの敵malloc
- わからなくなりがちだからまとめ
- コロナと一緒に倒しちゃいましょう！
- #include < stdlib.h> です！
- **0で初期化したい場合はcallocを使う**

## 基本形
```ポインタ = (型*)malloc(sizeof(型) * 大きさ)```

例えば、

```c
int *p = (int*)malloc(sizeof(int)*100);
free (p);
```

### 例
```c
#include <stdio.h>
#include <stdlib.h>
int main(){
  int arraySize = 5;
  int* p;
  p = (int*)malloc(sizeof(int)*arraySize);
  
  int i;
  for(int i=0; i<arraySize; i++) p[i] = 2*i;
  for(int i=0; i<arraySize; i++) printf("p[%d] = %d\n", i, p[i]);

  free(p);
  return 0;
}
```
出力は
p[0] = 0
p[1] = 2
p[2] = 4
p[3] = 6
p[4] = 8


## 配列のコピー
- #include < string.h>が必要です

```memcpy(dest, src, size)```

### 例
```c
int a[] = {1, 2, 3, 4, 5};
int *b = (int*)malloc(sizeof(int)*5);
memcpy(b, a, sizeof(int) * 5);
```



# malloc()関数
使い方の例

```c
int *ptr = (int*)malloc(sizeof(int)*10);

if(ptr == NULL) exit(1); //メモリ確保に失敗した時はNULL

ptr[0] = 123;
ptr[1] = 555;

free(ptr);
```

## 構造体で使う
```c
#include <stdio.h>
#include <stdlib.h>

// point構造体の定義は省略

struct point *init_point(int x, int y){
  struct point *ptr = malloc(sizeof(struct point));

  ptr->x = x;
  ptr->y = y;

  return ptr;
}

// または

struct point *init_point(int x, int y){
  struct point *ptr = malloc(sizeof(struct point));

  *ptr = (struct point){.x = x, .y = y};
  return ptr;
}

int main(){
  struct point *ptr = init_point(10, 20);

  printf("%d\n", ptr->x);
  printf("%d\n", ptr->y);
}
```

# あとがき
コロナのせいで予定なくなって暇になって書きました
超低クオリティですみません！！！！
HTMLのtableの列幅をドラッグで変えられるようにする雑な方法

表計算ソフトみたいに、テーブルの列幅をユーザー側で変えたいことって、ありますよね？
CSSの[resizeプロパティ](https://developer.mozilla.org/ja/docs/Web/CSS/resize)と[overflowプロパティ](https://developer.mozilla.org/ja/docs/Web/CSS/overflow)を使って、テーブルの列幅を可変にできます。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="mifumi323" data-slug-hash="WNvjaBN" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="HTMLのtableの列幅をドラッグで変えられるようにする雑な方法">
  <span>See the Pen <a href="https://codepen.io/mifumi323/pen/WNvjaBN">
  HTMLのtableの列幅をドラッグで変えられるようにする雑な方法</a> by 松田美文 (<a href="https://codepen.io/mifumi323">@mifumi323</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

`resize: horizontal`とすることで、横方向にリサイズできるようになります。
そのとき、`overflow: visible`になっていると、resizeが効かないので、`overflow: hidden`にしておきます。

ただし、残念ながら、「雑な方法」なので、どこでもちゃんと動くわけじゃないんですね。
Google Chrome、Mozilla Firefox、Microsoft Edge、Microsoft Internet Explorer（いずれも2020年2月時点の最新版）で試してみましたが、リサイズできたのはGoogle Chromeだけでした。
実はChromeでも、テーブルの中身や他のスタイル次第では変な動きになったりするので、完全に期待通りな、表計算ソフトみたいな挙動にはなりません（Qiitaの画面でも、テーブル全体が幅いっぱいになったとき、微妙な動きになると思います）。

ちゃんと動くものを作るには、JavaScriptとかでがっつり制御しなくちゃいけないとは思いますが、それについては説明しません。
だって、ここは雑な方法についての記事だし、そもそもちゃんとしたやり方知らないからね！
isara 模写

どうしても、「isara　受講生への参加特典」の

「isaraは『実質０円』！更なる特典もあります。」と
四角の白ボーダーとの重なりが表現できません。

どうすればいいでしょうか。

<img width="811" alt="スクリーンショット 2020-02-29 15.30.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586251/c2093a18-8ac5-df1d-9d29-1b9ec46c0e15.png">
Linux Malware Detectのログの保存場所

Zabbixでログ監視しようと思ったのだけど、
肝心のログがネットで見ると/usr/local/maldetect/logs/inotify_logにあるとか書いてあるけど、無い。

```
[root@hayate conf.d]# maldet -l

Linux Malware Detect v1.6
            (C) 2002-2017, R-fx Networks <proj@rfxn.com>
            (C) 2017, Ryan MacDonald <ryan@rfxn.com>
This program may be freely redistributed under the terms of the GNU GPL v2

Viewing last 50 lines from /var/lib/maldetect/logs/event_log:

～～～

[root@hayate conf.d]# ll /var/lib/maldetect/logs/event_log
-rw-r--r-- 1 root root 1604593  2月 29 14:56 /var/lib/maldetect/logs/event_log
[root@hayate conf.d]#

```

上記のコマンドを打つことで、ログの保存場所が表示される。
/var/lib/maldetect/logs/event_logとのこと。
故意に設定した記憶は無いけど、私の場合は何故かここだった。
Perl で学ぶ剰余計算

# はじめに
[AtCoder：競技プログラミングコンテストを開催する国内最大のサイト](https://atcoder.jp/home) をはじめとする競技プログラミングでは、「割ったあまり」を求める問題が頻繁に出題されます。
そこで、Perl 用のテンプレートを準備します。
# 剰余の基本
割る整数を法といいますが、ここでは 1,000,000,007 を法として説明いたします。
変数の初期化は、お好きな方法で。

```mod.pl
$mod1 = 1000000007;
$mod2 = 1_000_000_007;
$mod3 = 1e9 + 7;

print $mod1, "\n"; # => 1000000007
print $mod2, "\n"; # => 1000000007
print $mod3, "\n"; # => 1000000007
```
+ 足し算

```add.pl
$a += $mod + $b;
$a %= $mod;
```
変数が負のケースに対応するよう法を足しておきます。

+ 引き算

```sub.pl
$a += $mod - $b;
$a %= $mod;
```
マイナスにならない様、法を足しておきます。

+ 掛け算

```mul.pl
$a *= $b;
$a %= $mod;
```
+ 割り算

割り算だけ別の計算が必要になります。
# 割り算の剰余：逆元
割り算の場合、法($mod)で直接割って求めることはできないので、法から逆元を求め、逆元を掛けることにより割り算の代用とします。

```modinv.pl
sub modpow {
  my ($a, $n, $mod) = @_;
  my $res = 1;
  while ($n > 0) {
    $res = $res * $a % $mod if $n & 1;
    $a = $a * $a % $mod;
    $n >>= 1;
  }
  return $res;
}
sub modinv {
  my ($a, $mod) = @_;
  return modpow ($a, $mod - 2, $mod);
}
sub main {
  for (my $i=1; $i<13; $i++) {
    print "$i 's inv: " . modinv ($i, 13) . "\n";
  }
  my $a = 12345678900000;
  my $b = 100000;
  my $mod = 1_000_000_007;
  $a %= $mod;
  print $a * modinv ($b, $mod) % $mod, "\n"; # => 123456789
}
main();
```
\$a に \$b と \$mod から求めた逆元を掛けて、$mod で余りを求めます。

```print.pl
  print $a * modinv ($b, $mod) % $mod, "\n"; # => 123456789
```
# ABC 156 D
[AtCoder Beginner Contest 156 D - Bouquet](https://atcoder.jp/contests/abc156/tasks/abc156_d)

```ABC156D.pl
use strict;
use warnings;

my ($n, $a, $b);
{
  my $in = <STDIN>;
  ($n, $a, $b) = split(" ", $in);
}
my $MOD = 1e9 + 7;
my $modpow = sub {
  my ($a, $n, $MOD) = @_;
  my $res = 1;
  while ($n > 0) {
    $res = $res * $a % $MOD if $n & 1;
    $a = $a * $a % $MOD;
    $n >>= 1;
  }
  return $res;
};
my $modinv = sub {
  my ($a, $MOD) = @_;
  return $modpow->($a, $MOD - 2, $MOD);
};
my $comb = sub {
  my ($n, $k) = @_;
  my $a = 1;
  my $b = 1;
  for (my $i=0; $i<$k; $i++) {
    $a *= $n - $i;
    $a %= $MOD;
    $b *= $i + 1;
    $b %= $MOD;
  }
  $a * $modinv->($b, $MOD) % $MOD;
};

my $ans = $modpow->(2, $n, $MOD) - 1;
$ans += $MOD - $comb->($n, $a, $MOD);
$ans += $MOD - $comb->($n, $b, $MOD);
print $ans % $MOD, "\n";
```
うーん、$MODだらけ
# java の場合
javaの場合、java.math.BigInteger がライブラリとして準備されており、

+ modInverse(BigInteger m)：逆元
+ modPow(BigInteger exponent, BigInteger m)：べき乗
+ gcd(BigInteger val)：最大公約数

などがメソッドとして利用可能です。

# まとめ
+ 本番で実装するには時間が短すぎる
+ 習うより慣れよ

参照したサイト
[「1000000007 で割ったあまり」の求め方を総特集！ 〜 逆元から離散対数まで 〜](https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a)
[クラスBigInteger](https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigInteger.html)
[本日の精進：逆元と組み合わせ問題](https://qiita.com/shun310/items/e58e1340dcc029a152c3)

# 追記
*[Perl で学ぶ逆元の２ + パナソニックプログラミングコンテスト2020 C で嵌った話](https://qiita.com/superrino130/items/a65eaa417f7da80971e7)* にて、*AtCoder Beginner Contest 156 D - Bouquet* の別解法を投稿しました。

# 追記２
足し算でも変数が負の場合、正しく計算されるように変更しました。
*[Perl で学ぶ逆元の３ ABC 151 E が解けた！](https://qiita.com/superrino130/items/2f8a1b5769f7d0cbe3a7)*
composer global require Laravel/installerで詰まった件

初投稿なので、いろいろ荒が目立ちますが、何卒ご容赦いただきたい。

laravelをインストールしようとすると

```terminal:ターミナル
composer global require Laravel/installer

```

で詰まった件。


```terminal:ターミナル
$ composer global require Laravel/installer
Changed current directory to /Users/name/.composer
Using version ^3.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v3.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v3.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.0, v3.0.1].


Installation failed, deleting ./composer.json.
```

このようなエラーが出て前に進まない。
missing your systemと書いてあるから、何かが足りないんだろうなと考え、模索しました。

どう解決したかというと、
まずは、homebrewというmacOS用パッケージマネージャーをインストール。
これがなにかというと「Appleが用意していないあなたの必要なものをインストールするもの。」だそうです。

つまり、Homebrewは個別のディレクトリにパッケージをインストールし、それらへのシンボリックリンクを/usr/localに作ってくれるというもの。

これを使って、ターミナルでmissing your systemと言われているものを自分のmacbookに入れます。

インストール方法は
https://brew.sh/index_ja
のサイトに入ってインストールと書いてあるところのこのスクリプトをターミナルに貼り付け実行するだけ。
とっても簡単。
途中、エンターキーを押してくださいという英文とパスワードの入力をお願いされるだけで、数分でインストールしてくれます。

次に、実際に足りないものをインストール。
正直使いはじめでよくわかっていないのだが、ターミナルに

```terminal:ターミナル
brew install php@7.4
```

を入力したら足りないものをインストールしてくれました。


あとは再度実行。

```terminal:ターミナル
composer global require Laravel/installer

```

そして、最後に

```terminal:ターミナル
echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
```

source [file]
でファイルに書かれた内容を 忠実にコマンドとして実行してくれるので、

```terminal:ターミナル
source ~/.bash_profile
```

でlaravelがコマンドとして入力されるようになります。
以上。

やっとlaravel使えるぜ！！
ガンガン開発していきましょう。
配列の中のリーダーとなる数字を見つける

https://www.geeksforgeeks.org/leaders-in-an-array/
より

# 問題

配列の中のリーダーとなる数字を見つけなさい。
リーダーとなるとはその要素の右側にその要素以下の数字がない要素とする。

例
[16, 17, 4, 3, 5, 2]
=> [17, 5]

# 解答

さてあんまり難しいことは考えずに普通に実装してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134294/874e2443-3c7f-c153-d07f-c8897193d696.png)

上記図のように要素ごとそれ以降の要素全てと比べてみて数値を比較して大きな数値がなければその数をリーダーにすれば良さそうです。

簡単ですね。実装してみましょう。

```js
function findLeaderNumbers(arr) {
    const res = []
    for(let i = 0; i < arr.length - 1; i++) {
        let isLeader = true
        for(let j = i + 1; j < arr.length; j++) {
            if(arr[i] <= arr[j]) {
                isLeader = false
            }
        }
        if(isLeader) {
            res.push(arr[i])
        }
    }

    return res
}
```


さてこのコードはロープの中にループが存在します。このときこのコードは最適なコードと言えるでしょうか？

# 計算量を考えてみる

このアルゴリズムはループが二つネストされているため配列の大きさをNとするとO(n*n)の計算量と言えます。

## O記法とは何か

- プログラムがどれくらいの計算量を必要としているかの指標
- 入力された変数の数に対してプログラムのステップ数がどれだけ変わるかを式に表すことで表現できる
- 大体のケースで入力の配列の長さをnと定義する。なので配列を一回回すだけだったらO(n)、ループがネストするならO(n*n)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134294/bf81b749-2cbd-81eb-4225-4c6b96f927e3.png" height="400">

wikipediaより

さて今回のこの問題O(n*n)より効率的な方法はないでしょうか？
実はO(n)で解ける方法があります。難しいアルゴリズムとかを知っておく必要はありません。

# O(N)の解法

よくこの問題をみてみると右から配列をみていけばより効率的にリーダーを探せることに気づくかと思います。

以下のように右からの探索で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134294/5ea318d4-b6f8-0f15-4749-6bb88ef92934.png)

右からの最大値を変数に保持しておけば一回配列を探索するだけで問題を解くことができます


## 実装

```js
function findLeaderNumbers(arr) {
    let prevMax = arr[arr.length - 1]
    const res = [prevMax]
    for(let i = arr.length - 2; i >= 0; i--) {
        if(arr[i] > prevMax) {
            prevMax = arr[i]
            res.push(arr[i])
        }
    }

    return res
}

```

# まとめ

これが競技プログラミング？と言えるかどうかわかりませんが、プログラミングの問題は難しい数学やアルゴリズムの知識がないと立ち向かえないと思われるかたもいらっしゃると思います。また実務のコーディングとは全く違うと考える方もいるかと思います。

僕自身そうでしたが、この問題を１年前にやってみてプログラミングの問題って結局お題を解釈してそれを達成するために自分の知識を最大限使って効率よくプログラムを実装するってことなんですよね。
仕様をきちんと解釈して自分たちのチームでいかに効率よくその問題に対処するかって話で、そこにはもちろん難しい知識が必要な場合もありますが、基本は自分の頭で考えて行動・実装していく、これってまさに実務でやってることと同じではないでしょうか。ぁ人間関係の問題とか仕様の方を捻じ曲げるとかいろんなことはできるにせよ）

ということでプログラミングの問題解くの好きになって僕ですが、まだまだ全然実力無くて多分中学生とかにも余裕で負けるレベルなのでもっと頑張っていきたいと思います。
[備忘録]Ruby開発環境の作りかた

MacOSがMojave以前の場合の方法
## rbenvとruby-buildをインストール
```:ターミナル
$ brew install rbenv ruby-build
```

## rbenvをどのディレクトリからでも使用できるようにする
```:ターミナル
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
bash_profileはMacOSのヴァージョンがCatalinaかMojave以前かで異なるので注意

## bashファイルの変更を反映
```:ターミナル
$ source ~/.bash_profile
```

## readlineをインストール
```:ターミナル
$ brew install readline
```

realineはターミナル上で日本語入力を可能にするものです

## readlineをどこからでも使用できるようにする
```:ターミナル
$ brew link readline --force
```

## rbenvを利用してRubyをインストール
処理に時間がかかります

```:ターミナル
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.5.1
```

## Rubyの使用するバージョンを指定する
```:ターミナル
$ rbenv global 2.5.1
```

## rbenvを読み込んで設定を反映
```:ターミナル
$ rbenv rehash
```

## Rubyのバージョンを確認
```:ターミナル
$ ruby -v
```
バージョンが表示されれば成功

## MySQLのインストール
```:ターミナル
$ brew install mysql@5.6
```

## MySQLの自動設定
PCを起動すると自動でMySQLも起動するように設定する

```:ターミナル
$ mkdir ~/Library/LaunchAgents 
$ ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```

## MySQLをどこからでも操作できるようにする
```:ターミナル
# mysqlのコマンドを実行できるようにする
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
# mysqlのコマンドが打てるか確認する
$ which mysql
# 以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql
```

## Ruby on Railsの準備
### bundlerのインストール
```:ターミナル
$ gem install bundler
```
bundlerとはRailsの拡張機能であるgemを管理するためのもの

## Railsのインストール
```:ターミナル
$ gem install rails --version='5.2.3'
```

## rbenvの再読み込み
```:ターミナル
$ rbenv rehash
```

## 導入できたか確認
```:ターミナル
$ rails -v
```
バージョンが表示されれば無事導入成功
Install Docker on Ubuntu 18.04 on WSL2

![docker-logo.png](https://qiita-image-store.s3.amazonaws.com/0/348116/c120e083-edc3-19b3-e543-9a4b6c6e111a.png)

# 2020/10/23 追記

記事内容は、[Zenn.dev](https://zenn.dev/ymasaoka/articles/install-docker-ubuntu-1804-wsl-2) へ移すことにしました。
~~当面の間、内容はこちらにも記載しておきますが、そのうち削除するつもりです。~~

Qiita での記事内容は削除しました。
Zenn.dev 側で掲載していた内容と同じものを公開しているので、そちらをご確認ください。

- [Install Docker on Ubuntu 18.04 on WSL2](https://zenn.dev/ymasaoka/articles/install-docker-ubuntu-1804-wsl-2)
GoogleHomeからMicrosoftToDoにタスクを追加する

# 背景
我が家では買い物リストとしてWunderlistを使っています。
いえ、使っていま「した」…。
そう、Wunderlistは2020年5月にサービス終了することが決定し、
後継サービスであるMicrosoftToDo(以下、ToDo)に移行することになったのです！

ただ、後継サービスといっても全く同じサービス内容ではなく…
特に我が家が重宝していた機能「メールでのタスク投稿」ができなくなりました。

IFTTTではGoogleAssistantとWunderlistと直接連携することができなかったため、
GoogleHome経由でWunderlistにメールを送り、お買い物リストにタスクを追加していました。

メールによるタスク登録機能がなくなり、焦ってIFTTTを見てみたところ…
**やっぱりToDoもサービス連携がないじゃないですか！**[^1]
[^1]: 2020年2月29日現在
というわけで、以下のことを実現できるように試みました。

# 実現したいこと
- GoogleHomeに「お買い物、～」と言ったら、ToDoにタスクとして追加される
- タスクはToDoの家族共有の「お買い物リスト」に追加される

# 方法
| 連携サービス | TriggerApp          |ActionApp|
|:------------:|:--------------------:|:-------:|
| IFTTT       | GoogleAssistant     | Slack   |
| Zapier      | Slack               |ToDo     |
IFTTTを使ってGoogleAssistantからslackにタスクを投稿し、Zapierを使ってslackからToDoにタスクを投稿しました。[^2]
[^2]: ZapierにもGoogleAssistantとの連携はあるのですが、BETA版のようで`To use them, say "Ok Google, start Zapier", then say the custom phrase or trigger the Zap by name.`との表記があったので、タスク投稿がちょっと面倒かなと思ってやめました。[^1]
手順は以下の通りです。

## IFTTTの設定
thisにGoogleAssistant、thatにSlackを設定します。
slackはもともと家族でひとつワークスペースを持っていたので、そこに新たにチャンネルを追加しました。

1. thisの設定は[こちらの記事](https://qiita.com/kobusan/items/378451d84f7fc5c379d1)をご参照ください。
2. thatの設定は以下としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/0b026560-c65a-a68d-7888-81260a789f4f.png)

3. SaveしてConnectして、テストします。
次のZapierでのテストデータにもなるので何か適当なアイテムを投稿しておきます。

## Zapierの設定
アプリ連携サービスってIFTTTしか使ったことなかったんですが、今回ToDoとの連携が可能なZapierを使用しました。
###When this happens …
1. Choose App & Eventsでアプリと何をきっかけにするのかを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/79efbe37-e7f5-68a6-f368-1fe504f35b00.png)
2. Choose AccountでSlackのアカウントを選び、アプリ連携の承認をします。
3. Customize Message Postedでチャンネルとボットに対応するか否かを選択します。IFTTTからの投稿になるので「yes」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/409db344-d3f5-801d-6a30-043864bdc2e8.png)
4. Find Dataで先ほどIFTTTを使って投稿しておいたMessageを選択します。

###Do this …
1. Choose App & Eventsでアプリと何を実行するのかを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/ce876d6e-8a7e-e8a0-c6c1-7fa247ce1e41.png)
2. slackと同様ToDoのアカウントを選びます。
3. Customize TaskでTaskのタイトルにSlackの投稿のどの情報を入れるのか、どのリストに入れるのかを選択します。この時選択できるのは**自分が所有者になっているリスト**のみなので、共有リストを使用したい場合は設定者＝所有者になっておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/081ab212-07ad-145a-8fee-a7609fb598c8.png)
4. Send Dataでテストを行って、うまくいけば完了です！（下はうまくいった後の画面です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213964/3ae71f9c-ccc2-c6b7-ea09-f6b18930e5eb.png)

# 結果
- GoogleHomeに「ねえグーグル、お買い物、いちごジャム」と言うと、Slackに「いちごジャム」という投稿がされ、ToDoの買い物リストの**一番上に**「いちごジャム」が追加されるようになりました。普通にタスクを追加すると、**一番下に**追加されるので不思議です。しかし、個人的には上に追加してほしかったので嬉しい！
- 一度Slackを見に行くためか、処理はちょっと遅めです。でも、買い物するときに入っていればいいので十分です。

# 補足
- 最初はWebhookを介して連携させる仕組みを作ったのですが、ZapierではWebhookはpremium機能らしく、トライアル期間が終わるとサービスが停止されてしまいました…。というわけで、フリープランのまま使えそうなやり方に切り替えました。
【Excel】セル入力時、1文字目が勝手に確定されてしまう不具合の原因と対処

# 症状
この不具合は、Office365、2016環境下で特定のブック上でたびたび遭遇していた。
OSはWindows10でのみ確認している。

つまりどういうことなのかは以下のGIF画像を参照。
これは「ファイル」と入力したいのに一文字目が勝手に確定されてしまうため、
「ｆあいる」になってしまう、の図。

![syoujo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/34610363-a464-9459-8568-8821bfd5ed4c.gif)

いったんこれが始まるとそのブック上ではどのシートでも100％発症する。

一応の回避策としては、

* 1文字目を入力後、一呼吸おいて2文字目以降を入力。ただし回避できない時もある
* F2で編集モードにしてから入力。こちらは確実に回避可能

過去に一度調べたときはいくつかの原因と対処法が出てきたが、
どれも過去のExcelのものだったり、おそらく似たような違う事象のことだったりで
解決する方法が見つからず諦めてしまった。
自身での調査は、どうやらクエリを使用しているブック上でだけ起きていそう、というところで詰んだ。

先日また調べていたら、今度はあっさりと解決策を記してくれていた方の記事に巡り合えた。

# 原因と対処

こちらの記事の作者様、本当にありがとう。

[Excel2019　クエリが原因で日本語入力の一文字目が勝手に確定する] (https://www.travel-and-mylife.com/2019/07/excel-ime-problem.html)

発生条件は **サイドバーの「クエリと接続」でいずれかのアイテムを選択したままサイドバーを閉じている** ということ。
このアイテムを選択するというアクションで、クエリが含まれている範囲が選択状態になるので
おそらくそのあたりが干渉してしまってる、完全にバグと言っていい案件。
セル編集モード時は排他制御のようになるので、その間は影響を受けなかったというのも納得。
あと情報が出てこなかったのは、クエリを使用する人の絶対数が少ないからというのも関係してるのかな。

ということで解決策は、「クエリと接続」のアイテム選択を外してから閉じる。だった。

![kaiketsu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/1e41b290-0440-193d-5c47-5c12bd8fae56.gif)

発見した人すごい。

どういう症状かが動画であれば伝わりやすいと思ったので、
改めてまとめさせていただきました。

# 参考記事

[Excel2019　クエリが原因で日本語入力の一文字目が勝手に確定する] (https://www.travel-and-mylife.com/2019/07/excel-ime-problem.html)

[Excel PowerQuery使用時に、空白セルへの日本語入力で1文字目が勝手に変換確定されてしまいます - Microsoft Tech Community - 331530] (https://techcommunity.microsoft.com/t5/%E6%97%A5%E6%9C%AC%E8%AA%9E/excel-powerquery%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AB-%E7%A9%BA%E7%99%BD%E3%82%BB%E3%83%AB%E3%81%B8%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%A71%E6%96%87%E5%AD%97%E7%9B%AE%E3%81%8C%E5%8B%9D%E6%89%8B%E3%81%AB%E5%A4%89%E6%8F%9B%E7%A2%BA%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99/idi-p/331530#.XTme138uLMg.link)