OmniAICreator/Qiita-1.07M huggingface dataset:
GatsbyとNodistの相性が悪くてエラーが出る件

NPMのVersion管理にNodistを使用していますが、Gatsbyと相性が悪いです。`npm run develop`を実行すると以下のようなエラーが出てきます。

```powershell
npm WARN lifecycle The node binary used for scripts is C:\Program Files (x86)\Nodist\bin\node.exe but npm is using C:\Prfor the node binary npm was executed with.

> gatsby-starter-hello-world@0.1.0 develop C:\Users\admin\Desktop\wordpress-jamstack
> gatsby develop

child_process.js:127
  p.open(fd);
    ^

Error: EBADF: bad file descriptor, uv_pipe_open
    at Object._forkChild (child_process.js:127:5)
    at setupChildProcessIpcChannel (internal/bootstrap/pre_execution.js:332:30)
    at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:57:3)
    at internal/main/run_main_module.js:7:1 {
  errno: -4083,
  code: 'EBADF',
  syscall: 'uv_pipe_open'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! gatsby-starter-hello-world@0.1.0 develop: `gatsby develop`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the gatsby-starter-hello-world@0.1.0 develop script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\admin\AppData\Roaming\npm-cache\_logs\2020-08-12T01_50_06_524Z-debug.log
```

解決方法は以下の通り、オプションを付けて実行します。

```powershell
npm run develop --scripts-prepend-node-path

# 実行結果
> gatsby-starter-hello-world@0.1.0 develop C:\Users\admin\Desktop\wordpress-jamstack
> gatsby develop

Debugger listening on ws://127.0.0.1:9229/1a06ac9f-8f25-41a7-b9a1-5a4d3194ab93
For help, see: https://nodejs.org/en/docs/inspector
success open and validate gatsby-configs - 0.056s
success load plugins - 2.471s
success onPreInit - 0.007s
info One or more of your plugins have changed since the last time you ran Gatsby. As
a precaution, we're deleting your site's cache to ensure there's no stale data.
success initialize cache - 0.082s
success copy gatsby files - 2.415s
success onPreBootstrap - 0.268s
success createSchemaCustomization - 0.016s
success Checking for changed pages - 0.004s
success source and transform nodes - 5.392s
success building schema - 0.526s
success createPages - 0.005s
success Checking for changed pages - 0.011s
success createPagesStatefully - 0.197s
success update schema - 0.049s
success write out redirect data - 0.006s
success onPostBootstrap - 0.004s
info bootstrap finished - 67.566s
success onPreExtractQueries - 0.003s
success extract queries from components - 0.403s
success write out requires - 0.035s
success run page queries - 0.059s - 2/2 33.65/s
⠀
You can now view gatsby-starter-hello-world in the browser.
⠀
  http://localhost:8000/
⠀
View GraphiQL, an in-browser IDE, to explore your site's data and schema
⠀
  http://localhost:8000/___graphql
⠀
Note that the development build is not optimized.
To create a production build, use gatsby build
⠀
success Building development bundle - 38.953s
```

簡単ですが、以上となります。
【Blender】写真からパースを解析して画像合成 : fSpyの導入とBlenderにインポート

#fSpyで写真からカメラの位置を割り出す
　fSpyは写真からパースと消失点を割り出して、Blenderにインポートできるスタンドアローンのアプリケーション。 Blenderはアドオンを使うことで、セーブデータをそのままインポートして使うことができるのでとても便利。
![2020-07-05_16h17_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/ee2a5c35-ca3e-e6de-6b9d-d3bea7eef005.png)



##fSpyとインポーターの準備
作者の公式サイトからダウンロード。
https://fspy.io/

BlenderにインポートするためのAdd-onの準備。
(Download the latest versionから)
https://github.com/stuffmatic/fSpy-Blender


　アドオンのインストール。プリファレンス → アドオン → インストール → ダウンロードしたZipを選択。必ずチェックを入れる、これで準備OK。
![2020-07-05_14h43_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/28aa2e42-9310-2392-8682-3a95163aae60.png)

##fSpyでパースを割り出す
　ギズモを見ながら消失点が出るように設定していく。Principal PointをFrom 3rd vanishing pointに変更するとZ軸も設定できる。BlenderはZ軸が上方向。
![2020-07-05_14h59_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/65c52df0-0671-8524-29be-bb03b3da7e7c.png)


　3D guideでグリッド等確認ようのオブジェクトを出せる。 画像はxyを確認するグリッドを出しているところ。きっちりパースが割り出せている。Blenderはプロジェクトファイルのまま読み込めるのでこのまま保存。
![2020-07-05_15h02_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/e297561e-48f6-50f3-93f0-c5994de7599b.png)

##Blenderにインポート
インポートからfSpy、保存したプロジェクトファイルを読み込む。
![2020-07-05_15h07_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/97bbdca1-b729-ffb2-3acf-54c53c44da87.png)

　画像とカメラが既に設定されている。このままオブジェクトを作ればカメラが既に設定されているので、パースに合う。
![2020-07-05_15h08_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/11f9a719-58c0-cd29-5294-0a57e2c1d58d.png)
![2020-07-05_15h12_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/2e7846ce-65b0-81c0-06da-f6d222cfd896.png)
![2020-07-05_16h59_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/78f23cd2-7bdd-12ca-4f26-2401f85ccd11.png)


fSpyからBlenderで読み込む一連をキャプチャした映像。
https://youtu.be/SDnsPhwxRsQ
MacでLogicoolのWebカメラを使ったらフリッカーがでた時は

# 要約
Mac (Mac OSX) に Logicool の Webカメラ (HD Pro C920)を使ったら、横縞のフリッカーがでて困っている人向けの対処方法である。なお、ここでの対応方法により、フリッカーはでてないけど、ホワイトバランスを調整したい、輝度やコントラストをいじりたい、という場合にも対応できる。

近年の Mac は標準でカメラ内蔵のため改めてWebカメラ, USBカメラなどを購入して利用する人は恐らくレアかもしれないが、備忘録として載せておく。

Mac Book 利用で、Zoom等テレビ会議システム利用時にLogicoolのWebカメラを外付けして、画角やコントラストやホワイト版ランスをカメラ側で変更したい、といった人向け。

# 環境
私の環境は以下の通り。WebカメラはHD Pro C920 でのみ検証しただけなので、他のLogicool機種でも動くかは不明。対応OSに関してはMojave (10.14) と Catalina (10.15) 。

- Mac : iMac 5K
- OS : Mac OSX 10.14 Mojave
- Web Camera : [Logicool HD Pro C920](https://www.amazon.co.jp/ロジクール-960-000764-LOGICOOL-HDプロ-ウェブカム/dp/B006JH8T3S)

# 対処方法
対処方法はいたって簡単で、Logicool のサイトからカメラ調整用のアプリをダウンロードしてインストール、調整するだけ。

## Camera Settings アプリインストール

1. まず、Logicool の [HD Pro C920 サポートサイト](https://support.logi.com/hc/ja/articles/360024849133--ダウンロード-HD-Pro-ウェブカメラ-C920) へいく。
2. 「全てのダウンロードを表示」して **「Camera Settings」** アプリを探す。（または、ページの "問題を教えてください..." のBOXに、「Camera Settings」と入力して検索しても良い）<img width="1792" alt="200812-0004.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109096/d01cac11-16b2-22ea-9e58-e47f80eee7b4.jpeg">


3. Camera Settings が見つかったらダウンロードしてインストールする

## Camera Settings で調整
1. Camera Settings を起動
2. アンチフリッカーの項目に、「NTSC 60Hz」「PAL 50Hz」があるのでフリッカーが消えるほうを選ぶ<img width="1259" alt="200812-0002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109096/25ed1bf4-0228-4101-506c-a390f4c1fdc4.jpeg">

3. 必要に応じて「高度な」タブを選び、輝度・コントラスト・ホワイトバランスなど調整を行う


# 参考リンク
- [Webカメラ（ロジクール）の色や明るさ、フリッカーを調整できる「Camera Setting」](https://homepage-reborn.com/2019/10/22/webカメラ（ロジクール）の色や明るさ、フリッカ/)
- [Logicool Support](https://support.logi.com/hc/ja)
-
Railsアプリで時間を表示したときの「UTC」を消したい(Railsのタイムゾーンの扱い方)

#プログラミングの勉強日記
2020年8月12日　Progate Lv.226

#目標
　Railsアプリで投稿を更新した時間を表示させるようにした。

```erb:views/posts/index.html.erb
<%= post.updated_at %>
```
投稿を更新した日時を表示することができたが、時間の後ろに『UTC』という文字列が入ってしまっている。
『2020-08-08 11:56:59 UTC』

これを消して、以下のように表示させたい！！
『2020-08-08 11:56:59』

#方法
　RubyにはTime::strftimeメソッドがあり、これで時刻を好きなフォーマットに変更できる。

```erb:views/posts/index.html.erb
 <%= post.updated_at.strftime("%Y-%m-%d %H:%M:%S") %>
```
これでUTCが消され、以下のように表示されるようになった。
『2020-08-08 11:56:59』

| 対応する日時 | フォーマットの指定子 |
|:--:|:--:|
| %Y | 年(year) |
| %m | 月(month) |
| %d | 日にち(day) |
| %H | 時間(hour) |
| %M | 分(minutes) |
| %S | 秒(seconds) |

なので、このように自由にフォーマットを変えることができる。

```erb:views/posts/index.html.erb
 <%# 2020-08-08 11:56 %>
 <%= post.updated_at.strftime("%Y-%m-%d %H:%M") %>

 <%# 2020年 08月 08日 %>
 <%= post.updated_at.strftime("%Y年 %m月 %d日") %>
```

#UTCとは
　UTCは<font color=orange>協定世界時</font>のことである。国や地域ごとに時差があり、タイムゾーンと呼ばれる共通の時間を使うエリアの一帯のことを指す。日本で使われている時間は日本標準時(JST)と呼ばれている。
　RailsではデフォルトでUTCが設定されている。

#UTCの変更方法

　Railsのタイムゾーンは`config/application.rb`で設定できる。`config.time_zone`と`config.active_record.default_zimezone`の2つの方法でタイムゾーンを変更することができる。
　config.time_zoneは、Time.zone.nowやTime.currentといったTimeWithZoneに対する設定で、"Tokyo"などの都市名を設定することでタイムゾーンを変更できる。
　config.active_record.default_zimezoneはデータベースレコードの読み書きに対する設定で、`:utc`と `:local`のどちらかを設定することができる。`:local`を使用すると、データベースが動作するサーバーのタイムゾーンが使用される。

```ruby:config/application.rb
config.time_zone = "Tokyo"
config.active_record.default_timezone = :local
```

<font color=blue>application.rbを変更した後、Railsサーバーを再起動する！！</font>


#参考文献
[Timeメソッドで出てくるタイムゾーンの UTC とかいう文字を消したい](https://equal-001.hatenablog.com/entry/2013/02/02/005306)
[Railsでタイムゾーンを扱う方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/22191)
PHP ひとこと掲示板

```PHP
<?php

$filename = './bbs.txt';
$date  = date('Y-m-d H:i:s');
$data  = [];
$error = [];
$username = '';
$comment   = '';

if($_SERVER['REQUEST_METHOD'] === 'POST'){
    
    if (isset($_POST['username']) === true) {
        $username = trim($_POST['username']);
    }
    if (isset($_POST['comment']) === true) {
        $comment = trim($_POST['comment']);
    }
    
    if ($username === '') {
        $error[] = '名前を入力してください';
    } else if (mb_strlen($username) > 20 ) {
        $error[] = '名前は20文字以内で発言してください';
    }
    if ($comment === '') {
        $error[] = 'ひとことを入力してください';
    } else if (mb_strlen($comment) > 100) {
        $error[] = 'ひとことは100文字までで発言してください';
    }

    if (count($error) === 0) {
        $log = $username . ":\t" . $comment . "\t-" . $date . "\n";
        if (($fp = fopen($filename, 'a')) !== FALSE) {       
            if (fwrite($fp, $log) === FALSE) {              
                $error[] =  'ファイル書き込み失敗:  ' . $filename;
            }
            fclose($fp);
        }
    }
}


if(is_readable($filename) === true){
    if(($fp = fopen($filename,'r')) !== false){
        while(($tmp = fgets($fp)) !== false){
            $data[] = htmlspecialchars($tmp,ENT_QUOTES,'UTF-8');
        }
    }
} else {
    $error[] = 'ファイルがありません';
}

$data = array_reverse($data);

?>
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>ひとこと掲示板</title>
    </head>
    <body>
        <h1>ひとこと掲示板</h1>
<?php if (count($error) > 0) { ?>
    <ul>
    <?php foreach($error as $value) { ?>
        <li><?php print $value; ?></li>
    <?php } ?>
    </ul>
<?php } ?>
        <form method="post">
            名前:<input type="text" name="username">
            ひとこと:<input type="text" name="comment">
            <input type="submit" value="送信">
        </form>
        <ul>
<?php foreach ($data as $value) { ?>
            <li><?php print $value; ?></li>
<?php } ?>
        </ul>
    </body>
</html>
```
countを便利に使う。
ネット書店をスクレイピング、最も人気があるデータ分析書籍を取得

元記事：https://jp.scrapestorm.com/tutorial/scraping-online-bookstores-and-getting-the-most-popular-data-analysis-books/
データ分析とは、適切な統計分析方法で収集された大量のデータを分析し、有用な情報を抽出して結論を形成し、詳細な調査とデータの要約を実施するプロセスを指します。

本文は「honto」、「bookfan」、「Honya Club」、「Amazon」から、データ分析をキーワードとして、データ分析の書籍情報を取得して、最も人気があるデータ分析書籍を推薦します。

データ取得には[Scrapetorm](https://jp.scrapestorm.com/)を利用します。ScrapeStormとは、強い機能を持つ、プログラミングが必要なく、使いやすく人工知能[Webスクレイピングツール](https://jp.scrapestorm.com/)です。違う基盤のユーザーに二つの[スクレイピング](https://jp.scrapestorm.com/)モードを提供し、1-Clickで99％の[Webスクレイピング](https://jp.scrapestorm.com/)を満たします。ScrapeStormにより、大量のWebデータを素早く正確的に取得できます。手動で[データ抽出](https://jp.scrapestorm.com/)が直面するさまざまな問題を完全に解決し、[情報取得](https://jp.scrapestorm.com/)のコストを削減し、作業効率を向上させます。

データ分析の人気書籍は下記のようにご覧ください。
#####1.Kaggleで勝つデータ分析の技術
データサイエンスの認知の高まりとともに、データ分析に関するコンペティションが多数開催されるようになってきました。本書は最も有名なコンペティションプラットフォームであるKaggleKaggleのコンペティションに活用されている機械学習の解説書にはあまり載っていないような手法やテクニックを紹介します。
![1 Kaggleで勝つデータ分析の技術.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/68a21c36-22ca-9260-8a26-81f62532343c.jpeg)
#####2.Excelで学ぶデータ分析本格入門
データ分析をPythonやRでも同様の処理が出来るのでしょうが、Excelの方が身近である場合が多いですので、Excelでのデータ分析も出来たほうがいいには違いないと思います。難しい統計理論は横に置いておいて、本書はビジネスで結果を出したい人のために、Excelのデータ分析機能を徹底的に解説します。またサンプルと使用している約30個の事例は、実際にビジネシーンで登場するものばかりです。
![2 Excelで学ぶデータ分析本格入門.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/920232f2-8534-7134-e085-6afd6428e4e1.jpeg)
#####3.Python実践データ分析100本ノック
この書籍の優れている点は、pythonのどのような技術を使えば適切にデータを処理するのかを知ることができる点です。多くのデータサイエンスの本は概念の説明とそのサンプルコードが記載されている場合が多く、そこで用いるデータは綺麗なものばかりなので、処理の方法を考える習慣が身につきません。こうした現状を打破するためには適していると思います。――購入者のレビュー
![3 python実践データ分析100本ノック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/443f7896-2921-715e-ce2a-1f09b386decb.jpeg)
#####4.データ分析のための数理モデル入門 本質をとらえた分析のために
本書では、さまざまなモデリング手法の基礎的な部分を解説するだけでなく、それらをどのように選択して使用すればよいか、そしてモデリングによって得られる結論について初学者が勘違いしやすい事項について丁寧に解説しています。
主な読者層は、「これからデータ分析を始める」、或いは「ある種の分析で結果を出すことはできるが、それが何をやっていることになるのかがモヤモヤする」といった初学者・初級者です。
通常データ分析の文脈では言及されない（しかし重要な）種々の数理手法についても解説することで、ある程度モデリングに慣れた読者が読んでも楽しめる内容を目指しました。
![4 データ分析のための数理モデル入門　本質をとらえた分析のために.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/0328e177-8abd-3335-79dc-ccc44f4a09d8.jpeg)
#####5.「原因と結果」の経済学―――データから真実を見抜く思考法
データの時代と盛んに言われるようになりましたが、それは利用する者がデータの正しい読み方を身につけていることが前提です。この本を一読しておくことは、データ分析の常識を身につけ、誤った思い込みを正す上で役に立つと思います。データに基づく意思決定を迫られているビジネスパーソンにとっても有益です。――購入者のレビュー
![5 「原因と結果」の経済学―――データから真実を見抜く思考法.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/6b5e905c-0ebb-58d5-783d-02a84c571e76.jpeg)
機械学習を0から勉強し始めた人のメモ　#1

#AIについて
- 大量のデータを学習することで，モデルを作り，その作ったモデルによって**推定**を行う
- 従来では，人間がノウハウを用いて予測を立てていたが，それに変わることができ，プログラムによる**定量的な判断が可能？**あと自動化
- 何回かブームがあって今第三次AIブームらしい
- 流行りだからこそいろんな企業がこぞって取り入れようとする→AIの仕事が増加
- 機械学習で大切なことは，学習するためのデータをどうやって前処理するかである

---
#教師あり学習
- 例）画像認識で認識したもののを人間が**正解**を教えるもの．だから正解を教える人（教師）の指導能力が低いと，作られるモデルの質も低下する．
- 特徴
    - 教師なし学習よりも高精度であり，教える人（教師）が苦労する
    - 強化学習よりも答えが明確で学習速度が早い
- 学習モデル
    - Neural Network
        - 人間の脳の神経回路を頑張って作ろうとしてできたやつ
        - 性能が高いが，学習が難しいらしい
    - Random Forest
        - 重要項目の特定が可能
        - これは知らんかった
    - Support Vector Machine
        - なんか聞き覚えがある
- 正解の与え方による種類
    - 分類
        - 出したい正解がカテゴリ（ラベル？）
        - ▲が三角であるみたいなことだと思う
    - 回帰
        - 出したい正解が実数で与えられる．
        - 傾向が掴めるため予測などをするときに用いられるのかも？
- モデルの特徴

| モデル名 | 分類or回帰 | 特徴 | 利用分野 |
|:-----:|:-----:|:-----:|:-----:|
|Neural Network|両方|・表現力が高い<br>・データがたくさん必要（パネェ量）|・画像認識<br>・音声認識<br>etc|
|Random Forest|両方|・重要項目をランキングできる<br>・結果が離散的出る|・売り上げ予想<br>・寿命予想<br>基本的に推測系？|
Support Vector Machine|両方|データが多いとそれに比例した時間がかかるらしい|上と同じ|
Lasso Regression|回帰|・単純なデータで使う<br>・重要項目群の特定が可能|単純データ向け<br>・スパムメール判断<br>頑張ればアルゴリズムでかけそうw|
Ridge Regression|回帰|・単純そうなデータだったとりあえずこれやつらしいw|上と同じ
Logistic Regression|分類|単純データ用|上と同じ|

- モデルの選び方
    - 表を見ながら入力されるデータと，欲しい正解の形から取捨選択を行っていく．

---
#教師なし学習
- クラスタリング
    - 近いものをまとめるグルーピングを行う
    - 正解を与えなくても分類が可能であるが，低精度になる
    - 人間の判断で分類ができない時にも有効
- 次元圧縮
    - 高次元(2次元とか？)のデータを圧縮する
    - 種成分分析がよく使われる
- 特徴
    - そもそも教師ありと利用目的が異なることが多い
    - 人間による正解を教えなくていいから楽
    - 基本的にクラスタリングと次元圧縮を使うらしい
- お仕事で使うときの早見表

|技術|要望|手法|
|:-:|:-:|:-:|
|クラスタリング|・ユーザーの性格傾向把握<br>・文章分類<br>etc|・K-means法<br>・ウォード法<br>etc.|
|次元圧縮|・ユーザー性格傾向把握<br>・高次元データの可視化<br>etc.|・PCA<br>・局所性保存射影(意味不w)<br> etc|
|異常検知|・初期不良チェック<br>・製品メンテナンス<br>etc|・One-Class SVM<br>・Change Finder<br>etc|
|推定システム|・おすすめ商品提示<br>・生活サポート<br>etc|強調フィルタリング<br>内容ベースフィルタリング<br>etc|

- クラスタリングのポイント
    - 分類かつ明確な正解がある場合は使わない<br>→教師ありの方が高精度のモデルを作ることができる
    - 分割数が不明の場合はとりあえずX-means法を使ってみる
        - **K-means法**<br>人間が分割数を指定して与えることができる
        - **X-means法**<br>機会が自動的に分割すうを判断してくれる
    - **正規化が必須**<br>単位などでデータの意味が変わらないように調整が必要

#予測モデルの評価
教師あり学習を用いるとして考える→正解の定義が存在しているため，評価がしやすい

- 学習・評価をする際にはデータを3つに分ける
    - 評価のための学習用データ
    - 評価用データ
    - 全く関係のないテストデータ
- 学習したデータを使っての性能評価は厳禁<br>→やっていることはテストでいうカンニングと同じ
- 学習をしすぎるとモデルが複雑になり，本来欲しいモデルを作成できなくなってしまう．<br>→高精度のモデルを作りたいのであれば，用途に合わせた適切なモデルの複雑度を決定する必要がある．
- **交差検証**<br>学習データとテストデータの組み合わせを変化させて複数回学習・評価することで事実上学習データを増やすことができる
    - データが少ない時に必須となる
    - データが多い時でも有効的に用いることで精度が上がることが見込めるため積極的に行う．
    - データ数n個で最大分割数のn分割での交差検証はLeave-one-out CV(LOOCV)という．
    - 交差検証を行うかどうかは，学習の計算時間によって定める（要するにリソース？）
- **Hold-out法**<br>交差検証のようではなく，学習データとテストデータを完全分離する手法
- モデル複雑度の決定(パラメタチューニング)
    - グリッドサーチ
    - ランダムサーチ
- 精度指標
    - 分類
        - 正解率
        - F値
            - 少ない事例に対してどれだけそれを性格に分類できたかを示す精度指標
            - 多い事例だけでなく，少ない事例も分類できていないと，精度が高い分類モデルとは言えないことを考えている？
            - 計算式はググる
    - 回帰
        - R2乗値（決定係数）
            - 正解値（理論値）と予測値をプロットしてその誤差を考えるもの
            - 最小二乗法の考えと似てるのかも

---
#参考
- [Code Base NAGOYA AI Learn UP](https://codebase.proto-g.co.jp/learnup/ai3)

---
この記事は私が勉強用に作っています．
間違いや古い内容で新しいことなどがあれば，ぜひご指摘いただきたいです．
CentOS8でApacheとTomcatをアッという間に連携させる

#概要
定番ネタ

#環境
- CentOS 8.2
- http 2.4
- tomcat 8.0

#前提
apache, tomcatの設定は終わっているものとします。

- apacheの設定ファイル：/etc/httpd/conf
- tomcatの設定ファイル：/usr/java/tomcat8/conf

#手順
以下設定ファイルを作成。とりあえず全部転送で。

```/etc/httpd/conf.d/proxy.conf
ProxyPass / ajp://localhost:8009/
```

以下を実行（おまじない)

```
/usr/sbin/setsebool -P httpd_can_network_connect 1
```

8080をつぶすため以下コメントオフ

```/usr/java/tomcat8/conf/server.xml
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
```

Tomcat再起動

```
systemctl restart tomcat
```

URL:http://[IPアドレス]/　でtomcatのホーム画面が見えるはずだ。

#参考
- https://confluence.atlassian.com/bitbucketserverkb/permission-denied-in-apache-logs-when-used-as-a-reverse-proxy-790957647.html
StoryBoardでAn internal error occurred. Editing functionality may be limited.が発生した時の対処


## 事象
StoryBoardでAutoLayoutを作成中、
「An internal error occurred. Editing functionality may be limited.」という警告が発生し、青い線のみになった
そのままビルドするとレイアウトが崩れることも発生（必ずではない）

いろいろなサイトの情報から解消を試みるも尽く失敗。。。
ようやく解消できたので祝砲代わりの投稿

## 動作環境
Xcode 11.5
Xcode 11.3.1

## やったこと
自分の環境では解消しなかったが、解消できることもあるらしい

### プロジェクトのクリーン → 解消せず
1. Product > [option] + Clean Build Folder
2. Xcodeを再起動　→ 解消せず

### 制約のエラーを解消 → 解消せず（Xcode 11.3.1で発生した時はこれで解消）
1. Product > [option] + Clean Build Folder
2. Xcodeを閉じる
3. エラーが発生する直前のリビジョンに戻す
4. Xcodeを起動　→ 解消せず

### DerivedDataを削除 → 解消せず
1. Product > [option] + Clean Build Folder
2. Xcodeを閉じる
3. DerivedDataを削除
`rm -rf ~/Library/Developer/Xcode/DerivedData/*`
4. Macの再起動
5. Xcodeを起動　→ 解消せず

### Xcodeのキャッシュを削除 → 解消せず
1. Product > [option] + Clean Build Folder
2. Xcodeを閉じる
3. DerivedDataを削除
`rm -rf ~/Library/Developer/Xcode/DerivedData/*`
4. Xcodeのキャッシュを削除
`rm -rf ~/Library/Caches/com.apple.dt.Xcode/`
5. Macの再起動
6. Xcodeを起動　→ 解消せず

### Xcodeを再インストール → 解消せず
1. Product > [option] + Clean Build Folder
2. Xcodeを閉じる
3. DerivedDataを削除
`rm -rf ~/Library/Developer/Xcode/DerivedData/*`
4. Xcodeのキャッシュを削除
`rm -rf ~/Library/Caches/com.apple.dt.Xcode/`
5. アプリケーションフォルダのXcodeを全てゴミ箱へ！
6. Xcodeを完全アンインストール
7. Xcodeを新しくインストール
8. Xcodeを新規プロジェクトで起動　→　解消せず

## これで解決！！
### /private/tmp に権限を付与 → 解消した！
※Xcodeを再インストールの後で実施したが、おそらく再インストールは必要なかった
1. /private/tmpディレクトリが存在するか確認
`ls -l /private/tmp`
2. /private/tmpディレクトリが存在しなかった場合
`$ sudo mkdir /private/tmp`
3. 所有者を変更
`sudo chown -R $(whoami) /private/tmp`
4. Xcodeを起動　→ 解消！

/private/tmp ディレクトリは存在したが、所有者を変更したら無事エラーが解消された
長い道のりだった。。。

# 参考
https://www.seishin.me/xcode-the-folder-disabled-plist-doesnt-exist/
https://qiita.com/UJIPOID/items/015805c89bddca540129
https://qiita.com/shtnkgm/items/c96a58579ec406194fa8
https://qiita.com/stoneBK7/items/146ee235a46abc9178da
https://qiita.com/y-aimi/items/209e7acce54ee1d38144
https://stackoverflow.com/questions/33456411/ios-project-showing-error-an-internal-error-occurred-editing-functionality-may
カメラ制御（python,OpenCV,VisualStudio)　グレー化してファイル保管

#The Imaging Source社　カメラ　画像処理#
##目的、概要##
接続しているカメラを検出し、画像のリアルタイム表示を行う。
##開発環境##
プログラミング言語：Python
画像処理モジュール：OpenCV
数値計算モジュール：numpy
開発環境ツール：VisualStudio2017

##準備##
tis_OpenCV.py
　カメラ制御のメイン処理（pythonで記述）
tisgrabber.py
　カメラ制御のモジュール集（pythonで記述）

tisgrabber.dll
　カメラ制御のモジュール集（DLL）
Tisgrabber_x64.dll
　カメラ制御のモジュール集（DLL：64bit処理系）
TIS_UDSHL.dll
　カメラ制御のモジュール集（DLL）
TIS_UDSHL_x64.dll
　カメラ制御のモジュール集（DLL：64bit処理系）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/b5cbcd40-8756-f775-7c35-b147e06b0325.png)

##開発手順、実行手順##
１）Visuzlstudio2017の準備

　Visuzlstudio2017で下記手順を実施する。

　１－１）Pythonインタプリターを導入。
　１－２）Opencvを導入。
　１－３）Anacondaを導入（numpyを使用するため）
　１－４）ソースファイル、DLLファイル、などを同じフォルダーに配置

２）新規プロジェクトを作成する。
　２－１）tis_OpenCV.py、tisgrabber.py　をVisuzlstudio2017に読み込む
　２－２）Tis_OpenCV.py　をスタートアップに指定

３）実行（pre）

　→　カメラの映像が認識され、接続したカメラの情報が表示されるので控えておく
　→　ctrl+c　で終了（画像窓の×ボタンは利かない）
　tis_OpenCV.py　L36　を接続カメラの情報に修正

４）実行
　→　カメラの映像が表示される、ctrl+c　で終了（画像窓の×ボタンは利かない）

##ソースコード解説##
Pythonでカメラを制御するサンプルです。
画像処理モジュール（OpenCV）、数値計算モジュール（numpy）、カメラ制御モジュール（Imagingsource）、C言語の型（ctypes）を使います。

L1　~　L7
Pythonで使うモジュールをインポートします。
インポートする際に別名（as）も付けられますので、長い名前のモジュールには短い別名を付けておきます。

```python:
import cv2
import numpy as np
import sys
import os
import datetime
import ctypes as C
import tisgrabber as IC
```

L9
Cameraというオブジェクト（実態）を作成します。

```python:
Camera = IC.TIS_CAM()
```

L10 
カメラを指定して稼働させる。

```python:
Camera.open("DFK AFUX178-M12 2810513")
```

L12
captureというオブジェクトを作成する。

```python:
capture=cv.VideoCapture(0)
```



L14　メイン処理
日付と時刻を表す文字列を含んだファイル名のファイルを作成します。
capture.read()　で静止画を採取します。
それを表示し、日付と時刻を含んだファイルに保存します。

cv2.cvtcolor()　でグレイに変換して表示し保存します。

```python:
try:
    while(True):
        date0=datetime.datetime.now()
        date_str_form=date0.strftime("%Y%m%d_%H%M%S_%f")

        ret,frame=capture.read()
        cv2.imshow("frame_orig",frame)
        cv2.imwrite(date_str_form+".jpg",frame)

        cv2.waitKey(1)
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

        cv2.imshow("frame_gray",gray)
        cv2.imwrite(date_str_form+".jpg",gray)

        cv2.waitKey(1000)
except:
    Camera.StopLive()
    cv2.destroyWindow("Window")
```


以上の繰り返しです。

##ソースプログラム##
```python:gray.py
import cv2
import numpy as np
import sys
import os
import datetime
import ctypes as C
import tisgrabber as IC

Camera = IC.TIS_CAM()
Camera.open("DFK AFUX178-M12 2810513")

capture = cv2.VideoCapture(0)

try:
    while(True):
        date0=datetime.datetime.now()
        date_str_form=date0.strftime("%Y%m%d_%H%M%S_%f")

        ret,frame=capture.read()
        cv2.imshow("frame_orig",frame)
        cv2.imwrite(date_str_form+".jpg",frame)

        cv2.waitKey(1)
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

        cv2.imshow("frame_gray",gray)
        cv2.imwrite(date_str_form+".jpg",gray)

        cv2.waitKey(1000)
except:
    Camera.StopLive()
    cv2.destroyWindow("Window")
```
計算機の初期設定もろもろ (2020.08.12)

# 新しく計算機を設置した時のための備忘録
* 環境
 * OSはcentos7 or ubuntu
 * 基本はcentosだが、必要に応じてubuntu箇所を追記

## 前提
普段はemacs userなのだが、時々viを使わざるを得ない時がある。ので、備忘録に。
```i:``` 書き込みモードで移動し、編集。
```Esc``` でコマンドモードに戻り、```:wq```で編集を終える。

OSのバージョン確認は、リリースバージョンのかかれたファイルがある場合が多い。
centosの場合：　```/etc/centos-release```
ubuntuの場合：　```/etc/lsb-release```

## システムファイルのバックアップ (```/etc``` ```/opt/``` など)
バックアップは、同じディレクトリに取らない。というのも、同様のファイル名を全て見ていく場合があるため。ライセンス認証などはそうだった。なので、別にディレクトリを作って、そこでbackupを取っていく。```/home/kotsuki/sysbkup```というdirectoryを作成し、その上にbkupをしていくことにする。例えば、```/etc/ssh/sshd_config```を編集したい時は、

```bash
sudo cp -p /etc/ssh/sshd_config /home/kotsuki/bkupsys/etc/ssh/sshd_config.20200812
```

といった感じ。



## sudoerの追加 (ここだけはrootで実行) [(参考記事)](https://www.suzu6.net/posts/144-centos-su-user/)
rootでの実行は何かと怖い。ということで、hogeをsudoerにする。そうすると、hogeはsudo ~ でroot権限のコマンドを実行できる。そのためには、```/etc/sudoers```を編集する必要があるのだが、これは```visudo```と叩くだけで編集可能となる。

```bash
root@nozomi:~> visudo
```

下の方に或る```## Allow root to run any commands anywhere```にユーザー追加。

```text
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root       ALL=(ALL)       ALL
kotsuki    ALL=(ALL)       ALL
```

これで、kotsukiさんをsudoerにすることが出来た。

####備考(ubuntuの場合)はとっても簡単。sudoerのあるアカウントで下記を実行。

```bash
sudo gpasswd -a user_name sudo
```

## 最初にやる事
(1) root や ベンダーアカウントのpasswdを変更する。それぞれ、ログインして、```passwd```でupdate。

(2) rootのログインを無効にする。[(参考にした記事)](https://kazmax.zpp.jp/linux/lin_ssh.html)
```/etc/ssh/sshd_config```をバックアップ＆編集。

```text:/etc/ssh/sshd_config
#LoginGraceTime 2m                                                                   |
PermitRootLogin no  ## yes --> no　にupdate
```

## サーバーの名前解決
こちらもバックアップを取った上で、```/etc/hostname``` & ```/etc/hosts```を更新

```text:/etc/hostname
nozomi
```

```text:/etc/hosts
???.???.???.???   localhost localhost.localdomain localhost4 localhost4.localdomain4
::?               localhost localhost.localdomain localhost6 localhost6.localdomain6
aaa.aaa.aaa.aaa nozomi
bbb.bbb.bbb.bbb sakura
```

### 固定IPへの移行 [(参考にした記事)] (https://qiita.com/tukiyo3/items/67182edee4f937e7f707)

下記のファイルの最後の辺りを追加 or 編集。

```text:/etc/sysconfig/network-scripts/ifcfg-eno1
BOOTPROTO=static
DNS1="???.???.???.???"
DNS2="???.???.???.???"
DOMAIN=nozomi.hogehoge.jp
IPADDR=???.???.???.???
NETMASK=???.???.???.???
GATEWAY=???.???.???.???
```

上記設定の上、設定反映。

```bash
sudo systemctl daemon-reload
sudo systemctl restart network
```



## userの追加
下記、一連の操作。

```bash
sudo useradd -m hoge                 # hogeさんを追加。-mでhomeにdirectoryを作る
sudo mkdir -p /data01/hoge           # 解析用のdirectroyを作る
sudo chown -R hoge:hoge /data01/hoge # ファイル権限のupdate
sudo passwd hoge                     # hogeさんのパスワード設定

sudo chgrp -R hoge:hoge /data01/hoge # グループ名のupdate、これは必要に応じて。
```

* パスワード発効後は、ユーザーに連絡し、すぐに変更してもらうこと。
* 各ユーザーは、基本的に鍵認証へ移行してもらう。

## userのUSER-ID & GROUP-ID の統一 (ceontos & ubuntu 共通)
折角NFSマウントしても、user ID が統一されていないと意味がない。まずはマスターのサーバーでIDを確認して

```bash 
less /etc/passwd
less /etc/group
```

非マスターのサーバーのIDを編集。????が変更したいID。

```bash 
sudo usermod -u ???? username
sudo groupmod -g ???? groupname
```
Vimかなーやっぱりww

自分は思わないんだけど周りにVim使いっぽいってよく言われるwww

こないだEmacserに絡まれた時も気が付いたら意識なくて周りのinit.elがpackageだらけでクソ重だったしなwww

ちなみに彼女はnano使ってる（聞いてないw）

 #あなたっぽいEditor

----

ネットで見つけたおすすめ拡張packageを闇雲に入れると、クソ重 ＆ あとでメンテ不能になるのでほどほどにしましょう。

----

[元ネタ](https://twitter.com/search?q=%23%E3%81%82%E3%81%AA%E3%81%9F%E3%81%A3%E3%81%BD%E3%81%84%E3%82%A2%E4%BA%8C%E3%83%A1%E3%82%AD%E3%83%A3%E3%83%A9%E3%80%80%E3%82%AD%E3%83%AA%E3%83%88%E3%81%8B%E3%81%AA%E3%83%BC%E3%82%84%E3%81%A3%E3%81%B1%E3%82%8A%E3%80%80%E6%84%8F%E8%AD%98&src=typed_query)
カメラ制御（python,OpenCV,VisualStudio)　ecode(収縮：白部分が細くなる)

#The Imaging Source社　カメラ　画像処理#
##目的、概要##
接続しているカメラを検出し、画像のリアルタイム表示を行う。
##開発環境##
プログラミング言語：Python
画像処理モジュール：OpenCV
数値計算モジュール：numpy
開発環境ツール：VisualStudio2017

##準備##
tis_OpenCV.py
　カメラ制御のメイン処理（pythonで記述）
tisgrabber.py
　カメラ制御のモジュール集（pythonで記述）

tisgrabber.dll
　カメラ制御のモジュール集（DLL）
Tisgrabber_x64.dll
　カメラ制御のモジュール集（DLL：64bit処理系）
TIS_UDSHL.dll
　カメラ制御のモジュール集（DLL）
TIS_UDSHL_x64.dll
　カメラ制御のモジュール集（DLL：64bit処理系）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/b5cbcd40-8756-f775-7c35-b147e06b0325.png)

##開発手順、実行手順##
１）Visuzlstudio2017の準備

　Visuzlstudio2017で下記手順を実施する。

　１－１）Pythonインタプリターを導入。
　１－２）Opencvを導入。
　１－３）Anacondaを導入（numpyを使用するため）
　１－４）ソースファイル、DLLファイル、などを同じフォルダーに配置

２）新規プロジェクトを作成する。
　２－１）tis_OpenCV.py、tisgrabber.py　をVisuzlstudio2017に読み込む
　２－２）Tis_OpenCV.py　をスタートアップに指定

３）実行（pre）

　→　カメラの映像が認識され、接続したカメラの情報が表示されるので控えておく
　→　ctrl+c　で終了（画像窓の×ボタンは利かない）
　tis_OpenCV.py　L36　を接続カメラの情報に修正

４）実行
　→　カメラの映像が表示される、ctrl+c　で終了（画像窓の×ボタンは利かない）

##ソースコード解説##
Pythonでカメラを制御するサンプルです。
画像処理モジュール（OpenCV）、数値計算モジュール（numpy）、カメラ制御モジュール（Imagingsource）、C言語の型（ctypes）を使います。

L14　~　L17
Pythonで使うモジュールをインポートします。
インポートする際に別名（as）も付けられますので、長い名前のモジュールには短い別名を付けておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/af7cfdca-5f50-1d65-ee7e-476a961f2138.png)
L27
Cameraというオブジェクト（実態）を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/676a469f-6457-7bc2-2bc1-d4a4c1d05a30.png)
L31　~　32 
認識したカメラの品番を配列に格納し、表示する。
ここの処理で接続カメラの情報（シリアルナンバーも）が表示される。
この情報を元に「L37カメラ指定」処理のソースを改変。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/6a16be3e-10fe-d70a-bf2b-62cfd2279e00.png)
L37　カメラの指定　L31　の結果を踏まえてカメラの機種とIDを確認し、ソースを改変する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/2493e2fc-86c2-06d7-26b4-9f5aa5bfa0d4.png)
L39　カメラ接続の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/eef9c645-cbde-27da-cf83-026190450f65.png)
L50 カメラ稼働準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/68e35007-f808-2013-5342-89d2298b10c4.png)
L50　~　L96 カメラの設定を行います。
GetPropertyXXX();　が情報採取、SetPropertyXXX();　が設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/795d5940-3b58-ee88-0981-57dac3e73599.png)
L９7　メイン処理
SnapImage()で、画像を表示します。これは原画像です。
GetImage()で、画像を取り込みます。
cv2.flip(image,0)で、上下反転（原画像は撮像の関係で反転しています。）し、見やすいように修正します。
これはcv2のモジュールです。
cv2.erode(image,np.ones((11, 11)))で、縮小処理（白っぽい部分を細くする）を行います。
ones(11,11)は処理対象（カーネル）の大きさ縦11ピクセルと横11ピクセル
これもcv2のモジュールです。
 cv2.imshow(‘Window’, image)で、映像を表示します。原画像よりも白っぽい部分がやせています。
 cv2.waitKey(10)で、キーボード入力を待ちます。（10msec）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/2b433c53-a3d0-e957-5f10-ef35d57e6c67.png)
L109　デバイスが異常であれば終わるという処理です。L39行目のif文を受けて、
デバイスが異常な場合はその旨表示して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/0b3755b0-99eb-60bd-ed38-fd6a71cc025f.png)

##ソースプログラム##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350513/27129d3c-6b31-193a-9cb2-755f0c7375b0.png)
Pandas-datareaderで株価データを取得するとデータの欠落がある

# はじめに

Pandas-datareaderは、株価データを取得するのに重宝するのですが、残念なことにデータの欠落がある場合があります。例えば、Stooqで、「1357NF日経ダブルインバース」を取得すると、

~~~python
import pandas_datareader.stooq as web
from datetime import datetime

start_date = datetime(2016,6,10)
end_date = datetime(2016,6,17)

dr = web.StooqDailyReader('1357.JP', start=start_date, end=end_date)
df = dr.read()
df.to_csv('1357.csv')
~~~

以下のようなcsvファイルが得られます。

~~~csv:1357.csv
Date,Open,High,Low,Close,Volume
2016-06-17,3330,3380,3290,3370,8019724
2016-06-16,3270,3465,3250,3450,10403857
2016-06-14,3220,3315,3185,3270,9910736
2016-06-13,3105,3205,3100,3200,8193928
2016-06-10,2981,3040,2977,3000,4247241
~~~
2016-06-15のデータが欠落しています。ひょっとしたら、この日はシステムトラブルか何かで出来なかったのでは？と思い、Yahoo!Finance.の時系列データを確認すると、

![Y1357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483341/5eb5f8e4-141e-6ac9-cd79-58ec419fe33c.png)

Yahoo!Finance.では、その日のデータは存在していました。


nikkei225インデックスを取得してみると、

~~~python
import pandas_datareader.stooq as web
from datetime import datetime

start_date = datetime(2016,6,10)
end_date = datetime(2016,6,17)

dr = web.StooqDailyReader('^NKX', start=start_date, end=end_date)
df = dr.read()
df.to_csv('NIKKEI225.csv')
~~~

欠落はありませんでした。

~~~csv:NIKKEI225.csv
Date,Open,High,Low,Close,Volume
2016-06-17,15631.79,15774.87,15582.94,15599.66,1671723008
2016-06-16,15871.22,15913.08,15395.98,15434.14,1542472064
2016-06-15,15799.07,15997.3,15752.01,15919.58,1367727744
2016-06-14,16001.19,16082.5,15762.09,15859.0,1316932864
2016-06-13,16319.11,16335.38,16019.18,16019.18,1261788416
2016-06-10,16637.51,16643.36,16496.11,16601.36,1549976064
~~~

欠落は銘柄によるようです。

# データ欠落の対策

銘柄によって欠落があったりなかったり。このままでは、株価を比較したりする局面で重大な誤りを生じる恐れがあるので、欠落行を除くなり補間するなりが必要です。
pandasを使用して、２つの表をマージすることにより、欠落行を除くなり補うなりすることができます。

~~~python
import pandas as pd

nikkei225 = pd.read_csv('NIKKEI225.csv').set_index('Date').sort_index()
n1357 = pd.read_csv('1357.csv').set_index('Date').sort_index()

merged = pd.DataFrame.merge(nikkei225, n1357, on='Date', how='inner')
merged2 = pd.DataFrame.merge(nikkei225, n1357, on='Date', how='outer')
~~~

mergedは、欠落行が取り除かれた結果を得ます。

![merged.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483341/974e0c34-ea26-7174-6b14-4ecaf9154bcf.png)

merged2では、欠落行がNaNで埋められます。

![merged2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483341/ec903b09-2662-be31-cd76-eed42fa5613f.png)

欠落行を補間するには、一旦NaNで埋めてから、必要な値に補間したらよいでしょう。

欠落を補う方法は、以下の記事で解説されています。
https://qiita.com/kazama0119/items/c838114f8687518ba58e
データ分析で株価予測をしてみた
[PHP]Twitter APIを試して少しまとめた

#今回の題

Twitter APIの審査がようやく通ったので記事にします。いつか誰かの参考になれば幸いです。

余談ですが、グーグル翻訳の精度が上がっていて申請の際にめちゃくちゃ助かりました。
アカウントの申請に関しては本記事では省きますが、以下のリンクから行えます。

申請は[こちら](https://developer.twitter.com/)から

#ライブラリの準備
・abraham/twitteroauthのインストール
[abraham/twitteroauth]
(https://github.com/abraham/twitteroauth)はstar数4000近い人気のライブラリです。
少ないコード、シンプルな記述で簡単にTwitter APIを操作できます。

```terminal
$ composer require abraham/twitteroauth
````

#利用準備
申請後の開発者用のページの**Comusumer Key**や**Access Token**が乗っているのでコピーしておいてください。
コードはREADMEに記載されていた[こちらのページ](https://twitteroauth.com/)に従って書いていきます。
適宜、目を通しておくと吉です。

#インスタンスの作成

```php
<?php
require('vendor/autoload.php');

use Abraham\TwitterOAuth\TwitterOAuth;

$consumer_key = 'XXXXXXXXX';
$consumer_key_sercret = 'XXXXXXXXX';
$access_token = 'XXXXXXXXX';
$access_token_secret = 'XXXXXXXXX';

$connection = new TwitterOAuth($consumer_key, $consumer_key_sercret, $access_token, $access_token_secret);

```

composerのオートロードでvendor配下のライブラリをロードし、useを使ってエイリアスを作成。TwitterOAuthオブジェクトのインスタンスを変数$connectionに作成します。
インスタンス作成時の引数は各自の開発者ページに記載のものを利用してください。

#コード
abraham/twitteroauthのメソッドには基本的に、
**第一引数にエンドポイントのパス**
**第二引数にパラメーター**
を渡します。
エンドポイントとパラメーターは以下で確認できます。
[Twitter Developer](https://developer.twitter.com/en/docs/tweets/timelines/overview)
日本語でまとめてくれているサイトがありました。
[Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)

いくつか試してみます。
<hr>

###1.ツイートを検索する

ツイートの検索をするためのエンドポイントは
`https://api.twitter.com/1.1/search/tweets.json`
であることを、[Twitter Developer /Search Tweets](https://developer.twitter.com/en/docs/tweets/timelines/overview)で確認しておきます。
第一引数として使用するのは、`search/tweets`の部分です。

```php
$tweets = $connection->get('search/tweets', ['q' => '駆け出しエンジニア']);
```
パラメーターは連想配列で渡します。
これで、駆け出しエンジニアというワードが含まれたツイートを取得できました。
<hr>

###2.ツイートする

```php
$connection->post('statuses/update', ['status' => 'テスト'];
```
メソッドをpostにするとpostリクエストが出来ます。
アカウントの設定をRead and Writeに設定しておく必要があります。
<hr>

###3.いいねする
いいねをする為には、対象のツイートのidが必要になります。
なので、「1.ツイートを検索する」で書いたような手段でツイートを検索し、そのレスポンスの中に含まれてるツイートのidを取得し指定してください。
 
```php
$connection->post('favorites/create', ['id' => '1292797790070779905'];
```
<hr>

###４.トレンドを検索する
まず、エンドポイントtrends/availableで日本のidを取得します。

```php
$connection->get('trends/available');
```

日本のidは`2345896`でした。
それを今度は、trends/placeのパラメータとして渡します。

```php
$connection->get('trends/place', ['id' => '2345896']);
```

これで今現在の日本のTwitter上でのトレンドが取得できます。
<hr>

###5.APIの制限数を確認する

```php
$connection->get('application/rate_limit_status');
```
APIのリクエストには一定時間内での回数制限があります。
それを取得するためのリクエストです。リクエストの残数などを確認することができます。
パラメーターを指定すればエンドポイントごとに確認することも可能です。

制限回数は以下で確認することができます。
[Twitter Developer Rate limits]
(https://developer.twitter.com/en/docs/basics/rate-limits)

以上！！

#最後に
ここまで読んでいただきありがとうございます。
いつか誰かの参考になれば幸いです。
他にもAPI関連の記事を書いていますので、よければ🙇‍♀️
[[PHP] Zoom APIを利用してミーティングを作成する]
(https://qiita.com/kuzira_vimmer/items/d64f15447cb556eafd3b)
[[PHP] YouTube APIの利用（動画情報の取得）]
(https://qiita.com/kuzira_vimmer/items/dfd9f4febaec11851c06)
[[PHP] Messaging APIを使ったLINEbotで色々試してみる]
(https://qiita.com/kuzira_vimmer/items/ad485a9365c2c23f0465)



#参考
[Twitter Developer]
(https://developer.twitter.com)
[TwitterOAuth]
(https://twitteroauth.com/)
個別のブラウザのみ適用のCSSの書き方


## Edgeのみに適用

```sample.css
@supports (-ms-ime-align: auto) {
  span {
    color:#c00;
  }
}
```

## IEのみに適用

```sample.css
@media all and (-ms-high-contrast: none) {
  span {
    color:#c00;
  }
}
```

## Firefoxのみに適用

```sample.css
@-moz-document url-prefix() {
  span {
    color:#0c0;
  }
}
```

## Chromeのみに適用

```sample.css
@media screen and (-webkit-min-device-pixel-ratio:0) {
  span {
    color:#00c;
  }
}
```

## Safariのみに適用

```sample.css
::-webkit-full-page-media, :future, :root
 span {
  color:#c0c;
}
```
スマホもPCの一員としてファイル同期したいじゃない？Ⅱ


# おはようございます！

[前回の続きです。](https://qiita.com/ykato/items/74642f7bfd0685f97afc)

前回の

「**Syncthing**に似てる気がするけど知ってる？参考になるかもよー見てみたら？？」

にスマホアプリも追従させてみたよ！って記事です。

### やたらスマホ！

要するにHTTP(S)使ってフォルダを同期してくれる君というやつです。
Syncthing以外にもNearby Shareもあるじゃーんってご指摘あるな。
でも、これ強みとしてはバイナリいっこで動くし、マルチOS対応だし、、

あと今あるプロキシとか**HTTPエコシステム**に乗っかれるのがこのツールの推しポイント

# DE・KI・TA

<a href="https://github.com/yasutakatou/andoukie2"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/andoukie2.png" width="460px"></a>

お告げ通り機能追加しましたYO

 - ディレクトリのあるフォルダでも**再帰的に同期**
 - 前回同期時の設定をコンフィグに出して、次回は**それ読んで起動**
 - **同期状況**を表示する
 - **HTTPS**同期をサポート

詳しくはリポジトリ見てくださいな。releaseの.apkをもってくればインスコできます。

**2**が付いてないリポジトリは非互換なので注意です。

# つかいたい！

 - [PC版](https://qiita.com/ykato/items/74642f7bfd0685f97afc)を起動したら、EnterかSpaceを押すとQRコードが表示されます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/bcaa143f-281b-b05f-f0c4-0dbeaef0ca15.png)

 - それをスマホ版アプリで読み取れば同期が開始されます

# UIわからん！

![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/3a734ce9-4396-e86e-b959-a750b8769406.png)

①は同期ゲージです。この数字が何秒毎に同期するかになります。同期間隔が狭いとデカいファイルが転送しきれないのでその点はご注意を

②同期先を変えるときなど。QR Codeをもう一度読みましょう

③保存先フォルダを変更します

④は同期した時にサーバーに無いのに、クライアントにあるファイルを消すモードです。完全同期しておきたい時に使います。

⑤アプリを終了して設定をコンフィグファイルに書き出します

⑥は同期状況とか動作ステータスが色々でます

# あとがき

GUI、転送効率化プロトコル実装、中継サーバーとかsyncthingにある機能で
実装出来てないとこはあるけど、その他の最低限は盛り込めたかな？

Win、Mac以外にもラズパイとか色々持ってる人は便利だと思うので
是非使ってみてくださいな。(そんな人のニッチだよ！ってｗ)
【Linux】FQDNの安全な確認方法について検証してみた(CentOS7)

# はじめに
以前の記事にてこのようなご質問を頂きました。

![スクリーンショット 2020-08-12 8.19.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/f943ab1e-7baa-372f-43c1-f20d5c472b27.png)


**【以前の記事】**
[【Linux】インフラエンジニアの僕が「hostname」コマンドを使わない理由とは？](https://qiita.com/satton6987/items/f50ad3df302290d1f544)

申し訳ございませんが、FQDNまで考慮しておりませんでした。(業務にてFQDNまで確認するシチュエーションがなかったため。)

せっかくなので、検証してみようと思います。

# 今回検証するOS等の情報

```bash:OSバージョン
[root@tspdev01 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@tspdev01 ~]#
```

※事前に`/etc/hostname`をこのようにしました。

```bash:ホスト名
[root@tspdev01 ~]# cat /etc/hostname
tspdev01.example.com
[root@tspdev01 ~]#
```
<br>
**「そもそもrootユーザーでやらないだろ！」**
そのような声もよくわかります。(既存サーバには、基本的にrootログインしません。)

しかし、今回は検証用のためrootユーザーでやってみたいと思います。


# そもそも、「hostname -f」の出力結果とは？

```bash:実行コマンド
hostname -f
```

```bash:実行結果
[root@tspdev01 ~]# hostname -f
tspdev01.example.com
[root@tspdev01 ~]#
```

実行結果を確認すると、FQDN`(tspdev01.example.com)`にて表示されております。


#他のコマンドで試してみる

他のコマンドでFQDNを確認してみたいと思います。

## 質問にあったコマンドにて実行

質問にあったコマンドを実行してみる。

```bash:実行コマンド
echo `uname -n`.`dnsdomainname`
```

実行結果は、こんな感じです。


```bash:実行結果
[root@tspdev01 ~]# echo `uname -n`.`dnsdomainname`
tspdev01.example.com.example.com
[root@tspdev01 ~]#
```

結果、ドメインが2回表示されています。

## 「uname -n」にて実行してみる

こちらのコマンドにて実行

```bash:実行コマンド
uname -n
```

実行結果はこちらになります。

```bash:実行結果
[root@tspdev01 ~]# uname -n
tspdev01.example.com
[root@tspdev01 ~]#
```

FQDNにて表示されました！


# ホスト名を短縮名で表示してみる

## 通常のホスト名の短縮名表示

```bash:実行コマンド
hostname -s
```

実行結果はこちらになります。

```bash:実行結果
[root@tspdev01 ~]# hostname -s
tspdev01
[root@tspdev01 ~]#
```

ホスト名の短縮系のみ表示される。


## awkを使った短縮ホスト名確認方法

```bash:実行コマンド
uname -n | awk -F "." '{print $1}'
```

実行結果はこちらになります。

```bash:実行結果
[root@tspdev01 ~]# uname -n | awk -F "." '{print $1}'
tspdev01
[root@tspdev01 ~]#
```

このように、短縮されたホスト名のみ表示させることができます。
※`tspdev01.example.com`の`.`で区切っています。

**参考記事**
[awkの-Fオプションで区切り文字を指定する方法](https://it-ojisan.tokyo/awk-f/)


# ドメイン名のみ確認

## 通常のドメイン名確認方法

```bash:実行コマンド
hostname -d
```

実行結果は、こちらになります。

```bash:実行結果
[root@tspdev01 ~]# hostname -d
example.com
[root@tspdev01 ~]#
```


## 安全なドメイン名確認方法

```bash:実行コマンド
echo `dnsdomainname`
```

実行結果は、こちらになります。

```bash:実行結果
[root@tspdev01 ~]# echo `dnsdomainname`
example.com
[root@tspdev01 ~]#
```

ドメイン名のみ表示されております。
<br>
# まとめ

**FQDNでの表示方法**

```bash
uname -n
```

**短縮ホスト名のみ表示**

```bash
uname -n | awk -F "." '{print $1}'
```

**ドメイン名のみ表示**

```bash
echo `dnsdomainname`
```
<br>

おそらく、他にも方法があると思われます。
まだまだ勉強不足なので、これからもキャッチアップしていく所存です。
投資効果を正味現在価値で評価する

平成31年春期 午前問題64

投資効果を正味現在価値法で評価するとき，最も投資効果が大きい(又は損失が小さい)シナリオはどれか。ここで，期間は3年間，割引率は5%とし，各シナリオのキャッシュフローは表のとおりとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9492fbe3-317a-244f-e3d9-67c8bf1c88b6.png)


正味現在価値法は、一定期間のキャッシュフローを、時間的変化に割引率を設定して現在価値に換算した上で、キャッシュフローの合計値を求め、その大小で評価する手法です。

例えば割引率5％とすると、1年後に受け取る100万円は「100万円÷1.05」、2年後に受け取る100万円は「100万円÷1.052」、n年後に受け取る100万円は「100万円÷1.05^n」という具合に現在価値に換算します。つまり、同じ100万円でも将来に受け取るほどその価値を低く見積もります。


本問では各シナリオの回収額の合計が同じになっています。回収合計額が同じならば、より早く大きな金額を受け取れた方が現在価値の合計が高くなるはずです。
したがって、3つのシナリオを現在価値が高くなる順に並べると、1年目の割合が高いB、3年間に平準化されているC、最終年の割合が多いAの順になります。

最後に、現在価値が投資額を上回っているかどうかについても検討しなければなりません。「現在価値＜投資額」ならば、投資価値がないと判断されるからです。よって、シナリオBの現在価値を概算で求めます。

　120÷1.05＋80÷1.052＋40÷1.053
≒120÷1.05＋80÷1.1＋40÷1.15
≒114.2＋72.7＋34.7
＝221.6(万円)

少額ではありますが投資額の220万円を上回るので、投資をしない案よりもシナリオBの方が有利と判断されます。



参照：

https://www.ap-siken.com/kakomon/31_haru/q64.html

NPV（正味現在価値）とは何か？その意味と計算式
https://freeway-keiri.com/blog/view/407
半角文字が入れられなくなったときの対処法

###環境
- Ubuntu20.04LTS

##本題
急に半角文字が入れられなくなった。
・CapsLockをｶﾁｬﾘﾝｺする。
・一回再起動する

再起動したら直った。

##まとめ
(PCの)音が出なくなったときとかpcがおかしいときには一回再起動するといい。
ビッグデータの専門人材ーデータサイエンティストのスキルセット

平成31年春期 午前問題63

ビッグデータを有効活用し，事業価値を生み出す役割を担う専門人材であるデータサイエンティストに求められるスキルセットを表の三つの領域と定義した。データサイエンス力に該当する具体的なスキルはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1e94fc50-0407-fa67-5d42-a700ce717347.png)


データサイエンティストとは、ビッグデータなどの大量のデータを、数学的、統計学的、機械学習、データマイニングなどの様々な手法を駆使して分析し、ビジネス上の課題の解決を支援する職種です。近年、ビッグデータの活用が進むに連れて、データサイエンティストへの注目も高まっています。


・扱うデータの規模や機密性を理解した上で，分析システムをオンプレミスで構築するか，クラウドサービスを利用して構築するかを判断し，設計できる。
→分析システムの構築に関する事柄ですから"データエンジニアリング力"


・事業モデル，バリューチェーンなどの特徴や事業の主たる課題を自力で構造的に理解でき，問題の大枠を整理できる。
→事業分析能力に関する事柄ですから"ビジネス力"


・分散処理のフレームワークを用いて，計算処理を複数サーバに分散させる並列処理システムを設計できる。
→分析システムの構築に関する事柄ですから"データエンジニアリング力"


・分析要件に応じ，決定木分析，ニューラルネットワークなどのモデリング手法の選択，モデルへのパラメタの設定，分析結果の評価ができる。
→分析対象及び目的に適した分析手法を選択できる能力ですから"データサイエンス力"



参照：

https://www.ap-siken.com/kakomon/31_haru/q63.html
ruby におけるopensslバージョン情報 OPENSSL_VERSION

$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> puts OpenSSL::OPENSSL_VERSION
OpenSSL 1.1.1g  21 Apr 2020
=> nil
irb(main):003:0>

又は
$ ruby -ropenssl -e "p OpenSSL::OPENSSL_VERSION"
"OpenSSL 1.1.1g  21 Apr 2020"

Mac ruby 2.0.0におけるDEFAULT_CERT_FILEのディレクトリ情報 #Ruby - Qiita
https://qiita.com/shiro_usagi/items/311be28fa29da54d7f11

irb(main):002:0> require 'openssl'
=> true
irb(main):003:0> p OpenSSL::X509::DEFAULT_CERT_FILE
"/usr/local/stow/openssl-111g/ssl/cert.pem"
=> "/usr/local/stow/openssl-111g/ssl/cert.pem"
irb(main):004:0>

又は

$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/usr/local/stow/openssl-111g/ssl/cert.pem"


参考
RubyのOpenSSL::OPENSSL_VERSIONはなぜ定数？ / マスタカの ChangeLog メモ
https://masutaka.net/chalow/2014-04-08-1.html
Amazon EKSのKubernetes ダッシュボードをデプロイする

# はじめに
本記事はAWS環境におけるEKSクラスターのKubernetesダッシュボードをデプロイする手順について記載しています。

オンプレミスのKubernetesに比べて、EKSなどのマネージドサービスを初めて操作する場合は勝手が違います。本記事では[チュートリアル: Kubernetes ダッシュボード (ウェブ UI) のデプロイ](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dashboard-tutorial.html)を基に解説します。

## 準備作業
Kubernetesクラスタを制御するためには、オンプレミスやクラウドに関わらずクライアント側に**kubectl**などのインターフェイスが必要になります。

また、AWS環境におけるEKSのクラスターを制御する場合は、**eksctl** (Amazon EKS での Kubernetes クラスターの作成および管理用のシンプルなコマンドラインユーティリティ) もありますが、本記事では汎用性が高い**kubectl**を利用します。詳細は[AWS マネジメントコンソール の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html)を参照。

本記事の前提条件は以下になります。

- 操作するローカルの端末(Mac）に、AWS コマンドラインインターフェイス（CLI）がインストールされていること
- EKSでKubernetesが既に構築済

### AWS CLI 認証情報の設定
AWSのリソースを操作するためには、AWSの認証情報の設定が必要です。

以下のコマンドを実行し、必要な認証情報を対話的に入力します。
 
`$ aws configure`

```console
AWS Access Key ID [None]: hoge
AWS Secret Access Key [None]: hoge
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

認証情報を設定後に再度`aws configure`コマンドを実行すると、先ほど設定した認証情報が表示されます。

```console
AWS Access Key ID [****************hoge]: 
AWS Secret Access Key [****************hoge]: 
Default region name [ap-northeast-1]: 
Default output format [json]: 
```

### kubectlのインストールと設定
kubectlもコマンドラインツールとして用意されています。

kubectlのバイナリとkubectlのハッシュ値が記載されたファイルをダウンロード します。
`$ curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/kubectl`

`$ curl -o kubectl.sha256 https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/kubectl.sha256`

ダウンロードしたkubectlのバイナリとkubectlのハッシュ値が記載されたファイルを突合し、kubectlのバイナリの正真性が正しいことを確認します。以下はコマンドラインで突合する場合の例になります。

```console
$ kubectl=`openssl sha1 -sha256 kubectl | awk '{print $2}'`
$ kubectl_sha256=`cat kubectl.sha256 | awk '{print $1}'`
$ if [ ${kubectl} = ${kubectl_sha256} ]; then  echo "true"; else echo "false";fi;
true
```

### kubeconfigファイルの作成
kubectlを用いてKubernetesクラスターのMaster（AWSで言うEKS）と通信するためには、接続先クラスや認証情報等を記載した**kubeconfig**が必要です。

以下のコマンドを実行し、kubeconfigファイルを作成します。※＜cluster_name＞はクラスター名を指定
`$ aws eks --region ap-northeast-1 update-kubeconfig --name ＜cluster_name＞`

## ダッシュボードのデプロイ

以下のコマンドを実行し、proxyを起動します。
`$ kubectl proxy`

以下のコマンドを実行し、トークンを抽出します。
`$ kubectl -n kube-system describe secret`

ブラウザを起動し、ダッシュボードエンドポイントにアクセスします。

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login

上記で抽出したトークンを入力し、「サインイン」をクリックします。

![スクリーンショット 2020-08-12 0.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4e8ab2f1-940b-7676-2413-eeab8bb88c38.png)

ダッシュボードにログインできます。

![スクリーンショット 2020-08-12 0.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/759439ec-c02e-68b3-0a2f-cf9ec5b1664d.png)

# おわりに
初見の場合、公式のチュートリアルの内容が分かりずらいと感じたため、一連の作業についてまとめました。
Unity2020.1からuGUIのタッチ判定範囲を拡張できるようになっている

Unity2020.1からuGUIのタッチ判定を拡張できるプロパティ**RaycastPadding**が追加されています。

- 当たり判定サイズを調整するために画像サイズを変更する
- 当たり判定サイズ調整用のGameObjectの追加

といった呪縛から解放されます。

![extension.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/c878ceb5-1399-5bee-f82b-1453db1617bf.gif)

上記の動画のようにボタンの画像外にタッチ判定範囲を拡張する事ができています。
(逆に縮小も可) 


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/cae4c13c-7ca7-4566-d6ad-1676b062e8f6.png" width=450 />

タッチ判定を広げる場合は**RaycastPadding**に負の値を、狭める場合は正の値を代入します。

```cs
_graphic.raycastPadding = new Vector4(-200f, -200f, -200f, -200f);
```
ソースコード的には**Vector4型**で代入するだけです。
UI開発する上で、ボタンの当たり判定サイズを調整するっていうことはよくあるので、その手段が増えたことは、個人的には良いアプデだと思います。

ただColliderと違ってRaycastPaddingはシーンビューでも**可視化されない**ため、設定が分かりづらいという点はアプデに期待です。


Unity1Weekで実務では使用しない最新のUnityバージョンで作業してて気づいた機能でした。普段の業務から離れた開発の重要性を感じた一幕でした。
DynamoDBをPythonからSQLっぽく操作する。

# set up

```sh

pip install dql 
```


# code

```python

import dql
import boto3
import os
table_name=os.environ['TABLE_NAME'] # dynamodb


engine = dql.Engine()
c = engine.connect(
    region=os.environ['AWS_DEFAULT_REGION'],
    access_key=os.environ['AWS_ACCESS_KEY_ID'],
    secret_key=os.environ['AWS_SECRET_ACCESS_KEY'],
    host=os.environ['HOST'],
    port=int(os.environ['PORT']),
    is_secure=False
)
print("--scan--")
results = engine.execute(f"SCAN * FROM {table_name} LIMIT 10")
for item in results:
    print(dict(item))

print("--delete--")
results = engine.execute(f"DELETE FROM {table_name} WHERE tm>=1235 and tm<=1236")

print("--scan--")
results = engine.execute(f"SCAN * FROM {table_name} LIMIT 10")
for item in results:
    print(dict(item))
```
※Selectを利用するためには設定を変更する必要あり。


その他のクエリに関しては下記を参照ください。
https://dql.readthedocs.io/en/latest/topics/queries/index.html

# 備忘録
DQLドキュメント
https://dql.readthedocs.io/en/latest/ref/dql.engine.html

接続の実態は、dynamo3モジュールのDynamoDBConnectionという物
https://pypi.org/project/dynamo3

## 動画とDocker-compose

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/B8WwXqY0ANk/0.jpg)](http://www.youtube.com/watch?v=B8WwXqY0ANk)

動画内で説明している通り、Docker-compose環境も作成しました。
Arduinoなど9V電池駆動

# Vinを持つボードにおいて９V電池駆動を確認
今回は小ネタ。
## Arduino
[本家本元文書](https://www.arduino.cc/en/reference/board)によると、
![Arduinoサイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/83521d82-1328-db9a-6bd0-dd79a1f23a6b.png)
とあり、例えば、[Uno Rev3ボード](https://store.arduino.cc/usa/arduino-uno-rev3)の”TECH SPECS”に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0f1b5bde-e819-2306-e6ef-3f503a4e8aa6.png)
とあるので、9V電池の駆動が可能である。Vinピン位置はつぎのとおり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c10ad761-91c8-b206-d096-9312f6577180.png", width=80%>

## STM32 Nuculeo
こちらも[本家本元文書](https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf)によると、
![Nucleo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c85890a7-76ac-f670-5c66-6b90a0c98adb.png)
とあり、9V電池の駆動が可能。ただし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d08407c2-153b-fdda-2472-762004579eb0.png)
との記述が見つかり、JP5のジャンパーの位置に留意する必要がある（USB供給とは別の位置）。所有するF303REのVinピン位置はつぎのとおり（Arduino互換ピン）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/00f88066-8c16-cd34-6f3b-64da2e497484.png", width=90%>

## バッテリースナップ
利用したバッテリースナップはELPA社製。近所のホームセンターで120円位でGetしたもの。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/abade9c9-1b58-577b-7a41-113ddde6f652.png", width=70%>

## 確認（成功）
### Arduino
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/be808906-1c84-9df4-2ddd-2a8c7aabe261.png", width=80%>
7セグメントディスプレイが点灯（USBケーブル未接続）。

### Nucleo
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d955e437-7771-0ab9-93f3-dede61f8b8b7.jpeg", width=80%>
LEDが点灯。