OmniAICreator/Qiita-1.07M huggingface dataset:
[VBA]フォームを使わない軽量チェックボックスで幸せになろう

# 背景

VBA初めて一ヶ月も経たない超初心者。
チェックボックスをフォームで作ったら結構データが多いので容量でかくなりすぎて動かんくなって死んだ（Excelが）。
強制終了させて、さてどうするか。

調べてると図形を使うといいらしい。
コードはいっぱい書いてあってしんどかったから概要だけいただいてきました。ありがとうございます！！

ご指摘あればよろしくお願いします。

# 本題

図形（オートシェイプ）を使います。
図形にマクロ登録して
図形のテキストを編集することで疑似チェックボックスにします。

---

**ざっくり手順**

 - 長方形を配置する
 - チェックの文字を選ぶ（チェックボックス風になるよう微調整）
 - 図のテキストを表示/非表示にさせるコード書く
 - 環境依存文字に対応する

---

## 長方形を配置する

適当に配置したら好きな見た目にしよう

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/31f2067f-2c57-3a75-c435-54dd7aca9f01.png)

## チェックの文字を選ぶ


するとこんな感じ。

![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/0f925f65-ae59-c2f9-6703-48458c8f4107.png)

崩れてる。
図形を右クリックー「サイズとプロパティ」ー「プロパティ」ー「垂直方向の配置」で「中心を選択」

するとこう！！

![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/9aa3a370-cdca-e0e0-e023-7a8ceb3c1ff6.png)

いい感じ。

## 図のテキストを表示/非表示にさせるコード書く

とりあえずの検証をするならこんな感じでいいと思う。
ただ問題があって、✓は環境依存文字なので「?」になる。

**ここでこっそりマクロの登録終わらせています**

※完成じゃないよ！

```vb
Option Explicit

Sub myCheckBox()

    Dim ws As Worksheet
    Dim shp As Shape
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller) ' クリックした図形を取得
    
    With shp.TextFrame.Characters
        If .Text = "" Then
            .Text = "✓"
        Else
            .Text = ""
        End If
    End With

End Sub
```

## 環境依存文字に対応する

チェックボックスにテキストを入力して次のコードを実行すると、イミディエイトウィンドウに文字コードが出てくると思う。

```vb
Option Explicit

Sub getMojiCode()

    Dim ws As Worksheet
    Dim shp As Shape
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller)
    
    With shp.TextFrame.Characters
        Debug.Print(Hex(AscW(.Text))) ' 文字コード出力
    End With
End Sub
```

私は「2713」だった。

これでおしまいだ。（実際にはMyCheckboxClassを作成して活用した。）

```vb
Option Explicit

Sub myCheckBox()

    Dim ws As Worksheet
    Dim shp As Shape
    Dim strMojiCode As String
    
    Set ws = ActiveSheet
    Set shp = ws.Shapes(Application.Caller)
    strMojiCode = "2713" ' ここ変更してね

    With shp.TextFrame.Characters
        If .Text = "" Then
            .Text = ChrW("&H" + strMojiCode)
        Else
            .Text = ""
        End If
    End With

End Sub
```

# (おまけ)チェックボックスの位置を取得する

```vb
shp.TopLeftCell.Address
shp.TopLeftCell.Row
shp.TopLeftCell.Column

' 変数を展開するとこう
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Address
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Row
ActiveSheet.Shapes(Application.Caller)TopLeftCell.Column
```

チェックボックスの位置が取得できれば、チェック付きチェックボックスの行を取得とか隣のセルの値を取得とか、いろいろやりたいことができるかなと思います。（TopLeftを取得してるので配置が重要！！！）


# 参考

[Excel checkbox optionbutton 重いチェックボックス対策　超軽量チェックボックス](https://qiita.com/granpa/items/551e8e82796542be3162)
[【VBA】図形のテキストや文字色の取得と設定【.TextFrame.Charactersを使う】](https://daitaideit.com/vba-shapes-text/)
[【VBA】環境依存文字（レ点チェックなど）の出力方法【コード有】](https://nkmrdai.com/vba-environment-dependent-characters/)
Python3  [::1]や[::2]を並べた　アウトプット

まんまです
学習していてこの辺りややこしいのでリストアップしてみました


~~~python3
w="aiueo"
print(w)
# aiueo

# 0番目から０文字飛ばしで返す
print(w[::1])
# aiueo

# 0番目から1文字飛ばしで返す
print(w[::2])
# auo

# 0番目から2文字飛ばしで返す
print(w[::3])
# ae

# 1番目から1文字飛ばしで返す
print(w[1::2])
# ie

# 1番目から1文字飛ばしで返す
print(w[int(True)::2])
# ie

# 0番目から1文字飛ばしで返す
print(w[int(False)::2])
# auo

# 1番目から1文字飛ばしで返す
print(w[(True)::2])
# ie

# 0番目から1文字飛ばしで返す
print(w[(False)::2])
# auo



# 下記 おまけ
# 単体で使うと真偽
print(True)
# True

# 単体で使うと真偽
print(False)
# False

# intと組み合わせるとTrueはint：１を返す
print(True+0)
# 1

# intと組み合わせるとFalseはint：0を返す
print(False+0)
# 0
~~~
Node.js v17 で webpack error

#### digital envelope routines::unsupported
Node.js が v17 になって以降（2021年10月19日） 、webpack (v5) で次のようなエラーがでるようになりました。

```text
Webpack in development mode
[webpack-cli] Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)
...
<anonymous>:6:1) {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
```

OpenSSL 3.0 のハッシュ関数に関する問題のようですが、webpack.config.js に「output.hashFunction: "xxhash64"」を追加すると、とりあえずビルドできます。

```text:webpack.config.js
const config = {
...
	output: {
		hashFunction: "xxhash64",
...
	},
```

別の方法として、node の実行時オプションに「--openssl-legacy-provider」を追加してもOKです。この場合は、次のように環境変数を定義するのが簡単です。

```bash
export NODE_OPTIONS=--openssl-legacy-provider
```

なお、この問題は webpack の v6 で修正されるようです。
Python３　YesかNoを返す　（例：ある要素が含まれているかでYesかNoを返す）真偽判定

学習のアウトプットです

まずYesかNoを返す式

~~~python3
print("NYoe s"[1::2])
# Yes
print("NYoe s"[::2])
# No
~~~
となるので
１を入れている箇所に真偽判定で１か０を返す値を入れてあげると
YesかNoを返すようになる
そこで下記

~~~python3
print(False)
# False
print(False+0)
# 0
print(True)
# True
print(True+0)
# 1
~~~
TrueやFalseはintと混ぜると１や０を返してくれることを利用する
そしてまた下記

~~~python3
print("NYoe s"[judge::2])
~~~
judgeの部分に下記の要素を代入すると

~~~python3
# 文字の配列を用意
sampleList=['a', 'i', 'u', 'e', 'o']
# sampleListの配列は文字iを含んでいるか？
print("i" in sampleList) 
# True
print("NYoe s"["i" in sampleList::2])
# Yes
~~~
この場合
("i" in sampleList)は単体ではTrueかFalseを返すが
judgeの箇所に求められているのはintになるので勝手にint（１か０）に変換される
ハイアンドロー・カードゲームの解き方

# はじめに
ハイアンドロー・カードゲーム問題でつまづいたところがあったので、備忘録にと書かせていただきました。

# ハイアンドロー・カードゲームとは　
###　※問題をしている方は読み飛ばしても構いません。
ハイアンドロー・カードゲームは、複数枚の子カードそれぞれが、1枚の親カードとの強弱関係で勝負するゲームです。

どのカードにも2つの番号が書かれています。
1つ目の番号は1から10の整数、2つ目の番号は1から4の整数で表されます。
また、2つの番号の各組み合わせは1枚だけカードの束に含まれています。(同じカードが2枚以上存在しません)

2枚のカードの強弱関係は、次のルールによって決まります。
・1つ目の番号が大きいカードのほうが強い
・1つ目の番号が同じ場合、2つ目の番号が小さいカードのほうが強い

親カードと子カードの情報が与えられるので、それらの強弱関係を調べるプログラムを作成してください。

##入力される値
入力は以下のフォーマットで与えられます。

```
a b
n
A_1 B_1
…
A_n B_n
```

1行目では親カードの情報が与えられます。親カードの1つ目の番号は a、2つ目の番号は b で表されます。
2行目では整数 n が与えられます。
3行目から n 行の入力が続き、各行では、子カード i (1 ≦ i ≦ n)の情報が与えられます。
子カード i の1つ目の番号は A_i、2つ目の番号は B_i で表されます。

それぞれの値は文字列で標準入力から渡されます。

##期待する出力
出力の i 行目では、親カードと子カード i の強弱関係を調べたときに
親カードの方が強いならば "High"、そうでなければ "Low" と出力してください。
各行では、"High" または "Low" 以外の余分な文字、空白を含んではいけません。

最後は改行し、余計な文字、空行を含んではいけません。

##条件
すべてのテストケースで以下の条件を満たします。

・1 ≦ a, A_i ≦ 10
・1 ≦ b, B_i ≦ 4
・1 ≦ n < 40

※入力データの中で同じカードが現れることはありません。

####入力例2

```
7 3
4
7 1
7 4
5 3
10 1
```

####出力例2

```
Low
High
High
Low
```

###はい、よくわかりませんね。読解するのにちょっと時間がかかりました。

入力例2を参考に解説します。

親カード(7 3)

4回timesで回していきます。
子カード1 (7 1)
子カード2 (7 4)
子カード3 (5 3)
子カード4 (10 1)


まず親カードの(7)と子カード1の(7)を比べます。（一回目）
同じ強さなので
親カードの(3)と子カード1の(1)を比べます。（二回目）
親カードが弱いので出力はLow(二回目は1が一番強くなります。)

親カードの(7)と子カード3の(3)を比べたときに
親カードが小さいので出力はHigh

こんな感じです。

#解き方　

###　問題が解決済みの方・わからなかった方のみ読むことを推奨します</summary>
まずは親カード(7 3)を受け取ってください。　
受け取り方がわからない方は[こちら(paizaで頻出するメソッドまとめ)][link-1]から。　

次にn回入力をしたいので4を受け取る記述。
n回数、timesで子カードの情報を受け取ります。



```Ruby
n.times do
    A, B = gets.split(" ").map &:to_i
    puts A, B
end
```

```
出力
7
1
7
4
5
3
10
1
```

次にif文で強弱関係の比較演算子を記述します。

```Ruby
n.times do
    A, B = gets.split(" ").map &:to_i
    if a > A || (a == A) && (b < B)
        puts "High"
    elsif a < A || (a == A) && (b > B)
        puts "Low"
    end
end
```

解説します。
親要素(a b)と子要素（A　B）を比較していきましょう。

親カードの一番目が強い場合。
もしくは一番目のカードが同じ強さで、親カードが2番目が強かった場合の記述です。
このどちらかがtrueだった場合、"High"が出力されます。
どちらもfalseだった場合、elsifで比較されます。

```Ruby
if a > A || (a == A) && (b < B)
```

こちらも同様です。
親カードの一番目が弱い場合。
もしくは一番目のカードが同じ強さで、親カードが2番目が弱かった場合の記述です。
このどちらかがtrueだった場合、"Low"が出力されます。
どちらもfalseだった場合は想定されていないのでelseは無しで構いません。

```Ruby
elsif a < A || (a == A) && (b > B)
```

解説は以上になります。

# 終わりに

今回丸々書いてしまいましたが、検索をかければかなりの数が出てきます。
その中でも一番わかりやすく書いた（つもり）なので理解したって方はぜひLGTMをください！
Bランクともに目指しましょう！


[link-1]:https://qiita.com/_yuki0302_/items/23787dc44e842489967e
MATLABのUbuntuへのインストール

# はじめに
以前MATLABをUbuntuへインストールした時に少しハマったので、記録しておきます。

# 環境

- かなり古いカスタムワークステーション（Intel core i7 3770k, RAM 64GB）
- Ubuntu 18.04

# MATLABのインストール

- ダウンロードしたzipファイル（```~/Downloads```を仮定）を展開する。
- 事前にインストールするフォルダを作成する（フォルダの書き込み権限がらみでエラーが出るため。今回は```/usr/local/MATLAB/R2018a```を仮定）。
- インストール予定のフォルダの書き込み権限を変更する。
- MATLAB実行のためのシンボリックリンク作成のために```/usr/local/bin```にインストーラーが書き込みできるように権限を変更する。
- 最後に```./install```でインストールする。

```shell-session
# cd ~/Downloads
# unzip matlab_R2018a_glnxa64.zip
# sudo mkdir -p /usr/local/MATLAB/R2018a
# sudo chmod 777 /usr/local/MATLAB/R2018a
# sudo chmod 777 /usr/local/bin
# ./install
```

- 最後に```/usr/local/bin```の書き込み権限を戻しておくように。

# 最後に
インストールフォルダの指定の段階でエラーが出たので結構な時間を溶かした記憶があります。

# 参考
- [UbuntuにMATLABをインストールする](https://qiita.com/chicken9/items/65799a63cccb9a4a947a)
- [MATLAB answers](https://jp.mathworks.com/matlabcentral/answers/478492-linux-os-ubuntu)
【RSpecエラー】'0' is not a valid role

##環境
Ruby 3.0.2
Rails 6.1.4.1


##状況

```
enum genre: { mistery: 0, romance: 1 }
```


```factory.rb
FactoryBot.define do
  factory :post do
    user
    
    title { 'first' }
    genre { 0 }
  end
end
```

```rspec.rb
context '記事を追加する際、正しい値の場合' do
  let!(:post) { create(:post) }
  let!(:post_params) { attributes_for(:post, title: 'other') }
  it '記事を追加できること' do
    expect {
     post "/manage/posts/#{post.id}", params: { post: post_params }
    }.to change(Post, :count)
    expect(response).to have_http_status(302)
    expect(post.reload.title).to eq 'other'
  end
end
```

```
ArgumentError:
       '0' is not a valid role
```

employee_paramsにgenreの値は0が渡っていたため、パラメーターが正しくなくDBに追加されずにテストが落ちていた。

```
> employee_params
=> {:title=>"first",
    :genre=>0}
```

##解決法

enumを設定しているときのFactoryBotの値は文字列でデータ作成する。

```factory.rb
FactoryBot.define do
  factory :post do
    user
    
    title { 'first' }
    genre { 'mistery' }
  end
end
```
Dockerfileのstage nameが読み込めない！


```ruby:ターミナル
docker build .
```
実行時に

```ruby:ターミナル
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to parse stage name "ruby:": invalid reference format
```
というエラーが発生しました。

そこでDockerfileを確認してみると、

``` ruby:Dockerfile
FROM ruby:$RUBY_VERSION
```
というふうにrubyのversionが書かれていなかったため、

``` ruby:Dockerfile
FROM ruby:3.02
```
と記述するとエラーが解消しました。
【第４回】Confluent Platformのデモを試してみる(Kafkaコネクト編)

###概要
今回は、[第一回](https://qiita.com/Alex-hiro/items/0209b2faec9c00cf3ca1)で構築したConfluentのクラスタを利用しConfluent Control CenterにログインしてKafkaコネクタについてGUI上で確認してみたいと思います。
Kafkaコネクタについてはメーカーの公式ドキュメントページに日本語で説明されておりますので[こちら](https://docs.confluent.io/ja-jp/platform/6.0.1/connect/concepts.html)をご参照下さい。

###Confluent Control Centerにログイン
１.以下のURLでWebブラウザからコンフルエントコントロールセンターのGUIにアクセスします。

```sh
http://localhost:9021
````

この例では、以下の3つのコネクタについてみていきます。
　・SSEソースコネクタ
　・Elasticsearchシンクコネクタ
　・Confluentレプリケーター
これらは、Confluentプラットフォームで構成されたConnectワーカーで実行されています。Connectワーカーに組み込まれたプロデューサーは、べき等であるように構成されています-（プロデューサーが再試行を引き起こすエラーが発生した場合、同じメッセージのみがブローカーのKafkaログに1回だけ書き込まれます。）

１.Kafka ConnectDockerコンテナはカスタムイメージです。そのベースイメージは、ConnectとReplicatorをバンドルするcp-enterprise-replicatorです。詳細については、この[Dockerfile](https://github.com/confluentinc/cp-demo/blob/6.2.1-post/Dockerfile)を参照してください。

２.Confluent Control Centerは、Kafka ConnectAPIを使用して複数のコネクトクラスターを管理できます。ここでは、Overviewの画面で左メニューから「Connect」をクリックします。
![スクリーンショット 2021-11-04 13.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/e4affcbd-7aea-03b9-3bb4-b9862b80cce9.png)

３.次にConnectワーカーのクラスターの名前である「connect1」をクリックします。
![スクリーンショット 2021-11-04 13.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/f38ecafb-4a3e-66d2-20c1-0e3452d07ec9.png)

４.この例で実行されているコネクタを確認します。
　・ソースコネクタwikipedia-sse：この例のSSEソースコネクタの詳細は[この構成ファイル](https://github.com/confluentinc/cp-demo/blob/6.2.1-post/scripts/connectors/submit_wikipedia_sse_config.sh)で確認できます。
　・ソースコネクタreplicate-topic：この例のReplicatorコネクタの詳細は[この構成ファイル](https://github.com/confluentinc/cp-demo/blob/6.2.1-post/scripts/connectors/submit_replicator_config.sh)で確認できます。
　・KafkaトピックのWIKIPEDIABOTから取り込むelasticsearch-ksqldbシンクコネクタ：この例のElasticsearchシンクコネクタの詳細は[この構成ファイル](https://github.com/confluentinc/cp-demo/blob/6.2.1-post/scripts/connectors/submit_elastic_sink_config.sh)で確認できます。
![スクリーンショット 2021-11-04 13.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/e47d4582-e7d3-9688-0434-e3ce5da10364.png)

５.コネクタ構成の詳細を確認したり変更したい場合は、対象のコネクタ名をクリックすることでGUI上から詳細の確認、変更ができます。
![スクリーンショット 2021-11-04 13.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/34c1b67c-db0c-0ac4-e4b5-35bb706f93f8.png)

6.このGUIで設定や変更が完了すれば「Next」をクリックすることで下図のように実際のConfligを確認することができます。ここで問題なければ「Launch」をクリックして適用します。
![スクリーンショット 2021-11-08 16.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/942dd021-686a-1325-9ccc-14abac0aa327.png)
個人的には運用の段階であればGUI経由でパラメータを変更できるので便利ではないかと思った次第です。

次回は、KsqlDBについてみていきたいと思っています。
今回も最後までお読み頂きありがとうございました！
【Rails】nil、空文字、0を1つのコードで判定したい



##これまで
numberが```nil```か```''(空)```か```0```を判定したいとき

```
number.blank? || number.zero?
```

##これから

```nil``` ```''(空)``` ```0```を1つのコードで判定できる。
```nil``` ```''(空)```はto_iすると0になる。

```
number.to_i.zero?
```

```
[1] pry(main)> number = ' '
=> " "
[2] pry(main)> number.to_i.zero?
=> true
[3] pry(main)> number = ''
=> ""
[4] pry(main)> number.to_i.zero?
=> true
[5] pry(main)> number = nil
=> nil
[6] pry(main)> number.to_i.zero?
=> true
```
R言語とExcelを用いた重回帰分析の方法4(重回帰式検定編)

重回帰分析とは、多変量解析のうち複数の説明変数と一つの目的変数が量的なデータの場合に用いることができる解析手法です。

#前回のおさらいと今回すること
R言語の無相関検定によって説明変数として適している座高、体重、足の大きさから身長を予測する重回帰式を導出しました。
今回は導出した重回帰式が信頼できるか重回帰式の検定を行います。

#重回帰式の検定
重回帰分析から得られた結果と重回帰式は以下のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/e5e572ca-fa60-bde8-0beb-fae906c15fa3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/90e7adbc-5518-f1ed-3521-1bc58a505c86.png)
赤丸で囲んだところが今回使用する数値です。

ここで、帰無仮説と対立仮説を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/934c9d50-488f-8dd5-dc95-4ec37e21399d.png)

重回帰式の当てはまりが良い→推定した重回帰式に意味があることを示します(下図参照)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/d882e270-516c-0c6d-8498-51820fb1ceb5.png)
重回帰式の検定では分散分析表を用いたF分布表による分散比𝐹0の検定をします。F分布表はネットで検索すると出てくると思います。
分散分析表は上記にある重回帰分析の結果にあります。赤丸が分散比𝐹0です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/d1231e02-198d-7647-46ea-f14e543327cc.png)

下図は分散分析表の概要です。nはサンプル数で今回は15です。pは変数の数で今回は3です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/aacc889d-980f-e0a7-1bdc-b1f82bef0fcf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/369e84a4-1310-1d25-1256-17e08c0d0162.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/f6a4bd86-3c05-d94e-8c39-5d3ec0a1ca8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/88f3731a-824d-a08b-4701-a5cd1ca68a46.png)

結果として、座高、体重、足の大きさから身長を予測する重回帰式は信頼できることがわかりました。

#まとめと次回の予定
・重回帰分析の結果から導出した重回帰式を検定しました。
・重回帰式の検定では分散分析表を用いました。
・結果として、座高、体重、足の大きさから身長を予測する重回帰式は信頼できることがわかりました。
・次回は各説明変数の偏回帰係数の検定を行います。

#おまけ(決定係数)
得られた回帰モデルのあてはまり具合を示す指標として決定係数があります。
決定係数R^2は0から1までの値をとり、説明変数と目的変数の間に完全な線的な関係があれば𝑅^2=1となります。
決定係数を平方和の比で表すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/dbc02e42-898c-ba11-c9ea-c6fc458ea30e.png)
今回の決定係数は重回帰分析の結果から、0.969478であることがわかり、導出した重回帰式は当てはまりが良いことがわかります(下図参照)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/5b58bca1-280a-6ad1-d221-6c9fca23b7b3.png)

#あとがき
今後も今回くらいの量で書いていきたいと思います。

ここまでお読みいただきありがとうございます。
Pro Git の core.autocrlf=input についての説明が間違っている件

Qiitaへの初投稿がこんなものでよいか分からないけど、どこに記録しておくのがよいかわからなかったので記しておきます。

# 改行コードの自動変換に関する config のおさらい

最重要なのは `core.autocrlf` と `core.eol` の２つ。`core.safecrlf` についてはここでは触れない。
あとリポジトリに `.gitattributes` があればその設定が優先されるけど、それについてもここでは略。

## core.autocrlf

チェックイン／チェックアウト時にテキストファイルの改行コードを自動変換するか否かを制御する全体設定。
取りうる値は `true`, `false`, `input` の３つ。明示的に設定されていない場合は `false` となる。

| 値 | チェックイン時 | チェックアウト時 | 補足 |
|:-:|:-|:-|:-|
| true | 常にLFにしてリポジトリに格納する| 常にCRLFにする | |
| input | 常にLFにしてリポジトリに格納する | 何もしない（そのまま） | 「リポジトリへの**input**」と理解すればOK[^1] |
| false | 何もしない（そのまま） |`core.eol`に従う | |

## core.eol

作業領域で使う改行コードを設定する。`core.autocrlf=false` のときにのみ有効。
取りうる値は `native`, `lf`, `crlf` の３つ。明示的に設定されていない場合は `native` となる。

この設定により、`core.autocrlf=false` でも結果的にチェックアウト時の改行コードの自動変換が働く。一方、チェックイン時には影響しない（何もしない）。

|値| チェックアウト時|
|:-:|:-:|
| native | OS の標準の改行コード |
| crlf   | CRLF |
| lf     | LF |

# Pro Git での core.autocrlf=input の説明

上述のとおり `core.autocrlf=input` の意味は「チェックイン時はtrueと同じ、チェックアウト時は何もしない」であって、OSによって挙動が変わるような設定項目ではない。しかし Pro Git の [「Git の設定」節](http://git-scm.com/book/ja/ch8-1.html#_core_autocrlf)では以下のように説明されている。

> この設定は、Windows にチェックアウトしたときの CRLF への変換は行いますが、Mac や Linux へのチェックアウト時は LF のままにします。

誤訳かと思ったら[英語版](http://git-scm.com/book/en/ch8-1.html#_core_autocrlf)でもこう書かれている。

> This setup should leave you with CRLF endings in Windows checkouts, but LF endings on macOS and Linux systems and in the repository.

この説明は混乱を招いていると思う。いろいろなサイトでこの説明が引用されているので困ったもの。
[issue](https://github.com/progit/progit2/issues/1091#issuecomment-557666633)でもこのことが指摘されていたが、修正はされていない模様。

\# エンジニアたるもの、間違っていると思ったなら issue 立てるなり Pull Request 投げるなりするべきだが、ちょっとそこまでの余裕が今はない。すみません。

[^1]: [StackOverflowでのQ&A](https://stackoverflow.com/questions/48379316/git-autocrlf-true-core-eol-native-vs-autocrlf-input)によると、ファイルが working-tree から index にコピーされる際に行われる自動変換が "**input** conversion" とのこと。
M1 Mac (Monterey) でandroid studio をインスコするときに躓いた話。　"Failed to determine required packages"

##概要
Montereyが動いているM1MacにAndroid studioを新規インストールしようとしたところ、セットアップが一発でうまくいかなかったので解決策をメモ。



##症状
Android studioの初期セットアップでNextとfinishを押していけば問題ないという記事が多くあるが、その通りに進めていくと、以下のようなエラー画面が出る。
![k7NcO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2270248/ebafcb33-9221-0b5e-72d4-57322f4ed4a7.png)

Android studioがAndroid SDKを正常にインストールできない（そんなことあっていいのか？）ためにこのエラーが出るようだ。因みに、Brewで別個にAndroid SDKをインストールしてもダメ。


##解決策
IntelliJ IDEAをインストールし、新規プロジェクト→Android　からAndroid SDKをインストールして、Android Studioのセットアップをし直せばおk。
![Imgvu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2270248/8bf0948d-df01-bfd3-2dbd-9c6fafe19603.png)

![2Pe6Y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2270248/25de735d-ce0b-21ba-f408-d028f3c3c5aa.png)

##考えられる原因
Montereyにアップデートしたことが原因かもしれない。現に、Catalinaの友人は正常にインストールが完了している。
※もし他の原因をご指摘いただければ、改正します。

##参考にしたもの

https://stackoverflow.com/questions/69869181/error-about-android-studio-on-macbook-m1-an-error-occurred-while-trying-to-comp　 
の４つ目ぐらいのアンサーを参考にした。画像もそこから拝借させてもらった。
pandasでfilterメソッドを使うと'Empty DataFrame'となる

#やりたいこと
取得したAPIデータがCSVになっているので、pandasを用いてdataframe化して項目を絞りたい。

##データ取得のソースコード
```python
headers = {
    'X-API-Key': 'xxx',
}

response = requests.get('https://xxx', headers=headers)
body = response.content

print(response)
print(body)
```

##csvをdataframe化して、filterで絞りをかけるソースコード

```python
df = pd.read_csv(io.BytesIO(body),sep=" ")
print(df.columns.values)
df = df.filter(items= ['xxx'])
print(df)
```
###実行結果
```python
['xxx yyy zzz aaa']
Empty DataFrame
Columns: []
Index: [xxx ...]

[2076 rows x 0 columns]
```

#発生した問題
`df.columns.values`
で存在を確認したcolumnが、filterをかけると存在せず
`Empty DataFrame`
が返ってくる。

#解決方法
`sep=' '`
を削除する。

#原因
`sep=' '`があると

```python

print(df.columns.values)

-----------------
['xxx yyy zzz aaa']


```
と1つのcolumnとして認識される。
正しくは

```python
print(df.columns.values)

-----------------
['xxx', 'yyy', 'zzz', 'aaa']
```
と表示されてほしい。
よく見るとクオーテーションがおかしいなと思ったことが気づいたきっかけ。
未経験からエンジニア転職

こんにちは。
転職活動がひと段落ついたので、私と同じく転職活動を行っている方の支えとなればいいなと思い書かせていただきます。

# 自己紹介
__年齢__: `拳で戦える年齢`
__学歴__: `高卒`
__前職__: `車造ってました`
__社会人歴__: `高校卒業してから丸々3年働いてました`
__使用言語__: `Ruby & Rails`
__きっかけ__: `在職中に興味本位で触ってみたRubyが面白かったから本気で目指してみようと思いました`
__ポートフォリオ__: `恥ずかしいので載せませんが、簡単な画像投稿アプリを作成`

# 使用媒体
転職するにあたって、いろんな転職サイトに登録して応募しまくってました。

<ul>
<li>doda</li>
<li>indeed</li>
<li>Qiita jobs</li>
<li>マイナビ</li>
<li>リクナビ</li>
<li>レバテックキャリア</li>
<li>Wantedlly</li>
</ul>

これらを用いて企業を探していました。

# 企業選び
選んでいた特徴としては

<ul>
<li>Rubyを扱う企業</li>
<li>大阪</li>
<li>未経験可、もしくは何かしらの開発経験を求めている会社</li>
<li>最悪Rubyじゃなくてもいいと思っていました orz</li>
</ul>

こんな感じの企業を選んでいました。
`未経験`じゃなく、`何かしらの言語を用いた開発経験`を求めている企業には応募メッセージに加えて`ポートフォリオ`を送っていました。
**こうすることで書類選考が通過する確率があがると`ワザップ`に書いてありました。**
ある程度条件にマッチする企業があればどんどん応募していました！

あんまり覚えていませんが

| 応募 | 書類選考通過 | 1次面接通過 | 内定|
|:-:|:-:|:-:|:-:|
| 約40社 | 15社  | 10社  | 2社 |

一応これがリアルな数字です。
会社によっては最終面接、社長面接とありましたが、内定いただいた企業様では最終的に社長面接でした`orz`
未経験可がないところにも思い切って応募していたのでお祈りメールがどんどんきていましたw

# 面接での質問
平均的に面接の時間は40分くらいです。
カテゴリごとに聞かれた質問を分けますね

#### 前職の質問

`前職を辞めた理由`
・当たり前ですが聞かれます。納得のいく理由じゃないと、**「こいつこの会社でもすぐ辞めそうだな」**と思われるので気を付けてください
`前職で学んだこと`
・前職でのスキルが直に転職先に活かせるならそれも踏まえて答える。
・無ければ、学習する習慣や学ぶ姿勢を身につけた。のように自走力があることを示してください。
`前職で頑張ったこと`
・頑張ったこと、それから得たものがどうな風にエンジニアとして活かせるかを示してください。
`前職での失敗/成功談`
・これもその経験からどんな風に立ち直ったか、反省したか、次はどうするか、どう対処したかを答えます

#### 自分についての質問
`経歴を踏まえての自己紹介`
・職務経歴書などを見ながらでもいいので簡単に自己紹介
`自己PR`
・自走力を示すことがいいと思います。
`強み/弱み`
・弱みは、経験のなさからくる慎重さと答えました。
`趣味`
・なんでもいいと思いますが、ギャンブル系は辞めましょうw
`どんなエンジニアになりたいか`
・具体的なイメージができないのであれば、3~5年目安でどこまでのスキルを身につけたいかを考える
`希望の勤務地`
・派遣などが主の企業は聞かれると思います。
・転勤が多いが大丈夫か？みたいな

#### スクールに通っている人への質問（私はスクールには通っていません）
`なんでそのスクールを選んだのか`
`カリキュラムはどうだったのか`
`何を学んだのか`
などが想定されるかと思います。

#### ポートフォリオの質問
`コンセプトは何か　or なんで作ったか`
・簡単な理由でも構わないと思います。
`拘ったところ`
・苦戦したのではなく、拘ったところを答えてください(デザインや使用感、機能など)
`苦戦したところ`
・実装に苦労したところ、どう解決したのかなど
`今後運用はしていくか`
・私の場合は学習用として運用していくつもりだったので、そう答えました。

こんな感じで聞かれました。
みなさんの面接対策として使っていただければ幸いです。

#　まとめ
大雑把ですが、転職にあたって取り組んできたことをまとめました。
面接など、苦戦しそうなら想定される質問を自分で書き出して答えを用意することがいいです！
`リモートなのでカンニングし放題!!!!!`

エンジニアとしてようやくスタートラインに立つことができたのでこれからスキルアップに勤しんでいきたいと思っています。
ここまでご覧いただきありがとうございました！！！
Raspberry Pi 3B+でカメラモジュールを有効化できなかったときのメモ

# 環境
```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
$ uname -a
Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux
```
上記は、2021/11/10現在、Raspberry Pi OS Imager v1.4で最新版のRaspberry Pi OS (32-bit)を入れた設定

# カメラモジュールの設定方法

1. カメラモジジュールをRaspbery Piへ接続
1. `設定` > `Raspberry Piの設定` > `インターフェース`の`カメラ`を有効にする
1. 再起動
1. `vcgencmd get_camera`コマンドを叩いて、`supported=1 detected=1`が返ってこれば成功


# 発生した問題
「カメラモジュールの設定方法」の2において`インターフェース`の`カメラ`が表示されない。

## 対処1: CLIから設定する

```
$ sudo raspi-config
```
`3 Interface Options` > `P1 Camera`をenableにし再起動。

```
$ vcgencmd get_camera
supported=0 detected=0
```

有効にならない。CLIの設定でも有効にならない。

## 対処２: ファームウェアをダウングレード
`5.10.63`(2021-10-30)の[リリースノート](https://downloads.raspberrypi.org/raspios_armhf/release_notes.txt)を見るとcamera周りのアップデートがいくつかあったので、その一つ前の`5.10.17`(2021-05-07)にダウングレード。ファームウェアhashは以下を参照

- https://downloads.raspberrypi.org/raspios_armhf/release_notes.txt
- https://github.com/Hexxeh/rpi-firmware/commits

```
sudo rpi-update 518ee7c871aaa9aaa88116953d57e73787ee6e43
```

再起動後、カーネルがダウングレードされていることを確認

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
$ uname -a
Linux raspberrypi 4.19.118-v7+ #131 14:21:24 BST 2020 armv7l GNU/Linux
```
改めて、「カメラモジュールの設定方法」の2を試すが、カメラの設定はない

## 対処３: OSをダウングレード
`Raspbian GNU/Linux 11 (bullseye)`から`Raspbian GNU/Linux 10 (buster)`へダウングレードする。[こちらのサイト](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)からRaspbian GNU/Linux 10 (buster)の一番新しいイメージ([raspbian-2020-02-14/](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2020-02-14/))をダウンロード。Raspberry Pi OS Imagerの`CHOOSE OS` > `Use costom`から先ほどダウンロードしたイメージを選択。SDカードへインストールする。

起動して、正しくOSがインストールされたか確認。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
$ uname -a
Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux
```

改めて、「カメラモジュールの設定方法」の2を試す。`インターフェース`に`カメラ`が表示されたので有効にし、再起動。

```
$ vcgencmd get_camera
supported=1 detected=1
```

👍

# まとめ
Raspberry Pi OS 3B+でカメラの設定を有効化できない時は、以下の設定にしておけばとりあえずうまくいく。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
$ uname -a
Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux
```

# 参考
- [RaspberryPiのファームウェアをダウングレードする](https://sugarsugar.conf.jp/raspberrypi%E3%81%AE%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)
- https://downloads.raspberrypi.org/raspios_armhf/release_notes.txt
- https://github.com/Hexxeh/rpi-firmware/commit/78c1429cc1d5a200d824d2629c3ceba4ba4617fe
- http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
【WIP】brew+zsh+tmux のPATH順序がおかしかったのでなんとかする

*記事内容編集中*

## 背景

tmux内で＄PATHを確認したら `/opt/homebrew/bin` がやたら後ろの方にあったので気持ち悪かった。
tmux外だと先頭の方にある。


## 起こりうる問題

brewで上書きしたはずコマンドがtmux内ではOSX標準のものが優先されてしまう。


## この記事の結論

`eval $(/opt/homebrew/bin/brew shellenv -f)` で無理やり対応した


## 調査

### /etc/zprofile

zshの読み込み順など

### path_helper

色々諸問題があるらしい

### brew install --disable-etcdir zsh

無くなってた

### unsetopt GLOBAL_RCS

なんか思った挙動にはならない。効かない？

### /opt/homebrew/bin/brew shellenv

実行しても何も出力されない

#### すでに実行済みだと出ないのかも？

```sh
export PATH="" # 設定次第で色々エラーでる。一時的な措置。
$ /opt/homebrew/bin/brew shellenv
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export HOMEBREW_SHELLENV_PREFIX="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
```

出た。

#### forceオプションがあるのでは？？

```sh
$ /opt/homebrew/bin/brew shellenv -f
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export HOMEBREW_SHELLENV_PREFIX="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
```

## オプション何あるのかな？

```sh
$ /opt/homebrew/bin/brew shellenv ?
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export HOMEBREW_SHELLENV_PREFIX="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
```

なんでもよかったらしい。。



----

そして、結論に。
Java PDFを透過的な背景付きの画像に変換

<p><strong><a href="https://www.e-iceblue.com/Introduce/pdf-for-java.html">Spire.PDF for Java</a></strong>は、PDFのドキュメントをイメージに変換するために、<strong>Pdfdocument.saveasy ()</strong>メソッドを提供しています。バージョン4.11.1以降、PDFファイルのイメージ変換機能をサポートしてきています。さて、この記事ではJavaアプリケーションで<strong>PDF</strong><strong>を透過的な背景付きの画像に変換</strong>する方法を紹介していきたいと思います。</p>
<h1><strong>下準備</strong></h1>
<p>1.E-iceblueの公式サイトから<strong><a href="https://www.e-iceblue.com/Download/pdf-for-java.html">Spire. PDF for Java</a></strong>をダウンロードしてください。</p>
<p>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.PDF.jarを参照に追加してください。</p>
<h1><strong>Maven</strong><strong>の側なら？</strong></h1>
<p>もしMavenの利用者だったら、pom.xmlファイルに下記のようなコードを追加することで、JARを簡単にインポートできます。</p>
```JAVA
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.PDF</artifactId>
        <version>4.8.7</version>
    </dependency>
</dependencies>
```
<h1><strong>PDF</strong><strong>を透過的な背景付きの画像に変換</strong></h1>
<p>下記は必要なメソッドとステップになります。</p>
<ul>
<li><strong>PDFDocument</strong>クラスのオブジェクトを作成します。</li>
<li><strong>PDFDocument.loadFromfile ()</strong>メソッドを使用してサンプルPDF文書を読み込みます。</li>
<li><strong>PdfDocument.getConvertOptions().setPdfToImageOptions()</strong>メソッドを使用して背景の透過値を指定します。</li>
<li>文書を<strong>PDFDocument.saveMagic ()</strong>メソッドを使用して保存します。</li>
</ul>

```JAVA
import com.spire.pdf.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class PdftoImage {
    public static void main(String[] args) throws Exception {

        // PDFDocumentクラスのオブジェクトを作成します。
        PdfDocument pdf = new PdfDocument();
        
        //サンプルPDF文書を読み込みます
        pdf.loadFromFile("Sample.pdf");
        
        //画像の変換にPDFの間、背景透過値を0とします。
        pdf.getConvertOptions().setPdfToImageOptions(0);

        //保存します
        BufferedImage image = pdf.saveAsImage(0);
        File file = new File( String.format("ToImage.png"));
        ImageIO.write(image, "PNG", file);
    }
}
```


<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20211110/20211110150840.png" alt="f:id:lendoris:20211110150840p:plain" width="554" height="700" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h1><strong>最後に</strong></h1>
<p>ここまで読んでくださってありがとうございます！もし<strong><a href="https://www.e-iceblue.com/Introduce/pdf-for-java.html">Spire.PDF for Java</a></strong>を利用している時にご不明なところがございましたら、ぜひご連絡ください</p>
【業務効率化】Pythonで大量のWordもExcelも一気にPDF化して、ついでに結合する【Windows対応】【Mac対応したい】

# はじめに

Windowsでのみ動作確認してます。
PDF化はWord、Excelから簡単にできますが、大量のファイルを手作業でPDF化するのが苦痛だったので一発でPDF化、そして結合できるプログラムを作成しました。

こんな感じに動きます。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631457/a6f266cb-ea1c-1af2-179e-9b39c67d06f4.gif)



詳しく、コードの解説をしているわけでもないですが、記事読んでいただければ同様の問題を解決できるかと思います。


##すぐ使えるスクリプト
環境： 
-Windows10
-Python 3.9.6
前提条件：
-pythonがpcにinstall済み
-Excel,Wordをインストール済み
-ターミナル(コマンドプロンプト)を使用可能



```plaintext:使用する外部ライブラリ
pip install docx2pdf
pip install pywin32
pip install PyPDF2
```

```python:ms2pdf.py
import docx2pdf
import win32com.client
import PyPDF2
import re
import os

def excel2pdf(input_file, output_file):
    #エクセルを開く
    app = win32com.client.Dispatch("Excel.Application")
    app.Visible = True
    app.DisplayAlerts = False
    # Excelでワークブックを読み込む
    book = app.Workbooks.Open(input_file)
    # PDF形式で保存
    xlTypePDF = 0
    book.ExportAsFixedFormat(xlTypePDF, output_file)
    #エクセルを閉じる
    app.Quit()

if __name__ == '__main__':
    # 対象ディレクトリを入力(コピペok)(最後に\(¥)をつけない)
    print("Which dir(full path)?:", end="")
    # 対象フォルダ
    input_dir = (input()+"\\").replace('/', os.sep)
    filenames = os.listdir(input_dir)
    output_dir = (input_dir + "pdf/").replace('/', os.sep)
    # ディレクトリが存在しない場合、ディレクトリを作成する
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for file in filenames:
        # 拡張子が".docx"のものをpdfに変換
        word_match = re.search("\.docx$", file) 
        if word_match: 
            docx2pdf.convert(input_dir+file, output_dir+file[:-5]+".pdf")
            print(file)
        # 拡張子が".xlsx"のものをpdfに変換
        excel_match = re.search("\.xlsx$", file) 
        if excel_match: 
            excel2pdf(input_dir+file, output_dir+file[:-5]+".pdf")
            print(file)
print()
print("-------------------------------")
print("merging PDF from:" + output_dir)
# 結合するPDFファイル一覧を表示
print("↓↓↓↓↓↓↓↓↓↓↓↓ target file ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓")
merger = PyPDF2.PdfFileMerger()

filenames = os.listdir(output_dir) 
num = 0
for file in filenames: 
        merger.append(output_dir + file)
        print(file)
        num += 1
print("↑↑↑↑↑↑↑↑↑↑↑↑ target file ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑")
print("total: " + str(num) + "file")
print()
print("-------------------------------")
print()
# 結合したPDFの名前を入力
print("What merged file name?:", end="")
merged_file_name = input()
# 拡張子(.pdf)がなければ追加する
if merged_file_name[-4:] != ".pdf":
        merged_file_name += ".pdf"
merger.write(output_dir + merged_file_name)
merger.close()

```
![Something went wrong]()

**使い方**
①ターミナル(コマンドプロンプト)で```python ms2pdf.py```を実行
②"Which dir(full path)?:"で対象ディレクトリを入力(コピペok)(最後に\(¥)をつけない)
③"What merged file name?:"で結合したPDFの名前を入力
③大量のWordもExcelも一気にPDF化して、ついでに結合してくれる

----
一つ退屈な作業から解放されました。

### 参考

https://admin-it.xyz/operation-efficiency/python-docx2pdf/

https://laboratory.kazuuu.net/search-for-files-with-a-specific-extension-in-python-using-regular-expressions/

https://news.mynavi.jp/article/zeropython-62/

https://note.nkmk.me/python-pypdf2-pdf-merge-insert-split/

https://qiita.com/koara-local/items/7ad01e0692e36627ba2d

https://www.sejuku.net/blog/67787
PHPでフォームに入れたデータを、MySQLのデータベースに追加したい

# 前提条件
MySQLのデータベースが用意できていること


# 入力フォームをHTMLで書く
.phpファイルを作成していかを書き込む。

```html
<form action="送るphpファイルの名前。一旦、今書いてるファイル名" metod="post">
  <label>投稿内容</label>
  <input type="text" name="content">
  <button type="submit">送信<button>
</form>
```

# 投稿内容をサーバに送って表示できるようにする
とりあえず、データベースに送る前に、送信ボタンを押したら、上にその内容が表示される仕組みを作ってみる。
(送信ボタンを押したら、サーバに送って、サーバ上でPHPが処理した内容を表示させるだけでデータベースにつながっていないので、リロードするとすぐ消えちゃう。)

さっき書いていた.phpファイルのフォームの上あたりに以下を追加

```php
<?php
  print_r($_POST);
?>
```

phpにはPOSTメソッドを受ける$_POSTというのが用意されてるので、これをprint_rで出力するだけ。

[PHP組み込みのisset関数](https://www.php.net/manual/ja/function.isset.php)を使って、中身に応じて出し分けてみる。

基本の書き方はこんな感じ。

```php
if ( isset ( 変数名 )) {
  変数の中身がある時の処理
}else{
  変数の中身が空の時の処理
}
```

今回はこんな感じに書き換えてみる

```php
<?php
  print_r($_POST);

if ( isset ( $_POST["キー名"] )) {
  $content = $_POST["キー名"];
}else{
  $content = "なし";
}
echo "投稿内容:" . $content;

?>
```

# データベースと繋ぐ
さっきのisset関数の部分を以下の通りに書き換える。

```php
<?php
 // 接続
 $pdo = new PDO("mysql:host=ホスト名;dbname=データベース名;charaset=utf8", "ユーザ名", "パスワード" );

 print_r($_POST);

 if ( isset ( $_POST["キー名"] )) {
  // 投稿内容を変数contentへ入れる
   $content = $_POST["キー名"];
  // SQL文を入れる
   $sql = "INSERT INTO bbs (content, update_at) VALUES(:content, NOW());";
  // さっきのSQL文をセットする
  $stmt = $pdo->prepare($sql);
 // SQL文の中に、投稿内容を入れた変数を直接SQL文にセットはできない。
 //ここでbindValueを使って、変数contentを:contentに入れる
  $stmt -> bindValue(":content", $content, PDO::PAEAM_STR);
 // SQL文を実行
  $stmt -> ececute();
 }else{
  $content = "なし";
 }
echo "投稿内容:" . $content;

?>
```
外部ID付きでAWSのAssumeRole

# 概要

外部ID(外部キー)付きでAssumeRoleをする機会があったので、メモです。


# 外部キーについて

[AWS リソースへのアクセス権を第三者に付与するときに外部 ID を使用する方法 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)

* 外部IDはAccessKeyのペアなどと違い、機密情報として扱われないので注意。
* 外部IDはランダムな文字列が良い
* 外部IDは該当のロールの「信頼関係」で確認できます。
* 外部IDは[「混乱した代理」問題](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/confused-deputy.html)を防ぐためにある
* 外部IDは「CLI」もしくは「API」で利用する
    * Management Consoleからはできないので注意


# CLIでのassume-roleのやり方

今回は外部IDがある時の話なので、`--external-id`オプションをつけます

```bash
aws sts assume-role --role-arn <引き受けたいロールのARN> --role-session-name <セッション名(なんでもいい)> --external-id <外部ID>
```

これを許可されたアカウントのIAM Userで叩くと、以下の情報が返ってきます

* AccessKeyId
* SecretAccessKey
* SessionToken

以下のように環境変数に設定することで、引き受けたロールでcliを操作できるようになります。

```bash
export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken
```

## 引き受けたことの確認

```bash
aws sts get-caller-identity
```

## 元のIAMユーザーに戻す

環境変数を削除する

```
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
```

## 詳しくはこちら
[AWS CLI を使用して IAM ロールを引き受ける](https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-assume-role-cli/)
SPSS Statistics 28.0.1の新機能

統計解析ツールIBM SPSS Statisticsの情報発信です。
28.0.1がリリース(2021.11.9)されました。
新機能をご紹介します。

# Version 28.0.1の新機能

## 対応OS
・macOS 12およびM1 Chipへの対応
・Windows 11への対応
## 統計処理と機能拡張
・カーネルリッジ回帰(Kernel Ridge Regression)
・検定力分析：信頼区間による精度への対応
・検定力分析：統計量から効果量を求め検定力を算出
・混合モデル線型で疑似R2乗を出力
・ピボットテーブルのヒートマップをサポート
## 操作性の向上
・ワークブックのコンテクストメニュー、エラーペインのサポート
・ライセンス管理メニューの強化

# カーネルリッジ回帰
分析メニュー＞回帰＞カーネルRidgeが追加されました。
メニューを選択すると最初に拡張ハブからのダウンロードに誘導されます。
選択して拡張モジュールをインストールするとカーネルRidge回帰が実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/f2491453-74ee-553b-55f7-2ed14baaf9a9.png)

# 検定力分析の機能拡張
・信頼区間による精度への対応
分析メニュー＞検定力分析のすべてのメニューで、推定値にサンプルサイズ、検定力が選択できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/4ea4eae2-a3bc-696d-3905-3b3a65df3e63.png)
・統計量から効果量を求め検定力を算出
分析メニュー＞検定力分析のほとんどのメニュー(平均＞一元配置分散分析と回帰分析＞1変量の線型回帰を除く)で信頼区間に基づきサンプルサイズが推定できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/58961552-b523-6502-b1f7-dac20ac50025.png)

# 線型混合モデルで疑似R2乗を出力
分析メニュー＞混合モデル＞線型の結果に決定係数 疑似R２乗が出力されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/8bd9aa5d-3848-a3e7-eabe-55666c1f6485.png)

# ピボットテーブルのヒートマップをサポート
①出力のピボットテーブルをダブルクリックして、編集モードに
②セルを選択して、右クリック
③色スケールを選択
④好きな色を選んでOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/e0953731-582a-ab86-e72c-b7d33c517037.png)

# ワークブックのコンテクストメニュー、エラーペインのサポート
ワークブックは、v28から新しく追加された出力ファイルの形式です。
編集メニュー＞オプション　全般タブ　アプリケーションモードでワークブックは選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/f557c24b-963f-8a46-6f43-fd618fcb67ee.png)

# ライセンス管理メニューの強化
ファイルメニュー＞ライセンスの管理を選択すると有効期限や更新日、ライセンス情報が得られるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/72023953-10ee-eb06-3d97-fe0227106e90.png)

# まとめ
ぜひ、お試しください。
Sync Gateway機能解説：同期〜再同期


Sync Gatewayの機能全般について、以下の記事も合わせてご参照ください。

https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417


## 概要
Sync GatewayのSync関数は、ドキュメントのチャネルへのルーティング及びドキュメント書き込み時のチャネルへのユーザアクセス制御に関係しています。アプリケーションの仕様変更等に伴い、Sync関数を変更する場合、変更後のSync関数によって、バケット内の既存のすべてのドキュメントを再処理して、ルーティングとアクセスの割り当てを再計算する必要が生じる場合があります。

この目的のために、Admin REST APIは、データベース内のすべてのドキュメントの再処理を開始する再同期エンドポイントを提供しています。

## エンドポイント定義

`/{tkn-db}/resync`

応答メッセージには、再同期を実行した結果として行われた変更の数が含まれています。

## 再同期実行必要性判断基準

Sync関数への変更が書き込みセキュリティにのみ影響する（ルーティング/アクセスには影響しない）場合は、再同期操作を実行する必要はありません。
再同期操作では、すべてのドキュメントがすでにデータベースに書き込まれている状況で行われます。
そして、Admin REST APIである再同期操作を実行する場合、Sync関数の実行コンテキストは`admin`ユーザーです。そのため、Sync関数内で書き込み操作を管理するために、`requireUser`、`requireAccess`および`requireRole`を使用している場合であっても、これらのメソッドは常に成功します。


チャネル/アクセスルールを変更する場合でも、Sync関数変更以降に、書き込まれたドキュメントにのみそれらのルールを適用したい場合は、再同期操作を実行する必要はありません。

## Sync関数の更新、再同期実施手順

Sync関数を更新し、再同期を実行する際の手順を以下に整理ます。

1. Sync関数を更新します。

2. 新しい構成をSync Gatewayプロセスに反映します（構成ファイルの更新など必要に応じ、Sync Gatewayを再起動します）。

3. データベースをオフラインにします。次の管理RESTAPIエンドポイントを使用します：`/{tkn-db}/_offset`

4. データベースを再同期します。次の管理REST　APIエンドポイントを使用します：`/{tkn-db}/resync`

5. データベースをオンラインに戻します。次の管理RESTAPIエンドポイントを使用します：`/{tkn-db}/_online`

## 影響

再同期は、データベース内のすべてのドキュメントを新しい関数で処理する必要があるため、コストのかかる操作です。
すべてのドキュメントがスキャンされるまでユーザーのフルアクセス権限がわからないため、データベースはこのプロセスが完了するまで要求を受け入れることができません。したがって、Sync関数の更新により、データベースがオフラインのとき（つまり、`/{tkn-db}/_offline`と`/{tkn-db}/_online`の呼び出しの間）にアプリケーションのダウンタイムが発生します。

## アクセス取り消しの反映タイミング

Sync関数を変更してユーザーのドキュメントへのアクセスを取り消す場合、新しい設定は、そのドキュメントの新しいリビジョンがSync Gatewayに保存されたときにのみ有効になります。再同期操作を実行しても、現在のドキュメントへのアクセスは取り消されません。


## 複数Sync Gatewayインスタンス運用時の考慮点

複数のSync Gatewayインスタンスが負荷を共有しているクラスター環境では、すべてのインスタンスが同じ構成を共有する必要があるため、プロセスを停止するか、`/{tkn-db}/_offline`エンドポイントを使用してすべてのインスタンスをオフラインにする必要があります。

その後、構成更新後、データベースを更新できるように1つのインスタンスを起動する必要があります。この時点で複数のインスタンスが実行されている場合、それらは互いに競合します。最初のインスタンスがデータベースの更新を終了した後、他のインスタンスを開始できます。

## Sync関数更新/再同期によるダウンタイム回避のためのワークアラウンド

更新中にデータベースへのアクセスを確保する必要がある場合は、事前にSync Gatewayのバケットの読み取り専用バックアップを作成してから、バックアップバケットで読み取り専用モードでセカンダリSync Gatewayを実行できます。更新が完了したら、メインのSync Gatewayとバケットに切り替えます。

## 関連情報

https://docs.couchbase.com/sync-gateway/3.0/resync.html
【Pyinstaller】+【venv】 簡単に軽量な .exeをつくる手順

# はじめに
**pyinstaller**を使ってpyファイルのexe化をすると，exeファイルが重たくなってしまうことがある．本記事では，**venv(仮想環境用Python標準モジュール)** を使った手軽にできるexeファイル軽量化の方法を一つ紹介する．他に簡単な軽量化手段が見つかればその都度更新しようと思う． 

## 環境
- OS: Windows 10
- Python 3.9.5
- Pyinstaller 4.6
- pip 21.3.1

## venv(仮想環境)を使う
適当な場所にプロジェクトフォルダ`MyProject`をつくった後, 以下のようにしてカレントディレクトリを移動させる．

```:コマンドプロンプト
c:\Users\user> cd Desktop\MyProject
```
この場所に仮想Python環境をつくる．(一般的に`.venv`とすることが多い)

```:コマンドプロンプト
c:\Users\user\Desktop\MyProject> python -m venv .venv
```
`MyProject`直下に`.venv`が作られ，以下のようなフォルダ構造となる．

```
MyProject
 └─.venv
     ├─Include
     ├─Lib
     └─Scripts
```
ここで`activate`することで，仮想環境に入ることができる．
```:コマンドプロンプト
c:\Users\user\Desktop\MyProject .venv\Scripts\activate
```
そうすると以下のような表示に変わる．

```:コマンドプロンプト
(.venv) C:\Users\user\Desktop\MyProject>
```
この状態で`pip list`すればインストール済みライブラリがまっさらなのがわかる．
## ライブラリのインストール
venvを使うことで必要最低限のライブラリのみexeファイルに取り込むことができる．pyinstaller及びexe化したいpyファイル(例えば`app.py`)内で`import`したライブラリをこの仮想環境内にインストールする．

```:コマンドプロンプト
(.venv) C:\Users\user\Desktop\MyProject> pip install pyinstaller
(.venv) C:\Users\user\Desktop\MyProject> pip install numpy
   ︙

   ︙
```
venvを使わなかった場合，PCのpipで管理するライブラリがすべてexeに取り込まれる. 

## pyinstallerの実行
以下のフォルダ構造になるように`app.py`を配置する．

```
MyProject
 └─.venv
 |   ├─Include
 |   ├─Lib
 |   └─Scripts
 └─ src
     └─app.py
```
以下のコマンドでexeファイルが出来上がる．`-F`でexeファイルを一つにまとめ，`-w`でexe起動時のコンソール起動をなくす．

```:コマンドプロンプト
(.venv) C:\Users\user\Desktop\MyProject> pyinstaller -F -w src\app.py
```

## 仮想環境から出る
`deactivate`で仮想環境から出ることができる．出るときは入るときのように，`.venv\Scripts\deactivate`とする必要はない．

```:コマンドプロンプト
(.venv) C:\Users\user\Desktop\MyProject> deactivate
C:\Users\user\Desktop\MyProject> 
```

## 参考文献
venvを詳しく知りたい方は，以下が参考になると思う．特に2つ目は，1つ目（公式ドキュメント）よりわかりやすくまとまっていると思う．

https://pyinstaller.readthedocs.io/en/stable/usage.html#what-to-generate

https://realpython.com/python-virtual-environments-a-primer/#a-folder-structure:~:text=%E3%81%8C%E6%B1%BA%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%20%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC,-%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%81%A7%E3%81%AF

## 追記履歴
2022-07-30：フォルダ構造を訂正した．pipコマンドなどを使わずに仮想環境フォルダ`.venv`を直接書き換えるべきではない．今回参考にした[Python Virtual Environments: A Primer](https://realpython.com/python-virtual-environments-a-primer/#a-folder-structure:~:text=%E3%81%8C%E6%B1%BA%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%20%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC,-%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%81%A7%E3%81%AF)を参考文献に加えた．
2022-08-22：[ライブラリのインストール](##ライブラリのインストール)において，「venvを使わなかった場合，~~ローカル~~のpipで管理するライブラリがすべてexeに取り込まれる. 」が不適切だった．~~ローカル~~からPCとした．どちらかといえば，仮想環境がローカルで，そうでない場合がグローバルと言えるかもしれない．
Ruby:小数点を扱うとき

アルゴリズムが動かなくて頭を抱えていたのですが、
"ceil"と"floor"を使い間違えていただけでした。
使うタイミングも多々あると思うので整理してみました。

#少数点切り捨て
```
例
puts 1.1.floor 
puts 1.9.floor 
puts -1.1.floor 
puts -1.9.floor 
```
[![Image from Gyazo](https://i.gyazo.com/002a1f795215fd2be4b99f1f1fa2d399.gif)](https://gyazo.com/002a1f795215fd2be4b99f1f1fa2d399)

#小数点切り上げ
```
例
puts 1.1.ceil  
puts 1.9.ceil
puts -1.1.ceil
puts -1.9.ceil 
```
[![Image from Gyazo](https://i.gyazo.com/c4822ea5ebb270b310b2cb793ea5c284.gif)](https://gyazo.com/c4822ea5ebb270b310b2cb793ea5c284)

#四捨五入
```
例
puts 1.1.round 
puts 1.9.round 
puts -1.1.round 
puts -1.9.round 
```
[![Image from Gyazo](https://i.gyazo.com/eadcf78cde3b32101aa2936ecf135b78.gif)](https://gyazo.com/eadcf78cde3b32101aa2936ecf135b78)

#少数点を表示させる
```
例
puts 1.to_f
puts -1.to_f
```
[![Image from Gyazo](https://i.gyazo.com/28dba018abaf3dd7a41f5fd53c5d35fb.gif)](https://gyazo.com/28dba018abaf3dd7a41f5fd53c5d35fb)

#少数点を含む計算の誤差
[![Image from Gyazo](https://i.gyazo.com/30135dca8a26f42d74c0d17fef838e1d.gif)](https://gyazo.com/30135dca8a26f42d74c0d17fef838e1d)
[![Image from Gyazo](https://i.gyazo.com/294872ef1571c7dcd0395a6f4b348f7d.gif)](https://gyazo.com/294872ef1571c7dcd0395a6f4b348f7d)
###対応方法
[![Image from Gyazo](https://i.gyazo.com/ca0211580f4494e8a86d02f2b3cbdbc8.gif)](https://gyazo.com/ca0211580f4494e8a86d02f2b3cbdbc8)
[![Image from Gyazo](https://i.gyazo.com/50b47ea5a2ab0bd961c8d4884b8d531c.gif)](https://gyazo.com/50b47ea5a2ab0bd961c8d4884b8d531c)

```
require 'bigdecimal'
```
"BigDecimal"というライブラリを使って計算していくらしいです。
"Decimal"は直訳だと"10進数"みたいです。
そして引数はStringでないとダメらしく、".to_s"も必要みたいです。
[![Image from Gyazo](https://i.gyazo.com/37e51a9d13fe0c324057d95bd981698a.gif)](https://gyazo.com/37e51a9d13fe0c324057d95bd981698a)
リファレンス読んでもなかなか難しそう・・・・　、詳しくは参考記事を参照ください
https://docs.ruby-lang.org/ja/latest/library/bigdecimal.html

参考記事
https://qiita.com/yusabana/items/fd4a0185c1f120403a74
https://qiita.com/jnchito/items/d0ef71b25732ad5a881c

#まとめ
生前前から存在する電卓の偉大さを思い知りました・・・。
最後はデータサイエンス的な要素も少し感じましたが、前半部分はしっかりと活用してアルゴリズムを記述できるようにしておきたいです。
基幹システムしかしてこなかったのでイマドキのフロント開発を覚えたい


#目次
[1.はじめに](#1-はじめに)
[2.自己紹介](#2-自己紹介)
[3.React/Hooks/Typescript](#3-React/Hooks/Typescript)
[4.おわりに](#4-おわりに)

#1. はじめに
私は地方のITベンダーでシステムエンジニアをしています。自治体や民間企業の基幹系システム、いわゆるBtoBのシステムしかやってきませんでした。

15年ほど前、自治体では「オープンソースソフトウェア」の流行りが来まして、その時はJava + JSPでのシステム構築も経験したため、Web開発は行ってきました。しかし、最近流行りのフロント開発には全く携わってこなかったので、これを機に自分のスキルを上げるためにも勉強を始めました。

当Qiitaでは、私が勉強した内容の備忘録を残していきます。
テーマはフロント開発だけでなく、その時々でやっていることを残しておきたいと思います。

#2. 自己紹介
2021年で3回目の年男ですので、いわゆる「おじさん」です。システムエンジニア35歳定年説からすると、もう継続雇用に入りましたね（笑）

2児の父親で、山形県[長井市](https://www.city.nagai.yamagata.jp/ '長井市ホームページ')という、市の要件を満たさないぐらいの人口の、自然豊かな街に住んでいます。

新卒から山形市にある地元ITベンダーに勤めています。
会社の指示により（笑）、JDLA E資格2021 #2にも合格したため、ディープラーニングを組めます。

#3. React/Hooks/Typescript

これから覚えようとしている技術についてです。今までBtoCのことをほとんどやっていなかったため、フロン系技術を覚えるつもりでした。ディープラーニングにも興味があったため、Pythonで書けるDjangoを見てみましたが、やめました。

そんな中、会社のメンバーからJavascript系のフロント開発を覚えよう、という声が出てきたため、以下に注目にしました。

* Vue.js
* React

会社の若手はVue.jsを使って開発しているメンバーもいるようでした。アジアでは人気なのだとか？

ですが、世界的にはReactが人気らしく、今後もこのフレームワークは残るであろうと…。ということで、Reactを覚えよう、ということになりました。
さらにHooksとTypescriptも使ったやり方で覚えていこうと思います。

#4. おわりに

当Qiitaは備忘録になります。
あまり最新の技術を追っかけて行かないかもしれません。

ただ、React/Typescriptの記事を探してみても、英語情報が多く、自分のやりたいことを紹介してくれる記事がまだない状況でしたので、私がやれた内容を残していければと思います。（いつまで続くのやら…）
メモ〜phonenumber_fieldの値をテンプレート上で国内表示に戻す

本記事の概要
-
完全に自分用のメモです。

`phonenumbers`というパッケージを用いてdjangoアプリに電話番号入力フォームを実装していました。

電話番号には国内表記（090などで始まるいつものやつ）と国際表記（日本であれば+81といったような国コードを含むもの）がありますが、このパッケージを用いて実装されるフォームが国際コードを強制するものであり、そこに少し手こずったので、それも含めて残しておきます。


目次
-

- 導入
- フォームの作成
- 入力例
- テンプレートの表示例
- 国内表記に戻す方法
- 終わりに

導入
-

まずは必要なパッケージをインストールしていきます。

```shell
% pip3 install django-phonenumber-field
% pip3 install phonenumbers
```

インストールできたら、`settings.py`に以下のように追記します。

```python:settings.py
INSTALLED_APPS = [
  # ...中略...
  "phonenumber_field",
  # ...中略...
]
```

これで

```python
from phonenumber_field.modelfields import PhoneNumberField
```
と記述することでそのモジュールでは`PhonenumberField`を扱うことができるようになります。

フォームの作成
-
それではフォームを作ります。

```python:models.py
from phonenumber_field.modelfields import PhoneNumberField
class Shop(models.Model):
  phonenumber = PhoneNumberField
```

```python:forms.py
class ShopForm(ModelForm):
  class Meta:
    model = Shop
    fields = "__all__"
```

`PhoneNumberField`のインポート以外は特に問題ないと思います。

入力例
-
電話番号は国コードをつけた状態で入力します。

日本の電話番号であれば、先頭の0を`+81`に変換すればOKです（国コードをつけないとバリデーションエラーになります）。

[![Image from Gyazo](https://i.gyazo.com/64eb76cdc6f5e5e3d204791a881cb0b4.png)](https://gyazo.com/64eb76cdc6f5e5e3d204791a881cb0b4)

これをそのまま`shop.phonenumber`で表示した場合、テンプレート上では`+81`表記になります。

国内表記に戻す方法
-
`+81`表記だと使い勝手が悪いので、国内表記に戻します。

手っ取り早い方法は、phonenumberオブジェクトの`format_number`メソッドを用いることです。

```python
import phonenumbers
# ...中略...
natinal_phonenumber = phonenumbers.format_number(shop.phonenumber, phonenumbers.PhoneNumberFormat.NATIONAL)
```

第一引数のphonenmberオブジェクトを第二引数のフォーマットに従って変換しています。

`NATIONA`が国内表記の意味で、この部分を`INTERNATIONAL`にすれば国内→国際の変換も可能です。

あとはこれをテンプレートに渡すだけです。

ちなみに、この変換はテンプレートの`{{}}`の中では行えないので気をつけましょう。

終わりに
-
以上がPhoneNumberField`の使い方でした。

しかし今更ですが、国際コードでの入力が必要ない場面では却って使いにくいですね・・・

国内ユーザーのみを考慮すれば良いのであれば、自分でバリデーションを設定した方が良いと思います。
FMRIB Software Library（FSL）のインストール

# はじめに
神経画像解析用ライブラリであるFMRIB Software Library（FSL）をLubuntu 18.04にインストールします。

# 環境
- Dell Optiplex 5060 SFF (2019), core i5 8400, M.2 256GB SSD, 32GB RAM
- Lubuntu 18.04

# FSLのインストール
FSLのインストール方法は[公式](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation)に載っていて、そのとおりにやればいいのですが、一応日本語で書いておきます。

- FSLのライセンス登録とインストーラーのダウンロード
[ダウンロードページ](https://fsl.fmrib.ox.ac.uk/fsldownloads_registration)から必要事項を記入して、リンクからfslinstaller.pyを適当なフォルダにダウンロードしてください。

- インストーラーの起動
pythonバージョン2がインストールされていないといけませんので、バージョン2を入れます。その後、fslinstaller.pyを走らせます。

```shell-session
# sudo apt install python
# python fslinstaller.py
```
あとは指示に従ってインストール作業を進めます。
インストール場所はデフォルトの```/usr/local/```でいいと思います。
インストール後は```fsl```で起動してパスが通っているかを確認しますが、通らない場合は追加設定が必要です（.bash_profileがあるかないかでパスが通るか通らないか決まるように思いますが未確認）。
.bash_profileを作ってFSLDIRを設定します。
今回は、作成した空の.bash_profileにヒアドキュメント```cat <<EOF```をリダイレクトして入力します。EOFを入力すると終了します。echoを使ってリダイレクトしても構いませんし、エディタで書いても構いません。

```shell-session
# touch .bash_profile
# cat <<EOF> .bash_profile
> FSLDIR=/usr/local/fsl
> . ${FSLDIR}/etc/fslconf/fsl.sh
> PATH=${FSLDIR}/bin:${PATH}
> export FSLDIR PATH
> EOF
```
.bash_profileはログイン時に有効になるので、再ログインして完了です。

```
# fsl &
# fsleyes &
```
で、バックグラウンド起動してみて、FSLとFSLeyesのUIが立ち上がれば終了です。

# メニューの作成
作成中（プログラムランチャーから立ち上げる方法）

# おわりに
FSLをインストールしました。シェルスクリプトで動作させることが多いと思いますが、メニューも作った方が何をインストールしたかGUIでわかるので今後追記していきます。

# 参考
[ヒアドキュメント](https://qiita.com/kite_999/items/e77fb521fc39454244e7)
[.bash_profileと.bashrcの違い](https://qiita.com/takuyanagai0213/items/91f9c3c0287442367b34)
pyenv を windows に

やったことリスト

* choco install pyenv-win
* pyenv install 3.9.6
* pyenv global 3.9.6
    * →デフォルト
* python -m venv test
    * →カレントに test フォルダを作ってそこに仮想環境設定が入る
    * python -m venv %USERPROFILE%\venv\root　とかやってる人がいる。ちゃんとしててえらい。
* test\Scripts\activate
    * `(test)` が行頭に表示される
    * test という仮想環境ができた
    * ここでpipをするとこの環境に基本はいる
nRF9160 には BLE の機能はない

# nRF9160 には BLE の機能はない。

これに気づくのに数日かかった（←:relaxed:）。

nRF9160DK のような BLE機能付きの開発ボードには、別途BLE機能付きのチップが載っているのだ。

nRF9160DK には nRF52840 が載っていて、nRF9160とUART接続されている。

以上、ご参考まで。