OmniAICreator/Qiita-1.07M huggingface dataset:
Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション5:業務効率②：フォーム入力からLINEに通知を送る

<h1>問題設定とワークフロー・必要な知識</h1>
フォーム入力からLINEに通知を送るためのワークフロー
１．ユーザーがGoggle Formで申し込む。
２．ユーザーの申し込み情報をGASで取得する。
３．LINEに通知がいくようにする。

必要な知識
・フォームから情報を取得する方法
・GASでAPIを叩く方法
・LINE　Messaging　APIの使い方

<h1>APIとは</h1>
　**API**とは、ある情報を持つサーバーに対してユーザーが得たい情報をそのサーバーに**リクエスト**を送り、その情報をサーバーが**レスポンス**を返すやり取りのことを指します。
　リクエストで得たい情報の条件の事を**パラメータ**と言います。

<h1>LINE　Messaging　APIとは</h1>
　LINE　Messaging　APIとは、サービス（LINEアカウント）とLINEユーザーの双方向コミュニケーションを可能にするAPIのことです。サービス側が一方的にユーザーにメッセージを送ることはもちろん、ユーザー側もサービス側に対してメッセージを送ることが可能になります。

<h1>LINE　Messaging　APIの準備</h1>
[Messaging API - LINE Developers](https://developers.line.biz/ja/services/messaging-api/)のページでログインし、新規プロバイダーを作成します。
新規プロバイダーでMessaging APIを選択し、新規チャンネルを作成します。

<h1>GASからLINEに通知を送る</h1>
GASからLINEに通知を送るためには、以下のようにコードを書きます。フォーム送信時に通知が届くようにトリガー設定するようにします。

```gas:gas
function notifyLINE(){
  const ACCESS_TOKEN = 'アクセストークン';
  const USER_ID = 'ユーザーID';

  var url = 'HTTPリクエスト';

  var headers = {
    'Content-type' : 'application/json; charaset=UTF-8',
    'Authorization' : 'Bearer' +ACCESS_TOKEN
  };
  
  var message = 'テスト通知です';
　
  var data = {
     'to' : USER_ID,
     'messages' : [
        {
           'type' : 'text',
           'text' : message
        }
      ]
   };

  var options = {
    'method' : 'post',
    'headers' : headers,
    'payload' : JSON.stringify(data)
   }

  UrlFetchApp.fetch(url,options);
}
```
<h1>最後に</h1>
洗練さんでインターン(Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション5:業務効率②：フォーム入力からLINEに通知を送る)です。
[Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション5:業務効率②：フォーム入力からLINEに通知を送る](https://www.udemy.com/course/gas_for_operational_efficiency/learn/lecture/16826962#notes)

最後に
現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
[洗練](https://senren.work/)
phpの比較演算子「==」は予想外の動きをするで！比較は「===」を使おう

### 比較演算子「==」は型変換を自動で行ってしまう。
型の扱いが非常に曖昧であることで有名なPHPでは、他の言語と同じく「==」を使って比較を行うと、**型変換を勝手に行って比較**を行ってしまいます。

https://www.php.net/manual/ja/language.operators.comparison.php

```
<?php

$a = 100;
$b = "100"

var_dump($a == $b)
```

```
〜出力〜
bool(true)
```

$aはstring形、$bはint型なので、falseを返して欲しいところですが、型変換をして、値が等しいのでtrueとなってしまいます。

同じく下記のように**0とnullを比較した場合にもtrue**となってしまいます。
コードを書いている中で0とnullは別として扱いたいことが多いため、バグの発生源となってしまいます。

```
<?php

$a = 0;
$b = null;
var_dump($a == $b)
```

以下のような場合も悲しいことにtrueとなってしまいます。。

```
<?php

$a = "abcde";
$b = 0;
var_dump($a == $b)
```

否定演算子も同じく「!=」と書いてしまうと型変換した後の比較となってしまいます。

### PHPでは比較演算子は「===」を使おう
「===」を使うと、値だけでなく、**型の比較までもしてくれる**ようになります。

上記のように曖昧な比較をされないためにも**比較演算子は「===」を使うようにしましょう。**
(C言語などになれてしまっている人にとっては＝が３つ並ぶことは気持ち悪いかもしれませんが。。。)

ちなみに配列に値が存在するかどうか比較するin_array関数ではデフォルトでは「==」での比較を行ってしまうので注意が必要です。第3引数にtrueを指定すると初めて「===」での比較が行えます。

https://www.php.net/manual/ja/function.in-array.php
Twitterのトレンドを取得する

```python


import urllib
from requests_oauthlib import OAuth1
import requests
import sys

def main():

    # APIの秘密鍵
    CK = 'your key' # コンシューマーキー
    CKS = 'your key' # コンシューマーシークレット
    AT = 'your key' # アクセストークン
    ATS = 'your key' # アクセストークンシークレット

    tweets = get_trend(CK, CKS, AT, ATS,)

    # 検索結果を表示
    print(tweets[0:3])


def get_trend(CK, CKS, AT, ATS,):
    # リクエスト
    url = "https://api.twitter.com/1.1/trends/place.json?id=23424856"
    auth = OAuth1(CK, CKS, AT, ATS)
    response = requests.get(url, auth=auth)
    data = response.json()[0]['trends']

    return data


if __name__ == '__main__':
    main()
SpringBootのDIとは何か？

#SpringBootのDIとは
・Springのコア機能である。
・クラスの外から依存性（オブジェクト）を注入することで、クラス間の依存関係を解消する
　ことが目的である。
・インスタンスの生成※1とインスタンスのライフサイクルの管理※2を実施してくれる。
　※1インスタンスを毎回生成してアプリに渡すのか、1回のみ生成してアプリに渡すのかを
　　 管理してくれる。
　※2サーブレットの各スコープ(セッションスコープなど)にインスタンスを簡単に登録して
  　　 スコープの有効期限が切れたらインスタンスを破棄してくれる。

#DIの実装方法
以下のパターンがある。
・アノテーションベース
・JavaConfig
・xml
・JavaConfig + アノテーション
・xml + アノテーション

アノテーションベースの方が簡単にアプリケーションを作成できるが、JavaConfigだとインスタンスを
生成する際にコンストラクタに渡す値を設定したりというような細かい設定が可能となる
また、本番環境と開発環境でJavaConfigを切替えたるといった細かい切り替えが可能となる
小規模なアプリであればアノテーションベースで作成して、細かい設定などをしたいインスタンスがある場合に、そのインスタンスのみJavaConfigで設定するという方法が望ましい。
xmlでは、JavaConfigと同じ内容をxmlの形式で行う。

#DIの中の処理
1. Springを起動すると、DIコンテナ上で管理するクラスを探す処理(コンポーネントスキャナン)が走る。
2. DIが管理対象のクラスを見つけた後は、それらのインスタンスを生成して@Autowiredアノテーションがついているフィールドにセットする。

※DIコンテナ上で管理するクラスをBeanという。
・DIコンテナにクラスを登録する方法(アノテーションの場合)
  　@Component、@Controller、@Service、@Repositoryなどのアノテーションがついている
　クラスが対象である。
・DIコンテナにクラスを登録する方法(JavaConfigの場合)
  　@Configurationを付けたクラスに、DIコンテナに登録したいクラスのインスタンスを返す
　　getterを定義して@Beanを付ける。

#考察
・xmlとJavaConfigはxmlとjavaの言語の違いがあるだけなので、とりあえずxmlはおいといて、
　アノテーションとJavaConfigの実装方法だけ把握しとけば、xmlでの実装が求められる状況に
　なってもなんとかなりそう。
・詳細設計、製造の経験を多く積んで、ある程度設計の知見を得てからでないとDIのメリットを
　十分に理解できそうにない。
・JavaConfigは、テストパターンが多い場合の作業の効率化に役立ちそう。


#補足
・@Autowiredを付けられる箇所は以下である。
　・フィールド変数
　・コンストラクタの引数
　・setterの引数

#参考文献
・【後悔しないための入門書】Spring解体新書: Spring Boot2で実際に作って学べる！Spring 
　　Security、Spring JDBC、Spring MVC、Spring Test、Spring MyBatisなど多数解説！
　　作者: 田村達也
PHPでデータベースにアクセスする方法

PHPでデータベースにアクセスするコードを書き留めておきます。

##まずは接続のセットアップをします

``` PHP
<?php
//データベースユーザー
$user = "user";
$password = "pass";
//利用するデータベース名
$dbName = "testdb";
//MySQLサーバー
$host = "localhost";
//MySQLのDSN文字列を生成
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
```

##接続するコードを書いていく

``` PHP
try{
//pdoクラスのインスタンスを作成し接続
$pdo = new PDO($dsn, $user, $pass);
//プリペアードステートメントのエミュレーションを無効にする
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//例外処理対応を有効にする
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//接続成功したら表示
echo "データベースに接続しました";
//接続を切断
$pdo = NULL;
} catch(Excetion $e) {
echo "エラーがありました";
echo $e->getMessage();
exit();
}
?>
```

例外処理を用いてエラーがおこったときの処理をcatchのブロックに書いておく
exit();で以降の命令を中断
ubuntu設定 - アプリケーションの自動起動,各種設定

## 自動起動 autostart
### terminator

```
cd ~/.config
mkdir autostart
```

```shell:~/.config/autostart/terminator.desktop
[Desktop Entry]
Exec=/usr/bin/terminator 
Type=Application
```

### firefox

```shell:~/.config/autostart/firefox.desktop
[Desktop Entry]
Exec=/usr/bin/firefox
Type=Application
```

### folder(ピクチャ)


```shell:open_folder_pictores.desktop 
[Desktop Entry]
Exec=nautilus /home/dev/ピクチャ
#Exec=gnome-terminal -- bash -c "nautilus /home/dev/ピクチャ;exec bash"
Type=Application
# open folder command
# nautilus $PATH
```

### google-chorme

```shell:~/.config/autostart/firefox.desktop
[Desktop Entry]
Exec=/usr/bin/google-chrome
Type=Application
```

参考:https://ludwig125.hatenablog.com/entry/2019/01/19/232600

## 各種アプリケーションの設定
### terminator

ターミナル設定:左半分を埋めるような位置・サイズ

```configuration:~/.config/terminator/config
[global_config]
  borderless = True
  hide_from_taskbar = True
  always_on_top = True
  sticky = True
[keybindings]
  hide_window = F12
[profiles]
  [[default]]
    cursor_color = "#aaaaaa"
    show_titlebar = False
[layouts]
  [[default]]
    [[[window0]]]
      type = Window
      size = 960, 1080
      position = 0:25
      parent = ""
    [[[child1]]]
      type = Terminal
      parent = window0
[plugins]

```
rails db:seedでデータベースに反映されない時の対処法

seedを用いてデータベースにダミーデータを入れる時に使えるseeds.rbの記述方法について書きました。

seeds.rbにデータを記述する時に

```ruby:seeds.rb
User.create!(name: ...)
```
と上記のようにcreateの後に!をつけることでデータをデータベースに登録失敗した際にエラーを表示してくれるようになります。
tkinterでサイコロを作ろう

#始めに
ふと自分のオリジナルアプリをpythonで作ってみようと思い、tkinterを使ってみました。しかし、ボタンの押された時の処理がなかなか分からず苦労したので記事にしました。tkinterでボタンが押された時の処理をどう書けばいいのか分からない人や、ラベルの内容の変更方法の知りたい方は読んで下さい。


#ソースコード

``` python
# 必要なライブラリーを読み込む
import tkinter as tk
import random

# 画面の設定
root = tk.Tk()
root.title("Dice.app")
root.geometry('200x150')

# ボタンが押された時の処理
def dice(event):
    # ランダムな整数を生成して、labelの内容を書き換える
    value["text"] = random.randint(1,6)


value = tk.Label(text="0",font=("",80))
value.pack(fill = 'x', padx=20, side = 'top')


# ボタンの設定
Btn = tk.Button(text='サイコロをふる',width=10)
# ボタンとトリガーを紐ずける
Btn.bind("<Button-1>", dice)
# ボタンをプロット
Btn.pack(fill = 'x', padx=20, side = 'top')

root.mainloop()
```
#参考文献
[サイト](https://nnahito.gitbooks.io/tkinter/content/helloworld/30dc-30bf-30f3-3092-shi-3063-3066-307f-308b/button3092-ya-3059-3068-he-304b-3057-3066-307f-308b.html)
画像から色を抽出する

#抽出対象
マレーシアの国旗を使用します。色の割合を目で判断する場合に、「赤」、「白」、「青」、「黄色」の多い順になると思います。
![malaysiaflag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/9faa4104-14c3-ec39-d14b-067d6760bbe2.png)

#コードのイメージ図
画像はピクセルから成り立っています。そして、それぞれのピクセルは色(RGB)の情報を持っています。
下記はマレーシアの国旗の一部を切り取ったものとなります。ピクセル数は「50x50」です。
![partial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/7bd9bf8d-cdab-ab36-691a-8c5ba9e2f827.png)

これらのピクセルの色をRGBの空間で描くと下記となります。
![rgb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/1aa1e08a-5a00-aecb-515d-4ac28d50a4f9.png)

RGBの空間上にkmeansというクラスタリングの手法を用いて色の割合を導きだします。

#コード
```colorextract.py
import cv2
import matplotlib.colors as cs
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

#set path to image
imgpath = 'malaysiaflag.png'
#set number of cluster for kmeans
clusterno = 3

#read image
img = cv2.imread(imgpath)
#convert bgr to rgb
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#reshape img array
n_img = np.reshape(img,(img.shape[0]*img.shape[1],3))

#use kmeans to find cluster of color
clt = KMeans(n_clusters=clusterno)
clt.fit(n_img)

#get unique value of labels in kmeans
labels = np.unique(clt.labels_)

#find the pixel numbers of each color that is set by cluster number
hist,_ = np.histogram(clt.labels_,bins=np.arange(len(labels)+1))

#declare list to hold color to be used in chart
colors = []

#declare list to hold hex color code for labeling in chart
hexlabels = []

#get the main color
for i in range(clt.cluster_centers_.shape[0]):
  colors.append(tuple(clt.cluster_centers_[i]/255))
  hexlabels.append(cs.to_hex(tuple(clt.cluster_centers_[i]/255)))

#create pie chart for color
plt.pie(hist,labels=hexlabels,colors=colors,autopct='%1.1f%%')
plt.axis('equal')
plt.show()
```

#実行結果
・クラスター数(clusterno)が3として指定した時
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/b68e4122-cf2a-ce6b-5c4b-f2deb2093593.png)

・クラスター数(clusterno)が4として指定した時
![result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/797320/143b7f07-f304-4184-5034-1cf88aebba24.png)
【Rails】 記事の並べ方(昇順・降順)について

#自己紹介
こんにちは！
今回初めて投稿をします。
同じことで何度も悩んでしまわない為の、自分用のメモとして、またアウトプットする事によって記憶の定着に繋がればと思い始めました。

それでも、もしかするとどなたかに拝見していただける機会があるかもしれませんので、少しだけ自己紹介をさせていただきます。
2020年10月中旬より本格的にプログラミングの勉強をスタートさせ、現在はプログラミングスクールも活用し、未経験の中途という形でエンジニア転職を目指している者です。

さて今回の本題に！

開発環境
---
ruby 2.6.3
Rails 5.2.4.4


#投稿された記事をIDの若い順に並べてください。
この言葉にまず「若い順」ってどういう意味だろうと疑問に感じました。
結果から言うと、答えはそのままの意味で1.2.3.4....となるような数字の小さい順という事でした。
この若い順が一般的な昇順(asc)、その反対が降順(desc)になります。

今回のIDの話で例えると、
・昇順：IDが小さい順。古い記事が上にくる。
・降順：IDが大きい順。新しい記事が先頭にくる。

今回は、コントローラに記述する方法を使用したので残しておく事にします。

1.昇順、降順どちらも指定しない場合。
  デフォルト値は降順になります。

```
#デフォルト表記
@books = Book.all 
@books = Book.all.order(:id)
```

2.昇順、降順指定をする場合。
  掲載画像のコメントにも載せましたが、orderを記述する場合は手前のallは省略可能。

```
# 昇順
@books = Book.all.order(id: asc)
@books = Book.all.order(id: "ASC")

#orderがつく場合は、allを省略することもできる
#今回は指定を降順にします
@books = Book.order(id: desc)
@books = Book.order(id: "DESC")
```

終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
SuperCollider スパコちゃん2020 

2021年、あけましておめでとうございます！ここ数年はあまり積極的に表立ったスパコに関する活動をしていなかったけれど、昨年は大切なものは何かを考えさせてくれる年でした。そう、私はSuperCollider（スーパーコライダー）が大好き！

1/1より１週間にわたり、SCチュートリアルのようなものを投稿します。三日坊主なので頑張ります！

※この記事ではMacOS版のSCを使っています。

SuperCollider（スーパーコライダー）は、オープンソースの音響プログラミング言語と環境です。誰でも開発に参加することができ、誰でも無料で利用することができます。

対応しているOSは、Mac, Linux, Windowsです。バージョンによっては対応していない場合があるので最新情報は公式のgithubのページを参照してください。

※2020/12/1現在、最新のMacOS 11 Big Surはサポートされていません。また以下の様な文が表示されていますので、意訳しておきます。

CAUTION: macOS system volume doesn’t effectively limit audio applications’ maximum volume. Extra care has to be put in working on this platform, especially with headphones, because programs can produce unexpectedly loud sounds regardless of system volume settings, potentially causing ear damage. As a safety measure, we highly recommend to install the SafetyNet quark. See Using Quarks for Quarks installation instruction.

注意：macOSのシステムのボリュームは、最大の音量を効果的に制限しません。予期せず大きな音が出てしまうことがあるので特にヘッドフォンを使う場合は耳を損傷する恐れがあるので注意が必要です。私たちはauarkを使ってSafetyNetをインストールすることを強くお勧めします。



SCの入手法
最も簡単なインストール方法は、公式サイトからSuperColliderをダウンロードすることです。下のサイトからお使いのOSに応じたSCをダウンロードしてください。MacOSの場合はMacOS10.13以降と以前でファイルが異なるのと<acOS 11 Big Surには対応していないのでご注意を。

https://supercollider.github.io/download

ダウンロードができたら、注意書きの通り、SafetyNetをいれてみましょう。ダウンロードしたSCを起動してFileメニューからNewを選びます。新しくできたウィンドウに以下のコードを入力します。コピペでもいいですし、英数字であること、大文字と小文字を区別してタイプしてもOKです。

Quarks.gui;

書けたら、Quarks.gui;と入力した行にマウスカーソルが置かれた状態でcommand + return キーを押します。コマンドキーを押したままリターンキーを押してください。

![スクリーンショット 2021-01-01 23.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996271/229aeeba-6dbe-af89-3c29-74cd32f97380.png)

Quarksウィンドウが開いたらリストの中の「SafetyNet」を探し「＋」の部分をクリックする。緑色のチェックがついたら、下のINSTALボタンを押します。Post windowに「SafetyNet installed」と表示されたらOKです。
『OpenCVによる画像処理入門』4章-5章

[『OpenCVによる画像処理入門』](https://www.kspub.co.jp/book/detail/1538290.html)の続き。
4章～5章まとめ

# デジタル画像と配列
## 画像のデジタル化
フィルム式カメラの撮影データ（フィルム）は、光の強さに応じて変色する感光剤によって記録されたアナログデータ。
アナログデータをデジタル化する処理は、主に次のステップで行われる。

__標本化__
元の画像の領域を、横幅方向にwidth個、縦幅方向にheight個に分割すること。
分割された領域を画素またはピクセル、width×heightを解像度(resolution)という。

__量子化__
各画素の値を整数値に変換すること。
通常8bitで表現されることが多く、0が最も暗く、255が最も明るい。
各画素のbit数のことをbit深度という。

## PGM形式、PPM形式の画像フォーマット
PGM形式・PPM形式は、データ形式が単純であり、テキストエディタで編集可能であるため、画像処理を勉強するのに便利なフォーマット。PGM形式がグレースケール画像なのに対して、PPM形式は3ピクセルカラー画像で表現できる。

練習問題は[このページ](https://qiita.com/ikenohotori/items/06b88df543bc93bf67be)に記載。

## デジタル画像と配列
コンピュータで画像処理するためには、ファイルやカメラから画像を読み込み、プログラムから画素値を直接読み書きする必要がある。画素値の情報は配列として扱われることがほとんど。

練習問題は[このページ](https://qiita.com/ikenohotori/items/dd6103494e016de1f4c3)に記載。

## Matクラス
OpenCVでは画像データをMatというクラスで主に扱う。

__Matクラスの代表的なメンバ変数とメンバ関数__

メンバ変数・関数|意味
---|---
cols|画像の幅
rows|画像の高さ
data|画像データへのポインタ
depth()|bit深度を取得する
channels()|チャンネル数を取得する
type()|データ型を取得する
step|画像1行分のbyte数

# 画像形式と色空間
## 画像の形式
画像をファイル[※]として保存する方式は、大まかに3種類ある。

方式|代表例
---|---
RGM3原色の画素値をそのまま保存する方式|BMP
元の画素値の情報を圧縮して元の情報を回復できる状態で保存する方式|TIFF PNG
元の画素値の情報を圧縮して元の情報を回復できない状態で保存する方式|JPEG

__色数(bit深度)__
　BMP：モノクロ2階調、24bit 
　PNG：24bit、48bit 
　JPEG：24bit

__色空間__
　BMP：RGB
　PNG：RGB、グレースケール
　JPEG：RGB、CMYK、TCbCr、グレースケール


## bit深度
ピクセル毎のビット数のことをbit深度という。
例えば1bit画像(bit深度が1の画像)とは、各画素に1bit(黒or白)の情報を割り当てた画像であり、
24bit画像とは、各画素のR、G、Bそれぞれに8bit(1byte)の情報を割り当てた画像である。

## 色空間
__RGB空間__
RGB空間とは、赤、緑、青の三色を組み合わせて色彩を表現する方法のこと。

__YUV色空間、YCbCr色空間__
輝度信号Yと色差信号U(またはCb)とV(またはCr)で表現される色空間。
YUV空間はアナログビデオ信号用の色空間で、YCbCr空間はデジタル信号用の色空間。

__HSV空間__
色彩の情報を、色相、彩度、明度によって表現する。
明るさを変えずに、色だけを抽出するような処理に向いている。

色空間の変換については省略。
LTEでの"帯域幅"について

(5Gが始まっているのに今更感あるけど・・）
LTEで利用している電波の帯域幅の概念についてまとめ。

まとめるモチベは、趣味でLTEのRAN解説動画や文献などを漁っていたが"帯域幅"について触れているものが少なく、調べるのが大変だったので内容整理も込めて記事作成。

# まず結論
LTEの帯域幅とは「不要放射分+サブキャリアの最小の周波数と最大の周波数の差」

# LTEの電波の構造
LTEの無線区間の下りリンク区間（基地局-->端末）ではOFDMという技術を利用している。
OFDMの概要は以下の通り。
・Orthogonal Frequency Division Multiplexingの略で直交周波数分割多重化技術と呼ぶ
・無線技術における多重化方式の1つでFDMの応用技術
・情報伝達には複数の副搬送波(サブキャリア)を利用
・1つ1つのサブキャリアに対してデジタル変調(QAMや16QAM,64QAMなど)をかけてデータを乗せる

要するに、LTEの電波とは1本の搬送波(キャリア)とそれを取り巻く副搬送波(サブキャリア)で構成されている。

# サブキャリアのイメージ図

一般的なOFDM信号は以下の図で表現できる。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996263/ee3ae435-604e-5a56-9eb1-834a2b28301d.png)

引用元：https://www.jstage.jst.go.jp/article/essfr/1/2/1_2_2_35/_pdf/-char/ja

LTEではf0=15kHzとされており、最大サブキャリア本数は1200本(搬送波の1本を除く)である。
1200本目のサブキャリアの周波数は15kHz*1200=18MHzとなる。

# LTEのBandと照らし合わせてみる
https://ja.wikipedia.org/wiki/%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%E3%81%AE%E5%91%A8%E6%B3%A2%E6%95%B0%E5%B8%AF
この記事によると、2.1GHz帯のdocomoは20MHzとなっている。
先ほど計算した18MHzと合わない…

# 3GPPの規定を確認する
![3gpp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996263/74967462-1d4f-14c2-b6f2-cfadefddc4bd.png)


引用元：3GPP TS 36.101
https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=2411


RB(Resource Block)は複数のサブキャリアをまとめた単位で1Resource Blockがサブキャリア12個分。（サブキャリア1個目の周波数をf0=15kHzとすると、12個目は15*12kHz=180kHz)

これを見るとわかる通り、Channel Bandwidthと実際にリソースブロック(RB)が占有する帯域幅が異なることが分かります。

Channel Bandwidth = 20 MHzのとき、RB数が100なので、
100 * 180 KHz = 18 MHz

となり、計算があいました。
LTEでは不要放射の分を含めて"帯域幅"を定義しているようです。
アセンブリ言語でFizzBuzzをやってみる

このくらい出来なきゃと思い、実践。

## 感想
- 二桁以上の数値出力に手こずった。
- スタックポインタを手動で戻すことが出来たのが嬉しい。
- 一旦アセンブリはこのくらいにしておく。

## ソースコード
```
.intel_syntax noprefix
.global _start

# gcc fizzbuzz.s -c -o fizzbuzz.o 
# ld -o fizzbuzz.bin fizzbuzz.o

# div
# 割られる数: RDX:RAX（128bit）を <r>（64bit）で割る
# 割る数    : div <r>
# 答え      : rax
# 余り      : rdx

_start:
    mov rcx, 1

loop:
    # count % 15 == 0
    mov r15, 15
    mov rdx, 0
    mov rax, rcx
    div r15
    cmp rdx, 0
    jz print_fizzbuzz 

    # count % 5 == 0
    mov r15, 5
    mov rdx, 0
    mov rax, rcx
    div r15
    cmp rdx, 0
    jz print_buzz

    # count % 3 == 0
    mov r15, 3
    mov rdx, 0
    mov rax, rcx
    div r15
    cmp rdx, 0
    jz print_fizz

    # 数値出力
    mov r12, 0
    # 1の桁、10の桁
    mov rdx, 0
    mov rax, rcx
    mov r15, 10
    div r15
    add rdx, 0x30 # asciiコードにする
    push rdx
    inc r12
    add rax, 0x30
    push rax
    inc r12
    # 100の桁
    mov rdx, 0
    mov rax, rcx
    mov r15, 100
    div r15
    add rax, 0x30
    push rax
    inc r12

print_rsp:
    cmp r12, 0
    jz count
    dec r12

    mov rax, 1      # write
    mov rdi, 1      # stdout
    lea rsi, [rsp]  # buf メモリ番地代入
    mov rdx, 1      # buflen
    push rcx # syscallで壊れるので退避
    syscall
    pop rcx
    add rsp, 8
    jmp print_rsp

count:
    lea r14, [newline]
    mov r13, 1
    call print

    # loop
    inc rcx
    cmp rcx, 101
    je exit
    jmp loop

exit:
    mov eax, 60 # exit
    syscall

print_fizzbuzz:
    lea r14, [fizzbuzz]
    mov r13, 8
    call print
    jmp count

print_buzz:
    lea r14, [buzz]
    mov r13, 4
    call print
    jmp count

print_fizz:
    lea r14, [fizz]
    mov r13, 4
    call print
    jmp count

print:
    mov rax, 1      # write
    mov rdi, 1      # stdout
    lea rsi, [r14]  # buf メモリ番地代入
    mov rdx, r13    # buflen
    push rcx # syscallで壊れるので退避
    syscall
    pop rcx
    ret

fizzbuzz:
    .ascii "fizzbuzz"
buzz:
    .ascii "buzz"
fizz:
    .ascii "fizz"
newline:
    .ascii "\n"
```

## 環境
```
# uname -a
Linux 29b342e56b09 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
PHPをvscode remote containerで開発したかった

はじめLaravel入れていたが、template的に使えるものが欲しかったので作った。

https://github.com/moeyashi/template-php-on-vscode-remote-container

Laravel入れたバージョンも作ろうかなと思います。

## 2020-01-02 追記

Laravel入れました。勢いあまってlaravel/ui authまで入った。

https://github.com/moeyashi/template-laravel-on-vscode-remote-container
[Rails] form_with

# はじめに
下記の記事を参考させていただいております。
https://pikawaka.com/rails/form_with

---
form_withとは、**railsで情報を送信するためのヘルパーメソッド**です。 
form_withを使うことにより、簡単に入力フォームに必要なHTMLを作成することができます。

ヘルパーメソッドとは
Railsにおける、主にビューでHTMLタグを出現させたりテキストを加工するために使用するメソッドの総称です。

ヘルパーメソッドの利点は
**パスの指定やRubyの埋め込みなどの記述がシンプルになる
セキュリティ上の問題を解消できる**
などです。

---
# 書き方とツール
**基本的な書き方**

データベースに保存しない場合のform_withの書き方

```ruby

<%= form_with url: "パス" do |form| %>
  # フォーム内容
<% end %>
```

データベースに保存する場合のform_withの書き方

```ruby
<%= form_with model: モデルクラスのインスタンス do |form| %>
  # フォーム内容
<% end %>
```
---
例えば下記のようなコードではこんなフォームがブラウザに表示されます。

```ruby:new.html.erb
<%= form_with(model: @user, url: entrys_path, local: true) do |form| %>
  <h1>ユーザー名を入力</h1>
  <div class="field">
    <%= form.label :name, "名前（全角）" %>
    <%= form.text_field :name %>
  </div>
<% end %>
```

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

ちなみにform_withの機能で、
引数として渡されたモデルクラスのインスタンスが中身の入ったインスタンスの場合、updateアクションへ処理を振り分け、

反対に、引数として渡されたモデルクラスのインスタンスが中身の入っていないインスタンスの場合は、createアクションへ処理を振り分けてくれます。

自動的に処理を振り分けてくれるので、メソッドの指定はしていません。

---
**発展形の書き方**
オプションをつける場合
`<%= form_with model: モデルクラスのインスタンス, オプション, do |form| %>`

フォームの内容
`form.htmlタグ名 :カラム名`

オプションとメソッド
---

オプション名	|説明
----------------|-----------------------------------------------------------------
urlオプション	|フォームの情報を送るリクエストのパスを指定。
methodオプション	|フォームの情報を送るリクエストのHTTPメソッドを指定。オプションの初期値は:postなので、postメソッドを指定する場合は省略できる。
localオプション	|リモート送信を無効にするかどうかを指定。trueにすると無効になる。

---

htmlタグメソッド	                    | 用途
--------------------------- |  -------------------------------------
form.text_field	            | 一行のテキスト投稿フォーム
form.text_area	            | 複数行のテキスト投稿フォーム
form.number_field           | 数値入力ボックスを生成
form.search_field           | 一行の検索フォーム
form.email_field            | メールアドレス入力ボックスを生成
form.check_box	            | データベースの情報を使わないでチェックボックスを生成
form.collection_check_boxes | データベースの情報を元にチェックボックスを生成
form.select	            | 選択肢を作成
form.collection_select      | データベースの情報を元に選択肢を生成
form.file_field	            | ファイル選択ボックスを生成
form.datetime_field	    | 日時の入力欄を生成
form.date_select	    | 日付選択ボックスを生成
form.hidden_field	    | 非表示のフォーム
form.submit	            | 送信ボタンの生成
【Python】PyCharmの環境設定（インストール、インタプリタ設定、パッケージの追加）Mac環境

<!-- wp:paragraph -->
<p>こんにちは、かをるです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>今回は、GUIツールである<a href="https://www.jetbrains.com/ja-jp/pycharm/" target="_blank" rel="noreferrer noopener" title="https://www.jetbrains.com/ja-jp/pycharm/">【PyCharm】</a>をつかってPythonの環境構築を行なっていきます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><span class="marker-under">PyCharmとは、Pythonの統合開発環境</span>です。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>コマンドラインによる環境開発よりもこういったツールを使いこなすことで、<span class="marker-under">より効率的に開発を進めることができます</span>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>有償と無償とありますが、今回は無償のインストール方法を紹介していきます。</p>
<!-- /wp:paragraph -->

記事を書きました。
https://kaworublog.com/wp-admin/post.php?post=1065&action=edit
自作キーボード10 無理に分割しなくてもよかった?

Elecrowにケースを発注した。全部で113$

発注した後に毎回もっとこうした方が良かったのでは？とあれこれ思案してしまう。

そもそも論だがわざわざ分割するのではなく、
一体型で左右を離してしまえばよかったのではないかと思った。

例えばこんな感じ

![128key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/835d609a-a3e3-1c28-4e23-8a7b6457a551.png)

左手でも押せるようにわざと重複キーを設けた。

左右に以下のキーを割り振った。

* F5
* 6
* Y
* H
* B


ふと我に返る。キーボード沼にはまってる。
ubuntuでmysqlを消そうと思ったら消えなかった話

## はじめに
皆さんこんにちは.今回はmysqlを消そうと思ったら消せなかった話を書こうと思います.しかし,この記事もメモ的な感じで書いていくので宜しくお願いします.
## ことの顚末
### ①WordPressを導入しようと思って導入されていたmysqlの構成をすっかり忘れてしまったので入れ直そうと思った！
<b>が,しかし,なにをapt-get xxx なにでインストールしたか忘れた！</b>
### ②とりあえず定番のやつで消してみよう.

```
#apt-get remove mysql
```
<b>消えない...</b>

```
#apt-get remove mysql-server
```
<b>消えない...</b>

```
#apt-get remove mariadb-server
```
<b>消えない...</b>
<b>え...俺は一体なにでインストールしたんだ...</b>
### ③そうだ！パッケージを調べよう

```
#apt list --installed
```
このコマンドを使うことでインストールされているパッケージを調べることができます！
ちなみにこんな感じでした.

```
mysql-client-5.7/bionic-updates,bionic-security,now 5.7.32-0ubuntu0.18.04.1 amd64 [installed,auto-removable]
mysql-client-core-5.7/bionic-updates,bionic-security,now 5.7.32-0ubuntu0.18.04.1 amd64 [installed,auto-removable]
mysql-common/bionic,bionic,now 5.8+1.0.4 all [installed,auto-removable]
mysql-server-5.7/bionic-updates,bionic-security,now 5.7.32-0ubuntu0.18.04.1 amd64 [installed,auto-removable]
mysql-server-core-5.7/bionic-updates,bionic-security,now 5.7.32-0ubuntu0.18.04.1 amd64 [installed,auto-removable]
```
<b>みみみ...見えるぞ！</b>
### ④それでは消しましょう！

```
#apt-get remove --purge remove mysql-server-5.7
```

皆さん！こんな感じでやると消すことができますので困った時にはぜひやってみてください
以上です.
【Java】フォルダ内のファイルパスをListで取得

引数のフォルダ内にあるファイルの一覧をStringのListにしてみるメソッド。
※再帰的に呼び出してListにaddAllしてみた
※Java8～15で動作検証済み(不具合あっても責任は取らない方向で

```java:FileUtils

import java.io.File;
import java.util.LinkedList;
import java.util.List;

public class FileUtils {

	/**
	 * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す
	 *
	 * @param root
	 * @return
	 */
	public static List<String> getFileList(String root) {
		return getFileList(new File(root));
	}

	/**
	 *
	 * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す
	 *
	 * @param root
	 * @return
	 */
	public static List<String> getFileList(File root) {
		return getFileList(root, null);
	}

	/**
	 *
	 * 引数のディレクトリ内にあるフォルダやファイルのPathを文字列のListで返す
	 *
	 * @param root
	 * @param fileList
	 * @return
	 */
	private static List<String> getFileList(File root, List<String> fileList) {
		// 引数のフォルダが存在しない場合はnullを返す
		if (root == null || !root.exists())
			return null;
		if (fileList == null)
			fileList = new LinkedList<>();
		if (root.isDirectory())
			for (File f : root.listFiles())
				fileList.addAll(getFileList(f, null));
		else
			fileList.add(root.getPath());
		return fileList;
	}
}

```
timer_createでsigeventのsigev_notifyにSIGEV_THREADを設定したときの動作(C言語)

##背景
私が現在開発している組込みシステムでは、周期処理に様々な方法が用いられている。中でもtimer_create関数でsigevent構造体のsigev_notifyにSIGEV_THREADを設定し、一定時間が経過したら指定した関数を一つのスレッド（タイマスレッド）として起動する方法はよく使われている手法の一つである。開発中のシステムでは、この方法で周期タイマを実現している箇所が複数存在し、システムを起動させると常にタイマスレッドの生成・終了が行われている。この時、生成されたタイマスレッドがそれぞれどこで生成されたものか気になったので、タイマスレッドのスレッド名を調べてみた。（タイマスレッドの名称とtimer_createを呼び出したスレッド名が一致すると思っていたため。）すると、生成された全てのタイマスレッドが同じスレッド名になっていた。そこで、timer_createでSIGEV_THREADを設定したときの周期タイマの動作について調査してみた。

##timer_createの概要
```
int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid)
```
引数：
 　第一引数：クロックID
 　第二引数：sigevent情報 →[詳細](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sigevent.7.html)
 　第三引数：タイマID格納用ポインタ

プロセス毎にタイマを作成する。タイマ満了時sigeventで設定した動作が行われる。
（周期時間の設定やタイマの開始はtimer_settime関数で行う。）

##SIGEV_THREADを設定したときの動作（※自分の環境の場合）
 一番最初にSIGEV_THREADが設定されたタイマが作成されたとき、タイマ満了時に起動用のタイマスレッドが生成される。（親スレッドのスレッド名が引き継がれる。）
タイマ満了時、最初に生成されたタイマスレッドで指定した関数を起動する。
→SIGEV_THREADが設定されたタイマが複数作成された場合でも、最初に作成されたタイマスレッドで関数を起動する。そのため、タイマスレッドを生成したスレッド以外は、タイマの作成を行ったスレッドとタイマスレッド名が異なることになる。
但し、既にタイマスレッドが動作しているときに他のタイマが満了した場合、新規にタイマスレッドを生成する。（この時のスレッド名はタイマ満了時に起動するスレッド名と同じ。関数が終わるとタイマスレッドはすぐに終了する。）

##参考文献
この記事は以下の情報を参考にして執筆しました。

timer_create() manual
http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man2/timer_create.2.html

SIGEVENT manual
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sigevent.7.html
Git クライアントツールのススメ

#はじめに

Git関連ツールのメモ代わりです。

Gitは皆さんよく使われると思います。
ですが、思ったよりクライアントツールが話に出ないandどれを使えばいいのかわからないという方が結構多い。

__そういった方のおすすめしたいツールが以下の二つ！！__
・<a href = "https://www.sourcetreeapp.com/">SourceTree</a>
・<a href = "https://www.gitkraken.com/">Git Kraken</a>


#クライアントツールとは？

簡単に言えば、リポジトリの管理をGUIで見やすく管理するツールです。

gitでcommit や push をするのはVScodeやコマンドプロンプトで実行できますが、
それを上記のアプリ内で実行することが可能です。

ある程度の機能はVSCodeで行うものとそこまで差異はありませんが、異なる点を挙げるとすれば
・複数のリポジトリを一括で管理できる。
・リモートのリポジトリに存在するブランチや現在の作業ブランチをサイドタブに表示することができ、簡単に切り替えが可能
・別の方が行ったcommit,push,merge等を視覚的に理解できるようになる。(拡張機能のgitgraphに近い)

といったところです。


gitkrakenに関しては無料の範囲内ではできることが限られているので使用の際は有料登録がおすすめです。
sourcetreeは初心者でもわかりやすくおそらくメジャーなツールに分類されるので情報もたくさんあると思います。
お試しで使ってみたいという方はSourceTreeがよいかと思います。

実際のアプリの使用法はここでは説明しませんが、ぜひ使ってみてください！！
良い開発ライフを！！
Vue.jsで非同期処理関数を作る方法

皆さんこんにちは！！！

今回はVue.jsで非同期処理関数を作る方法をご紹介します！

めちゃめちゃ簡単なので、ぜひ学習の参考にしてください。

それでは説明していきます。

#Promiseを用いて関数を作成#

今回はTimeoutの関数を非同期処理で行います。

Vue.jsで非同期処理関数を作成する際は、宣言時にPromiseを利用するのではなく、返り値として利用します。

```App.vue
<script>
  export default{
    methods: {
        sleep(mesc) {
          return new Promise((resolve) => {
            setTimeout(resolve, mesc)
        })
      } 
    },
  }
</script>
```

#エラー対処#

Vue2.x系を使っている方は下記のようなエラーが出ると思います。（出ない方はスルーして結構です）

```
error: npm i core-js/fn/promise
```

このエラーの対処の仕方は、僕が書いた記事[core-jsの依存関係エラー（core-js/～/～）対処法](https://qiita.com/akki-memo/items/1c50fb7246da18da9fd1)を参考にして頂くと、恐らく解決できます。解決できない場合はコメント欄にてご報告をお願いします。

以上、「Vue.jsで非同期処理関数を作る方法」でした！

めちゃめちゃ簡単♪

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
(OutSystems) ローコードでも大丈夫、BATCH処理 !! vol.1

#背景
ローコードプラットフォーム『OutSystems』を社内へ導入・開発サポートしている。
JavaやPythonも楽しいけど、これからの時代はローコード!!

#課題
OutSystemsはWEBは良いけどBATCHがなぁ…という声を度々耳にするが『そんなとこはない、BATCHもローコードで大丈夫』と言いたい。本稿では、OutSystemsでBATCH処理を実現する上での工夫ポイントを紹介する。

想定
・ 数千～数百万レコード単位の処理
・ スケジューラはOutSystemsとは別の何か(Zabbix, Windowsタスクスケジューラ, JP1など)

ポイント
① BATCHアーキテクチャ
　※定時起動, 常時実行, オンデマンドのタイプがあるが、本稿では"定時起動"について記す
② タイムアウト対応
③ コミット制御
④ レスポンス改善
　a) TextDitionaryを活用
　b) コア部分のみ外を活用 (Extention, PL/SQL, Powershell)

#対応
今回は以下について記述する。
① BATCHアーキテクチャ
※定時起動, 常時実行, オンデマンドのタイプがあるが、本稿では"定時起動"について記す

#目的
OutSystemsでBATCHを実現する上での一例を紹介し、ローコードに対する懸念をやわらげ、もっと普及させたい。

#内容
特別悩む必要もないのだが、以下構成が簡単。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563944/138715f2-8179-0cdc-51bd-fbc33201e00a.png)

Powershellはtry-chatchでREST APIをコールし、返り値を判定。異常終了の場合はExcetpionをスロー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563944/3d46a8a0-b4d3-b441-5677-b4962b15199b.png)

REST APIは正常時と異常時の制御だけに集中し、業務処理はServer Actionで記述する。
BATCHの異常処理時はExceptionをスローしてトランザクションをロールバックさせる。
↓はREST API上の実装例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563944/7148ccd3-ff00-2af7-9512-02ffb80636f9.png)

BATCHの結果を監視したい場合は、Powershellでログを出力するか(テキスト監視)、OSP上でエラーログ出力し、DB監視する。

OutSystemsCloudを利用している場合はPowershell実行用のオンプレサーバを用意する。
オンプレのみの場合はOSPを導入しているサーバにPowershellを配置するのが良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563944/79287288-69b0-8d9c-9818-97861f698415.png)
#結果 or 気付いた点
OutSystemsで定時起動のBATCHを実現する場合は、概ねこういう構成になるのではないだろうか。

#結論
今回は工夫ポイントを紹介する上での前提となるアーキテクチャを共有した。
次回から中身の話。
vueで親コンポーネントで非同期通信が完了してから子コンポーネントでの通信を行いたい

vue3で親コンポーネントで非同期処理が終わってから子コンポーネントの処理を行いたい時のメモ

#結論
親コンポーネントの処理が終わったらv-ifで子コンポーネントを有効にする。

```親.vue
<template>
  <子コンポーネント v-if="mount"/>
</template>

<script lang="ts">
export default {
  setup() {
    const mount = ref<boolean>(false)
    親コンポーネントの非同期処理().then(() => mount.value = true)
    return { mount }
  }
}
</script>
```

#その他
・v-showは表示されていないだけでコンポーネントは生成されるため、非同期処理の完了を待たずに実行される。
・Vue3の新機能`suspense`を使うとv-showと同じような動作となる。
・setup関数をasyncにして非同期処理をawaitにすると表示されない(親コンポーネントでsuspenseを使う必要がある？）
railsコマンドを叩くと「Ignoring nokogiri~」が大量に吐き出された話。

`rails g model` でmodelを作成しようとしたところ
`Ignoring nokogiri-1.10.0 because~` という1文が大量に吐き出された。どうも気持ち悪いかつ上手くmodelの生成が出来ず詰まってしまったのでメモ。

（結論言うとmodelが作成できないのは別の理由だったのでIgnore~の部分について言及していく。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877744/4ff64df0-f765-d576-78ef-9d30554b6716.png)

# やったこと
アラートに書かれている通り `gem pristine nokogiri --version 1.10.9` を実施。すると

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```
なにやらPermission Errorが出てきて上手くgemが入らない。

# 一難去ってまた一難
[bundle installしてもpermissionsエラーが起きるときの対処法](https://qiita.com/edasan/items/288604b78e5cf6407d0e)という記事にたどり着き、事なきを得るかと思いきや最後の

```
gem install bundler
```

を実行したところ今度は

```
ERROR:  Loading command: install (LoadError)
    dlopen(/Users/zenichiro0419/.rbenv/versions/2.6.2/lib/ruby/2.6.0/x86_64-darwin16/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/zenichiro0419/.rbenv/versions/2.6.2/lib/ruby/2.6.0/x86_64-darwin16/openssl.bundle
  Reason: image not found - /Users/zenichiro0419/.rbenv/versions/2.6.2/lib/ruby/2.6.0/x86_64-darwin16/openssl.bundle
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass
```

# 結果rbenvの再インストールが肝だった。

[gem コマンドで Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib が出たときの対処法](https://qiita.com/suzukalight/items/1fd68258c4134ad7fc48) で紹介されている通り、ライブラリの構成が何かが原因でおかしくなっていたようなので rbenvの再インストールを行った。

まとめると

```
# rbenvのアンインストール
$ rbenv uninstall 2.6.3

# rbenvのインストール
$ rbenv install 2.6.3

# bundlerのインストール
$ gem install bundler

# rbenvのリフレッシュ
$ rbenv rehash

# gemのインストール
$ bundle install 
```
install画面でさっきの「nokogiri~」というのが見えたかつrailsのコマンドを叩いて `Ignoring nokogiri-1.10.0 because~` が見えなくなった(追記：rehashは不要の説もありと情報いただきました。)。解決。

# 終わりに
個人でアプリ開発を行っているわけだが環境構築から開発着手まで半年近く期間が空いたからかなかなか立ち上げの部分で詰まらない部分で足踏みしてしまっている。これからアプリ開発をやり始めようとしている私のような駆け出しの方がいたら環境構築から開発着手までは一気通貫してやることを勧める。

# おまけ
`rails g` 出来ないときは `spring stopを叩こう` と[こちらの記事](https://qiita.com/NaokiIshimura/items/e01cb95d71ffa5811f63)でも書かれているのだが、どうも治らず。

検索してもエラー文が `Could not find generator 'hoge'` なので上記リンク先のような情報しか出てこずお手上げ状態だったのだが・・・なんと自分の場合は`rails g modal` とまさかのタイポだった。。気づくまでにだいぶ時間を要してしまった。

エラー文を読むことも大事だが、自分が叩いたコマンドにも気をつけよう。。
Docker コマンド

Docker Hub のイメージを検索 (**search**)
Docker Hub から使いたいイメージを取得する (**pull**)
イメージからコンテナを生成して起動 (**run**)
コンテナ内でコマンド実行 (**exec**)
コンテナを停止 (**stop**)
コンテナをイメージ化 (**commit**)
いらなくなったらコンテナを削除 (**rm**)
いらなくなったらイメージを削除 (**rmi**)

その他コマンド

取得済みイメージ一覧 (**images**)
実行中コンテナ一覧 (**ps**)
停止中も含めた全てのコンテナ一覧 (**ps -a**)
停止中のコンテナを起動 (**start**)
ホストとコンテナ間でのファイルコピー (**cp**)
多次元連想配列のソート


[Pythonで少し複雑な辞書オブジェクトをsortする \- 午後から→オーバークロック](http://nemupm.hatenablog.com/entry/2014/08/06/223026)
[Perlのsortの基本的なやつ \- Qiita](https://qiita.com/otaka/items/af69693e68052e7ca02c)

### Python

```py:s.py
    dict = {
        1: {
            'name': 'A',
            'age': 30,
        },
        2: {
            'name': 'B',
            'age': 31,
        },
        3: {
            'name': 'C',
            'age': 29,
        },
    }
    for i in sorted(dict.items(), key=lambda x: x[1]['age'], reverse=True):
        print(i)
```

```
$ python3 s.py
(2, {'name': 'B', 'age': 31})
(1, {'name': 'A', 'age': 30})
(3, {'name': 'C', 'age': 29})
```

### Perl

```pl:s.pl
use strict;
use warnings;
use Data::Dumper;

my %hash = (
    1 => { name => 'A', age => 30 },
    2 => { name => 'B', age => 31 },
    3 => { name => 'C', age => 29 },
);
foreach my $key ( reverse sort { $hash{$a}{'age'} <=> $hash{$b}{'age'} } keys %hash ){
    print "$key\n";
    print Dumper \%{$hash{$key}};
}
```

```
$ perl p.pl
2
$VAR1 = {
          'name' => 'B',
          'age' => 31
        };
1
$VAR1 = {
          'age' => 30,
          'name' => 'A'
        };
3
$VAR1 = {
          'age' => 29,
          'name' => 'C'
        };
```
分割されたtsファイルを合体させるスクリプトを書いてみた

# 分割されたtsファイルを合体させたい
複数の分割されたtsファイルがあったとして、そのままだと見にくいので1つのmp4ファイルにしたい。

# 作ってみた
https://github.com/MasatoHanayama/cat_ts
(MITライセンスです)

# 必須要件
1. Windows (開発環境は10 20H2)
2. Python3.x
3. ffmpeg

# 使用方法
1. 1つのフォルダに合体させたいtsファイルを保存します
2. ts_cat.pyを実行します (ここでffmpegに食わせるts_cat.txtが生成されます)
3. cat.batを実行します (先に生成されたts_cat.txtを元にffmpegをたたきます)
4. output.mp4ができあがります
Next.jsをdocker-compose upしたい！

# はじめに
最近、開発環境をすべてdockerで完結させれればローカルが綺麗な状態に維持できる事に気がついたのでDockerでやりたがりがちです。
そこで、話題のNext.jsをdocker-composeで立ち上げてみましたので、自分用備忘録として残して置こうと思います

# 環境
```
macOS High Sierra v10.13.6
Docker version 19.03.8
docker-compose version 1.25.5
```

# 実装
docker上で全部完結させたいです

## 準備
新しくプロジェクト用ディレクトリを作り、その下に下記２つのファイルを置いてください。
Dockerfile と docker-compose.yml です。
docker-compose.yml の command にあるディレクトリ移動コマンドは、プロジェクトの名前に応じて適宜変更してください。今回は `sample-app` とします。

```dockerfile:Dockerfile
FROM node:14.15.3-alpine
WORKDIR /usr/src/app
```

```dockerfile:docker-compose.yml
version: '3'
services:
  node:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/usr/src/app
    command: sh -c "cd sample-app && npm run dev"
    ports:
      - "3000:3000"
```

現状です

```
$ ls
Dockerfile  docker-compose.yml
```

## create-next-appコマンドをインストール
create-next-appコマンドをインストールします。

```
$ docker-compose run --rm node npm install create-next-app
```

## create-next-appコマンドを実行
これでnextアプリを作ります。
create-next-app は create-react-app と違ってインストール先のディレクトリ指定できないようなので、アプリ名は docker-compose.yml の command で指定したディレクトリ名と同じにしてください
（もし、インストール先のディレクトリ指定できる場合は教えて下さい。。）

```
$ docker-compose run --rm node npx create-next-app sample-app
```

## docker-compose up 実行
無事にnext-appのインストールが完了したら、アプリが起動できるはずです。
`Welcomet to Next.js!` が出れば成功です。

```
$ docker-compose up
```

![スクリーンショット 2021-01-01 17.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233730/5ff8da31-54dd-d3fc-71b5-974cb986a9d2.png)

# 終わりに
今回はdocker-composeを使ってnext.jsの開発環境を構築しました。
docker-composeを使うと、APIコンテナ等と連携できるので、とても便利だなと思っています。
create-next-appコマンドもディレクトリ指定できるようにならないかな。
Pardot のメールマーケティング (Pardot Lightning アプリケーション) ⇒ メールエンゲージメントのトラッキングとレポート (Pardot Lightning アプリケーション)

１．Pardot ではどのようにリストメールにアクセスしますか?
２．クリックスルーレートレポートでコールアウトが暖色になると何を意味しますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/bd5c6546-667e-0bb2-b4d0-154c08b69fd2.png)
Simple Calendar gemの導入・基本的な使い方

RailsのgemであるSimple Calendarを使ったアプリ開発を行っているので、後学のために、Simple Calendarの導入と基本的な使い方を説明します。

内容的には[simple_calendarの公式GitHub](https://github.com/excid3/simple_calendar)の日本語訳になります。

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

## Simple Calendarとは
カレンダー表示機能を簡単に実装できるようにしてくれるgemです。

## 実行環境
- Ruby 2.6.5
- Rails 6.0.3.4

## Simple Calenderのインストール

`Gemfile`に以下のように記述し、ターミナルで`bundle install`を入力します。

```:Gemfile
gem "simple_calendar", "~> 2.0"
```

```:ターミナル
bundle install
```
`application.css`ファイルにデフォルトのスタイルシートを読み込みます。

```app/assets/stylesheets/application.css
*= require simple_calendar
```
もしくは`application.scss`ファイルに下記の記述をします。

```app/assets/stylesheets/application.scss
@import "simple_calendar";
```

## メソッドを使ってビューファイルにカレンダーを生成
Simple Calendarのメソッドを使ってビューファイルにカレンダーを生成する方法を説明します。

### month_calendarメソッド
`month_calendar`メソッドを使えば月間カレンダーを生成できます。

```month.html.erb
<%= month_calendar do |date| %>
  <%= date %>
<% end %>
```
![スクリーンショット 2021-01-01 21.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/5d084fce-62b8-c40a-11f1-25b4d6a2dd84.png)

### week_calendarメソッド
`week_calendar`メソッドを使えば週間カレンダーが生成できます。
オプションの`number_of_weeks`で何週分表示するかを設定できます。`number_of_weeks`を記述しない場合は、デフォルトで１週分表示します。

```week.html.erb
<%= week_calendar(number_of_weeks: 2) do |date| %>
  <%= date %>
<% end %>
```
![スクリーンショット 2021-01-01 21.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/58f2f7e9-08d1-20a6-36e4-fb0598cc4fe4.png)

### calendarメソッド（表示日数をカスタムする）
`calendar`メソッドを使えばカレンダーの表示日数をカスタムすることができます。
オプションの`number_of_days`で何日分表示するかを設定できます。`number_of_days`を記述しない場合は、デフォルトで4日分表示します。

```custom.html.erb
<%= calendar(number_of_days: 4) do |date| %>
  <%= date %>
<% end %>
```

![スクリーンショット 2021-01-01 22.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849306/5161cb1f-1c57-4f3f-7875-241647169f44.png)

Simple Calendarの導入から基本的な使い方まではここまでとなります。


## Simple Calendarの見た目を自分で編集する
各カレンダーの見た目を編集したい場合は下記のコマンドを入力して、ビューファイルを自身のアプリにコピーします。

```:ターミナル
rails g simple_calendar:views

#以下の通りsimple_calendarフォルダと各ビューファイルが自身のアプリに生成されます
create  app/views/simple_calendar
create  app/views/simple_calendar/_calendar.html.erb
create  app/views/simple_calendar/_month_calendar.html.erb
create  app/views/simple_calendar/_week_calendar.html.erb
```



## 参考資料
- [simple_calendarの公式GitHub](https://github.com/excid3/simple_calendar)
- [Qiita【Rails】Simple Calendarを使ったカレンダー表示](https://qiita.com/mikaku/items/0971442a7308dc669122)
- [Qiita【rails】simple_calendarを使ってカレンダーつきのブログ機能を作ってみた。](https://qiita.com/isaatsu0131/items/ad1d0a6130fe4fd339d0)
【PHP学習メモ】preg_match 定数の指定

あけましておめでとうございます。
あっという間に2021年ですね。
善き一年になりますように。

【今日の学び】
preg_match は、正規表現によるマッチングを行うことができます。

````
【構文】
preg_match ( string $pattern , string $subject [, array &$matches = null [, int $flags = 0 [, int $offset = 0 ]]] ) : int|false
````
引数 $pattern には、検索する文字列を、 $subject には、検索対象の文字列を、[] 部分はオプションで省略可能です。

〜PHPマニュアル〜
https://www.php.net/manual/ja/function.preg-match.php

今回学んだのは、検索する文字列に、『定数』を指定する方法です。

````
・・・省略・・・
// 定数
const THREE_TIMES_RATIO_DAY = 3;
const FIVE_TIMES_RATIO_DAY = 5;

・・・省略・・・

if (preg_match ('/' . self::THREE_TIMES_RATIO_DAY . '/' , $date)) {
・・・省略・・・
}
````

このように、連結演算子「.」を使用することで、『定数』を指定することができます。
※同様に『変数』もこの記述方法で指定することができます。



日々の学びを少しずつアウトプットしていきます。
間違いなどありましたら、お手数ですが、ご指摘頂けましたら幸いです。
pybind11 で numpy 配列データを作るメモ

`py::array_t<double>` で numpy 配列データを作ることができます.

配列を作るのはドキュメントにはあまり情報がないので, ソースコード(test code)を追うことになります.

## 配列を作る

```
py::array_t<double> a;
a.resize({N, M});
```

基本 resize でいけます.

## 配列のアクセス

`a[1][2]` みたいにアクセスはできないです. `[]` は一次元配列のみ使えます.

`a.data(i, j)` のようにして多次元配列アクセスします

## 配列の値を設定する

配列データは基本 const になっているので, `a.data(1, 1) = 1.0` みたいにするのはできません.

配列に値を設定する場合は

```
a.mutable_at(0, 2) = 1.0;
```

などとして mutable にして(const はずし)アクセスが必要です.

Python での書き方(e.g. slice 記法)に慣れてしまうと C++ でフレキシブルにやるのには結構制約がある感じです.


## その他のアクセスの方法

pybind11入門(3) NumPy連携その１
https://qiita.com/lucidfrontier45/items/183526df954c1d6580ba

ありがとうございます.
Gitで「 fatal: not removing 'second.txt' recursively without -r 」エラー

GitとGitHubの学習中にエラーが発生したため、学習記録として記録します。

ターミナルにて、
`git rm [ディレクトリ名]`
`git rm --cached [ディレクトリ名]`
入力後に発生。


```
git rm second.txt
fatal: not removing 'second.txt' recursively without -r
```

recursively without -rをGoogle翻訳すると、
![スクリーンショット 2021-01-01 22.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993977/84ee7c1f-f1c5-0aa9-eb2a-a815452ce2b8.png)
となっていたので試しに`git rm -r`で実行。

```
 git rm -r second.txt
rm 'second.txt/text1'
```



```
git rm -r --cached second.txt
rm 'second.txt/text1'
```
今度は成功しました😊
迎春なので鏡餅をCSSで作った

# どうも7noteです。お正月にふさわしいアレをCSSで作りました。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/c752d025-40c2-3c44-73a7-083cb11fb69b.png)


## ソース

```index.html
<div class="kagamimochi">
  <div class="mikan"></div>
  <div class="mochi1"></div>
  <div class="mochi2"></div>
  <div class="kami"></div>
</div>
```

```style.css
.kagamimochi {
  width: 100px;
  text-align: center;
}
.mikan {
  width: 50px;
  height: 40px;
  background: #e88522;
  border-radius: 50%;
  position: relative;
  z-index: 10;
  display: inline-block;
}
.mikan::after {
  content: "";
  width: 15px;
  height: 5px;
  background: linear-gradient(#4f9c5d 50%, #6cb576 50%);
  border-radius: 50%;
  display: inline-block;
  position: absolute;
  top: 0;
  right: 10px;
  transform: rotate(-20deg);
  display: inline-block;
}
.mochi1 {
  width: 80px;
  height: 40px;
  background: #fff;
  border: 1px solid #000;
  border-radius: 50%;
  display: inline-block;
  margin-top: -15px;
  position: relative;
  z-index: 5;
}
.mochi2 {
  width: 100px;
  height: 50px;
  background: #fff;
  border: 1px solid #000;
  border-radius: 50%;
  display: inline-block;
  margin-top: -20px;
  position: relative;
  z-index: 4;
}
.kami {
  width: 92px;
  height: 92px;
  background: #fff;
  border: 5px solid #f00;
  transform: rotateX(45deg) rotateZ(45deg);
  display: inline-block;
  margin-top: -75px;
  position: relative;
  z-index: 1;
}
```


## まとめ

かんたんなイラストならCSSでなんでもできそうな気がしてきますね。
まぁ流行りはSVGのような気もします。。。
また思いついたら他のものも作ってみたいと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Gemを追加したら、There was an error parsing `Gemfile`と言われる

## 対象者

タイトルの通り、Gem追加したら、There was an error parsing `Gemfile`というエラーメッセージが出た方


##エラー文を読む(現状把握)

fakerを開発環境、テスト環境に入れようとGemfileに記載。

```
group :development, :test do

   **gem 'faker'** 　←これを追加

end

```

そして、bundle installを試みるも、

```
bundle install
```

タイトル記載のエラーが出る。

```
[!] There was an error parsing `Gemfile`: You cannot specify the same gem twice with different version requirements.
You specified: faker (>= 0) and faker (= 2.1.2). Bundler cannot continue.

 #  from /Users/XXXX/XXXX/XXXX/Gemfile:88
 #  -------------------------------------------
 #  gem 'dotenv-rails'
 >  gem 'faker',                   '2.1.2'
 #  gem 'carrierwave'
 #  -------------------------------------------
```

エラー文を読むと、
>Gemfile`の解析にエラーが発生。異なるバージョン要件で同じgemを2回指定できません。
faker (>= 0) と faker (= 2.1.2) を指定したので、Bundlerが続行できません。
※DeepLの翻訳を参考にしています。

と言われていることから、fakerが既に入っているようだ。
案の上、Gemfile下部に既にfakerの記載があった。

```
gem 'faker',                   '2.1.2'
```

エラー文で注意されたように、
異なるバージョン要件で同じgemを2回指定しようとしてしまったわけです。
的確に言われて、グウの音も出ません。

##解決策
解決策は、fakerはテスト環境含めてすべての環境で使用できる形になっていますので,今回のケースだと「gemfileは追加しない」になります。
解決策とは違うかもですが、原因がわかりましたね。以上です。
githubプルリクエストとgithubFlow

**プルリクエスト**
自分の変更したコードをリポジトリに取り込んでもらえるように
依頼する機能


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/9a2777a4-086c-029c-cc93-f33a1a4839a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/e5cf8377-6f55-ffe5-53f4-cd4ed5a12b5c.png)

作成中
*****
**GitHub Flow**

masterブランチは常にデプロイできる状態に
開発は新しいブランチ作って開発
必ずレビュー
テストとデプロイ作業は自動化
全ての点を通って最短で移動する経路を探したい

#前回の続き
[前回の記事](https://qiita.com/canonno/items/de3a8f1a585d4b83a54b)ではいくつかの点をとったときに、始点から終点までの最短経路を求めるコードを読み解きました。
前回のコードでは全ての点を経由することができなかったので、その部分を少し考えてみます。
結局色々失敗してる最適化のお勉強メモですのでご了承ください。
色々まとまっている教科書は[こちら](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)。

#実装内容
##前回の実装
ある点に注目した時に、その点に入る道とその点から出る道の本数の関係を定式化しました。
始点の場合はその点から出る道のほうが一本多く、終点の場合はその点に入る道の方が一本多い、
それ以外については双方が同数になるという実装です。
この実装だと「全ての点を通った」最短経路にはならないので、その部分をトライしてみます。

```py
for nd in g.nodes():
    m += lpSum(x[k] for k, (i, j) in r if i == nd) \
      == lpSum(x[k] for k, (i, j) in r if j == nd) + {source:1, sink:-1}.get(nd, 0) # 制約
```

##進歩1：ある点に出入りする本数を規定する
ある点に注目した時に、その点に入る本数と出る本数の合計が2（終点始点は1）になるようにすれば、「通らない」ということは無くなりそう。
ですが実際にやってみると、本命の経路以外で輪を作ってしまうパターンに。
難しい・・・。

```py
from pulp import *
import networkx as nx
g = nx.fast_gnp_random_graph(10, 0.8, 0)　#第三引数を1にすると双方向の経路をg.edgesに保持

source, sink = 0, 2 # 始点, 終点
r = list(enumerate(g.edges()))
m = LpProblem() # 数理モデル
x = [LpVariable('x%d'%k, lowBound=0, upBound=1) for k, (i, j) in r] # 変数(路に入るかどうか)
m += lpSum(x) # 目的関数
for nd in g.nodes():
    m += lpSum(x[k] for k, (i, j) in r if i == nd) \
         + lpSum(x[k] for k, (i, j) in r if j == nd) == {source:1, sink:1}.get(nd, 2) # 制約
m.solve()
print([(i, j) for k, (i, j) in r if value(x[k]) ==1])
```
この結果がこちら。
0から2へ行く、というはずなのに、0,5,2以外の点で円環ができてしまっています。
この2つの経路をどうつないだらいいのか・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/edd0bb1b-57b3-e33c-8aac-2e9c0313b3b0.png)

##進歩2:道に距離の概念を導入
前回の実装ではすべての道を同じ長さと考えて最短経路を選択していました。
もう少し実用に近づけるべく、長さの概念を入れてみるとどうなるかやってみました。
一旦長さは「各経路の両端のノード番号を足した値」と定義してみました。
g.edges[i,j]["dist"]のようなお作法については[こちらの記事](https://qiita.com/kzm4269/items/081ff2fdb8a6b0a6112f)を参考にしました。

```py
#https://qiita.com/kzm4269/items/081ff2fdb8a6b0a6112f
n = 10 # ノード数
g = nx.random_graphs.fast_gnp_random_graph(n, 0.9, 8)
for i,j in g.edges():
    g.edges[i, j]["dist"] = i+j
```
最適化部分のコードはたいして変更していませんが念のため再掲です。

```py
source, sink = 0, 9 # 始点, 終点
r = list(enumerate(g.edges()))
m = LpProblem() # 数理モデル
x = [LpVariable('x%d'%k, lowBound=0, upBound=1) for k, (i, j) in r] # 変数(路に入るかどうか)
m += lpSum(x[k] * g.edges[i,j]["dist"] for k, (i, j) in r) # 目的関数
for nd in g.nodes():
    m += lpSum(x[k] for k, (i, j) in r if i == nd) \
        + lpSum(x[k] for k, (i, j) in r if j == nd) == {source:1, sink:1}.get(nd, 2) # 制約
m.solve()
print([(i, j) for k, (i, j) in r if value(x[k]) ==1])
```
最適な経路に選ばれたものを取り出して図示します。
sprint_layoutについては[こちらの記事](https://qiita.com/odanny/items/7c550010f5915ae4acdc)が便利でした。

```py
def draw(g):
    rn = g.nodes() # ノードリスト
    pos = nx.spring_layout(g, pos={i:(i/4, i%4) for i in rn}) # ノード位置
    """描画"""
    nx.draw_networkx_labels(g, pos=pos)
    nx.draw_networkx_nodes(g, node_color='w', pos=pos)
    nx.draw_networkx_edges(g, pos=pos)
    plt.show()

G = nx.DiGraph()
for k,(i,j) in r:
    if value(x[k]) == 1:
        nx.add_path(G, [i, j])
draw(G)
```
描画の結果はこちら。
今回はたまたまちゃんとした経路になったようです。
円環を作ってしまう現象はこちらでも起こりうる状態なはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/24f37d2d-4724-b752-982e-344444b6f8c4.png)

最適解の時の総距離はこちら。
これもあってそう！

```py
value(m.objective)
>>>81.0
```


#最後に
最適化楽しい！
【エラー】This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

# このエラーはなに

「**ユーザーのプライバシーにアクセスするための説明が無い**」と怒られている。
例えばアプリでフォトアルバムにアクセスするコードは書かれているけど、それに対するプライバシー設定がされていないと掲題のエラーが起こる。

## 設定する

`Info.plist` に設定を追加する。
カメラとフォトアルバムを使用する設定をそれぞれ追加した。

![c93d1060b443c5fb8ab1878ebf40d828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/d68198c4-2e73-f964-25cc-cba8ad9d50f2.png)

アプリをAppStoreでリリースする際は `Value` をもっときちんとした形で書かなければいけないみたい。
Microsoft.Windows.SDK.Contractsインスト－ル

UWPのAPIをWPFで利用するには、Microsoft.Windows.SDK.ContractsをNuGetでインストールするのが簡単ですが、インストールできなかったり、ビルドする際、Must use PackageReference エラーが発生する場合、次を確認します。

環境：VisualStudio 2019

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/993a96a9-7052-2fcf-9931-28c724653c08.png)
既定のパッケージ管理形式　PackageReference

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/2e1f7972-97ef-f3a8-2dc1-0308b402ebf9.png)
プロジェクトのパッケージ管理が、古いタイプの場合、
packages.config を PackageReference に移行する

移行する場合は、プロジェクトをバックアップしてから実行した方がよさそうです。

* [packages.config から PackageReference への移行](https://docs.microsoft.com/ja-jp/nuget/consume-packages/migrate-packages-config-to-package-reference)