OmniAICreator/Qiita-1.07M huggingface dataset:
ひかり電話のサブ番号での発着信をasteriskで実施する話



ひかり電話では、ISDNの時のように、回線1本で電話番号を２つとることができるマイナンバーというオプションがあります。
カードではありません。

企業では、電話とFAXを番号分けて利用していることが多いのであれを自宅＋Asteriskで実現してみます。
後、家にはfaxが複合機しかありませんし、通常のアナログ電話機もありません。

回線は1本なので、FAX受信中に通話はできませんし、着信もできません。ですが、個人宅なので全く問題ありません。

FAX複合機は、Brother製MFC-L3770CDW。
SIP自体は実装されていますが、NTTのもつNGN網だけでやり取りが可能なデータコネクトのみがサポートされていて
ひかり電話には接続できません。
仕方がないので、GrandStream社製のHT801というVoIPアダプタを挟んで変換します。
Amazonでは7000円ぐらいで売られていて高い。中古を探すも割とニッチな商品のようで見つからない。
見つかっても高い。

結局、Aliexpressで中古品は怖かったけど探して購入しました。2101円でした。
1/3ぐらいの価格で入手でき、ちゃんと動いたので良かった。

HT801はUSBで動く優れものです。
LinkSysのものも5V2AなのでUSBでも動かせそうですが、本体側の端子が〇型です。

届いたHT801を初期化して、LINEを複合機へ、LANはSWへつなぎ、DHCPでアドレスをとってweb経由で設定。
IPアドレスを特定するために、電話機側から***をダイヤルした後、02とするとIPアドレスを英語でしゃべります。
それをメモしてもいいのですが、DHCPの設定でmacアドレスによる固定IP配布にしてもいいし、switchへログインして
arpをみるのも特定する方法の一つかと。

asteriskはバージョン13を使用、NTTへ直接接続しているため、HGW向けのパッチなどはあてることなく使えました。

HT801と外線発信向けのsip.conf

```
register => 048xxxxxxx:@ntt-east.ne.jp/048xxxxxxx

;NTTのひかり電話網へ接続する設定
[ntt]
type=peer
host=118.177.125.1
nat=never
;fromdomain=118.177.125.114
canreinvite=no
caninvite=no
session-expires=300
defaultexpiry=3600
;dtmfmode=rfc2833
dtmfmode=inband
context=pstnin
qualify=yes

;HT801との接続をした設定
[902]
type=friend
username=902
secret=xxxxxxxx
canreinvite=no
host=dynamic
dtmfmode=rfc2833
context=pstnfaxout
qualify=yes
```

extentions.conf
faxに関連する部分のみ抜粋

```
MAINNUMBER=048xxxxxxx
SUBNUMBER=048yyyyyyy

[pstnfaxout]

exten => _0.,1,Set(CALLERID(num)=${SUBNUMBER})
exten => _0.,n,Set(CALLERID(name)=${SUBNUMBER})
exten => _0.,n,SIPAddHeader(P-Preferred-Identity:<sip:${SUBNUMBER}@ntt-east.ne.jp>)
exten => _0.,n,Dial(SIP/${EXTEN}@ntt)
```

SIPAddHeaderの、P-Preferred-Identityを追記して、SUBNUMBERを指定すると発信することができました。
このヘッダは、ひかり電話の仕様書に書いてあったり、voip-info.jpのサイトの最下部にも書いてあったのですが、
PBXに知見が全くないため設定を見つけるのに苦労しました。

参考情報
https://voip-info.jp/index.php/%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1HGW_MAC%E8%AA%8D%E8%A8%BC


着信が来た時の振り分け処理

```
[pstnin]

; 発信先電話番号を取得
exten => ${MAINNUMBER},1,Set(TO_DIAL=${SIP_HEADER(TO):5})
exten => ${MAINNUMBER},2,Set(TO_DIAL=${CUT(TO_DIAL,@,1)})
; 振り分け処理
exten => ${MAINNUMBER},3,GotoIf($[${TO_DIAL} = ${MAINNUMBER}]?dial1)
exten => ${MAINNUMBER},4,GotoIf($[${TO_DIAL} = ${SUBNUMBER}]?dial2)
;
; メイン回線の場合、通話録音をセット
exten => ${MAINNUMBER},5(dial1),Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-IN-${EXTEN})
exten => ${MAINNUMBER},6(dial1),Monitor(wav,${CALLFILENAME},m)
; 901着信
exten => ${MAINNUMBER},7(dial1),Dial(SIP/901,25)
; 留守電応答
exten => ${MAINNUMBER},8(dial1),Wait(1)
exten => ${MAINNUMBER},9(dial1),Voicemail(901)
exten => ${MAINNUMBER},n,Hangup()
; サブ回線の場合、FAX受信
exten => ${MAINNUMBER},n(dial2),Dial(SIP/902,25)
exten => ${MAINNUMBER},n,Hangup()
```

sip set debug on
をいれて着信番号をテストした結果、SIP_HEADERの5に着信番号が載っていたのでそれをもとにfaxである902に直接転送。

動作テストでは、いちいち複合機の電話番号を入れるのが面倒なので、内線番号903を作ってAGEPhoneアプリから発信して
確認していました。

外線は、この設定で3年は使えているので仕様変更が入らないことを祈ります。
[AWS] ssm セッションマネージャー タグによるアクセス制限

特定のタグを持つEC2にのみセッションマネージャーでログインできるようにするIAMポリシーです。
部署ごとにEC2をタグで分けている場合などに使えると思います。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-examples.html)




## IAMポリシー
タグ"DIV"に"APP"を含むものにのみアクセスできるポリシー

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceProperties",
                "ec2:describeInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/DIV": [
                        "APP"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
}
```

### 複数タグを指定する場合
Conditionの箇所に下記のように複数記載します。

```
"Condition":{
            "StringLike":{
               "ssm:resourceTag/tag-key1":[
                  "tag-value1"
               ],
               "ssm:resourceTag/tag-key2":[
                  "tag-value2"
               ]
            }
```

### ポリシーについて

AWSコンソールからアクセスしたい場合は下記の部分が必要でした。CLIからのみアクセスする場合は不要です。

```
　　　　{　　
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceProperties",
                "ec2:describeInstances"
            ],
            "Resource": [
                "*"
            ]
        },
```

## ログイン試行結果

### CLI
タグがついているインスタンス

```
% aws ssm start-session \
--target タグがついているインスタンスIDを指定

Starting session with SessionId: セッションID
sh-4.2$
```

タグが付いていないインスタンス

```
% aws ssm start-session \
--target タグがついていないインスタンスIDを指定

An error occurred (AccessDeniedException) when calling the StartSession operation: User: ユーザ is not authorized to perform: ssm:StartSession on resource: インスタンスID
```

### コンソール
タグがついていないインスタンスに接続を試みると同様のエラー

```
User: ユーザ is not authorized to perform: ssm:StartSession on resource: インスタンスID
```

## その他
Windowsでも同様
プチロボMS3LをROSのジョイスティックで動かすシンプルなpythonコード

#はじめに

ROSのlistenerノードのサンプルコードを少し書き換えて、WR-XX制御基板とシリアル通信をする操作を加えた簡単なpythonコードを書いて、プチロボ入門用の3軸指型ロボットのMS3Lを操作してみた。

#環境

- Ubuntu18.04LTE
- ROS Melodic
- Wonderkit/MS3L
- ポリパッド3ターボゲームパッド

#やっていること

ジョイパッケージを利用して配布されたトピックを読み込んで、サブスクライブしたゲームコントローラのジョイスティックの値にサーボモータの位置を割り当てて動かすだけです。モータの回転速度は固定値を利用しますがpythonなのでソースコードは簡単に変更できます。

#ソースコード

```simple_joy_wrxx_node.py
#!/usr/bin/env python
import serial, struct, time
import rospy
from sensor_msgs.msg import Joy

_serial = serial.Serial('/dev/ttyUSB0')
_serial.baudrate = 38400
_serial.parity = serial.PARITY_NONE
_serial.bytesize = serial.EIGHTBITS
_serial.stopbits = serial.STOPBITS_ONE
_serial.timeout = 0.05

def callback(data):
    command = [0xFD,0x0B,0x06,0x01,0x0A,0x6E,0x0,0x6E,0x0,0x6E,0xFE]
    command[5] = int(data.axes[0] * 50 + 110)
    command[7] = int(data.axes[1] * 50 + 110)
    command[9] = int(data.axes[2] * 50 + 110)
    for cmd in command:
        data = struct.pack("B", cmd)
        _serial.write(data)
    print(command)
    _serial.flush()

if __name__ == '__main__':
    rospy.init_node('joy_wrxx_node')
    rospy.Subscriber("joy",Joy,callback)
    rospy.spin()
```
#終わりに

ジョイスティックのボタンに動作を割り当てて動かすことも簡単にできそうです。ROSで「いつC++（や他の言語）を使うべきか、悩んでいたのですが、オライリーの「プログラミングROS」が一つの回答をしてくれていました。
>C++のノードは同じようなPythonのノードよりも速い場合がありますが、その速度の向上が、C++ノードを書いたりデバッグしたりする時間に見合うものかどうかが重要です。

自分の場合、C++を使わないと決めてから、このコードを書くまでほんの数日でした。というか、このコードを書くのに使った時間はのべ１時間くらいです。C++で書いていたらもっとずっと時間がかかっていました（C++の学習中なので・・・）。やっぱり、ROSのようなプロトタイプづくりにはPythonを利用するのは合理的な選択と言えそうですね。
[JS | jQuery]1行で指定要素までスクロールする


#1行で指定要素までスクロール
```js
$('#target').get(0).scrollIntoView(true);
```


# jQuery使わないバージョン
```js
document.getElementById('targetElementId').scrollIntoView(true);
```

# 使用例
```js 
    $(window).on("load",function() { //ページ全体が読み込まれた時に動く
        $('#target').get(0).scrollIntoView({ // スクロール
            behavior: 'smooth' // スムーズに
        });
    });
```

# メモ
jQueryで素のJSの「document.getElementById」と合わせる時は「.get(0)」が必要。

#参考：
https://qiita.com/amamamaou/items/728d571d508347b2bc82
ROOTのインストール

# ROOTのインストール

xcodeを再インストールしたところ, ROOTが動かなくなったので, 再インストールする.
CERNが開発したデータ解析ツールで, グラフやヒストグラム作成から, 多変量解析(TMVA), 統計処理まで多岐にわたり用いられている.
公式HPは[ここ](https://root.cern.ch/).

## 環境

```
macOS: Catalina 10.15.7
xCode: version 12.4
```
`cmake`は, `homebrew`でインストールしておく.

## 手順
1. gitでレポジトリをもってくる.

    ```bash:terminal
    mkdir ~/tool/
    cd ~/tool/
    git clone https://github.com/root-project/root.git root_src
    cd root_src
    git checkout -b v6-22-06 v6-22-06 # choose the newest version 
    ```

1. `~/tool/root_build`を用意し, `~/tool/root_install`にインストールする.

    ```bash:terminal
    cd ~/tool/
    mkdir root_build root_install
    cd root_build
    cmake -DCMAKE_INSTALL_PREFIX=../root_install ../root_src
    cmake --build . -- install -j4
    ```
デフォルトでは`python2`環境でライブラリを構築してしまうので, `python3`を用いる場合は以下のように明示的に示す必要がある.

    ```bash:terminal
    cmake -DCMAKE_INSTALL_PREFIX=../root_install -DPYTHON_EXECUTABLE=~/.pyenv/shims/python ../root_src
    cmake --build . -- install -j4
    ```
自分のPC環境では`pyenv`でpythonを管理しているので, そのpathを明示している.

1. 以下の3行を`~/.bashrc`に追加して, rootが使える環境を整える.

    ```bash:~/.bashrc
    cd ~/tool/root_install                                                                                                                                                    
    source bin/thisroot.sh                                                                                                                                                                       
    cd - > /dev/null 
    ```

これで, rootが使えるようになる. 前インストールしたソースやディレクトリは消去する.
[Bootstrap4] レイアウトの基礎


#グリッドシステム
Bootstrapの、デバイスの画面を12分割し、管理する仕組みのことです。
その12分割されたグリッド上に沿うように、コンテンツを配置していきデザインを整えます。
このグリッドを上手く使って、PC・スマホなど画面幅の異なるデバイスで見たときにもレイアウトが崩れないようにします。

#ブレイクポイント

Bootstrapには画面のサイズによってレイアウトを変更できる特徴があります。
例えば大きなPCで見てたらこの画面、小さなスマホで見ていたらこの画面、タブレットで見てたらこの画面などを切り分けることができるのです。
そのレイアウトが変わる変更点をブレイクポイントといいます。

　　　　　　|            |       |        |         |              |
-----------|------------|-------|--------|---------|---------------|
画面幅（px）  |~557       |576~767|768~991 |992~1199  |1200~
名前       |Extra Small|Small   |Medium |Large      |Extra Large
クラス名     |           |sm     |md      |lg        |xl
主なデバイス |            |スマホ  |タブレット  |PC        |大型ディスプレイ   


#コンテナ
`container`
Bootstrapでは「container（コンテナ）」というCSSクラスが用意されています。これは、コンテンツを入れる箱の様なものです。また、中に入れるコンテンツを画面中央に配置します。

`container-fluid`
こちらは「width: 100%」と指定したときのように、横幅はどのデバイスでも画面幅全体となります。

container-fluidはメディアクエリの設定は特にありません。
どのデバイスで見ても横幅100%なのです。

`row`

行という意味を持つクラスで、このクラスは、横並びにしたいコンテンツがある時、それらをこのrowクラスで囲うという使い方をします。

`col（カラム）`

「カラム」とは12分割した列のことです。このクラスは、「col」の後にブレークポイントとカラム数指定の記述を加える事ができます。
<a href="https://gyazo.com/d4824cd4e9a24e7d80c0527834eb8c9c"><img src="https://i.gyazo.com/d4824cd4e9a24e7d80c0527834eb8c9c.jpg" alt="Image from Gyazo" width="4032"/></a>

#固定幅コンテナ
・幅のサイズが固定
・ただしブレイクポイントでは変化

#可変幅コンテナ
・ブラウザの横幅いっぱいに広がる
・画面全体のコンテンツに影響
NetlifyでNext.jsのSSRがしたかっただけなのに超ハマった話

#結論

```コマンド
npm install --save next-on-netlify
```

をする必要がある。

https://github.com/netlify/next-on-netlify

（隠れてないでもっと自己主張しててくれてもいいのに。）

#エラーログ

`
2:10:00 PM: Error occurred prerendering page "/". Read more: https://err.sh/next.js/prerender-error
2:10:00 PM: Error: Error for page /: pages with `getServerSideProps` can not be exported. See more info here: https://err.sh/next.js/gssp-export
2:10:00 PM:     at Object.exportPage [as default] (/opt/build/repo/node_modules/next/dist/export/worker.js:16:281)
2:10:00 PM: info  - Exporting (5/7)
2:10:00 PM: info  - Exporting (7/7)
2:10:00 PM: Error: Export encountered errors on following paths:
2:10:00 PM: 	/
2:10:00 PM:     at exportApp (/opt/build/repo/node_modules/next/dist/export/index.js:30:1103)
2:10:00 PM:     at processTicksAndRejections (internal/process/task_queues.js:97:5)
2:10:00 PM: error Command failed with exit code 1.
2:10:00 PM: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
2:10:00 PM: ​
2:10:00 PM: ────────────────────────────────────────────────────────────────
2:10:00 PM:   "build.command" failed                                        
2:10:00 PM: ────────────────────────────────────────────────────────────────
2:10:00 PM: ​
2:10:00 PM:   Error message
2:10:00 PM:   Command failed with exit code 1: yarn run build && yarn run export
2:10:00 PM: ​
2:10:00 PM:   Error location
2:10:00 PM:   In Build command from Netlify app:
2:10:00 PM:   yarn run build && yarn run export
`

このエラーログからたどり着ける人がいますように。


#補足（設定ファイル）

ルートディレクトリに、以下のファイルを作成

```netlify.toml
[[redirects]]
  from = "/*"
  to = "/index.html"
  status = 200

[build]
   command   = "npm run build"
   functions = "out_functions"
   publish   = "out_publish"
```

同じようにルートディレクトリに以下のファイルを作成

```next.config.js
module.exports = {
  target: 'serverless'
};
```


#ひとりごと
普段の業務ではVueなのですが、Reactの方がやってて面白いし発見が色々ある気がします（肌感）

Netlifyはドメインも簡単に設定できて最初からhttpsだし大分楽と感じました。
EC2のRoute53でドメインをとったんですが、DNSを登録しただけでした。

これはReactかNext.jsの知識が浅いだけかもしれないのですが、
{children}以外の共通レイアウト部分でCSSが当たる前に表示されてしまい、非常にみっともないことになっています。。
何か情報あれば教えていただけると幸いです。（styled-componentを使ってます）
面接での技術質問の反省①

#はじめに
今回も、昨日の面接でいただいた話から広げていきます。

#アプリの課題

面接の技術的な質問にて…

```ruby:users_controller.rb
def show
  @users = User.all
end
```
（あくまでも、例です）

ActiveRecodeの「all」を使っているけど、
「もし、ユーザーが１万人に増えて、処理が遅くなるとしたら、どうする？」

##その時の考え
正直、今まで考えたことがありませんでした。
学習してきた中で、データベースの操作を表すCRUDがあって、
特に条件を付けずに、情報を取ってくるときは、allと安易に理解していました。

##改めて復習してみる
CRUDとは…
C(create)
R(read)
U(update)
D(delete)
の頭文字で、データベース操作を表しています。

今まで使っていた、各操作の代表的なものは、
###C(create)

```ruby

user = User.create
```
新しく情報を作成するときに使っていました。
コントローラーで`create`のメソッド内で使うことが多くありました。

###U(update)

便宜上、こちらを先に…

```ruby

user = User.find(id:1)
user.name = Qiita
user.save
```

###R(read)

```ruby

users = User.all
```
保存された情報を表示させるようなときに使っていました。
ビューでeach文を使って数に応じて表示させたり、フォームのプルダウンで選択できるようにしたりする場面が主でした。

###D(delete)

```ruby

user = User.find(params[:id])
user.destroy
```
必要なくなった情報を削除したいときに使います。
ちなみに`find`はR(read)です。

##なぜ、allでは処理が遅くなるのか…
改めて、この問題を考えるためには、ActiveRecodeとは何かを考えます。
私の認識としては、
SQL文を直接書かずとも、Railsが勝手に書いて、処理をしてくれるもの
です。
つまり、面接での質問の意図と処理が遅くなるとは、
<font color=red>~~「めっちゃSQL文が生成されているけど、本当に全部必要？」~~</font>
<font color=red>「必要のない情報も呼び出してるけど、全部必要？」</font>
ってことだと考えます。
「はい、必要ではない場合もあると思います。」
大まかに言うと同じだと思うのですが、
~~具体的に言うと、
Amazonで例えるなら…
全ての商品をいちいち表示してないですよね。きっとそんなことしたら、商品の数だけSQL文が生成され、×(かける)ユーザーの数となり、素人でも処理が遅くなることが想像できます。
これを抑えることができないか？
と、いうことです。~~
このままAmazonを例にすると答えが導き出せそうです。
実際にAmazonではどうしているか。
パッと思い浮かぶ解決方法は2つあります。
- 検索でヒットした情報のみを表示させている。
- 表示も一度ではなく、ページを分けている。(1ページに◯件まで)
これはヒントになりそうです。

自分のアプリケーションにも取り入れることができないか。他の方法はないか、もう少し考えてみたいと思います。



##最後に
現場では、処理の速度や情報が大量になったときを想定して、設計していることを知ることができた面接でした。
やっぱり、エンジニアってすげぇって話です。
続きは、また明日。
LaravelのタイムスケジュールをXサーバで利用する際、crontabでの設定に戸惑った話（備忘録、初心者）

LaravelのタイムスケジュールをXサーバで利用する際、多少苦戦したので、備忘録として投稿します。

【試した環境】
Xサーバ:プランX10
Laravel:ver7
PHP:ver7.4

【本文】
https://readouble.com/laravel/7.x/ja/scheduling.html
こちらでは、crontabに
「* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1」
と登録するように記載されているが、Xサーバは共有サーバであるため、crontabに登録する際、phpの場所とバージョンを指定してあげる必要がある。
調べてみると、「***** /path/php7.4 ~」のように先頭でphpを指定するとよいとあったが、エラーが発生。試行錯誤した結果、単純に「* * * * * cd /path-to-your-project && /path/php7.4 artisan schedule:run >> /dev/null 2>&1」とすると無事解決した。

【余談1】
https://www.xserver.ne.jp/manual/man_program_soft.php
こちらで、Xサーバのphpパスを確認できます。
【余談2】
「/dev/null」を変更すると、ログが取れるので原則設定しておいた方がいいと思います。
AndroidStudioの新規プロジェクト用のbuild.gradle.kts

Android Studioの新規プロジェクトでは今のところktsを選択できませんね。すぐに対応されると思いますが。
がっつり新規で作る時は別にいいのですが、ちょっとした機能の確認時とかに新規プロジェクトつくったときに、ktsに慣れてるとちょっとした編集も面倒に思えてきて、でもktsに変換するのもめんどくさいということになってしまったので、コピペすればいいものを投稿しておこうという記事です。

※AGP 7.3.1になっても対応されていないので更新

```kotlin:settings.gradle.kts
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My Application"
include(":app")
```

```kotlin:build.gradle.kts
plugins {
    id("com.android.application") version "7.3.1" apply false
    id("com.android.library") version "7.3.1" apply false
    id("org.jetbrains.kotlin.android") version "1.7.22" apply false
}
```

```kotlin:build.gradle.kts
plugins {
    id("com.android.application")
    id("kotlin-android")
}

android {
    namespace = "com.example.myapplication"
    compileSdk = 33

    defaultConfig {
        applicationId = "com.example.myapplication"
        minSdk = 26
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        viewBinding = true
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.5.1")
    implementation("com.google.android.material:material:1.7.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.4")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
}
```

以上
Excel VBAで日付を0埋めする方法

#日付を0埋めする方法

2020年02月02日06時04分01秒

↓↓これを
202022641

↓↓　こんな感じにする
20200202060401

###サンプル
`Right("0" & Month(Date), 2)`

Right("頭埋め文字" & 数値, 桁数)
Right(String(桁数-1, "頭埋め文字") & 数値, 桁数)
[生産性向上]サクラエディタの使い方

新卒で１年ほどエンジニアをやって来ましたが、「プログラミングができる」ことよりも、「より早く（生産性高く）」「問題解決するための方法」を身につける方が圧倒的に大切だと感じています。
今回は自身が「**生産性を高めるため**」「**問題解決するため**」に役立った考え方・知識・スキルの一つである「テキストエディタ」についてまとめました。

テキストエディタのおすすめはサクラエディタです。（処理が早く、検索や置換に優れているため）

#テキストエディタにまとめるべき内容#
・確定した仕様
・上司・メンバーと会話した内容
・会話で確定した内容
・資料の格納先のPath
上記のような「**後から検索して見返す可能性があるもの**」については**一つ**のエディタファイルにまとめると良いです。

#理由：
仕事が忙しいとき程メモすることが増えますが、忙しい時は数秒の余裕が無いことが多いです。
つまり、複数のメモ帳を開いて使い分ける余裕がなくなりがちになります。

そのため、一つにすることでメモの記入先を選択する必要がなくなります。
また、後で検索する際に、必ず一つのメモ内に答えがあるため、後の生産性も上がります。

#メモのコツ#
・後から検索しやすい形でメモすることが大切です。決定事項などはもちろん、日付・人物などは意識して入れましょう。
（ex)業務開始時に一度だけ日付を書き、下にその日のメモを積み上げていく。

#ショートカットキー#
必須で覚えるべきは
・Ctrl+F　検索
・Ctrl+R　置換
・F3　次を検索
・Shift+F3　前を検索

[キー割り当て一覧(サクラエディタ)](https://sakura-editor.github.io/help/HLP000107.html)

#生産性を上げるために・問題解決の方法を身につけるために#
こちらの記事により多くの手段をまとめてます。
[]()
オープンソースで作ったテキストマイニングシステムのご紹介 (NLP4J)

[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) 

# 概要

NLP4J は、自然言語処理技術を用いた分析のためのフレームワークです。
「データの収集」「形態素解析や構文解析といったアノテーターの利用」「分析アプリケーション」
を容易に利用するための仕組みです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4a00601b-424b-4c62-7de4-405b24b1e373.png)


# テキスト分析システム

Googleをはじめとした検索システムは皆様なじみがあると思うのですが、
テキスト**分析**システムはなかなか見かけないと思います。

そこで私が日曜大工のオープンソースで開発し、
一般公開しているサイトがありますのでご紹介したいと思います。

#0.データ

NLP4J Analytics 国土交通省不具合情報分析
https://nlp4j.azurewebsites.net/search.jsp
です。（今後データを追加変更する可能性があります。）

元データは日本の国土交通省が公開している「不具合情報検索」から取得したデータを使っています。
http://carinf.mlit.go.jp/jidosha/carinf/opn/index.html
約３年分のデータを取り込んであります。


使い方はシンプルです。

#1．検索
検索窓に「ニッサン」と入力してボタンを押すと、日産自動車の不具合情報が表示されます。（※特定の会社の故障情報の件数を強調したいわけではありません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/5d4d3409-bbc9-bb52-db17-dd1966dfd760.png)

ここまでは「検索」と同じで、国土交通省のサイトで提供されている検索機能と同じです。

#2．時系列分析

同じ画面に「時系列」タブがあるのでここをクリックすると
全体の件数推移と、検索条件での件数推移の両方が表示されます。
ここで「全体との比較」ができることが分析につながります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/264c044a-e9f0-ba33-95ad-53ae2194effe.png)

たとえば「ニッサン ルークス」で検索すると、全体と比較して2020年3月からやや件数が増えていることがうかがえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/9585010b-8241-9407-9073-05ed21038467.png)


# 3．キーワード分析

また「キーワード」のタブをクリックすると、
自然言語処理を使って抽出した各種キーワードが表示されます。
これを書いている時点では「名詞」「動詞」「ブランド」「車種名」「装置名」でキーワードが表示されます。
「名詞」「動詞」は報告文から抽出したものですので、本家の国土交通省サイトで見ることはできません。
また、「ブランド」「車種名」「装置名」についても件数のカウントは本家の国土交通省サイトでは見ることができません。
さらに「名詞」「動詞」については「全体と比較して現在の検索条件では多いキーワード」が強調表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/7edb7ea9-d1d4-23bb-cc13-442786b2299b.png)

以上、テキストマイニングが少しわかる例をご紹介しました。

大矢裕己


# まとめ
NLP4J を使うと、Javaで簡単に自然言語処理ができます

#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">


---
[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)
pandasのplotだけでy軸の範囲指定したグラフ表示

PythonのpandasでCSVを読み込んでplotでグラフ化するにあたり、x軸の列指定とy軸の範囲指定を実施しました。
調べるとmatplotlibでplt.ylimみたいなのが多く出てきますが、plotだけで出来ました。

まずはCSVファイルを読み込みます。

```python
import pandas as pd

df = pd.read_csv('stock_nasdaq_1.csv')
df
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/e379f6ff-3650-fadb-4c51-27457fc53694.png)


Unnamed: 0という余計な列をdropで削除します。

```python
dfr=df.drop("Unnamed: 0", axis=1)
dfr
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/fcd87e29-b19f-3e25-eb0f-f1cc6c29e620.png)

x軸にDateの列を指定してグラフ表示します。

```python
dfr.plot(x='Date')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/10e0bf44-6017-8e54-0e0d-7179cb5123f4.png)

y軸の範囲を0〜20に指定してグラフを表示します。

```python
dfr.plot(x='Date',ylim=[0,20])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/28385dff-86c2-f501-0998-7aff114cabb2.png)
有能サイト(備忘録)

己のための有能サイトまとめ(見つかるたびに追加していく予定)
・Learn Python, PHP, Ruby and Javascript in one Blog Post
　上記の言語を網羅する勢いのサイト
https://dev.to/alexmercedcoder/learn-python-php-ruby-and-javascript-in-one-blog-post-2n0p
・Python Exercises, Practice, Solution(2021/2/12更新)
　Pythonの勉強ができる。たぶん無料
https://www.w3resource.com/python-exercises/
・機械学習cousera(2012/2/13更新)
無料で機械学習を学習できるサイト
https://www.coursera.org/learn/machine-learning?ranMID=40328&ranEAID=Vrr1tRSwXGM&ranSiteID=Vrr1tRSwXGM-IpnMx4uJD_11VMa3F_05KQ&siteID=Vrr1tRSwXGM-IpnMx4uJD_11VMa3F_05KQ&utm_content=10&utm_medium=partners&utm_source=linkshare&utm_campaign=Vrr1tRSwXGM
【SSH接続】公開鍵暗号方式を利用した認証時に「パスフレーズ」の入力を省略する

####トピックについて
* GitHubとGitをSSH接続して認証させる場合にパスフレーズの入力が面倒になった。
* パスフレーズの入力を省略したかったつもりが、パスワードを省略する方法で検索していたためにすぐに探し物を見つけられなかったので、自分用のメモとして残す。

→　SSH接続時に公開鍵暗号方式を利用して認証する場合の「パスフレーズ」の入力を省略する方法について

####解決策
.ssh/configファイルを以下のように更新する。
以下の例は、xxxx.comにSSH接続する際の設定情報となる。
重要なのは**「IdentityFile」に秘密鍵のフルパスを設定しておくこと**。

```
Host xxxx.com
  HostName xxxx.com
  User yyy
  IdentityFile 秘密鍵のパス（~/.ssh/id_rsa）
```

####メモ
●　ssh/configファイルはどこにあるの？
→　macの場合は、デフォルトでホームディレクトリ > .ssh > config

●　ホームディレクトリはどこにあるの？
→　cdコマンドで`cd ~/`で移動可能

●　.sshファイルが`ls`コマンドしてもホームディレクトリ上に存在しない。
→　`ls -a`を入力することで隠しファイルを表示できます。.sshファイルは隠しファイルになっています。それでも存在しない場合は`mkdir .ssh`でフォルダを作成します。
【解決！】windowsアップデートしたら変換・無変換キーで「英数」「かな」の切り換えが消えた人のための再設定方法


#どうも7noteです。windowsでmacみたいにスペースキーの隣で「英数」「かな」の切り換えをする方法

windowsアップデートがきたから更新したら、mac使用にしていた「英数」「かな」の切り換えができなくなっていたので、設定を見直して再設定しました。
だれかの参考になれば。

## 手順

### ①windowsの設定から「日本語IMEの設定」を開く

**・「windowsキー」→「[ime]で検索」**
もしくは、
**・タスクバーの「A」か「あ」の上で右クリック→「設定」**

で開くことができます。

### ②「キーとタッチのカスタマイズ」を選択

### ③キーの割り当て設定を以下の通り変更する

・「各キーの好みの機能を割り当てる」→「オン」
・「無変換キー」→「IME-オフ」
・「変換キー」→「IME-オン」

**これでmacのように親指で英数かな変換が可能になります。**

## まとめ

もともとmacをつかっていたため、英数とひらがなの切り換えはいつも「無変換」「変換」キーで行なっていました。しかしアップデートで設定が消えてしまい、また設定方法も変わってしまったようなので、同じように焦った人のためにまとめました。

普段はWEB制作向けのTipsを毎日更新しています！
今回はちょっと番外編でした。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
ImageJ起動時にマクロレコーダーを自動で開く

ImageJであまりやったことのない作業中、「うまくいったけど、今のコマンドは何だったんだろう？」となることがあるので、マクロレコーダーは開いておくようにしている。が、毎回メニューバーから起動するのは面倒。

下記の1行を記載した`RunAtStartup.ijm`ファイルを、`macros`ディレクトリに置いておくと起動時に自動で開く。

```RunAtStartup.ijm
run("Record...");
```

何かで調べてこの方法を見つけたはずなのだが、検索してもそれらしいものが見つからず、出典が不明になってしまった。

環境 `Windows10, Fiji`
PowerAppsで添付ファイルの数と拡張子を制限する

#概要
- 以下のようなサムネイルを使ったアプリを作成する場合、保存場所はSharePointの添付ファイルフィールドを使い、画像のアップロードは編集フォームで添付ファイルコントロールを利用する方法が簡単です。
- ただし添付ファイルコントロールで「画像は1つまで」、「登録できるのは画像のみ」といった制約をつけるには少し工夫が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/fc8b3a3d-c934-b7bf-76d4-624b61411945.png)

※SharePointリストをデータソースとする場合を想定。

#①画像を1つしか添付できないようにする
添付ファイルコントロールにはMaxAttachmentsプロパティがあり、添付できるファイル数を制限できます。
普通にMaxAttachmentsを1にすると既にファイルがある場合は入れ替えができなくなるため、以下のような工夫が必要です。

画面の設定
・OnVisible：```UpdateContext({MaxFileCount:1})```

添付ファイルコントロールの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/2fb7044f-246d-e344-1f1e-714e49d40ff9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/b9b5f77a-21c2-991b-f851-d0c663db7d39.png)
既存のファイルを削除したときは2、それ以外は1が設定されるようにします。


#②添付できるファイルの種類を制限する
ラベルコントロールを追加し、Textプロパティに以下のような関数を設定。
CountIf関数で指定のパターンに一致しないファイルの数をカウントします。

```JavaScript:Label_DeniedFileCount.Text
CountIf(DataCardValue_添付ファイル.Attachments,!IsMatch(ThisRecord.Name,".(gif|jpg|png|bmp|webp)",IgnoreCase & EndsWith))
```
次に、サブミットボタンで添付できないファイル数をチェックして登録を制限します。

```JavaScript:Icon_Submit.OnSelect
If(Value(Label_DeniedFileCount.Text) > 0,
    Notify("添付できないファイルがあります",NotificationType.Error),
    SubmitForm(Form_RegisterFood)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/2b6d0500-90e1-199d-416a-6361c729237f.png)
anaconda で R 環境を整えたい

しかし Anaconda-Navigator から RStudio を install しようとしても一向に上手く行かない！
そして色々検索して試しても上手く行かず困っていた。
どうも、

```terminal:terminal
(base) anaconda3 % conda install r-essentials --verbose
Collecting package metadata (current_repodata.json): ...working... done
Solving environment: ...working... failed with initial frozen solve. Retrying with flexible solve.
```

依存関係がゴチャっておられる様で、しかも失敗したまま無理矢理勧めても何故か一番古いのをインストールしようとしてくれる模様。そして結局起動できない。

そして一日経った次の日も無駄に検索と失敗を繰り返していたのだが、その時ひらめいた。

# どうせ無理矢理インストールするなら最新バージョンを入れようよ！

というわけで、実行。search コマンドで最新バージョン調べて
その番号を指定して、無理矢理実行した。

```terminal:terminal
(base) anaconda3 % conda search r-essentials
Loading channels: done
# Name                       Version           Build  Channel             
r-essentials                     1.0               0  pkgs/r              
r-essentials                     1.0              0a  pkgs/r              
r-essentials                     1.0        r3.2.1_0  pkgs/r              
  <中略>
r-essentials                   3.5.0          r350_0  pkgs/r              
r-essentials                   3.5.1          r351_0  pkgs/r              
r-essentials                   3.6.0           r36_0  pkgs/r              
(base) anaconda3 % conda install r-essentials=3.6 --verbose
```

結局似たようなエラー表示は出るし、途中で y を押しても反応が帰って来ずに Ctrl-C で止めたり、ダウンロードも何度か失敗したりしたので、数回 install コマンドを実行したが、何か入ったような気がするので、続けて rstudio もやってみる。

```terminal:terminal
(base) anaconda3 % conda search rstudio     
Loading channels: done
# Name                       Version           Build  Channel             
rstudio                       1.0.44               0  pkgs/r              
rstudio                      1.0.136               1  pkgs/r              
rstudio                      1.0.153               1  pkgs/r              
rstudio                      1.1.383      h4814094_2  pkgs/r              
rstudio                      1.1.423      hb125a76_0  pkgs/r              
rstudio                      1.1.456      h04f5b5a_1  pkgs/r              
(base) anaconda3 % conda install rstudio=1.1.456 --verbose
Collecting package metadata (current_repodata.json): ...working... done
Solving environment: ...working... done
```

お、Solving environment に成功しているし、いけるんじゃない？！
こちらも何度かパッケージのダウンロードに失敗したりして install コマンドを繰り返しているうちに正常終了した模様。

なので、 Anaconda-Navigator を起動すると RStudio のボタンが無事 Launch に変わっている。ポチっとな！
### できました！！
![スクリーンショット 2021-02-02 22.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076617/d2d40948-2f64-5672-83f6-f8565a964d64.png)

ライブラリとかはまだ確認していませんが、配列作ったりT検定をしたりとかの実行はできたので何とかなっているようです。

というわけで、Solving environment で失敗して最古バージョンを選択しちゃうというデフォルトの挙動を回避することで、何とかなりました。
上手く行かない方の参考になれば幸いです。
ランチにPicoはいかがでしょうか～第0話　イントロ～

ごきげんよう、ちゃまおです。

今日、[株式会社 KSYさん](https://raspberry-pi.ksyic.com/main/index)で購入したRaspberry Pi Picoが届きました。1台528円だったので、ランチ1食分ですね。

![RaspberryPiPico.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930492/f15ed4eb-1949-d2ff-0390-76b1688f206d.jpeg)

上図は大きさ比較の為に100円玉を並べてみました。かなり小さい事が分かると思います。

この小さなマイコンを使って何を作るかはこれから考えていきます。それと並行して、以下の方の役に立つ情報を、連載記事として発信していければと思っています。なので、タイトルに第0話と付けました。

- Raspberry Piシリーズに興味があって、これからRaspberry Pi Picoを買おうと思っている方
- マイコンに興味があって、これからRaspberry Pi Picoを使って始めようと思っている方
- プログラミングに興味があって、これからRaspberry Pi Picoを使って始めようと思っている方

(注)私自身は、[自己紹介](https://qiita.com/Chamaotaku/items/ddcf66fdb21ea5c35cad)の通り、ただのオタクで、知識量も多い方では無いと言う事は一応伝えておきます。

#Raspberry Piって何？

この記事を読んでいる方が、そもそもRaspberry Piについて全く知らないかもしれないので、ものすごーく簡単に紹介します。Raspberry Piは、Eben Uptonさんが中心となって設立されたプロジェクトから生まれたハードウェアの事です。元々、Eben Uptonさんは、イギリスの子供たちのコンピューティング教育に役に立つ事を目的としてRaspberry Piを広める活動を行っていましたが、いまでは年齢など関係なく、世界中の多くの人に親しまれているハードウェアの一つとなっています。詳細を知りたい方は[Raspberry Pi公式サイトのAbout us](https://www.raspberrypi.org/about/) (英語)を読んで頂くのが良いと思います。

[これまでに発売された主な製品](https://www.raspberrypi.org/products/)は、Raspberry Pi 1 Model A+, Raspberry Pi 1 Model B+, Raspberry Pi 2 Model B, Raspberry Pi 3 Model A+, Raspberry Pi 3 Model B, Raspberry Pi 3 Model B+, Raspberry Pi 4 Model B, Raspberry Pi 400, Raspberry Pi Zero, Raspberry Pi Zero Wで、同じシリーズ(例えばRaspberry Pi 3)でも、仕様の違いによってModel AとかModel Bとなっています。これらの製品にはRaspberry Pi独自のOSを載せる事が出来て、公式が配布しているのはDebianをベースに開発したRaspberry Pi OSですが、Windows10 IoTを載せたり出来ます。値段もお手頃で、25ドルのコンピューターとして知られていますが、Zeroに関しては5ドルです。

#Raspberry Pi Picoって何？
今回、私が購入したRaspberry Pi Picoは新製品なのですが、これまでの製品とは大きく異なっていて、<font color="Red">OSが載りません</font>。電子機器などに載っていて、機器の制御を行っているマイクロコントローラー(通称マイコン)として作られたのがPicoです。この小さなマイコンを使って何を作るかは人それぞれですが、一例は[公式サイト](https://www.raspberrypi.org/documentation/pico/getting-started/)に載っています。

#結局何買えばいいの？

一番無難なのは、Raspberry Pi Picoに加えてRaspberry Pi 4を買う事ですが、Raspberry Pi 4の代わりにお手持ちのノートパソコンでも大丈夫です。Pico自体、何かしらのプログラムを入れてあげなければ動かないので、プログラミング開発環境が必須になります。

私は、Raspberry Pi 1～3まで持っていますが、今後の記事は、Windows10のノートパソコンを開発環境として、書き進めて行きます。

#次回予告
次回からは、[Raspberry Pi Pico -Getting Started-](https://www.raspberrypi.org/documentation/pico/getting-started/)を用いて、色々と解説をしていく予定です。

#参考文献
Eben Upton+Gareth Halfacree[共著], 株式会社クイープ[訳]: 「Raspberry Pi ユーザーガイド」([インプレスブックス](https://book.impress.co.jp/books/3374))
Ruby on Railsの理念と原則

# Webアプリケーションのフレームワークには、理念や原則が存在する

>`Webアプリケーションのフレームワークには、理念や原則が存在する`

これは私が現状学習をしている`Ruby on Rails`に置いても同様である


## Ruby on Railsの理念

理念とは、物事に対する`根本的な考え方`である

遵守することで`フレームワークの能力を最大限に活かす`ことが可能


###無駄のないコードを書く為に

**DRY** 

>[Don't Repeat Yourselfの略]
`「同じ情報を繰り返し定義しない」`

 - コード量を減らす
    - 修正工数削減
    - ミスによるバグを減らす
    - 可読性の向上
    - アプリケーションの動作が早くなる

---
### フレームワークのルールに沿った実装を行う為に

**CoC**

>Convention Over Configurationの略
`「設定よりも規約を優先する」`

- すでに定義されている処理を利用する
    - 開発スピードが上がる
    - 質を担保
    - 規約は開発者同士の共通認識であるため可読性が向上

---
---

## Ruby on Railsの原則

原則とは、一般に適用される`根本的な法則`である

人や物など現実世界に存在するものに限らず、
`作業や処理など`の目に見えない概念も、
クラスなどの`オブジェクトとして切り分ける`ことができる

### オブジェクト指向の考え方

**すべてを「モノ」として考える方針のこと**

>Ruby on Railsは、オブジェクト指向言語であるRubyで作られている
同様にRuby on Railsも`オブジェクト指向の考え`に則って作られている

全てをモノとして考え、そのモノに情報を加えていくと
私たち人間が`理解しやすいプログラムを作成する`ことが可能

---

**「MVC」もそれぞれ専用の役割を担ったオブジェクト**

- モデルというオブジェクト
    - DBとのやり取りを行うモノ


- ビューというオブジェクト
    - レスポンスとして設定された見た目を返すモノ


- コントローラーというオブジェクト
    - リクエストがあった場合に、設定されたレスポンスを返却するモノ
統計学実践ワークブック 第６章 例題 6.1-6.4

統計学実践ワークブック 第６章の演習問題の Python 実装メモです。
問6.1
(1)

``` python
from scipy.stats import norm
A_hensa = 50 + ((85-65)/10)*10
B_hensa = 50 + ((60-65)/10)*10
print(A_hensa, B_hensa)
```
(2)

```python
prob = 1 - (1 - norm.cdf(2)) - norm.cdf(-0.5)
print(prob*100)
```

(3)

```python
q_length = (norm.ppf(0.75)*10+65) - (norm.ppf(0.25)*10+65)
print(q_length
```

(4)

```python
from scipy import integrate
import numpy as np

def avg_of_more_avg(x):
    return x*2*norm.pdf(x)

print(integrate.quad(avg_of_more_avg, 0, np.inf))
```


問6.2

(1)

```python
COV = (150**2-80**2-90**2)/2
print(COV)
RHO = COV/(80*90)
print(RHO)
```

(2)
2変量正規分布の期待値の算出

$E[X_2|X_1=x_1] = \mu_2+\rho\sigma_2\frac{x_1-\mu_1}{\sigma_1}$

```python
exp_2 = 250+0.555*90*(335-305)/80
print(exp_2)
```

問6.3 式導出がメインのため略

問6.4
(1)

```python
a_hensa = (10*(67-65)/4) + 50
b_hensa = (10*(82-85)/3) + 50
print(a_hensa, b_hensa)
```

(2)

```python
1 - 0.6*norm.cdf((60-65)/4)-0.4*norm.cdf((60-85)/3)
```
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ Pardot リードスコアリングと評価 (Salesforce Classic) ⇒ スコアリングの使用

１．Pardot のスコアはどのようなものですか?
２．プロスペクトグループのスコアをゼロにリセットする最適な方法は何ですか?
３．スコアリングカテゴリとプロスペクトのスコアにはどのような関連がありますか?
４．スコアリングカテゴリを設定する前に作成しておく必要があるものは何ですか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/0b3245d0-841c-da6d-0ff9-47431729061a.png)
pythonの基本文法(youtubeを通して学んだ事)のメモ②(for文からimportまで)

youtubeでpythonの基本文法を学んだので、メモとして残す。

for文
pythonでのfor文は　for 変数　in　オブジェクト:
と書く。
indexは"索引"という意味がある。
rangeは"範囲"という意味がある。

```python:test.py
def unko_funbaru(arg):
    unko_status = arg
    
    if(unko_status < 10):
        return "mada daijobu"
    else:
        return "yabai"

for index in range(3):
    print(unko_funbaru(5))
```

```cmd.exe
D:/python/test>python test.py
mada daijobu
mada daijobu
mada daijobu
```

変数が0から増えているのがわかる。

```python:test.py
for index in range(3):
    print(index)
```

```cmd.exe
0
1
2
```

このようなこともできる。

```python:test.py
def unko_funbaru(arg):
    unko_status = arg
    
    if(unko_status < 10):
        return "mada daijobu"
    else:
        return "yabai"

for index in range(11):
    print(unko_funbaru(index))
```

```cmd.exe
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
mada daijobu
yabai
```

また、list内のデータも表示できる。

```python:test.py
unko_list = ["unko_small","unko_medium","unko_large"]
for item in unko_list:
    print(item)
```

```cmd.exe
unko_small
unko_medium
unko_large
```

with文とopen関数
with open("ディレクトリ指定file名","モード")でfileを扱える。
as 変数　を追加することでopen()の一連の処理を省略して変数で扱えると理解した。
fileを開くモードとしては
・"w":書き込み用で開く。file名に設定したものが既に存在する場合はそのfileに上書　きする。
・"r":読み込み用で開く。
・"x":新規fileの書き込みとして使う。既存のfile名の場合はエラーとなる。
・"a":書き込み用で開く。既存の場合は末行に追加していく。
・"b":バイナリモードで開く。
read,write,name,modeなどがあるが、これについては今後詳しく調べる必要があると考えている。


```python:test.py
with open("./unko.txt","r") as file:
    print(file)
    print(file.name)
    print(file.mode)
    print(file.read())
```

```unko.txt
Hello Unko!
```

```cmd.exe
<_io.TextIOWrapper name='./unko.txt' mode='r' encoding='cp932'>
./unko.txt
r
Hello Unko!
```

class インスタンス
classとインスタンスに関してはもっと勉強する必要がある。
しっかり概念を理解できていない。

```python:test.py
class Card:
    def __init__(self,date,user_name):
        self.date = date
        self.user_name = user_name
    def message(self):
        return "この投稿は" + self.user_name + "さんが" + self.date + "に投稿しました"

date_a = "2020-01-01"
user_name_a = "Taro"
card_a = Card(date_a, user_name_a)

date_b = "2020-01-03"
user_name_b = "Kayoko"
card_b = Card(date_b, user_name_b)

print(card_a.date)
print(card_a.user_name)
print(card_a.message())

print(card_b.date)
print(card_b.user_name)
print(card_b.message())
```

```cmd.exe
D:\python\test>python test.py
2020-01-01
Taro
この投稿はTaroさんが2020-01-01に投稿しました
2020-01-03
Kayoko
この投稿はKayokoさんが2020-01-03に投稿しました
```

import
importは外部モジュールや標準ライブラリの内容を使用する時に必要だと理解した。
外部モジュールはinstallする必要がある。
ここでは例にnumpyをinstallして使用した。

```python:test.py
import math
print(math.pi)

import numpy
numpy_list = [3,1,5,10,2093,304,123]
print(numpy.sum(numpy_list))
```

```cmd.exe
D:\python\test>python test.py
3.141592653589793
2539
```
テスト仕様書作成について

##テスト仕様書の準備
今回、Javaを使ってウェブアプリをチーム開発し、テスト仕様書を作成しました。備忘録として、その時の仕様書作成についてまとめます。単体テストについてはコーディング時に簡単に確認しながら開発したため、結合テストから仕様書を作成しました。

###■開発環境
- Javaサーブレット
- JSP
- oracleDB
- Eclipse
- Apatch
- Tomcat

###仕様書の作成にあたって
今回、仕様書作成にあたりテスト作成者とテスト実施者が異なる場合を想定して、「誰が実施しても同じテスト」を意識して作成しました。
※ここでは"同じテスト"とは、**同じように理解でき、同じように実施でき、同じように結果を記載できること**という意味で使っています。

###テスト項目の追加除去の基準

- テスト項目は1つのテストにつき１つ、複数確認しなければいけないときには項目を増やす
 →基本的には結果欄に○✖︎を記載すれば何が違っていたのかテスト実施者以外が見てもわかることが理想
 →備考欄は基本的に使わないで済むように設計する
　　✖︎名前の入力欄の文字数設定が正しい
　　✖︎名前の入力が7文字以上20文字以下で入力できる
　　○名前の入力欄に20文字入力できる

- コピペ欄を作ることで入力ミスを防ぐ
　　ああああああああああああああああああああ

- テスト手順についても具体的な操作を記述し、曖昧な表現は使わない
　　✖︎名前の入力欄に20文字入力する
　　○名前の入力欄にコピペ欄の内容をコピーする

- 期待値についてもわかるものに関しては具体的な表現を用いる
　　✖︎送信エラーが表示される
　　○「送信できませんでした」の文言が表示される

###テスト仕様書の入手
[こちら](https://bizroute.net/download/test_siyousyo)のサイトのテンプレートをダウンロードして編集して利用しました。

####全体としてあった項目
※ダウンロード時にあった項目(・) 追加した項目(+) 除去した項目(-)
>・システム名
・サブシステム名
・作成者
・作成日
・会社名
・実施者
+ 動作環境(実施ブラウザ)

####各テストごとにあった項目
※ダウンロード時にあった項目(・) 追加した項目(+) 除去した項目(-)

>・No.
・分類
・テスト項目
- 検証内容
・実施日
・結果
・備考・特記事項
+ コピペ欄
+ テスト手順
+ 期待値
+ エラーメッセージ欄

###関連
[テスト報告書について](https://qiita.com/kunrenyouAcount/items/39013d99262e678705e6)
要件定義とデザイン【クライアントにヒヤリングを実施して得られたコト】

#導入
この度ご縁があり、初心者ながらwebサービスの開発案件をいただくことができました。
依頼者の方と実際にお会いし、どのようなサービスにしてくか話し合っていき要件定義とデザインを完成させることができました。ここから得られた経験や反省をシェアしたいともいます。

私は普段、ブログを運営しています。細かい状況を知りたい方はこちらの記事に詳しく載っているので参考にしてください！
https://pontyblog.com/409/
パーティションの種類について

## 勉強前イメージ

3つくらいあった気がするけど、何が違うのかはわからない

## 調査

### まずパーティションとは？

日本語で区切りを意味し、多くの場合はHDDにパーティションを作成する などという場合に使用します。
HDDをパーティショニングすることはHDDがいくつもあるようにみえます。

### パーティションを作成する目的

- あるパーティションにトラブルが発生し、データが欠損しても他のパーティションには波及せず被害を抑えらる
- swap領域を作るため
	- swap領域はメインのメモリが足りない際にメモリの代わりとして使用できる領域
	- swapを使うためには、パーティションを切らないといけない
- ディスク容量不足によるトラブル防止

### パーティションの種類

大きく3つ存在する

- 基本パーティション
- 拡張パーティション
- 論理パーティション

#### 基本パーティション

1台のディスクに必ず1つ以上が存在する必要があり、1つの物理ディスクには最大で4つに分割することが出来る
デバイスファイル名は、SCSIディスク(/dev/sda)の場合は `/dev/sda1、/dev/sda2、/dev/sda3、/dev/sda4` となる

#### 拡張パーティション

基本パーティションのうち1つだけを拡張パーティションとして使用することが出来る。
拡張パーティションは、直接ファイルシステムを作成することができない代わりに論理パーティションを格納することができる

#### 論理パーティション

論理パーティションは、拡張パーティション内に作成されたパーティションのことで
デバイスファイル名はSCSIディスク(/dev/sda)場合は `/dev/sda5 以降` となる

## 勉強後イメージ

ふと疑問なんだけど、拡張パーティションを使う理由ってパーティションを4つ以上使いたい時？
それ以外に理由ってあんのかな？

## 参考

- [Linux技術トレーニング　基本管理コース I](https://users.miraclelinux.com/technet/document/linux/training/1_3_2.html)
- [Linux - fdisk](https://www.infraeye.com/study/linuxz21.html)
- [Linuxパーティションの種類](http://www.linuxmaster.jp/linux_skill/2012/11/linux-21.html)
【Swift】UITextFieldをタップしたらUILabelを表示させる

# どういうことか

こういうことがやりたい。

![bcff5fd89a3750f235df06f0eac48674.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/21a1d225-c06f-13f6-582d-2be5f5078e78.gif)

## UITextFieldDelegateを使いましょう

正確に言うとUITextFieldDelegateのデリゲートメソッドである `textFieldDidBeginEditing` を使う。
このメソッドは**タップされて入力可能になったあとに呼ばれる**。
実際に使ってみる。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    // ラベル
    @IBOutlet weak var nameLabel: UILabel!
    
    // フォーム
    @IBOutlet weak var form: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // labelはあらかじめ消しておく
        nameLabel.isHidden = true
        
        form.delegate = self
    }

    // デリゲートメソッドを使う
    func textFieldDidBeginEditing(_ textField: UITextField) {
        
        // labelを出現させる
        faceLabel.isHidden = false
        
        // これはオマケだけどplacehonlderも消す
        form.placeholder = ""
    }
}
```

以上です。
UITextField以外の範囲をタップしたりして解除する場合はまた別記事で。
【MySQL】コマンドプロンプトでSELECTすると横幅が足りないとき対策





###横長のディスプレイでなんとか表示できる

```

mysql> select * from test;
+------+------------+-----------+-----------------+----------------+-----------------+-------------+--------------+--------------+
| id   | first_name | last_name | first_name_kana | last_name_kana | nickname        | postal_code | address_pref | address_city |
+------+------------+-----------+-----------------+----------------+-----------------+-------------+--------------+--------------+
|    1 | 太郎       | 山田      | たろう          | やまだ         | 古臭い名前      | 111-1111    | 愛知県       | 名古屋市     |
+------+------------+-----------+-----------------+----------------+-----------------+-------------+--------------+--------------+
1 row in set (0.00 sec)
```

###画面分割などしていると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/fa1647d1-f957-83b5-c849-def83a2bf35c.png)

「なんかズレてますや～ん」

こんな感じになってまいっちんぐマチコ先生でした。


###縦表示にすれば表示できる

`select * from test\G`

最後のところが`;`じゃなくて`\G`とすることで縦表示にできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/e08a08e2-c4b9-bc06-a22e-f9bd1b17d45b.png)


###公式リファレンス
https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-output-vertical.html

>The vertical format option prints result sets vertically instead of in a horizontal table, in the same way as when the \G query terminator is used for an SQL query. 

だそうです。

便利ですね。

###WorkbenchではCtrl+Alt+Enter

worckbenchでは`\G`は実行できませんでしたが、代わりに`Ctrl+Alt+Enter`を使用すれば表示されました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/cbd00be3-050f-e8c9-6aee-8558a19cd01d.png)


※ ただし、一旦横表示でアウトプットしてから、改めて前述のショートカットで実行しないと、エラーは出ないけど、Outputもどこにされているのかわからない状況でした。
ESP32-DevKitC-VE ESP32-WROVER-E 開発ボードをPlatformIOで開発する

```text:platformio.ini
[env:esp-wrover-kit]
platform = espressif32
board = esp-wrover-kit
framework = arduino
monitor_speed=115200
```
上のようにすることでとりあえず書き込めました。
# 参考
https://docs.platformio.org/en/latest/boards/espressif32/esp-wrover-kit.html
マイナンバーカードの電子証明書が更新された年度でのオンライン確定申告でのドはまり

# スマホで確定申告しよう
今年から[feeeでスマホからマイナンバーカード読み取って確定申告](https://www.freee.co.jp/func/kojin/final-return/tax-return-with-smartphone/)できるようになり、
**電子確定申告元年としての準備が整った。**
そう私も思っておりました。申告するまでは。
実際にfreeeで申告する手順については[この記事](https://blog.nkzn.info/entry/2021/01/30/155345 "確定申告のe-Taxでカードリーダーが不要に！freeeの電子申告アプリが最高だった話")の通りで問題ありません。

# 電子証明書のエラー
申請が終わり受付結果を参照したところ、**「エラー情報あり」**
![確定申告書類の作成 _ freee - Google Chrome 2021-02-02 20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128561/19d40930-5756-3cba-1b34-804bef2e211f.png)と出ます。

詳細を見ると

```
青色申告決算書 及び 確定申告書Bの受付結果詳細
HUBH139E:納税者の方（本人）の電子証明書が登録されている電子証明書と異なるため、電子証明書を確認の上、
再度送信してください。 なお、電子証明書の更新・変更をしている場合には、新しい電子証明書をe-Taxへ再登録
する必要があります。 税理士等の方が代理送信される場合は、送信方法が正しいかを確認の上、再度送信してくだ
さい。
```
とあります。
確かに、去年はマイナンバーカード利用してから5年目の誕生月なのでで電子証明書を更新していました。
**誕生月前にマイナンバーカードを始めたアーリーアダプターな方は結構いるのではないでしょうか。そういう方達は全員漏れなく今年この罠にはまると思うので気を付けて下さい。**

誕生月より後にマイナンバーカードを始めた方でも確定申告が誕生月より後だと同じ事になります。


こうなってしまうと、認証局のアプリ、ルート証明書のインストールなどの悪夢が襲ってきます。

# e-Tax(PC版)はやめておけ
ここからが地獄の始まりです。
間違っても**e-Tax(PC版)**をインストールしようとは思わない方がいいです。PC版はインストール出来なくてハマります。何やってもインストールできません。環境変えてもダメです。

e-Tax(Web版)も罠が多く、まずサイトのURLが分かりにくい、Chromeだと一回ログインしてログアウトせずに閉じてしまった場合、2度とログインできなくなるなど色々あります。ログイン問題の方に至っては電源落としてもブラウザ全部落としてもダメです。Cookie消せば大丈夫かもしれませんが、面倒なのでやってません。
それでも一応ログイン出来るe-Tax(Web版)にすがるしかありません。
(Chromeで2度とログインできない問題があったのでスマホ版は試していません。)

# e-Tax(Web版)の準備
[e-Tax(Web版)](https://clientweb.e-tax.nta.go.jp/UF_WEB/WP000/FCSE00001/SE00S010SCR.do)はChromeだと2度とログインできなくなるので、忌まわしきIE11か、Edgeでログインしましょう。
e-Tax(Web版)のサイトに行くと何が足りてないかナビしてくれますので言う通りインストールしていきます。

Edgeの場合、Chrome Extentionの[e-Tax拡張](https://chrome.google.com/webstore/detail/e-tax-ap/hopiajgbpnepghlkfmdonpgdnmcajpeb)を入れる必要があります。
「Chromeに追加」から普通にインストールできます。便利！。![e-Tax AP - Chrome ウェブストア および他 1 ページ - 個人 - Microso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128561/6930dbc8-269c-029d-26c2-fb16b5522d70.png)


# e-Tax(Web版)で電子証明書を更新できない
準備が終わりe-Taxにマイナンバーカードとカードの暗証番号(4桁のやつ)して、証明書を更新しようとしました。

![EtNmb_yUcAAJ3Fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128561/e1e9874e-0010-9ef3-7641-baa20b9b4c57.png)

なんかグレーアウトしてて押せません。
ここからまた、色々インストールしなおしたり他のブラウザで入ってみたりしたのですが全くうまくいきません。ひょっとして申請できる様になっているのかと思いもう一度スマホから確定申告をしてみましたがエラーでした。そうだよね。。。


# 電子証明書の更新方法の解決策
もうすべてを諦めかけて、「明日、国税局にめちゃめちゃ怒鳴り込もうかな」って気分になっていたのですが、
試しにe-Taxへのログインをマイナンバーカードと4桁暗号で横着せずに、
**利用者識別番号(4桁区切りの16桁の数字）**と**e-Taxのサイトのパスワード(英数字混じっている8桁以上の奴）**でログインしてみたら、なんと今までグレーアウトしていたボタンが押せるようになってるでは無いですか！

という事で進めていくと、カードの認証にどの認証局を使うか聞かれますが、[JKPI](https://www.jpki.go.jp/download/win.html)を利用するのがいいと思います。他の使った事ないし。
これで無事再登録が出来たら準備は完了です。
もう一度スマホのアプリから申請してみましょう。今度は大丈夫なはず。

## 納税きもちー！

もういっそのことサイトからアプリまで全部作り直して欲しいなと思いました。
あとe-Tax関連でパスワードが4つくらい必要になるのもどうにかして欲しいなと思いました。
おわり。
[GitHub] 2回目以降のGit管理方法

#GitHubに投稿してコードの編集をした後のGit管理方法
##gitのインデックスに追加する

```
$ git add 移動したいファイル名
```

##ローカルリポジトリにコミットする

```
$ git commit -m "コミットメッセージ"
```

##ローカルリポジトリをプッシュしてリモートリポジトリへ反映させる

```
$ git push
```
[Rails]親モデルから孫モデルを直接参照する方法

#はじめに

railsのポートフォリオ作成中に親model、子model、孫modelとあって
親の全部の子から特定の孫を抽出するのにかなり苦労したので残しておくことにしました。

以下の例では、親モデル：Parent、 子モデル：Child、 孫モデル：Grandchild として説明します。
また、親：子　＝　１：N、　子：孫　＝　１：N　とします。

#前提
今回のmodel操作は, 

親：子：孫　＝　１：全部(all)：全部 or 特定 (where)　を実現する方法なので、
親：子：孫　＝　１：特定   　： 全部 or 特定　ではありませんので予めご理解ください


#一般的な連結


```ruby
#親モデル parent.rb
Class Parent < ApplicationRecord
 has_many   :childs
end

#子モデル child.rb
Class Child < ApplicationRecord
 belongs_to :parent
 has_many   :grandchilds
end

#孫モデル grand_child.rb
Class Grandchild < ApplicationRecord
 belongs_to :child
end

#model作成時に子モデルにparent:references、
#孫モデルにchild:referencesが含まれていることが前提です
```
これで一般的な連携が可能となります。

##問題
ここでParentから全Childを取得して、さらにGrandChildを取得しようとすると

```

＃rails console

> childs = Parents.first.childs.all
=> #<ActiveRecord::AssociationRelation [ #<Child id:1, ...> ... ]

> grandchilds = childs.grandchilds.all
=> NoMethodError (undefined method "grandchilds" 
for #<Child::ActiveRecord_AssociationRelation:000000000000000000)

```


と怒られてしまいます←
なので関連付けを追加する必要があります。

#親から孫に直接アクセスする(結論)

```ruby:model
#親モデル　parent.rb
class Parent < ApplicationRecord
 has_many   :childs
 has_many   :Grandchild, through: :childs  #<=これを追加！！！
end

#子モデル child.rb
変更なし

#孫モデル grand_child.rb
class Grandchild < ApplicationRecord
 belongs_to :child
 has_one    :master,  through: :child      #<=これも追加！！！
end
```

これで直接の取得が可能になりました！

```
#rails console

> grandchilds = Parents.first.grandchilds.all
=> #<ActiveRecord::AssociationRelation [ #<GrandChild id:1, ...> ... ]

```

こんなに簡単なのに2、3日かかってしまった。。

#最後に

今回の表記は一番初歩的な書き方だったので今後はN+1とかも考慮した書き方を学んでいきたいですね！
また、前提で触れた「特定の複数子モデルに対しての孫アクセス」も機会があればやりたいと思います。

では！
jq の入っていない環境で、JSON をフォーマットする方法

（この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/2021/02/02/212033) とのマルチポストです）

JSON をフォーマットしたいけど、jq が入っていない！ということがよくあります。
そういう時は、**Python, Ruby, PHP** を使いましょう！

# Python の場合

```bash
python3 -m json.tool
```

↓　こんな風に表示されます！

```bash
[qiita@example ~]$ echo '{"key": {"format": ["json", "XML"]}}' \
    | python3 -m json.tool
{
  "key": {
    "format": [
      "json",
      "XML"
    ]
  }
}
```

:::note warn
Python2 だと、キー順にソートされてしまいます。
:::


# Ruby の場合

```bash
ruby -rjson -e 'puts JSON.pretty_generate(JSON.parse(STDIN.read))'
```

↓　こんな風に表示されます！

```bash
[qiita@example ~]$ echo '{"key": {"format": ["json", "XML"]}}' \
    | ruby -rjson -e 'puts JSON.pretty_generate(JSON.parse(STDIN.read))'
{
  "key": {
    "format": [
      "json",
      "XML"
    ]
  }
}
```

また、`JSON.parse(STDIN.read)["key"]` とすることで、特定の項目だけ表示することもできます。

```bash
[qiita@example ~]$ echo '{"key": {"format": ["json", "XML"]}}' \
    | ruby -rjson -e 'puts JSON.pretty_generate(JSON.parse(STDIN.read)["key"])'
{
  "format": [
    "json",
    "XML"
  ]
}
```

# PHP の場合

```bash
php -r 'echo json_encode(json_decode(stream_get_contents(STDIN)), JSON_PRETTY_PRINT);'
```

↓　こんな風に表示されます！

```bash
[qiita@example ~]$ echo '{"key": {"format": ["json", "XML"]}}' \
    | php -r 'echo json_encode(json_decode(stream_get_contents(STDIN)), JSON_PRETTY_PRINT);'
{
    "key": {
        "format": [
            "json",
            "XML"
        ]
    }
}
```

また、`json_decode(stream_get_contents(STDIN))->key` とすることで、特定の項目だけ表示することもできます。

```bash
[qiita@example ~]$ echo '{"key": {"format": ["json", "XML"]}}' \
    | php -r 'echo json_encode(json_decode(stream_get_contents(STDIN))->key, JSON_PRETTY_PRINT);'
{
    "format": [
        "json",
        "XML"
    ]
}
```