OmniAICreator/Qiita-1.07M huggingface dataset:
LINE WORKSとkintoneをつなぐチャットボット作成サービス

#Joboco（ジョボコ）とは

「Joboco（ジョボコ）」とはLINE WORKSとkintoneをつなぐチャットボットをノンプログラミングで作成するサービスです。弊社が運営するkintoneを便利に活用する情報サイト「キントマニア」内でいくつかのご利用例を紹介していますので、こちらも合わせてご覧ください。

* [LINE WORKSを使って、社内手続きFAQを簡単に検索する仕組みを作ってみた](https://www.joyzo.co.jp/blog/14218)

* [Jobocoを使って備品管理登録！](https://www.joyzo.co.jp/blog/13984)

* [kintoneのToDoリストをLINEWORKSで確認しよう！](https://www.joyzo.co.jp/blog/12382)

* [kintoneとLINE WORKSを使って従業員の体温を簡単管理](https://www.joyzo.co.jp/blog/10712)

* [繋げて便利！Jobocoを使ってチャットでタスク依頼](https://www.joyzo.co.jp/blog/10437)

#Jobocoの利用メリット

## 開発工数の削減

LINE WORKSでは誰もがチャットボットを作成できるようにAPIが公開されていますが、開発にはそれなりの工数が必要となります。下図のグレーになっている部分がその開発を必要とする範囲になりますが、ここをカバーしているのがJobocoとなりますので、あとは設定を行うだけで利用が可能になります。コードを書くことが目的じゃない限り、会話の中身を設計する作業に当てることができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35843/850b7651-8d22-da46-a24f-eb0789b9c792.png)

## 対話順の簡単な修正

チャットボットはユーザとの会話によってシステムへデータを連携するので、システムとの対話の行いやすさが利用する上で重要な要素となります。Jobocoではこの「対話順」をドラッグ＆ドロップで簡単に入れ替え、ボタンひとつで変更をチャットボットへ反映させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35843/5a0e22ac-f560-d7af-1cf0-c3d503ca4b7c.png)


## メニューから呼び出し

チャットボットの呼び出し方法は、「キーワード」を会話する方法と、下図のようなメニューから選択する方法があります。メニュー表示の場合、呼び出しメッセージを覚える必要がありません。ただし、メニュー表示数はLINE WORKS側の仕様により現在は最大4つまでとなっています。使い方の例として、同じ検索であっても「キーワード」から検索させる場合と、「カテゴリ」から選択させるといったものが考えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35843/db2d864d-217e-432a-c128-3cc6aee80931.png)

# まずはお試しから

LINE WORKS、kintone、Jobocoはいずれもお試し版の用意がありますので下記よりお試しください。Jobocoお申込み時に各種設定方法のご案内、およびサンプルデータの用意があります。

*無料ではじめる「[LINE WORKS](http://works.do/GRp7KQ)」
*30日間無料で利用できる業務改善プラットフォーム「[kintone](https://kintone.cybozu.co.jp/trial/)」
*チャットボット作成サービス30日お試し「[Joboco](https://form.kintoneapp.com/public/form/show/f3cd2bdc3b8226532e1e257310bb09e9f2ec4847538c5e94e9b539c171114f5e#/)」
【Ruby】コピー時に元データがなぜか上書きされる【浅いコピー】



コピー先の変数の値を書き換えようとしたら、なぜか、コピー元の方まで値が書き変わってしまう謎現象に遭遇し、困ったのでメモ。

謎現象の原因を探るには「浅いコピー」「深いコピー」「参照渡し」という概念について、それぞれ理解しなきゃならないらしい。

なんでお前が書き換わんだよ！！！お前じゃないんだよ！！！！
と３時間ぐらい一人で格闘していたが、
浅かったのは、私の頭の方だった。

# 浅い頭を悩ませる「浅いコピー」
![【Ruby】コピー時になぜか上書きされてしまう【参照コピー、浅いコピー】.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954103/66cc5e01-98a3-a1aa-2964-abd566a3cc5d.jpeg)


浅いコピーというのは、コピー元のオブジェクトとコピー先のオブジェクトがメモリ上の同一の場所を参照することになります。

っておい、なんじゃそれ :rage:

どうやら、参照先は一緒になるので、
片方に変更を加えると、もう片方のデータも変わってしまうらしい、と。

追記）cloneメソッドなどの浅いコピーは、
配列などの多次元配列の際意図しない挙動になることがあるようです。

これは落とし穴…。

# 配列の参照渡し
あと、配列の参照渡しなるものも気をつけなきゃいけないらしい。
（※追記.Rubyは厳密には配列の参照渡しではなく、参照の値渡しだそう）

A=BでBをコピーできるのかと思っていたが、そうじゃないらしい。


```
# 配列データを準備
$ origin = ["書き換え前"]
=> ["書き換え前"]

# コピーするよ！！
$ copy = origin
=> ["書き換え前"]

# コピーした（はずの）配列を書き換えてみる
$ copy[0] = "書き換えたよ！！！！"
=> "書き換えたよ！！！！"

# ↓なんでだよ！！！（なぜか元データが変わってる）
$ origin
=> ["書き換えたよ！！！！"]

# オブジェクトIDを比較してみる
$ origin.object_id
=> 440

# あれ？オブジェクトIDが一緒...？コピーできてないっぽい
$ copy.object_id
=> 440

```

そもそもA=BでBはコピーできないらしい。
オブジェクト名は違うが、結局同じ住所を見ているから、だと。

勉強になったよ。


# 参考
詳細は、[こちら](https://takeda-no-nao.net/programming/ruby/difference-between-shallow-copy-and-deep-copy/)が 参考 になるかと。

[【Ruby】コピー時に元データがなぜか上書きされる【浅いコピー】](https://takeda-no-nao.net/programming/ruby/difference-between-shallow-copy-and-deep-copy/)

2021.12.25 追記）
ご指摘頂いた箇所を一部修正いたしました。
Pythonの並列処理multiprocessingによる処理時間の短縮を計測

# はじめに
この記事ではPythonの標準機能であるmultiprocessingを実際に動作させて、その効果を確認する。
また、並列処理したい関数は複数の引数を持つことが多いと思うので、複数引数を扱うサンプルコードを作成した。

https://docs.python.org/ja/3/library/multiprocessing.html

ドキュメントに記載の例で簡単に動作を試すことができるが、処理時間の短縮が確認しづらかったため簡単な処理サンプルを作成して処理速度の向上を測ることにする。

```python
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

# 標準出力に以下が出力されます:
[1, 4, 9]
```

## 補足
2乗にする例では、おそらくmultiprocessingを処理するオーバーヘッドのため、以下サンプルより処理速度が遅くなる。
処理対象を10,000,000にして比較すると、multiprocessingの処理時間が約2倍になった。

```python
[x * x for x in list(range(10000000))]
```

# 検証
## 動作環境
Python 3.6.9

## 処理サンプルの内容
対象ファイルから指定の文字列がある行番号を探す。
サンプルでは、1行ごとにReadさせて探索させる。

```python
from datetime import datetime

def search_specified_id(file_name: str, target_id: str) -> list:
    print(f"{target_id}: {datetime.now()}")
    with open(file_name, "r") as tf:
        out = []
        count = 0
        for line in tf.readlines():
            count += 1
            parse_data = csv.reader([line], delimiter=",")
            for item in parse_data:
                if item[1] == target_id:
                    out.append(count)
    print(f"{target_id}: {datetime.now()} e")
    return out
```

## 検証データ作成
探索する英字を含むCSVファイルを作成する。

```python
import string
import csv
ROW_NUM = 1_000_000
LETTERS = string.ascii_letters // a-zA-Z

with open("target.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["no", "item"])
    for i in range(ROW_NUM):
        writer.writerow([i, LETTERS[i % 52]])
"""
出力イメージ
no,item
0,a
1,b
2,c
...
"""
```

## 実行：直列処理（非並列）
対象の英字(49文字とする)を直列処理する。
処理結果として、各英字が存在するファイル行番号のListが格納される。

```python
res_list = [search_specified_id("target.csv", LETTERS[i]) for i in range(49)]
```
## 実行：並列処理
直列処理と同じ処理内容を並列処理化する。
処理サンプルのコードで処理の開始と終了のタイミングをPrintをしており、4つのプロセスが同時に実行され次々と処理が進む様子が確認できる。

```python
from multiprocessing import Pool

with Pool(processes=4) as p:
    res_list = p.starmap(
        func=search_specified_id,
        iterable=[("target.csv", LETTERS[i]) for i in range(49)],
    )
```

* Poolのワーカープロセス数を省略すると、`os.cpu_count()`が設定される。
* 複数の引数を持つ関数を並列処理する場合、`starmap()`を使用して引数をList形式のタプルで渡す。

## 処理時間

ファイル行数を3ケースに変更して、処理時間(秒)を測定した。
4並列処理化で処理時間がおよそ半分になることを確認できた。

| ファイル行数 | 直列処理 | 並列処理 | 比率(%) |
|:-:|:-:|:-:|:-:|
| 100K  | 12 | 7 | 58 |
| 1M  | 132 | 62 | 47 |
| 3M  | 462 | 208 | 45 |

# まとめ

それほど記述量を増やすことなく並列処理を実現でき、処理時間の短縮を確認できた。
並列化によって処理時間の短縮を確認できたが、並列処理時にCPU使用率が90%近くになりノートPCの処理にラグが起こっていたので、PC性能(CPU、コア数など)を上げることで処理時間の短縮比率を上げられそう。
Vimperator+Livedoor ReadarからVivaldi+Irodrに移行しました

今年はChromeにRSSフィード機能が追加され、RSSがにわかに復調の兆しを感じました一年でした。

この記事ではそんなRSSリーダーの楽園だったVimperatorとLivedoor Readarの組み合わせの乗り換え先を見つけて、落ち着くことができたというお話を紹介したいと思います。

## いまさらRSS？

キュレーションサービスやSNSが隆盛している今日この頃で、情報を得る手段としてのRSSは一世代古いという感じがしますが、私はなかなか手放せないでいます。

その理由はこんな感じです。

- 定点観測で同じテーマの流れや系譜をウォッチしたい
- 特定の方の生き方や心境の変化もあわせた仕事や技術との関わり方を知りたい
- 速読したい

特に自分から購読したい情報（ブログや情報発信サイト）を自ら取りに行くという形は、RSSならではですね。
数ヶ月や数年の時が経っていても、フィードによっては過去の系譜やノリや心境の変化も伝わってきて哀愁を感じることも珍しくありません。

## 速読したい

RSSの購読数が数百フィードを超えてくると、全部を細かく目を通しているとすごく時間がかってしまいます。
かといって、実読が増えてしまったり、クリックして既読にだけしてしまう行為をすると購読する意味があまりなくなってしまうので、速読でざっくり全記事を読んでいきます。

だいたいサブジェクトと冒頭の書き出し部分を見ていきます。詳しく読みたいかを判断は感覚的にしてますが、詳しく読みたい記事はあとでじっくり読むというようなスタイルをとっていました。

VimperatorとLivedoor Readarで使っていた機能とオペレーションの流れでいうとこんな感じです。

- jを連打してフィードをざっくりと読んでいく
- p(ピン機能)で読む記事を一時的に溜める
- sで次のフィードに移動し、jを連打して読むを繰り返す
- 全部消化したらoでピンを縦タブに展開し10記事ずつ読む
- 気になればpocketに登録したりreblogしたりチャットで話題にする
- 読んだらdでをクローズ

このサイクルが染みつくと、あまりにも快適でいつの間にか手放せない環境になっていました。

## Irodrに乗り換えをした

Livedoor Readar(Live Dwango Readar)もVimperatorも終焉を迎えました。fastladderを試したこともはあったものの、それから数年間ずっと定着する環境を見出せずにいました。

そんな折、RSSリーダーをLiveDoor Readerの操作感を再現した[Irodr](https://irodr.netlify.app)を試してみたら、全く同じではないものの、違和感はそこまでなかったので使い込むことにしました。

RSS記事のクローラーや購読管理は[Inoreader](https://www.inoreader.com)が採用されています。
使い込んでいくことバックエンド側についてはそれほど気にならず、操作感と視覚面を設定で調整すればいい感じになりそうだなという感触を得ました。

- Vimperator的な操作感を再現したい
- タブは縦タブで表示したい

この2つを実現できそうなブラウザを調べてみると、ChromiumベースのVivaldiが候補として残りました。

### 設定をカスタマイズ

雑に設定した内容を紹介します。
昔はけっこう細かく設定をこだわっていた気がするんですけど、いまは大雑把な感じになっています。

- Vivaldi設定
    - 120%くらいのデカ文字に
    - 設定→キーボード→キーボードショートカット
        - 単一キーのショートカットを有効にする
    - 設定→キーボード→タブ
        - タブを閉じる : d
        - 一つ前のタブに戻る（表示順）: h
        - 一つ後のタブに戻る（表示順）: l
        -  閉じタブを開き直す：u
    - 設定→キーボード→ページ
        - 上へ移動 : ctrl+u
        - 下へ移動 : ctrl+d
    - 設定→タブ
        - タブバーの位置 : 左
        - 最後のタブを閉じても運動を閉じない : ✔︎
        - 新しいタブを開いとき時はホームページ
            - これは拡張でタブを開いた時にフォーカスが移らないないようにするため
- 機能拡張のインストール
    - [Force Background Tab](https://chrome.google.com/webstore/detail/force-background-tab/gidlfommnbibbmegmgajdbikelkdcmcl)
        - タブをバックグラウンドで開くための拡張
        - 設定
            - Default behavior : background
            - Rule追加 vivaldi://startpage : Defaultをオフ
    - Vimnum
        - Excluded URLs and keysにirodrを追加
            - petterns `https?://irodr.netlify.app*` : Keys `zxcvbasdfgjkqweryuip`
        - その他細い設定mapping設定は追加

### Firefox51からの進化

Vimperatorは今から約5年前の2017にリリースされたFirefox51で使えなくなってしまいました。ブラウザの進化もすごくて、JavaScript実行エンジン速度の違いがVimperatorを使っていた時とは圧倒的に違い、ピン機能がなくても `v` で都度別タブに記事を展開しても速読に影響しないことがわかりました。

2015、2016年あたりのMacbookProだと若干気にはなったものの、M1 Macで使うとタブに展開した後にほぼ1秒以内にIrodrにフォーカスが戻ってくるので、かなり快適感が増していることが実感できました。

## 最後に

今でも、VimperatorとLivedoor Readarが使えればなと思うものの、周辺の状況やメンテしていくコストとモチベーションを考えると難しさも理解でき、Irodrを提供してもらっている現状に感謝したいです。

そんなこんなで、CPU性能の進化、V8エンジン高速化、画面領域も広くなったことも手伝って、地味にメリットをうまく享受でき、再びルーチンワークスタイルをLife Changeできました。

年の瀬ということもありますし、みなさまも自身の環境をたまに刷新すると気持ち良くなるかもしれませんよ！
mbedコンパイラ廃止予定のお知らせがキタ。


#1.Keil Studio Cloud introduction and Mbed Online Compiler retirement
ってメールが12/15日付でmbedを使用している人には届いている筈です。

これ読んで行くと
Keil Studioに移行してねーってことになっている。

studio.keil.arm.com
にアクセスして、mbedにあったソースを早いうちにコピーしておくことをお勧めする。
基本ほぼ自動で行ってくれるので、やれば良いだけ
ですが、ターゲットマイコンへの反映があるのか？謎なところですが、
早いうちに行っておきましょう。


以上
やましょうでした。
neosでlogix その40

#概要

niosでlogixやってみる。
BluePrint v4.5を使ってみた。

#写真

![2021-12-25 04.33.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/439c2b36-3144-19df-978b-9688c2edbbcb.jpeg)

#操作法

- 入手方法

Essential Tools->PolyLogiX Public Tools->BluePrint

- 展開

右上を押す

- 大きさを調整

展開時に右上の三角をドラッグする

- 縮小

左下を押す

- 名前を変更

上の名前の部分をクリック

- 移動

下のバーの部分をグラブする

- 張り付く。

BluePrintにノードなどを近づけると

- 縮小した状態でも、はみ出したノードにつなげることができる。

左右に入出力のノードを意図的に、はみ出させる。


以上。
Djangoでブログ_01｜設計と計画

### 前置き  
こんにちはさだやです。Djangoで、Webサイトの立ち上げるにはどうしたらいいの？
ということを備忘録的に共有していこうかと思います。
##### 開発環境  

|項目|内容|
|--|--|
|PC|HP Chromebook x360-14b-ca0004na|
|OS|Chrome OS|
|Spec|メモリ：8GB、eMMC：128GB|
|エディター|Visual Studio Code|
|言語|Python|
|フレームワーク|Django|
|サーバー|GCP（Google Cloud Platform）（無料枠）|
※サブテーマ：子どもが使用するChromebookでも、ビジネス利用できることを証明する。

# 目的と意義について
- Djangoに関する学習
- 個人の信頼向上（仕事を獲得）
- Webに関する基本スキル（GitHub、サーバー設定）向上
- 多少のマネタイズ  

### アウトプットの重要性  
アウトプットしていかないと、学習は覚えるを超えません。つまり理解までは至りません。
また人事の立場としては、スキルよりもアウトプット力の強い人材のほしいと思うため、
自分自身でも、もっと個人のブランディングをしていかないとなぁ、と考えて動きはじめました。

# 制作スケジュール  
1. サイトマップ作成（構造・設計）
1. ラフデザイン作成
1. Djangoプロジェクト立ち上げ
1. TOP画面作成
1. メインコンテンツ作成
1. GitHub設定
1. デプロイサーバー選択
1. 初期設定・デプロイ
1. リリース  

### スケジュールの重要性  
「仕事じゃないんだから、そんなスケジュール組まないよ」と思う方は、
きっと一生、個人の仕事を生み出すことはできません。
ちなみに、このスケジュールのtodoはGoogle Keepがオススメです。
そうすることでスケジュールの潰しこみ・確認が、スマホからでもPCからでもできます。

# Djangoブログ｜次回の投稿  

- サイトの設計（構造・設計）
- ラフデザイン作成
ゼロからPython環境構築

Pythonインストール、仮想環境構築、PyCharm導入まで

#1. Pythonインストール
###インストーラダウンロード
公式ページからinstallerをダウンロード

https://www.python.org

Python >>> Downloads >>> Windows >>> Stable Releases >>> Python 3.10.1-Dec.6,2021 >>> Windows installer (64-bit)

Add Python 3.10 to PATH にチェックを入れた上で install実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408366/ea28dac8-04c1-634c-e5fa-39637a66709d.png)

install後、コマンドプロンプトで確認。

```
C:\Users>python -V
Python 3.10.1
```
#2.仮想環境構築

下記の記事を参考にさせていただきました。

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e

プロジェクトフォルダに移動し、```python -m venv venv```を実行
最後の ```venv```は仮想環境名を示す。各プロジェクト内に格納されるため、重複はしない。

```
C:\Users>cd /d D:\Users\[プロジェクトのファルダ]
D:\Users\[プロジェクトのファルダ]>python -m venv venv
```

#3.PyCharm導入

https://www.jetbrains.com/ja-jp/pycharm/

ダウンロード >>> Windows >>> Community　ダウンロード

ダウンロードしたinstallerを実行する。

このあたりは、下記の記事を参考にさせていただきました。

https://qiita.com/k5t5rxxyg/items/a54a7ae95e034c5d5234

###1) まずは、日本語化

Plugins >>> 検索窓で "japa" >>> Japanese Language Pack >>> Installボタン押下 >>> Restart IDE ボタン押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408366/2aaec0fc-00ce-9d50-4e70-9c7ce69e8a88.png)

###2) 次に、プロジェクトの作成
プロジェクト >>> +新規プロジェクト 押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408366/4e70ae5d-9565-1eb1-16e6-aba2eae5f5e2.png)
場所をプロジェクトフォルダを選択、
インタプリンタは「以前構成されていたインタープリター」より、上で作成した仮想環境内の python.exe を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408366/a5c05502-369d-aad1-19e3-5293a29ca837.png)

###3) パッケージのインストール
仮想環境内のpipを最新Verにする。
まず、コマンドプロンプトを管理者権限で立ち上げる。

```
D:\Users\[プロジェクトのファルダ]>cd venv\Scripts
D:\Users\[プロジェクトのファルダ]\venv\Scripts>activate
(venv) D:\Users\[プロジェクトのファルダ]\venv\Scripts>python -m pip install --upgrade pip
```

その後、必要なパッケージを順次インストールしていく。（下記はnumpyの例）

```
(venv) D:\Users\[プロジェクトのファルダ]\venv\Scripts>python -m pip install --upgrade numpy
```

pyodbcのパッケージで

```
(venv) D:\Users\\[プロジェクトのファルダ]\venv\Scripts>python -m pip install --upgrade pyodbc
building 'pyodbc' extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
```
とエラーが出るため、Microsoft C++ Build Toolsのインストールする。

https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/

https://self-development.info/%E3%80%8Cmicrosoft-visual-c-14-0-or-greater-is-required-%E3%80%8D%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/
[3ds Max]スムージンググループをスクリプトから設定する方法。Set Smoothing group by MaxScript

#はじめに
3dsmaxのmaxscriptでポリゴンなどのスムージンググループを設定する際に、polyop.setFaceSmoothGroupを使用すると思います。
そのメソッドを使用すると思った通りの動作にならず戸惑う方がいそうなので今回記事にしました。

###setFaceSmoothGroup について

このメソッドは第一引数に対象のポリゴンオブジェクト、第二引数に対象のフェイスIDそして、第三にスムージンググループの整数を入れるよう指定されています。
以下　ヘルプの引用

https://help.autodesk.com/view/3DSMAX/2020/JPN/?guid=GUID-E420291B-3A8C-48AC-A05C-5782634E4DEF

```

polyop.setFaceSmoothGroup <Poly poly> <facelist> <int smoothing_group> add:<boolean=false>
指定された面のスムージング グループを設定します。

<smoothing_group> の各ビットの状態は、対応するスムージング グループにその面が属しているかどうかを示します。

<add> が true の場合、<smoothing_group> は各面に指定された既存のスムージング グループ データに追加されます。

<add> が false の場合、既存のスムージング グループ データが上書きされます。

```

この第三引数が曲者。
単純にオンにしたいスムージンググループの数字を打つのではなく。
**<font color="Red">32桁の2進数で、1がONで0がOFFだとして、10進数の数字を入れないと正常に動作しないという、難解仕様。</font>**

なので、第三引数に1を入れるとスムージンググループは1。
2を入れると「2」、
3を入れると「1と2」、
4を入れると「3」。

っという風になるわけです。

|10進数|2進数|smoothing group|
|---|---|---|
|1|1|1|
|2|10|2|
|3|11|1,2|
|4|100|3|

##対処法

これじゃあわかりにくいので、bitarrayから整数に変換するスクリプトを用意しました。
(整数からbitarrayに変換する関数も入ってます)
以下スクリプトです。

```ConvertBitarrayFrom32Int.ms

fn ConvertBitarrayFrom32Int num  =
(
	local sgroup_val= num
	local sg_bitarray=#{}
	if sgroup_val < 0 do
	(
	sg_bitarray[32]=true
	sgroup_val -= 2^31
	)
	for i = 1 to 31 do
	(
	sg_bitarray[i]= (mod sgroup_val 2 > .5)
	sgroup_val /= 2
	)
	sg_bitarray
)
fn ConvertIntFromBitarray bitary = 
(
	result  = 0 
	for i = 1 to 32 do
	(
		if bitary[i] then 
		(
			result +=  2 ^ (i  - 1)
		)
	)
	return result 
)

format "-----------------------\n%\n" (ConvertBitarrayFrom32Int 5)
format "-----------------------\n%\n" (ConvertIntFromBitarray #{1,3,6,8})

```


こちらを使用して、以下のように記述すると、少しはわかりやすいかも。

```
polyop.setFaceSmoothGroup  $Box001 1 (ConvertIntFromBitarray #{1,3,6})

```

ちなみに、スムージンググループ以外にも、この形式で指定するメソッドがちらほらmaxの内部にあります。
それは引数で、<int maskflag>とか<32bit int>とかそんな感じで表記されているので、その場合は、この2進数を10進数に変えて指定する方法を疑ってもいいかもしれません。
是非、ご参考までに。
N＋１問題はincludesメソッドで解決できる

現在プログラミング勉強中です。
N＋１問題について勉強していて、イメージがつき辛かったので備忘録としてまとめてみます。

#N+1問題とは

N＋１問題とは、アソシエーションの関係にあるモデル間で、データベースへのアクセス回数が膨大になってしまうというものです。

例えばTwiiterなどでは、以下の画像のようにtweet毎に投稿者の名前が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378833/27280bcb-fe9c-9d63-8b18-ae586b66a5bd.png)

このようなtweet毎に紐づくユーザーネームを取ってくるためには、tweetの数分、usersテーブルにアクセスする必要があります。

具体的にコードを確認します。
まずは事前設定として、以下の表のようにアソシエーションの関係にある、
tweetsテーブルとusersテーブルを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378833/378d06f7-7485-1152-bd8e-e0c52847ab75.png)


このアソシエーションで関連づいているモデルで、tweetに紐づくuser_nameを全て取得します。
この時N＋１問題を考慮せずに記述すると、


```ruby:qiita.rb
tweets = Tweet.all
tweets.each do |tweet|
  　tweet.user.name
end
```
となります。
しかしこのように記述すると、each文の中でtweetの数だけ（N回）、userモデルにアクセスをしてしまいます。
実際に実行して、SQL文を見てみます。

```ruby:qiita.rb
tweets = Tweet.all
　
#TweetモデルへのSQLが発行されている
Tweet Load (1.2ms)  SELECT `tweets`.* FROM `tweets`
```
まず全てのtweetを取得する時にTweetモデルにアクセスしています。
そして次に、

```ruby:qiita.rb
tweets.each do |tweet|
  　tweet.user.name
end
　
　# tweetの回数分（4回）UserテーブルにSQLが発行されている
　User Load (1.1ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  User Load (0.6ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 LIMIT 1

```

このように、each文の中でtweetの数だけUserテーブルにアクセスしている事がわかります。
今回の例では4回なので影響は少ないですが、
tweetが1000回、1万回となるとアクセス数も膨大になってしまいます。

#includesメソッド
このようなN+１問題を解決するために、includesメソッドを使うことで関連モデルへのアクセスを一度で行う事ができます。書き方としては

```ruby:qiita.rb
モデル名.includes(:関連モデル名)
```
です。

例えば以下のように全てのtweetを取得する際に、allメソッドではなく、includesメソッドを定義することができます。

```ruby:qiita.rb
tweets = Tweet.includes(:user)
tweets.each do |tweet|
  　tweet.user.name
end
```

上記の例では、全てのtweetを取得する際に、同時に紐づいたuserも参照しています。そのために、続くeach文では、N回というuserモデルへのアクセスが不要になります。
実際に実行してSQL文を見てみます。

```ruby:qiita.rb
tweets = Tweet.includes(:user)
　
 #Tweetモデルと、UserモデルへのSQLは合計で2つだけ
  Tweet Load (1.0ms)  SELECT `tweets`.* FROM `tweets`
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)
```

すると
Tweetモデルへのアクセスを行うと同時に、紐づく全てのUserモデルへのアクセスも１回で行えている事がわかります。
(この時、続くeach文ではSQLは発行されません)



従ってincludesメソッドを使う事で、
N回というどんなにtweetの数が膨大でも、データベースへのアクセスとしては合計２回で済むのです。

#まとめ
N＋１問題とは、アソシエーションがあるモデルで、N回という膨大なデータベースへのアクセスをしてしまうことです。
解決策として、includesメソッドを使う事でモデルへのアクセスを2回で済ます事ができます。
static定義とは

インスタンスではなく、クラスに直接所属させる宣言。

## 具体例
```
public static Human{
	static int countHuman = 0;
	private String name = '';

	Human(String name){
		countHuman++;
		this.name = name;
	}
}
```
countHumanとnameの違いは？
	人数→人間という概念（クラス）に所属
	名前→個人（インスタンス）に所属

引用：https://qiita.com/ue_knnk/items/fa84b8bc30ba319e5744


## メリット
- インスタンス化しなくても使える
		- インスタンス生成に時間がかかる時に有効

- インスタンスごとで動作が変わらない
		- 複数箇所でユーティリティメソッドを呼ぶ時などに、互いのメソッドが干渉しないので、動作が一定
		-※ユーティリティメソッドに状態を持たせるのがそもそも良くないけど。

- インスタンスメソッドよりも若干早い


## デメリット
- 使い所を間違えたり、多用して「インスタンスが状態を持たないクラス」が増えすぎると、そもそもオブジェクト指向ではなくなる
		- ※オブジェクトに状態を閉じ込めることができなくなって、副作用が多くなる


<a id="#reference"></a>
# 参考文献
- [staticおじさんにならないために](https://qiita.com/ue_knnk/items/fa84b8bc30ba319e5744)
- [staticメソッドの使いみちがイマイチわからないのでまとめてみた](https://qiita.com/uhooi/items/f32e20750d2fb0f2da46)
- [【初心者向け】Javaのstaticメソッド・static変数について解説！](https://www.tech-teacher.jp/blog/java-static/)
Minecraftサーバープラグインを安全にリモートデバッグする方法

# 何がしたいのか
PaperやSpigotサーバーで動かすプラグインをリモートサーバーでデバックしながら開発したい。
## デバッグとは
実行中のプログラムを止めて変数の中身を見たり、プログラムの変更内容を動的に切り替えることができるようになります。

https://pleiades.io/help/idea/debugging-code.html

## なぜリモート？
VPSなどのリモートでサーバーを起動する、ぼく的メリットは２つあります。

### 他の開発者にリアルタイムで開発状況を見てもらえる
ローカルでサーバーを立てる場合でも不可能ではありませんが、ポート開放など環境を整えるのが面倒
### 低スペックパソコンに優しい
マイクラ鯖ソフトのリソースの使用量は凄まじく、特に8GBのノートパソコンなどではメモリ不足で開発効率が悪くなります。クライアント複数起動なんてもってのほか...

# やり方
## jvm引数
jarを実行する時に引数にこれをつける

```
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
```

## IntellijIDEAなどで接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758030/7cd8fe2f-38bf-5d9f-699a-cdd23923fc24.png)

## sshポートフォワーディング
上記のjvm引数を次のようにしてもいいのですが、これではアドレスとポート番号が分かれば誰でも接続出来てしまい、非常に危険です。

```
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
```

エディタなどでアタッチする前にこのような引数を付けてssh接続しておきます。接続先は、サーバーを起動している場所です。

```
ssh -L 5005:localhost:5005 <username>@<remote-host>
```

すると、localhost:5005でデバッグ起動中の鯖にリモートデバッグ接続できるようになります。

## Dockerでサーバーを起動している場合

jvm引数のaddressはjdk9以上ではポートしか指定していないと、デフォルトでローカルホストのみになるそうです。
dockerホストから接続できるよう0.0.0.0を付けます。

```
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005
```

ホストの5005番に接続が来た時、サーバーを起動しているコンテナに繋がるように、dockerでもポートフォワーディングしておきます。加えて、127.0.0.1を付けることで外部からは接続できないようにしておきます。

```
-p 127.0.0.1:5005:5005
```

dockerのjvm引数の設定がよくわからなかったので、こちらを確認してみてください。

https://github.com/itzg/docker-minecraft-server#jvm-options

# 参考

https://gists.cwidanage.com/2019/10/remote-debugging-java-over-ssh.html

https://qiita.com/opengl-8080/items/7e487e3d25a032fcfcaf

https://ja.wikipedia.org/wiki/0.0.0.0

https://qiita.com/irotoris/items/f3b98feb69807f450984#%E8%BF%BD%E8%A8%982016126
__init__.py とは

## 勉強前イメージ

基本の設定ファイル的なやつ？

## 調査

### \_\_init__.py とは

\_\_init__.pyの機能として、以下の2点あります。

#### 1.\_\_init__.py ファイルがあると、そのディレクトリをパッケージと認識させることができる

まず、パッケージというのは以下の `xxxx` の部分になります。

```python
import xxxx
```

また、以下の `yyyy` の部分はモジュールといい、
パッケージの中の.pyファイル単位でのimportもできます。

```python
from xxxx import yyyy
```

まぁ上記のようにパッケージを使用したい際に、そのディレクトリに __init__.py を置くことで
ディレクトリ内のファイルをimportして別のファイルから使用することができます。

イメージとしては以下になります。

![パッケージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/43f7af7d-df6e-2f92-156c-be7e05ca3b56.png)

ただし、python3.3以降は \_\_init__.pyがなくてもディレクトリをパッケージとして認識してくれます。


#### 2.importされたときに\_\_init__.pyに記載されているスクリプトが実行される

initっぽい感じですが、importされたときに処理する内容が記載されています。

イメージとしては以下のような感じで、
\_\_init__.pyに記載されている内容を処理します。

![読み込み1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/edbbb294-d7bd-61fc-6f4b-e6484299d9bd.png)


## 勉強後イメージ

モジュールって自分のとこからでも読みに行けるのか・・・
まぁ、そうか、普通にそうだよね。

## 参考

- [\_\_init__.pyの役割とは？パッケージ化やimportの関係は？](https://shimi-dai.com/python-what-is-__init__-py/)
- [Python \_\_init__.py の機能について](https://www.kangetsu121.work/entry/2018/09/16/004008)
これから研究していく人たちに捧ぐ、卒研の心がけを伝えていく

## はじめに
ついに今年も最終日までバトンが回ってきました。一年というのは長いようで振り返るとあっという間に過ぎていきますね。
私も歳を取るのが嫌な年齢になりました。悲しい。

[昨日の記事](https://qiita.com/hcpmiyuki/items/45e51e4c1418cfa21ae7)はSupabaseにGraphQLの拡張機能が追加されたことについてでした。白痴な私にはfirebaseとsupabaseの違いがようわからんので、なんか凄そうという感想しか出ませんでした。ごめんなさい😞

最終日は今年私が卒研に取り組んで後悔したことを書き連ねていきます。主に現在の三年生に向けての記事になるのでしょうか。

## 卒研の本質
既存の研究(データ)を知り、新しく価値を生み出す研究(市場)を生み出す。新しく人に価値を与えるプロダクトの作成です。当たり前のことですが全人類が研究を行う目的は豊かになるために行います。学士研究においては大体が卒業するためという目的なんですけれど、0から自分自身で利益をうむプロダクトを作成する活動を行うことを学ぶいい機会ですね。去年同期のサクラとなったNさんによると起業家に通じるものがあるそうです。というより生きていく上で割と重要になってくるのかね。

# 卒研の中身
順序に則り全体像を懺悔と共に語ります。

## サーベイ
研究は調査活動からはじまります。サーベイは自身の興味の分析、プロダクトの既存研究の調査、新しく作成するプロダクトの設計。大まかに3つに分けられるでしょう。

最初に興味の分析です。これなら一年間続けられるだろうと思われるサービスを思い浮かべます。例としてこの記事では音楽推薦サービスの研究を行うこととします。

次にプロダクトの既存研究の調査です。ここで強くお伝えしたいことはレビュー記事から読むことです。間違ってもMasterの先輩が良い論文というような論文を読んでは行けません。あなた(私もだけど)にはまだ早い!良い論文というのは総じて難しいテクニカルタームをめちゃくちゃ使っています。初見では解読不可能な古文書を読んでいる気分になります。母国語以外の論文なんて読んだ日にはもう目も当てられません。読んで悪いことはないですが、(むしろめちゃくちゃ勉強になる)効率は悪いと言わざるおえないでしょう。なので、レビュー論文を読みましょう。
音楽推薦サービスであったら[これ](https://www.jstage.jst.go.jp/article/jjsai/34/3/34_300/_pdf)です。レビューじゃなくて特集か。なんとも優しいことに英語の論文の比較的に新しい研究の和訳、そして短く紹介してくれています。このような記事で自分がこれから飛び込む研究分野の概要を知ります。その後に英語で書かれたレビュー記事。そして、ようやくいい論文と呼ばれているような難解な古文書にも目を通せるようになります。

大体既存の研究が何をやってきたかわかったら自分が作るプロダクトの設計に入ります。もはややっていることはSIerです。この場合要求は自身の趣味と卒業。要件は既存の研究の調査結果からの分析ですね。作成するシステムの概要図を作って、シーケンス図やデータフロー図を作成しておくと論文執筆時に楽ですし、ゼミ内発表でも伝えやすいです。ここまで全てできたら我らがMYJ先生にこの研究でいっていいか確認をとりましょう。真面目に論理を組み立てていることができていれば普通に通ります。

このサーベイの工程が一番重要です。時間をかければかけるほど良いと私は思います。作り直しなんてことにならないようにしっかりシステム設計しておきましょう。私?私は何回か作り直しました。

## システム作成
サーベイが完璧にできていれば何も困ることはありません。ただ作るだけです。MYJのゼミ生ならば一番楽しいと感じる部分ではないでしょうか。己の技術力で解決してください。ですが、現実ではサーベイが完璧にできていることは稀です。いけそうだと思った技術も実際に使ってみたら思うような結果を出力できなかったり、問題がいっぱいでできます。Try and Errorを楽しめるような人間になってください。ここで精神をやられる人が出現してきます。完璧主義者やプライド(それも大切なんだけどね)が高い人は気楽にやることを心の片隅に置いてがんばりましょう。簡単に我々学士がうまく終わらせられる研究なんてまずないのですから(あってもサーベイの時点でMYJ先生からもっといけると言われそうです)。そして、問題が起きたときにはスケジュール管理を必ずしてください。私はできなかったので人のことを言えないのですが、一週間単位でやる予定、実際にやったこと、できなかったこと、リカバリー方法をどっかのDocにまとめておきましょう。夏休み中なんかMYJ先生に見せることになります。全力でシステム開発を楽しみましょう。

## 実験
卒研で一番難しいのはこの実験だと思います。なすことは既存研究の実験方法をいっぱい吟味して自分のサービス用にリメイクすることです。実験について一言でまとめると、「サーベイで設定した人に価値を与えるために自身のサービスが提供できるものは実験においてちゃんと価値を生み出すことを確認できる」というような実験でなくてはなりません。要するに論理立ててサーベイから実験までつながっていないと行けないのです。一番難しいのは実験の設計ですが一番大切なのはサーベイですね。私も難し過ぎて上手く伝えられませんでした。

## 執筆
サーベイから実験まで行ってきたことを全てdocにまとめます。期間内に死ぬ気で終わらせましょう。私は今、泣きながらこの作業に従事しています。目が乾燥し過ぎて涙が止まりません。そうならないためにはスケジュール管理をしておくべきだった、、、今更何言っても遅いよね。

## まとめ
一年振り返っていると知識は1,2,3年生よりも増えたような気がします。そして老けました。結局のところサーベイが命です。私は声を大にしてでも伝えたい。研究はサーベイが全てである！
これから研究する人は私という人柱を踏んでシステム開発し直しということがなく、スケジュール管理ができなくなるなんてことがないようにお祈り申し上げます。

スケジュールの遅れは精神を着実に削っていきますからね。

私は時間を浪費したばかりにシステムを作ることが叶わず、自分の論文には数式ばかりが並び立てられています。本当はこんなはずではなかったのに。全てはサーベイをしっかりやっていなかったからです。

長文読んでいただきありがとうございました。R.I.P
CMakeでビルド後にファイルをコピーする方法

# 背景
CMakeでビルドした後、実行に必要なファイルをコピーするコマンドを追加したかったのですが、少し躓いたので備忘録として残しておきます。

# やりたいこと
あるプロジェクトを作成していますが、実行時に別のファイル（例えばDLLなど）が必要です。そうした際にDebug, Releaseそれぞれのビルドで必要なファイルが必要な場所に自動でコピーされるようにしたいです。VisualStudioではプロジェクトのプロパティで、"ビルドイベント"から設定を行う内容です。

# 失敗した方法
まずはこちらの方法を試してみました。
sampleプロジェクトに`add_custom_command`を設定します。

```CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)

project(sample)

add_executable(sample main.cpp)
add_custom_command(
  TARGET sample POST_BUILD
  COMMAND copy "C:/Hoge/hoge.dll" $<TARGET_FILE_DIR:sample>
)
```

`C:/Hoge/hoge.dll`が必要なファイル（コピー元）、`$<TARGET_FILE_DIR:sample>`はビルド後にバイナリが配置されるディレクトリ（コピー先）です。`$<TARGET_FILE_DIR:sample>`はCMakeがDebugとReleaseでそれぞれ適切なディレクトリに置き換えてくれます。

makeを実行します。

```PowerShell
> cmake -G "Visual Studio 16 2019" .
```

生成されたソリューションを開き、ビルドイベントの設定を確認すると、以下のようなコマンドが追加されています。

```
setlocal
copy C:/Hoge/hoge.dll C:/sample/Debug
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
```

しかし、ビルドを実行するとエラーになってしまいます。

```
2>コマンドの構文が誤っています。
2>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: コマンド "setlocal
（中略）
2>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
2>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(155,5): error MSB3073: :VCEnd" はコード 1 で終了しました。
```

# 上手くいった方法
`add_custom_command`の書き方を変更すると解決しました。`COMMAND`の後に`${CMAKE_COMMAND} -E`というオプションを追加してから`copy`コマンドを書く必要があるようです。

```CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)

project(sample)

add_executable(sample main.cpp)
add_custom_command(
  TARGET sample POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy "C:/Hoge/hoge.dll" $<TARGET_FILE_DIR:sample>
)
```

これでmakeすると、ビルドイベントに設定されるコマンドが以下のように変わり、ビルド時にcopyコマンドも実行されるようになりました。

```
setlocal
"C:\Program Files\CMake\cmake_3.16.3_win64\bin\cmake.exe" -E copy C:/Hoge/hoge.dll C:/sample/Debug
（以下略）
```

# 参考文献
こちらの記事とリンクを参考にしました。

https://qiita.com/syoyo/items/4a29f51b9cdf8875c3df

https://stackoverflow.com/questions/44212101/cmake-how-to-have-add-custom-command-run-after-all-project-files-are-built
シリアル接続7セグメント4桁LEDのファームウェアを書き換える

#経緯
[シリアル接続7セグメント4桁LED](https://www.sparkfun.com/products/11441) の動作を変更したくなったので、ファームウェアを書き換える。
「シリアル接続7セグメント4桁LED」はATMEGA328P-AUが載っていて書込み端子も出ているので、Arduino IDEとシリアル変換器があれば書き換えができる。

#用意するもの

* [シリアル接続7セグメント4桁LED](https://www.sparkfun.com/products/11441)
* [Arduino IDE](https://www.arduino.cc/en/software)
* シリアル変換器。たとえば下記のようなもの
 * [ＦＴ－２３２ＲＱ　ＵＳＢシリアル変換モジュール](https://akizukidenshi.com/catalog/g/gM-11007/)
 * [FTDI USBシリアル変換アダプター](https://www.switch-science.com/catalog/1032/)
* ワイヤ。たとえば下記のようなもの
 * [スルーホール用テストワイヤ TTW-200](https://www.sunhayato.co.jp/material2/ucb12/item_548)
 * [テストワイヤ TTW-203](https://www.sunhayato.co.jp/material2/ucb12/item_1180)

#手順
#####ファームウェア
[ファームウェア](https://github.com/sparkfun/Serial7SegmentDisplay/tree/master/firmware/Serial%207-Segment%20Display/Serial_7_Segment_Display_Firmware)をダウンロード、展開してスケッチのディレクトリ(Documents\Arduinoなど)に置く。

#####7セグ用ライブラリ
[sparkfun/SevSeg](https://github.com/sparkfun/SevSeg)をダウンロード、展開してライブラリのディレクトリ(Documents\Arduino\librariesなど)に置く。

#####ボードマネージャ
[ボードマネージャの説明](https://github.com/sparkfun/Arduino_Boards/)に従って「ファイル→環境設定→設定タブ→追加のボードマネージャ」にjsonファイルのurlを追記する。

```
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/main/IDE_Board_Manager/package_sparkfun_index.json
```

「ツール→ボード→ボードマネージャ→Sparkfan AVR Boards」を選択してインストールする。
「ツール→ボード→Sparkfan AVR Boards→Sparkfan Serial 7-Segment Display」を選択する。

```
Index error: could not find referenced tool name=...
```

というエラーが盛んに出るが影響は無い。目障りなら作業が済んだ後でボードマネージャ(Sparkfan AVR Boards)を削除すれば消える。

#####スケッチを編集
ファームウェアは何種類かの7セグに対応しているので、シリアル接続7セグ4桁LEDに合わせた設定に変える。
Serial_7_Segment_Display_Firmware.inoの39行目付近を修正

```
#define DISPLAY_TYPE S7S
```

#####書き込む
ポート(COM5など)とボード(Sparkfan Serial 7-Segment Display)を確認して「マイコンボードに書き込む」を押す。

#余談
「シリアル接続7セグメント4桁LED」は時々I2Cアドレスが勝手にランダムな値に変更されたり、LEDが暗くなる不具合が発生する。電源OFF/ONで元に戻れば問題無いが、EEPROMに書き込んでくれるので電源OFF/ONでは元に戻らない。元に戻すにはアドレスを突き止めて修正コマンドを送る必要があって不便だ。そこでファームウェアを書き換えてEEPROMに書き込まないようにするか、常にデフォルト値を使うようにすれば不具合を回避できると思う。
スピーカー特性の測定・・・１）WAVファイルの読み込み、グラフ描画

この記事では、自分でスオーディオ空間の特性の測定方法するための方法を記載できればと思います。
一連の流れをpythonで記述してプログラムを作成していますので
演算上の流れも把握できます。

##スピーカー特性の測定方法
①インピーダンス特性
②音圧-周波数特性
③歪率-周波数特性
④指向特性
⑤伝達関数(位相特性)
⑥遅延時間測定

##音響特性の測定方法
①インパルスレスポンス測定）

#用意するもの
・PC（記事ではMacを使います)
.マイク
　（S６D社iAI2など、感度、特性をHPで確認できるもの）
・ターンテーブル
・インピーダンス測定ケーブル

##記事を作成した背景
世の中には高級オーディオ機器と呼ばれるものがあり
一式を揃えると、数百万円〜一千万近く円かかる場合もあります。
雑誌を読むとアナログの信号ケーブルに数万円するものも販売されていたりします。
一般にハイエンド（高級機）ほど周波数特性がフラットと呼ばれていますが、マニアは電源系、ケーブル類にもこだわります。

こだわるのはいいことですが、音質の変化は
プラセボ（気のせい）の可能性もあるため、ここは定性・定量的に
何がどう違ってくるのかを記事にしたいと思います。

また、安価なスピーカでも周波数特性を適切に補正するこで
ある程度、ハイエンドのに近いところまで調整できるはずです。
それでも、周波数特性だけで近づいても音質としては
異なるはずです。何が違うのか数値、グラフを元に紐どければと思います。


##第１回目 WAVファイルの読み込み


オーディオファイル(test.wav)を読み込むためのコードを示します。


```python:import_wav.py
import wave
import numpy as np

wav = wave.open('test.wav','r')#読み込むWAVEファイル名

wdata = wav.readframes(wav.getnframes())
data = np.frombuffer(wdata, dtype='int16')

print ('Sampling rate:', wav.getframerate())

print(data.shape)
print(data)
print(data.dtype)

wav.close()
```

##解説

wave.readframesの部分で音声ファイルを
Wave_read型（オブジェクト）として読み込みます。
その後、ヘッダー部分を除いた音声のみのデータの
読み込んだ音声データを１次元配列(int型データ)に収納しています。


#表示
確認のためMatplotlib関数を使って表示すると良いでしょう。

```python
import matplotlib.pyplot as plt
plt.plot(data) #グラフを書く
plt.show()
```
描画例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262142/9d8416cb-e5e0-dcdb-e25d-2b7c0ca0899c.png" width=50%>


以上

参考文献：Pythonで学ぶWAVプログラミング
デジタル時代のホーンスピーカー製作
【Project Euler】Problem 64: 平方根の連分数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題：平方根の連分数の循環周期

原文 [Problem 64:Odd period square roots](https://projecteuler.net/problem=64)

**問題の要約：　$1<N<10^4$で$\sqrt{}N$の連分数の循環周期が奇数になるもの数を求めよ**

連分数に関しては[こちら](https://ja.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B0)に説明があるので参考にしてください。</br>
正の整数の平方根の連分数展開は循環することが知られていますが、sympyに2次無理数の連分数展開を求めるcontinued_fractionという関数があり（説明（英文）は[こちら](https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.continued_fraction.continued_fraction)）以下のように簡単に求めることが出来ます。</br>
従ってこの循環部分(=cf[1])の長さをチェックすればよいのですが残念ながらこの関数は遅すぎて$1<N<10^3$で2分程度かかってしまいました。

```python
from sympy.ntheory.continued_fraction import continued_fraction
from sympy import sqrt

for n in range(2,10+1):
  cf = continued_fraction(sqrt(n))
  print(n, cf)
#2 [1, [2]]
#3 [1, [1, 2]]
#4 [2]
#5 [2, [4]]
#6 [2, [2, 4]]
#7 [2, [1, 1, 1, 4]]
#8 [2, [1, 4]]
#9 [3]
#10 [3, [6]]
```
そこで色々探した結果こちらの「[平方根の連分数とペル方程式 有澤健治著](https://leo.aichi-u.ac.jp/~keisoken/research/books/book51/book51.pdf)」という文献に添付されているコードを参考させていただき以下の関数cfsqrtを書きました。機能はcontinued_fractionと同等ですが平方根の連分数に特化しているのでかなり速く$1<N<10^4$でも1秒以内に答えをだすことが出来ました。

```python
def cfsqrt(m):
  n0 = int(m**(1/2))
  if n0*n0 == m: return [n0]
  n,a,b,cf = n0,1,0,[]
  while True:
    b = n*a -b
    a = (m-b*b)//a
    n = (n0+b)//a
    cf.append(n)
    if a == 1: break
  return [n0,cf]

```
Windows(コマンドプロンプト)でlsコマンドを使う方法

# 概要
Linux系OSを使った後にWindowsに戻ってくると、ついうっかり「ls」って打ってしまってちょっとイラッとしてしまう、そんな問題を解決する方法。

# 方法
コマンドプロンプトを開いて

```
doskey ls=dir
```

これだけ。以上。
未定義の配列キーを読もうとしているとfor文が遅くなってしょうがない

PHP7.4での小ネタです。
PHP8ではエラーになるようなので、役に立つ情報ではないようです。

PHPでfor文の高速化を試している時、色々な情報をネットから仕込んで試していても一向に早くならないなあと思ってたところ、原因が判明しました。
未定義の配列キーがある場合、読み込みにすごく時間がかかっていました。

```PHP7.4
foreach($list as $row) {
    // 色々な条件をくぐり抜けた結果、$sumに値をセット
    $sum['a'] = $row['a']; <- $row['a']が$rowによってあったりなかったりする
}

```

感覚では配列数が万を超えるあたりから明確に遅くなってきました。（今回計測はしておりません）
noticeには未定義の値が〜のようなものが上がっているようですが、気にしておりませんでした。

以上
簡易TCPサーバを使ったポートへの疎通

HPCクラスターのシステム構築時、スレーブノードから特殊なアプリケーションのライセンスサーバのTCPポートなどにて対してネットワーク疎通のテストを行いたいときがある。その際にアプリケーションのライセンスサーバがまだ導入されておらずポートに対してとりあえず仮テストしたい場合に、ncコマンドを使用して簡易的なTCPサーバを立ち上げ、そのポートに対して疎通テストを行うことができる。

###**■TCP簡易サーバの実行**
TCPサーバ(例 port:12443)を立ち上げ複数ノードに対してリッスンする。

```
$ nc -klnv 12443
```

###**■スレーブノード(クライアント)からの疎通テスト実行**
サーバIP(例:192.168.10.10)に対して疎通確認したいTCPポート(例:12443)に問い合わせてみる。

```
$ nc 192.168.10.10 12443

Hello  #文字入力してみる
```
###**■結果 TCP簡易サーバ側表示**
```
$ nc -klnv 12443
Listening on 0.0.0.0 12443
Connection received on 192.168.10.5 50121

Hello #スレーブノードから文字が送信された。
```

スレーブノードからサーバのTCPポートに対して疎通が確認できた。
テストを終了するにはサーバ側のコンソールでCTRL+Cを入力する。
VS Code でJupyter Notebook (Mac版)

# はじめに
意外とこの手順書がなかったので自分用メモ

HW: MacBook Pro (M1)
OS: macOS Monterey (12.1)

# 古いVS Code環境のリセット
実は以前に導入したのだが、設定がボロボロでまともにPythonが使えていなかったので、最初から入れ直すことにした。
VS Codeのアプリを消しただけでは、設定は残っていてリセットできない。次のコマンドで初期化をする。

```
% rm -rf $HOME/Library/Application Support/Code 
% rm -rf $HOME/.vscode
```


(参考記事)
https://daeudaeu.com/visual-studio-code-%E3%81%AE-mac-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

https://teratail.com/questions/319188#reply-444100


# VS Code導入
改めて、 VS Codeを入れ直す。

https://code.visualstudio.com/download

自分のMacはM1だが、「Universal」 を選んだ。
zipファイルを解凍し、できたappファイルをアプリケーションに移動後、起動する。

「日本語化するか」みたいな質問が出てくるので、「はい」で答えて再起動。

![スクリーンショット 2021-12-31 8.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cf9d95d0-b814-e710-8e0c-ba9b2bcf5ccd.png)

再起動後の画面
![スクリーンショット 2021-12-31 8.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4866fe7f-e4c2-d326-6dde-e8c8ef3e1218.png)


(参考記事)
https://sukkiri.jp/technologies/devtools/vscode_mac.html

# Python導入

画面左下の「拡張機能」のアイコンクリック
![スクリーンショット 2021-12-31 8.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d3a0cba8-75af-1166-bed7-6b244a5784e8.png)

①検索窓に``ms-python``と入力
②一番上の「python」の「インストール」ボタンをクリック

![スクリーンショット 2021-12-31 8.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1f576c79-60e1-7608-5637-2d849cc75d2e.png)


(参考記事)
https://blog.hiros-dot.net/?p=10265

あと、左下の画面に、Pythonのランタイム環境を表示させるためには、下記の手順が必要だった。

①　画面左下の「制限モード」の欄をクリック
②　出てきたパネルで、「信頼する」ボタンをクリック

![スクリーンショット 2021-12-25 11.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/54ba7b35-9f5e-6508-adf0-7f186c0a36ed.png)

これで、左下が下図のように変化する。
![スクリーンショット 2021-12-25 11.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8bb8dbe1-4359-6901-4e22-ec14c9faf3a3.png)

# Jupyter導入
このあたりの仕組みもまったくわかっていないのだが、以上の手順でJupyter Notebookも使えるようになっていた。
Keymapという拡張モジュールも入れた方がよさそうなので、追加導入した。
最終的な、拡張モジュールの状況は以下のとおり。

![スクリーンショット 2021-12-25 11.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6a047bcb-faeb-7cf6-6fbb-a1f2246c4356.png)

# その後の設定
下記の設定（デフォルトは　true)をfalseにしておかないと、ダブルバイトの文字がハイライトされて見にくい

![スクリーンショット 2021-12-26 14.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2fe5645f-2289-067b-60d5-9ab3191f180b.png)

# トラブル時の対応
発生のタイミングが理解できていないのですが、時々、VS Code内でPythonが動かなくなることがあります。試行錯誤的に見つけた対応策のメモ

この問題が起きたときは、経験上、下記の箇所でPythonにエラーが起きています。

①プラグイン
②Python選択
③ランタイムの状態

![スクリーンショット 2022-01-16 10.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/dbfb8fec-203c-d848-3752-8e44ff9b2909.png)

その場合はまず④「無効にする」をクリックします。
下の画面になったら、「再読み込みが必要です」をクリック

![スクリーンショット 2022-01-16 10.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8fdffd6f-b3ab-a4a7-7fbe-78517533c1a3.png)

更に下記画面で「有効にする」をクリック

![スクリーンショット 2022-01-16 10.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ebeb54b4-53b9-a162-a976-407163e961d4.png)

経験上、これで使えるようになることが多いです。


# 参考になりそうなリンク

https://atmarkit.itmedia.co.jp/ait/articles/1711/24/news034.html
【メモ】CSS

## Note

### 記述順序おすすめ

* CSS プロパティの記述順序 (個人的)
    * https://knooto.info/css-property-order/

### 縦書き

* CSS3で縦書きにする方法と挙動
    * https://qiita.com/tsuka-rinorino/items/3e3eaaba8cddb6ff08e9

### fibersがNode16に対応していない

* sass-loaderとdart-sassにまつわるfibersの話
    * https://blog.nasbi.jp/programming/devenv/webpack/the-story-of-fibers-about-sass-loader-and-dart-sass/
* node-fibers
    * https://github.com/laverdet/node-fibers
* sass-loaderで、Node16の場合にfibersを除外する方法
    * https://github.com/webpack-contrib/sass-loader#implementation
countdown Calendar 2021 まとめ作業のお土産

Advent Calendar 2021 

https://qiita.com/advent-calendar/2021/

まとめ作業をする際に、あわせてしている作業をここではお土産という。

# お土産

## ! 記事への補足、追記
記事の内容を補足する。

100点満点中30点未満の記事は30点を目指す。
誰かからいいねをもらった記事は、その誰かに役立つかもしれないことを追記する。
できれば参考資料を追記する。手を入れたら、Tweetする。

百点満点の三十点を目指しなさい。

https://qiita.com/kaizen_nagoya/items/cc953b7a4c9368cc2a17

## 参考資料への補足、追記

参考資料の内容を確認し、
補足が必要そうな記事には手を入れ、Tweetする。

## Advent Calendarに参加いただいた方の記事を参照する。

@kazuo_reve さんには複数記事を投稿していただいた。

参照を30個追加することを目標にする。

## 集計しながら考える。

この記事自体、集計しながら、作業をしながら、記録している。

# 参考資料

Qiita Advent Calendar 2021 に登録された記事は Qiita公開 と Zenn公開 のどちらが多かったか？【Swift でスクレイピング】

https://qiita.com/treastrain/items/b9ca9503cc4c2dee42af


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
【Mac】Node.js と【Windows】SQL serverを接続し、SQLserverのデータ(画像)を抽出する方法

# 目的
windows8.1内のSQLserver2005から画像データ(バイナリ)を抽出し、画像に変換し、変換した画像はMac側に保存する。

# やったこと
windows内で諸々の作業ができればよかったのですが、windows環境ではネットも繋がっておらず、色々と作業しにくいこともあり、プライベートネットワークを介して、mac内のnode環境から抽出することにした。

# 大まかな手順
1. windowsマシンを(LANケーブル等で)プライベートネットワークに接続
    
    コマンドプロンプトで`IPCONFIG`コマンドを叩いて、IPアドレスを確認。
    
2. macとwindowsマシンを接続確認

    取得したIPアドレスに対し、ターミナルで`$ ping  IPアドレス`コマンドを叩いて、接続を確認。
    
3. mac上でNodeアプリを作る
    SQLserverのドライバ「**Tedious**」をインストール。DB設定情報をセット。
    
4. nodeアプリから、SQLを叩いて、データ抽出。バイナリを画像に変換して保存。


## 抽出するプログラムをNode.jsで作る
上記手順の３について、詳細に説明します。

```javascript

const { Connection, Request } = require('tedious'); // ⇦SQLserverのドライバー

//DB接続設定
const config = {
    authentication: {
        options: {
            userName: 'username',
            password: "password"
        },
        type: 'default'
    },
    server: 'windowsマシンのIPアドレス(IPv4)',
    options: {
        port: SQLserverのポート番号,
        database: 'DBname',
        encrypt: false,
        instancename: 'SQLserverのインスタンス名'
    }
};
const connection = new Connection(config);

//クエリを実行し、バイナリが返ってきたら画像変換し、Mac内に保存する処理
const execute = () => {
    const sql = '実行したいSQLをここに記述';
    const request = new Request(sql, (err, rows) => {
        connection.close();
        if ( err ) {
            console.log(err);
            process.exit();
        }
    });
    request.on('row', columns => {
        columns.forEach(column => {
           var fs = require("fs");
           fs.writeFile("newImage.jpg", new Buffer([バイナリ], "base64"), function(err) {});
        });
    });
    connection.execSql(request);
};

//DBと接続し、成功すればクエリを投げる。
connection.on('connect', err => {
    if ( err ) {
        console.log('error: (' + err + ')');
        process.exit();
    }
    console.log('success');
    execute();
});

connection.connect();
```


NodeからSQLserverを操作するにあたり、必ずドライバーが必要となります。
SQLserverのドライバーには、`tedius`を使用します。


あとは、ターミナルで

```
$ node このファイル名.js
```

で実行すれば、画像が抽出できるかと思います。

### 参考にした記事
https://symfoware.blog.fc2.com/blog-entry-2481.html
https://www.npmjs.com/package/tedious
既存の動画にフィルターを適用する方法

#撮影済みの動画にフィルターをかける方法

<img src="https://user-images.githubusercontent.com/23278992/147177254-06633831-7dcd-4b4f-be3c-fc97eadbceac.gif", width=600>

既に存在している動画にフィルターをかけられれば、
面白い編集ができる。
#フィルターはリアルタイムでしかかけられないのか？

既存の動画を処理したい。
しかし、動画の処理を書くのは大変そう。

#[**SemanticImage**](https://github.com/john-rocky/SemanticImage)で秒で解決


[**SemanticImage**](https://github.com/john-rocky/SemanticImage)というライブラリなら、
かんたんに既存の動画にフィルターを適用できる。

#使用方法

###１、SemanticImageをインポートする
SwiftPackageManagerで[**SemanticImage**](https://github.com/john-rocky/SemanticImage)を追加する。

```swift
import SemanticImage
```

###２、フィルタリングを実行

```swift
guard let ciFilter = CIFilter(name: "CIEdgeWork", parameters: [kCIInputRadiusKey:3.0]) else { return }
sematicImage.ciFilterVideo(videoURL: url, ciFilter: ciFilter, { err, processedURL in
    // 処理済み動画URLをここで使う
})    
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
簡単な開発内容をお書き添えの上、お気軽にご連絡ください。
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
組織を動かしていくための心得

こんにちは、食べログシステム本部長の京和です。

食べログアドベントカレンダー2021の4日目の記事です。諸事情あって、最終日の公開となりました & 当初の予定とは違う内容でお送りします:snowman:

さて、この記事では組織を動かしていくための心得ということで、組織で新しい取り組みや変化を促していく際に、私が心がけていることを何点かご紹介したいと思います。

## 1. 最初は自分が動く
新しいことを始める場合や既存の仕組みを変える場合、言い出しっぺである自分自身がまず動くことが大事だと思っています。まだ実現されていないものは、どんなに分かりやすく説明されたとしても、理屈の上で理解はできても腹落ちして実践するのは難しいです。飛行機の理論を説明したとしても、飛行機を見たことがない人に飛行機は作れません。なので、まずは自分自身がリーダーシップを発揮して、実現したい状態を自ら作っていくことが重要です。

[「技術部門にOKRを導入したら3ヶ月で部の雰囲気がめちゃくちゃ良くなった話」](https://qiita.com/tkyowa/items/fa432d9cf25ec54aeda2)で紹介している組織にOKRを導入した際も、まずは私自身が先頭に立って、OKRの運用や改善を行っていきました。そうしてある程度形ができてから徐々に権限委譲をしていき、最終的には私がほとんど見ることなく、チームが自律的に運用できるところまで権限委譲できるようになっています。

## 2. 小さく始めて成功事例を作る
巻き込む規模・ステークホルダが多くなるほど、変えるにあたって考慮すべきことや必要な調整ごとは指数関数的に増えていきます。また、失敗した場合のリスクも同様に大きくなっていきます。そのため、新しい事にチャレンジする場合は、小さく始めてそこでまず成功事例を作ることが重要です。ウェブサービスやアプリでも、カナリアリリースと言う一部のユーザーにだけ新機能を適用する手法がありますね。
実際にやってみることで、初めて得られる気づきや学びも多くあります。そこで改善サイクルを回してブラッシュアップすることもできますし、成功した実績があれば、周囲の説得・安心材料にもなります。
一見すると時間がかかるように見えますが、小さく早く進めるこのやり方の方が、実体験の上でも早く進むことが多かったですし、周囲の共感を得られていました。

## 3. 周りを変えようとするのではなく、自分たちから変わる
うまくいかないことがある場合、人間の感情として、責任や原因を相手に求めがちです。ただ、コミュニケーションは鏡と言われるように、そうした時は相手も同様にこちらの責任だと思っているものです。そうした場合、相手への変化を期待しても、変化が起こることは難しいので、いわゆるデッドロックのような状態になってしまいます。

相手に変わってもらいたい場合、一番良いのは自分自身が変わることです。「返報性の原理」という法則の中に「好意の返報性」というものがあります。これは、相手から好意を受けると自分も好意を返したくなると感じる心理のことです。まずは相手がやってほしいことをこちらがする。そうして関係性を構築していくことで、相手もこちらがやりたいことを受け入れてくれるようになります。

これは個人においても組織においても同様で、自分たちの組織の外に影響範囲を広げていきたい場合は、まずは自分たちが変わり、そこで実績や信頼を作っていくことが重要です。遠回りに見えるかもしれませんが、相手を変えるという自分ではコントロールできない事象よりも、自分の変化というコントローラブルな事に取り組むほうが精神的に健全ですし、結果的に早く変えていけると言うのが、これまでの仕事を通じて私自身が強く実感していることです。


## 4. 忙しくても返事はすぐに返す
信頼を得るためにはマメさが必要です。リモートワークがメインの環境下では、席に来て「ちょっといいですか？」と言う気軽な相談ができません。私はチャットで来る連絡は対面で声をかけられたのと同じくらいの感覚だと捉えていて、どんなに忙しくてもなるべく即レスを心がけています（見逃してしまうことはありますが…）。
また、自分で忙しい忙しいと言っていると、声をかけるハードルが上がってしまうので、「忙しい中すいません」と言われたら「全然余裕です」などと返すように心がけています。また、「スケジュールが空いてればいつ時間取っても大丈夫ですよ」というようにして、相談しやすい雰囲気作りを心がけています。

## おわりに
以上、簡単ではありますが4点ご紹介しました。
心得の根底にあるのは信頼関係をつくることの重要性です。「誰が言うかより何を言うかが大事」とよく言われますが、自身が聞き手の視点としての考えであればとても良い心得だと思います。ですが、話し手としてこの考えを持ってしまうと、聞き手の感情面の配慮ができなかったり、正論を振りかざす論破マンになってしまう危険性があるので、私は話し手の立場で行動する際は、「誰が言うかも大事」と心がけています。

> 大組織の運営には信頼が欠かせないからだ。信頼がなければ、コミュニケーションも成り立たない。なぜなら、人間が触れ合う時に必要なコミュニケーションの量は、信頼の量に反比例するからだ。

*[「Who You Are 君の真の言葉と行動こそが困難を生き抜くチームをつくる」](https://shop.nikkeibp.co.jp/front/commodity/0000/P88810/)  より引用*

上記の**「必要なコミュニケーションの量は、信頼の量に反比例する」**という言葉はコミュニケーションの本質を端的に突いた至言だと思っていて、私はこの言葉をいつも念頭においています。

それでは、本記事が組織を動かしていきたい人のとっての参考になれば幸いです。最後までお読みいただきありがとうございました。
モレの挑戦　一年で韓国語を極める方法論

#前置き
さて自分がこの記事を書こうとしたキッカケから

韓国語は20年前に勉強をしたことがある。当時の韓国と言うのは、今ほどＫＰＯＰなどの認知度が無くて、自分は北朝鮮問題の方から入っていったので、やや北よりかもしれない（だって愛読書が、キムヨンヒの「いま女として」だったから・・・）

そんなことはさておいて、韓国語のベースは少しはある（と勘違いしていたが。。。２０年のブランクはそう簡単には埋まらない）
当時は韓国旅行に４、５回は行ったことがあり、当時のネットカフェでハングル打ちのキーボードを見て、崇高のまなざしで見ていたことを思い出す。

しかしながら、現代を見渡してみても、インターネットでやすやすと国境を乗り越えられる時代にはなったが、やはり言語の壁と言うものは、はるかに高い位置にある。

#韓国語

そんな訳で、ある曲の暗唱からチャレンジし始めたのであるが、いきなり暗礁に乗り上げてしまった（やや、おやじギャグが入ったが、ハングル文字に対するアレルギーがあって、やはり英語と中国語の勉強に比べてかなりハードルが高いように思える）

昨夜もNHKのハングル講座などをテレビで見たのであるが、ハングルの発音と言うのは、そもそも日本語と違って、子音＋母音＋子音になるので、この最後の部分の音節を、如何に認識するように脳の思考回路を変える必要がある。

少し脱線するが、音節と言うのは言語学習にとって、非常に重要な要素であり、ここのルールを間違ってしまうと、そもそも言語認識が変わってしまうのである。（例えば新聞という単語は、日本語では「し、ん、ぶ、ん」と４音節になるが、ハングルでは「신シン、문ムン」の２音節である。）

韓国と言う国は、元々は中国から漢字が文化的には流れてきてはいるが、いつの時代から漢字教育を辞めてしまった。（はっきり言って、国策として、漢字を残していれば、かなり語学学習の役に立ったと思えるし、いまほど日韓の隔たりはなかったのではないかと、個人的には思う）

何故、漢字を使わず、ハングルのみで成り立ったかと言えば、やはり文字と音節の関係があり、新聞＝신문という関係から2文字で成り立ったから、日本語のように文章が長くならずに済んだのである（ちなみに、日本語の場合はそれこそ漢字がなければ、仮名オンリーで文字数が、幼稚園の絵本並みに長くなってしまうのである）

#IT的な思考から
さすがにＩＴ技術も随分と進化したことなので、自分も勉強をやり直すのであれば、少し頭のいいやり方をしたいと考えている。例えば、自分の脳内にTransformerを埋め込んだり、形態素解析するモジュールを組み込んだり・・・ややアンドロイド的な妄想も入るのであるが・・・
（いつぞや、そんなエッジデバイスが人類の相互理解を深めてくれる時代になるに違いない。そんなときは、いちいち言語を通さないかもしれないが）

当面の悩みであるが、韓国語と言うのはやはり言語としての認知度が低いのではないかと思う。証拠としてDEEPLの翻訳機に搭載されなかったりしている（正直に言うと、ハングル文字は表音文字であるので、文字を音声に変換しなければ、意味を理解することが難しい。少なくともA,B,C,D　＝　エー、ビー、シー、ディーのように、ハングル文字がすぐに脳内で音変換できるぐらいの認知が必要である。サイトなどを閲覧するにあたっては、ハングル→　視覚　→　音声　→　読み方　→　意味　→　認知の長いステップが必要となる。

#形態素解析

とりあえず、あーだこーだ言っていても始まらないので、自分としては2022年の一年間を通じてどこまで韓国語を習得できるのかを目標に、言語学習を進めていきたいと考える。

そんななかQiitaで記事を探してみて、やや志の近い方を発見した。
https://qiita.com/mnmandahalf/items/96a753df086b81dd1014

その方のリンクを辿ってみて、ハングルのPythonライブラリと、タグ付け記法についての資料を入手した。
モレのハングル再学習の、何かの入り口になるのではと考えている。

https://docs.google.com/spreadsheets/d/1OGAjUvalBuX-oZvZ_-9tEfYD2gQe7hTGsgUpiiBSXI8/edit#gid=0

#自己紹介
https://motochan1969.hatenablog.com/entry/2019/07/07/082800
MySQLのGIS機能を手軽に試せるように、市町村の境界データを全国分まとめて簡単にロードできるようにしました

# はじめに
本記事は [RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2021](https://qiita.com/advent-calendar/2021/rdbms_gis) の25日目です。

MySQLでは5.7でGIS機能をBoost.GeometryというC++のオープンソースライブラリを採用して再実装し、[MySQL 8.0でも引き続き機能強化](https://www.slideshare.net/yoyamasaki/mysql-80gis)しています。本記事をきっかけにMySQLのGIS機能に興味を持ってもらえると嬉しいです。

# この記事で伝えたいこと
MySQLのGIS機能を手軽に試せるように、MySQLのダンプファイルの形式で以下データを配布しています。

　・e-Statで配布されている境界データのシェープファイルをogr2ogrを使ってMySQLに取り込んで、Spatialインデックスを追加したもの (都道府県別にダンプファイルを提供)

　※配布先は[こちら](https://github.com/YoshiakiYamasaki/MySQL-GIS-Data-Japan-eStat)

[このデータは2019年12月から配布していました](https://qiita.com/yyamasaki1/items/9b4c7955649368d0f097)が、今回はこのデータを[MySQL Shellのロードダンプユーティリティ](https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-utilities-load-dump.html)を使って全国分のデータをまとめて簡単に取り込めるようにしました。

# 背景
MySQLのGIS機能を使う時に、シェープファイル(GIS系のデータフォーマットの一つ)を取り込めると出来ることが広がります。そこで、シェープファイルを取り込む方法について以下の資料やQiitaの記事で解説していますが、事前にGDALをインストールしないといけない、など一般のMySQLユーザーには少し敷居が高くなっています。

　・[MySQL 8.0で強化されたGIS機能と使用事例のご紹介＋α](https://speakerdeck.com/yoshiakiyamasaki/mysql-8-dot-0deqiang-hua-saretagisji-neng-toshi-yong-shi-li-falsegoshao-jie-a)
　・[MySQL 8.0にシェープファイルを取り込んで、MySQL Workbenchでポリゴンの形を確認する](https://qiita.com/yyamasaki1/items/073450d6987565223ba0)

※GDALを使わずにシャープファイルをMySQLにインポートできるshp2mysqlもあります。こちらを使うと、シェープファイルをインポートするためのSQL文が生成できるため、MySQLユーザーの方にはこちらの方が使い易いかもしれません。

　[MySQLにシェープファイルをインポートするツール(shp2mysql)を作った](https://qiita.com/miyauchi/items/b4e810b3becf2cf07e2f)

そこで、まずは手軽にMySQLのGIS機能を試してもらうために、MySQLに取り込んだ状態のデータを配布しています。

# 本文
今日はクリスマスですね。MySQLのGIS機能に興味があるみなさんにクリスマスプレゼントを用意しました。以下の手順を実行するだけで、全国の市町村の境界データ(e-Statで配布されている境界データ)をMySQLに取り込むことが出来ます。

　1．MySQL Shellをインストール
　2．ダンプファイルの取得
　3．ダンプファイルの解凍
　4．geotestデータベースの作成
　5．ダンプファイルのロード

1．MySQL Shellをインストール
[こちら](https://dev.mysql.com/downloads/shell/)からMySQL Shellをダウンロードしてインストールして下さい。

2．ダンプファイルの取得

```
wget https://objectstorage.ap-osaka-1.oraclecloud.com/p/S8m5HhnWYunAWsk7ep5AyU-R5rXI6eU0ihFki_bnXDqHl8YK6Ils0DcbiA0q1JYT/n/axqeeh9mtohj/b/geotest/o/geotest.tar.gz
```
※2031年12月31日までは、上記URLからファイルを取得できる予定です。(免責事項：予告なく上記URLが無効になる可能性があります)

3．ダンプファイルの解凍

```
$ tar -zxvf geotest.tar.gz
```

4．geotestデータベースの作成

```
mysql> create database geotest;
```

5．ダンプファイルのロード　※MySQL Shellから実行

```
MySQL  JS > util.loadDump("/home/opc/geotest", {dryRun: false, ignoreVersion: true})
```

※上記コマンドは/home/opc/ 配下でダンプファイルを解凍した場合の例

# 備考
データを取り込んだ後は、以下の記事の手順で境界データの形などを確認できます。

　[MySQL 8.0にシェープファイルを取り込んで、MySQL Workbenchでポリゴンの形を確認する](https://qiita.com/yyamasaki1/items/073450d6987565223ba0)


# 配布データの出典
政府統計の総合窓口[e-Stat](https://www.e-stat.go.jp/)

※この手順でロードできるデータは、[こちら](https://github.com/YoshiakiYamasaki/MySQL-GIS-Data-Japan-eStat)で案内している手順でe-Statからダウンロードしたシェープファイルを加工したもの。

# 免責事項
本データを用いて行う一切の行為について、いかなる責任も負いません。本データを使用したことによって被った損害、損失に対して一切の責任を負いません。
Python 型変換の基礎を知る

##1.型変換とはなにか？

プログラミングには「データ型」と呼ばれるものがあります。
データ型とは何か？下記が解説の引用です。

> プログラミング言語などが扱うデータをいくつかの種類に分類し、それぞれについて名称や特性、範囲、扱い方、表記法、メモリ上での記録方式などの規約を定めたもの。

つまり、データの種類というものですね。
この内容は「国語」、これは「数学」というように、データにもこれは「長めの文字列」、これは「浮動小数点」というようにカテゴリーが存在します。

この定められたデータの種類をコードの途中で変更することを**「型変換」**と言います。

##2.なぜ型変換をする必要があるのか？

プログラム実行中では、原則同じ型で処理を行うというルールがある。
データ型の異なる文字列型と数値型を連結させると、下記のようなエラーが出るのだ。

```console
TypeError: Can't convert 'int' object to str implicitly
```

直訳すると、「'int'オブジェクトを暗黙的にstrに変換できません」
つまり、異なる型同士の連結はできない。

そのため、この記事では型変換について初学者の方がすぐわかるように事例を用いて説明しようと思う。

## 3.数値型から文字列型へ変換

```python/script.py
price = 2000
print("この技術書の価格は" + price + "円です")
```

これだとうまくいきません。なぜなら文字列型（str）と数値型（int）が混在しているためです。
そこで、「price」を文字列型に揃えてあげましょう。

```python/script.py
price = 2000
print("この技術書の価格は" + str(price) + "円です")
```

```console
この技術書の価格は2000円です
```

これで調整完了ですね！🔥

## ４.文字列型から数値型へ変換

```python/script.py
count = "5" #この段階では「5」という文字列です。
price = 900
allprice = price * int(count)

print(allprice)
```

```console
4500
```

こちらは、文字列型から数値型に修正して四則演算を実行するケースです。

##5.まとめ
型変換は気を使うことも多くて大変ですよね。
ただこれらの知識はWebアプリケーションの構築にも非常に活きてきますし、**使えないとかなりひっかかる部分です。**気に留めつつプログラミング楽しんでいきましょう！🔥