OmniAICreator/Qiita-1.07M huggingface dataset:
Chinachuで録画後にNVENCする

chinachuを使って録画後に、自動でエンコードまでやってくれるスクリプトの紹介です。

NVENCで紹介しますが、ffmpegのパラメータ書き換えれば他のエンコーダでも当然ながら動作可能ですので、録画後の処理のシェルスクリプト見本だと思っといただければ。

NVENCの導入方法については

https://qiita.com/yamakenjp/items/7474f210efd82bb28490

参照のこと。

前提として chinachu がユーザー chinachu のホームディレクトリにインストールされているとする。
具体的には
/home/chinachu/chinachu
に設置してる想定で書いている。

## スクリプト

```shell:/home/chinachu/chinachu/encoded-hevc_nvenc.sh
#!/bin/bash

log=/home/chinachu/chinachu/log/encode
dir_output="/encoded"
outfile=${1%.*}.m4v
mp4file=${outfile##*/}

echo -----start encoding @$(date +%Y/%m/%d/%H:%M:%S)----- >> $log
start=$(date +%s)
echo $1 >> $log

/home/chinachu/bin/ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -c:v mpeg2_cuvid -i "$1" -vf "yadif_cuda,scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -preset slow -rc-lookahead 30 -c:a aac -b:a 192k -r:a 48000 -tag:v hvc1 -f mp4 -aspect 16:9 "${dir_output}/${mp4file}" 2>&1 | grep "^[^f]" >> $log

end=$(date +%s)
diff=$(expr $end - $start)
echo about $(expr $diff / 60) min. >> $log
echo ---finish encoding @$(date +%Y/%m/%d/%H:%M:%S)--- >> $log
echo >> $log

exit 0
```

## 解説
`log=/home/chinachu/chinachu/log/encode`
ログの吐き捨て場を指定してます。あらかじめ

```
touch /home/chinachu/chinachu/log/encode
```
しておくと良いかと。

`dir_output="/encoded"`
エンコードしたファイルの置き場所ですので適宜書き換えてください。

`/home/chinachu/bin/ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -c:v mpeg2_cuvid -i "$1" -vf "yadif_cuda,scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -b_ref_mode 0 -preset slow  -rc-lookahead 30 -c:a aac -b:a 192k -r:a 48000 -tag:v hvc1 -f mp4 -aspect 16:9 "${dir_output}/${mp4file}" 2>&1 | grep "^[^f]" >> $log`

変換部分です。chinachu付属のffmpegを使わず、自分でコンパイルしたffmpegを使用してますので、ffmpegのパスは適宜書き換えてください。

`-b_ref_mode 0`
この部分はH265のBフレーム対応していないGPU用に使用しないよう設定を加えています。使用する場合`1`に変更してください。
使用できるのは7世代以降のNVENCチップ搭載GPUです

https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new

## 最後に
このスクリプトのパスを chinachu の config.json に食わせればおk

```json:/home/chinachu/chinachu/config.json
  "recordedCommand": "/home/chinachu/chinachu/encoded-hevc_nvenc.sh",
```

これで録画後に自動でエンコードしてくれます。
NVENCだとx10ぐらいでエンコしてくれるので30分番組だと5分かからずに終わることも
[初心者・文系必見]文系大学生がAIエンジニアを本気で目指してみた

# はじめに
近畿大学で文系大学生をしているHIDANOです。

2019年4月から10月までTECH：EXPERTに通ってWEBエンジニアになる為の勉強をしていたのですが、途中でWEBエンジニアの将来性に不安を覚え始め8月からPython文法・機械学習基礎・数学をTECH：EXPERTと並行して勉強し始め、最近になってやっとAI関連の技術書に入れたので技術ブログを書くことにしました。

AIエンジニアはプログラミング技術だけでなく数学的知識などの理系的知識も必要になる為、短期間で転身することが難しく敬遠されやすいですが、将来性がすごく良く、まだ終わりが全然見えていない探求しがいのある領域なので、この際自分もまだ大学1年生で時間もあるので全力で目指してみようと思います。よろしくお願いします。


# 学習計画
**Python文法・機械学習基礎・数学の学習**
![logo_square_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/177f0e00-7b6c-9539-8532-79f8cd4aaf6b.png)
Pythonオンライン学習　 **PyQ**
![about-default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/84969056-4519-d5a9-cff7-dc06e61d3354.png)
Udemy　**AIのための数学講座**

**機械学習・深層学習の技術書で学習**
![512ru2i5gyL._SX352_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/ab8c58ec-5f3a-9bde-c65d-e651007b3dec.jpeg)
**ゼロから作るDeepLearning　(現在学習中)**
![51FoSTiivwL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/e639f16c-8031-ddfb-c984-9aa79dbefc10.jpeg)
**ゼロから作るDeepLearning　自然言語処理**
![ダウンロード.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/2184fe14-ce21-ea12-bfdf-9391d7b26362.jpeg)
**[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践**
![51W34ZKKlHL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/1fa5a913-c399-381b-05ea-abdba5492b24.jpeg)
**直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ**
![61zJusXfyjL._SX388_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/23cf60e9-b31d-e8fc-3a48-8b261653da0c.jpeg)
**深層学習**
![picture978-4-87311-745-4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/75f3418c-c4a7-7f56-01ae-6b15079d964c.gif)
**Caffeをはじめよう――深層学習による画像解析の実践**
![51+F0cSeYvL._SX387_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/026a66dd-fc50-dee3-473e-29d18c066924.jpeg)
**つくりながら学ぶ! PyTorchによる発展ディープラーニング**

**kaggle・コンクール・長期インターンでの実戦やポートフォリオの作品制作**

この段階は技術書で機械学習・深層学習を勉強している時から始めてもいいと思っています。
教授などの話を聞くに、プログラミングは学びながら実戦していったほうが良いといっていたので、kaggleのコンペやコンクールへの参加、ポートフォリオの作品制作はすぐ始めたいと思います。
インターンに関してはもう少し実績になるものを作れたら行きたいです。
ER図の自動作成ツールを探していたらPhpStormが素晴らしかった件

## 作成のきっかけ
お仕事でEC-CUBE4系を利用することになり、ドキュメントを作成する必要が出てきたのですが、EC-CUBEの開発ドキュメントをみても3系のものしか見当たらなかったので、自分で作成する必要が出てきました。

## 条件
下記の条件を満たすものを探していました。

- 既存のDBから生成できる
- Mysqlに対応している
- png, jpgなど画像形式で出力できる

## 検討した自動作成ツール
社内で同じような経験をした人がいないかと思い、slackで問いかけみると「SchemaSpyを使う」「PhpStormのdiagram機能を利用する」「SequelProでER図を出力する」「MySQL Workbenchのreverse engineeringという機能を利用する」というありがたき知恵をたくさんいただきました。

## 実際に使ったもの
PhpStormを利用していることと、手っ取り早くできそうだったので「PhpStormのdiagram機能を利用する」を採用することにしました。

## ER図を作成する
私が利用しているPhpStormのバージョンは「PhpStorm 2018.3.4」になります

### PhpStormからDBを接続する
PhpStormでプロジェクトを作成、もしくはプロジェクトを開いている状態で行います。

1.  タブの「View > Tool Windows > Database」でツールウィンドウを開いて、DBアイコンを選択します。
<img width="38" alt="df14d90ff65761a53a66e3592eda1e22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/224dd3ef-ffb4-dc30-df33-0c83a531a7c6.png" style="margin:0;">

2. ＋アイコンから「MYSQL」を選択し、ER図を生成したいDB情報を入力します。
<img width="35" alt="2a795ffe3aae895031097e287fead386.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/127c1625-361e-7470-249a-907c0ef41b41.png">

3. 接続できたらDatabaseのツールウィンドウから追加したDBを選択し、右クリックをし「Diagram > Show Visual」を選択します。
<img width="559" alt="05f7de096084e1bb3ea7191e6a6ebc9e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/4c6cde2b-e169-8183-5ec3-b63f18af41ef.png">

4. すると、自動生成してくれて簡単にER図が完成します！（早っ...）
しかもレイアウトまで変更でき（ER図の空いているところ右クリックして「Layout」を選択）、テーブルを選択すると自分でごにょごにょ動かすこともできちゃいます！

（縮小しすぎるとわからないので、拡大した一部を切り取っています...）
　例えばこんなのとか
<img width="1046" alt="a06e8964d6c7d7db90238955547cbf64.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/d5ad139f-bb11-7962-70d0-f8baa9467906.png">
こんなのとか
<img width="1065" alt="b930f254bd7685ff404d3d4a204e76bc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/1eea04cd-3ad5-0acd-1565-5d75bcd0955b.png">

こんなのとか
<img width="1071" alt="05b0cf3292bdd88cf3b9a04088c004a3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/b66336f4-1799-cf89-9e65-fc285296d175.png">

色を変えたい...というかたはPhpStormのColorSchemeを変更すると白にもできちゃいます。
（上記のテーマはSolarized Dark, こちらはSolarized Light）
<img width="798" alt="110a8441d7d621af0f9a8f46695f431c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/3820baf6-c576-f27f-9273-d6db43156861.png">

画像として出力したい時は下記のアイコンからの「Export to file」でpng形式で出力可能です。JetBrainsさますばらし！:clap:
<img width="25" alt="a665108aa2cf52e05908344c0edb772b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267342/de23ecfa-ca2b-e332-fd7c-4e820d39ad6d.png">

## さいごに
少しでもみなさまのドキュメント作成のお役に立てればと思います。
足をお運びいただきありがとうございました。
## ※おまけ
テーブル定義書作成についてはこちらを利用させていただきました。
[GASを使って、スプレッドシートにMySQLのテーブル定義書を作成する](https://qiita.com/kumanizm/items/7bf5019e41ecdbcf5197)
MacOS CatalinaでPuppeteer動かない時の対処

SideCarに釣られてアップデートしたMacOS CatalinaでPuppeteerがErrorを出したのでメモ

```shell
(node:69317) UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed.
```

## 対処法

`node_modules/puppeteer/`内のpackage.jsonのchromium_revisionを699988に変えた上で
`node_modules/puppeteer/`内で`yarn run install` or `npm run install` してください

```shell
$ vim node_modules/puppeteer/package.json
```

11行目辺り

```node_modules/puppeteer/package.json
  "puppeteer": {
    "chromium_revision": "699988"
  },
```

```shell
$ cd node_modules/puppeteer
$ yarn run install
  or
$ npm run install
```

## 参考
 - [Support MacOS Catalina #5020](https://github.com/GoogleChrome/puppeteer/issues/5020)
dockerでwordpressを簡単に構築する

WordPressの環境が必要になったので、さくっと作って見ました。
予めdocker-composeが使える前提です

##①適当なディレクトリを用意する
```
mkdir wordpress_test
cd wordpress_test
```

##②docker-compose.ymlを作成
```
vi docker-compose.yml
```
以下の通りに設定します。注意としては、mysqlのバージョンを新しくするとwordpressでは動かないので、5.7程度のものを指定するようにしてください

```
version: '3.3'
 
services:
   wordpress:
     image: wordpress:latest
     depends_on:
       - db
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - ./html:/var/www/html
 
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
       
volumes:
    db_data:
```

##③コンテナを起動します

```
docker-compose up -d
```

##④サイトにアクセス
ブラウザで「localhost:8000/」にアクセスしましょう
wordpressの初期設定画面が表示されるはずなので、言語を選択し、サイト名やアイパスを設定しましょう。


以上です！とっても簡単でした。
[漏洞预警]泛微ecology OA系统WorkflowCenterTreeData(限oracle数据库)接口注入漏洞

### 漏洞描述
泛微e-cology OA系统的`WorkflowCenterTreeData`接口存在接口注入漏洞.漏洞是由于其内置sql语句拼接不严,导致存在sql注入漏洞.利用该漏洞可以读取数据库以及服务器敏感信息.
### 漏洞威胁等级
高危
### 影响范围
暂不清楚
### 漏洞复现
使用payload进行验证

![使用payload进行验证](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c598394b-4358-a2e0-7089-c6ebdf84127b.png)
### 修复建议
等待泛微官方进行修复
https://www.weaver.com.cn/
### Reference
https://mp.weixin.qq.com/s?__biz=MzU3ODM2NTg2Mg==&mid=2247487240&idx=1&sn=c674666a323d3d8b8c088ac4a2de1fa8&chksm=fd773fc1ca00b6d78ea4a4bcd233a536afecb6f530aa9c346cb45496b99a457d1cb6baf4c842&scene=0&xtrack=1#rd
2019-10-10 WRF v4.1.1 > ./real.exe > FATAL CALLED FROM FILE:  <stdin>  LINE:    1284 > num_metgrid_levelsが31層と34層で不整合を起こしている > FNLファイルのサイズが小さかった

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。

### 概要

- CentOS 7.7 + WRF v4.1.1のシステムを構築中
- WPSの動作はできたが、WRFの./real.exeにてエラーが出ている

### エラーメッセージ

以下はrsl.out.0000の後ろにあるエラー。

```
 metgrid input_wrf.F first_date_input = 2019-06-20_00:00:00
 metgrid input_wrf.F first_date_nml = 2019-06-14_00:00:00
d01 2019-06-20_00:00:00  input_wrf.F: SIZE MISMATCH:  namelist num_metgrid_levels           =           34
d01 2019-06-20_00:00:00  input_wrf.F: SIZE MISMATCH:  input file BOTTOM-TOP_GRID_DIMENSION  =           31
d01 2019-06-20_00:00:00 ---- ERROR: Mismatch between namelist and input file dimensions
NOTE:       1 namelist vs input data inconsistencies found.
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    1284
NOTE:  Please check and reset these options
-------------------------------------------
```

### 気づいた点

使用しているmet_emファイルのnum_metgrid_levelsの定義が異なる。

```
$ ncdump  -c met_em.d02.2019-06-20_00\:00\:00.nc | grep num_metgrid
	num_metgrid_levels = 31 ;
	float PRES(Time, num_metgrid_levels, south_north, west_east) ;
	float GHT(Time, num_metgrid_levels, south_north, west_east) ;
	float RH(Time, num_metgrid_levels, south_north, west_east) ;
	float VV(Time, num_metgrid_levels, south_north_stag, west_east) ;
	float UU(Time, num_metgrid_levels, south_north, west_east_stag) ;
	float TT(Time, num_metgrid_levels, south_north, west_east) ;
```

- met_em.d02.2019-06-14_00\:00\:00
    - 34
- met_em.d02.2019-06-20_00\:00\:00
    - 31

この差異がエラーを起こしているようだ。

### 関連

- [2019-10-10 WRF > GFS v15.1 > num_metgrid_levelsが32層から34層に変更 > 2019年6月12日以降のデータ](https://qiita.com/7of9/items/def94573b7b77d78287a)


### 気づいた点 (2019-10-11)

処理を2019-06-21も含めるようにしたところ、2019-06-20のデータだけ層数が31となっていることが分かった。

```
num_metgrid_levels 

2019-06-14: 34
...
2019-06-19: 34
2019-06-20: 31
2019-06-21: 34
```

入力データ（気象データ）の層数がおかしいのかもしれない。

### 原因 (2019-10-11)

WPSの処理で使うFNLデータを見たところ、一つだけサイズが小さい。
FNLのデータ処理に問題があるのだろう。データ提供先に連絡することになる。

```
fnl_20190619_18_00.grib2: 25526103
fnl_20190620_00_00.grib2: 16400384
fnl_20190620_06_00.grib2: 25653679
fnl_20190620_12_00.grib2: 25512848
```

### データ再取得 (2019-10-11)

データを再取得したところ、fnl_20190620_00_00.grib2のサイズは25465911となった。

WPSで再処理をして、WRFのreal.exeを実行したところ、正常に終了した。
Your Favorite Data Visualization Conferences List


1. [IEEE VIS: IEEE Visualization](http://ieeevis.org) [twitter] (https://twitter.com/ieeevis) including IEEE Visual Analytics Science and Technology (VAST), IEEE Information Visualization (InfoVis), IEEE Scientific Visualization (SciVis)
1. [IEEE Pacific Visualization](http://vis.tju.edu.cn/pvis2020/)
1. [VisInPractice](https://visinpractice.github.io/) 
1. [SIGGRAPH](https://s2019.siggraph.org/) [twitter](https://twitter.com/siggraph)
1. [SIGGRAPH ASIA](https://sa2019.siggraph.org/) [twitter](https://twitter.com/SIGGRAPHAsia)
1. [SIGGRAPH ASIA](https://sa2019.siggraph.org/) [twitter](https://twitter.com/SIGGRAPHAsia)
1. [Euro Vis](https://www.eurovis.org/) [twitter](https://twitter.com/eurovis2019)
1. [International Conference Information Visualization](http://www.graphicslink.co.uk/IV2018/)
1. [Conference for Visualization of Information](https://www.see-conference.org/en/)
1. [International Cartographic Conference](https://www.icc2019.org/)
1. [Infographics Conference](https://www.infographicscongres.eu/) [twitter](https://twitter.com/InfographicsNL)
1. [IVAPP: International Conference on Information Visualization Theory and Applications](http://www.ivapp.visigrapp.org/)
1. [VIZBI: VISUALIZING BIOLOGICAL DATA](http://www.vizbi.org/)
1. [Open Visualization Conference](https://odsc.com/california/open-visualization-conference/)
1. [DSSV2019 (Data Science, Statistics and Visualisation)](https://iasc-isi.org/dssv2019/)
1. [eyeofestival](http://eyeofestival.com/) [twitter](https://twitter.com/eyeofestival)
1. [Information+](http://informationplusconference.com/) [twitter](https://twitter.com/infoplusconf)
1. [Malofiej](http://www.malofiejgraphics.com/) [twitter](https://twitter.com/malofiej)
1. [Open VIS Conference by emlyon](http://www.openvisconf.com/) [twitter](https://twitter.com/OpenVisConf)
1. [Tapestry Conference by Tableau](http://www.tapestryconference.com/) [twitter](https://twitter.com/tapestryconf)
1. [PLOTCON by plotly](https://moderndata.plot.ly/category/plotcon/) [twitter](https://twitter.com/plotlygraphs)
1. [Visualized](https://vimeo.com/visualized) [twitter](https://twitter.com/visualized)
1. [EVA London](http://www.eva-london.org/) [twitter](https://twitter.com/EVAlondonConf)
1. [Encode](https://encode.info/)  [twitter](https://twitter.com/encode_info)
1. [S-H-O-W](https://graphichuntersshow.nl/) [twitter](https://twitter.com/GraphicHunters)
1. [viSFest](http://visfest.com/) [twitter](https://twitter.com/d3unconf)
1. [Visualizing Knowledge](https://vizknowledge.aalto.fi/) [twitter](https://twitter.com/vizknowledge)
1. [reference 1](https://depictdatastudio.com/complete-listing-data-visualization-conferences/), [2] (https://smallmultiples.com.au/articles/data-visualisation-conferences-in-2019-and-2020/), [3](https://www.datalabsagency.com/2019/03/28/your-guide-to-data-viz-conferences-in-2019-datalabs/)
Unity2019でVSCodeが開かない問題

# UnityでVSCodeの希望の場所が開かない。。。。
ネットに見当たらなかったのでここに記します。

環境
Unity 2019.2.4f1
VSCode 1.39.0

Window -> Package Manager -> Visual Studio Code Editor
をversion 1.12.0　にアップデートすると改善しました。
Capybaraをつかったfeature(system) specのBasic認証を雑に突破する

## 概要
あまりユースケースはないと思いますが、
Capybara使ったfeature(system) specで、Basic認証を突破したい時。
基本的にspecは本番環境のテストなので、Basic認証は使わないという本質的なことは置いておいてとりあえずテストしたいんだってときの雑実装です。


## コード


### Feature spec

```ruby

RSpec.feature 'hoge' do

  describe 'GET /hoge' do
    let(:url) { '/hoge'}

    background do
      name='name'
      password='password'
      Capybara.app_host = "http://#{name}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}"
    end

    it 'success' do
      visit(url)
      expect(page).to have_content('fuga')
    end
  end
end
```

shared_contextにする場合はこんな感じ

```ruby

shared_context 'basic_authentication' do
  background do
    name='name'
    password='password'
    Capybara.app_host = "http://#{name}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}"
  end
end

RSpec.feature 'hoge' do
  describe 'GET /hoge' do
    let(:url) { '/hoge'}

    include_context 'basic_authentication'
    it 'success' do
      visit(url)
      expect(page).to have_content('fuga')
    end
  end
end
```
FBX SDK PythonでASCII形式のFBXを出力する

# バイナリではなくASCII形式でFBXを出力したい
Python版FBX SDKでFBXファイルを出力する際に、デフォルトだとバイナリ形式になりますが、ASCII形式で出力したかったので、その方法を調査しました。

サンプルプロジェクトはこちらに置きました。
https://github.com/segurvita/fbx_sdk_python_sample



# C++版の公式サンプルコードを参考にした

C++版の公式ドキュメントのこちらのページに、ASCII形式でシーンを保存するサンプルコードを見つけました。
[Autodesk FBX 2017 HELP / C++ API Reference / Examples / Common/Common.cxx](https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref__common_2_common_8cxx_example_html)

該当箇所のC++コードを抜粋します。

```c++
int lFormatIndex, lFormatCount = pManager->GetIOPluginRegistry()->GetWriterFormatCount();
for (lFormatIndex=0; lFormatIndex<lFormatCount; lFormatIndex++)
{
    if (pManager->GetIOPluginRegistry()->WriterIsFBX(lFormatIndex))
    {
        FbxString lDesc =pManager->GetIOPluginRegistry()->GetWriterFormatDescription(lFormatIndex);
        const char *lASCII = "ascii";
        if (lDesc.Find(lASCII)>=0)
        {
            pFileFormat = lFormatIndex;
            break;
        }
    }
}
```

こちらのコードを読む限り、ASCII形式を表すフォーマットIDというものを、ファイルを出力する際に指定すればよさそうなのですが、そのフォーマットIDはどうやら定数として定義されておらず、動的に検索する必要があるみたいです。（もっと効率よい方法があればどなたか教えてください）



# フォーマットIDを検索する処理

公式のC++コードを参考にしてPythonのコードを書きます。

ASCII形式のフォーマットIDを検索する処理は以下のような関数にしました。

```python
def get_ascii_format_id(manager):
    # 書き出し可能なフォーマットの数だけループ
    for formatId in range(manager.GetIOPluginRegistry().GetWriterFormatCount()):
        # FBX形式かどうか
        if manager.GetIOPluginRegistry().WriterIsFBX(formatId):
            # ASCII形式かどうか
            if "ascii" in manager.GetIOPluginRegistry().GetWriterFormatDescription(formatId):
                # フォーマットIDを返却
                return formatId
        
    # ASCII形式が見つからない場合はautoを返却
    return -1    
```


引数の `manager` には `FbxManager.Create()` で生成したインスタンスを入力してください。
戻り値はASCII形式のフォーマットIDです。



# ファイルを出力する処理

以下のように `exporter.Initialize()` の第二引数に、先ほどの関数を指定します。

```python
exporter = FbxExporter.Create(manager, "")
exporter.Initialize("./test.fbx", get_ascii_format_id(manager))
exporter.Export(scene)
```

これで無事にASCII形式のFBXを出力することができました。


# さいごに
for文とか、C++とPythonで文法が全然違うので、書いてて面白いです。

サンプルプロジェクトはこちらに設置しました。
https://github.com/segurvita/fbx_sdk_python_sample

また、本記事作成にあたり、以下のサイトを参考にさせていただきました。ありがとうございました。

- [Autodesk FBX 2017 HELP / C++ API Reference / Examples / Common/Common.cxx](https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref__common_2_common_8cxx_example_html)
- [how to fbx sdk export binary fbx file with python](https://stackoverflow.com/questions/35549348/how-to-fbx-sdk-export-binary-fbx-file-with-python)
JavaScript（オブジェクト）

#オブジェクト
値に名前**（プロパティ）**を付けたもの。

イメージ
:boy_tone1:`男の子（オブジェクト）`の`名前（プロパティ）`は`太郎（値）`、`年齢（プロパティ）`は`18（値）歳`
##オブジェクトの作り方
**`{プロパティ１ : 値１ , プロパティ２ : 値2}`**

```js
{name : "太郎" ,age : 18}
```

##オブジェクトを定数に代入
`console.log(定数名)`とすると、オブジェクトがコンソールに出力される。

```js
//
const boy = {name : "太郎" , age : 18};
console.log(boy);
//コンソール
{name : "太郎" , age : 18}
```

##オブジェクトの値を取り出す
:boy_tone1:「太郎」を取り出したい。
`console.log(オブジェクト.取り出すプロパティ);`

```js
//
const boy = {name : "太郎" , age : 18};
console.log(boy.name);
//コンソール
太郎
```

##オブジェクトの値を更新する
`オブジェクト.プロパティ = 更新する値`

```js
//
const boy = {name : "太郎" , age : 18};
boy.age = 20;
```

##オブジェクトを配列する
配列の要素には、０から始まる番号が付けられる**（インデックス番号）**。
`console.log(オブジェクト[番号].プロパティ)`で取り出したい要素の値が取り出せる。

```js
//
const family = [
  {name : "ひろし" , age : 35},
  {name : "さちこ" , age : 29},
  {name : "ゆうた" , age : 5}
];
console.log(family[0].name);
//コンソール
ひろし
```
#配列と繰り返し処理
配列したものを繰り返す。

###問題
以下のように出力しましょう。

```js
//コンソール
名前はひろしです。
年齢は35歳です。

名前はさちこです。
年齢は29歳です。

名前はゆうたです。
年齢は5歳です。
```

###答え

```js
//
const family = [
  {name : "ひろし" , age : 35},
  {name : "さちこ" , age : 29},
  {name : "ゆうた" , age : 5}
];

for(let i = 0;i < family.length;i ++){
  const yamadaFamily = family[i];
  console.log(`名前は${yamadaFamily.name}です。`);
  console.log(`年齢は${yamadaFamily.age}歳です。`)
};
```
【flake8 python】コードチェッカーflake8のインストールから設定まで

# 【flake8 python】コードチェッカーflake8のインストールから設定まで

## flake8に関して
### flake8とは
[Flake8: Your Tool For Style Guide Enforcement — flake8 3.3.0 documentation](http://flake8.pycqa.org/en/latest/)
Pythonのコードチェックツール。
flake8は下記コードチェックツールのラッパーらしいから、flake8を使用することで広範囲のチェックができる。

　- PyFlakes（pyflakes : コードのエラーチェック）
　- pycodestyle（pycodestyle : PEP8に準拠しているかチェック）
　- Ned Batchelder’s McCabe script（mccabe : 循環的複雑度のチェック）　


### install方法

```:command
$ pip install flake8
```

pipのインストールのに関しての参考サイト 
> [Pythonのパッケージ管理システムpipの使い方](https://note.nkmk.me/python-pip-usage/)

### 使い方
#### コードチェックコマンド
flake8 コマンドに続けてファイルまたはディレクトリパスを指定するだけ。

```:command
$ flake8 <対象ファイルへのパス>
```

#### --statistics オプション
最後に統計が出る。エラーの多いものから出るから、対応すべき順番付けにもなりそう。

#### --show-source オプション
ソースコードのどの部分を修正すれば良いかが分かりやすくなる。

#### git commit時に自動実行するよう設定
**Gitで管理してるプロジェクトのルート**で 

```:command
$ flake8 --install-hook git
```

これだけでコミット時にflake8が走るようになる。

**チェックに引っ掛かったファイルはコミットできないようにする**には、以下のように設定を変える。

```:command
$ git config --bool flake8.strict true
```
これでcommit時に自動でflask8が走り、引っかかったやつはcommitできないようになった。

pre-commit設定に関しての参考サイト 
> [蛇ノ目の記 : flake8をGit pre-commit hookした](https://nao-y.hatenablog.com/entry/2017/10/05/004759)

## autopep8に関して
### autopep8とは
インデントや空白行に関する問題を自動解決してくれる。
これをかけた後、flake8をすればいい。
### install方法

```:command
$ pip install autopep8
```

### 使い方

```:command
$ autopep8 -i <対象ファイルへのパス>
```
(注) -iオプションを抜かすと、修正されたコードがterminal上に表示されるだけで元ファイルは修正されない。

## 参考文献
flask8,autopep8の使い方に関しての参考サイト 
> [Sider Blog : flake8を使ってPythonプロジェクトを自動コードレビューする](https://blog-ja.sideci.com/entry/2017/06/20/110000)


vimでのflake8の使い方に関して。vim使い始めたら見たい。 
> [もた日記 : flake8でPythonのコードをチェックする](https://wonderwall.hatenablog.com/entry/2017/02/05/214004)
purescript の事始め

# purescript とは? 
純粋関数型のaltJS系の言語だと思っていただければだいたいあっています。
純粋関数型の言語の代表例にhaskellがあるのだが、
purescript は そのhaskellの影響を結構受けたりしている。

# 環境構築
## 実行環境構築
purescript は altJSなので npm　経由でinstallします。

そしてpurescript をさっくり実行するのに必要なものは主に以下の３つです
* コンパイラ
* パッケージマネージャー
* ビルドツール

というわけでinstall。
`コンパイラ`

```
npm install -g purescript
```
`ビルドツール`

```
npm install -g pulp
```
`パッケージマネージャー`

```
npm install -g bower
```

bowerと見ると凄まじく懐かしさを感じます。
githubのissueだとすでにbowerの代わりがあるのですが、
公式ドキュメントがbowerでの環境構築を乗っけているので、
それに則りましょう。

https://github.com/purescript/purescript/issues/3396

## プロジェクト作成
せっかくビルドツールをインストールしたので、
それを使ってプロジェクトを作成しましょう。

というわけで、空のディレクトリを作ってその下で以下のコマンドを実行

```
pulp init
```

すると、一通りのファイルが作られるので、
コンパイル&実行をしてみる。

```
pulp run
```

これで、最後に
Hello sailor!

と表示されれば成功。

# さいごに

よきpurescriptライフを
毎時の累積データ、毎日の累積データを作る

分析関数の `PARTITION` の使い方を忘れないため

## 毎時の累積データ

```
SELECT
    date 
    ,hour
    ,sum(amount) as amount
    ,sum(sum(amount)) OVER (PARTITION BY date ORDER BY hour ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as _sum   
FROM
    (
    SELECT
        DATETIME_TRUNC(a.datetime, hour) as hour
        ,a.date
        ,a.amount
      FROM amount AS a
    ORDER BY hour desc        
    ) as t1
GROUP BY
  hour 
  , date
```

## 毎日の累積データ

```
SELECT
    month 
    ,date
    ,sum(amount) as amount
    ,sum(sum(amount)) OVER (PARTITION BY month ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as _sum   
FROM
    (
    SELECT
        DATE_TRUNC(a.date, MONTH) as month
        ,a.date
        ,a.amount
      FROM amount AS a
    ORDER BY date desc        
    ) as t1
GROUP BY
  date 
  , month
```
超初歩的なソートアルゴリズムのまとめ

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#アルゴリズムとは
アルゴリズムは、コンピュータが行う計算方法のことです。アルゴリズムには、順次処理、分岐処理、繰り返し処理の3つがあります。この3つを組み合わせることで目的の計算を実現します。

#アルゴリズムの例
ここでは、代表的なアルゴリズムとして、ソートアルゴリズムの一部を紹介します。
##バブルソート
隣あう2つの値を比較して、並び替えを行う方法です。

例えば、(61,15,54,34,87,46,23)という配列を昇順に並べたい時は、
1.  61と15を比較、並び替える  (15,61,54,34,87,46,23)
2.  61と54を比較、並び替える  (15,54,61,34,87,46,23)
3.  61と34を比較、並び替える  (15,54,34,61,87,46,23)
4.  61と87を比較、並び替えは行わない
5.  87と46を比較、並び替える  (15,54,34,61,46,87,23)
6.  87と23を比較、並び替える  (15,54,34,61,46,87,23)
7.  **2週目に突入**、15と54を比較、並び替えは行わない
8.  54と34を比較、並び替える  (15,34,54,61,46,87,23)
9.  54と61を比較、並び替えは行わない
10. 61と46を比較、並び替える  (15,34,54,46,61,87,23)
11. 61と87を比較、並び替えは行わない
12. 87と23を比較、並び替える  (15,34,54,46,61,23,87)

以下、同じように比較、入れ替えを昇順(15,23,34,46,54,61,87)になるまで行います。

##選択ソート
配列の最小値(または最大値)をみつけて、並び替えを行う方法です。

(61,15,54,34,87,46,23)という配列を昇順に並べたい時は、
1. 61以外の要素の最小値を探す。最小値は15なので、61と15を入れ替える。これ以後、15は固定する。 (**15**,61,54,34,87,46,23)
2. 15,61以外の要素の最小値を探す。最小値は23なので、61と23を入れ替える。これ以後、23は固定する。 (**15,23**,54,34,87,46,61)
3. 15,23,54以外の要素の最小値を探す。最小値は34なので、54と34を入れ替える。これ以後、34は固定する。 (**15,23,34**,54,87,46,61)
4. 15,23,34,54以外の要素の最小値を探す。最小値は46なので、54と46を入れ替える。これ以後、46は固定する。 (**15,23,34,46**,87,54,61)
5. 15,23,34,46,87以外の要素の最小値を探す。最小値は54なので、87と54を入れ替える。これ以後、54は固定する。 (**15,23,34,46,54**,87,61)
6. 15,23,34,46,54,87以外の要素の最小値を探す。最小値は61なので、87と61を入れ替える。(**15,23,34,46,54,61**,87)　要素の最後まで到達し、ソート完了。

##挿入ソート
ソート済みの配列の間に新たな要素を挿入することで、並び替えを行う方法です。

(61,15,54,34,87,46,23)という配列を昇順に並べたい時は、
1. 61に15を挿入する。61>15なので15が前にくる。 (**15,61**,54,34,87,46,23)
2. 54を61と15の間に挿入する。 (**15,54,61**,34,87,46,23)
3. 34を15と54の間に挿入する。 (**15,34,54,61**,87,46,23)
4. 87を61の後に挿入する。 (**15,34,54,61,87**,46,23)
5. 46を34と54の間に挿入する。 (**15,34,46,54,61,87**,23)
6. 23を15と34の間に挿入する。 (**15,23,34,46,54,61,87**)　要素の最後まで到達し、ソート完了。

##クイックソート
要素の中で基準値(ピボット)を定め、ピボットより大きな値と小さな値の分割を繰り返し、並び替えを行う方法です。

(61,15,54,34,87,46,23)という配列を昇順に並べたい時は、
1. 61をピボットとして、並び替える。 (15,54,34,46,23,**61**,87)
2. 分割された2つの要素の中でピボットを定める。 (**15**,54,34,46,23,*61*,**87**)
3. それぞれの要素の中で入れ替える。 (**15**,54,34,46,23,*61*,**87**)
4. ピボットを定める。 (*15*,**54**,34,46,23,*61*,*87*)
5. 要素の中で入れ替える。 (*15*,34,46,23,**54**,*61*,*87*)
6. ピボットを定める。 (*15*, **34**,46,23,*54*,*61*,*87*)
7. 要素の中で入れ替える。 (*15*,23,**34**,46,*54*,*61*,*87*)
8. 分割されたそれぞれの要素が1つなのでソート完了。 (15,23,34,46,54,61,87)

##マージソート
ソート前の配列を2つに分割する作業を、1つ1つの要素がバラバラになるまで繰り返します。その後、分割と逆の順序でマージ(結合)作業を行います。この際、大きさに応じて並び替えを行います。

(61,15,54,34,87,46,23)という配列を昇順に並べたい時は、
1. 配列を2つに分割する。 (61,15,54,34),(87,46,23)
2. それぞれの配列を2つに分割する。 (61,15),(54,34),(87,46),(23)
3. それぞれの配列を2つに分割する。 (61),(15),(54),(34),(87),(46),(23)
4. 3で分割したものをマージする。 (15,61),(34,54),(46,87),(23)
5. 2で分割したものをマージする。 (15,34,54,61),(23,46,87)
6. 1で分割したものをマージする。 (15,23,34,46,54,61,87) マージが全て終わったので、ソート完了。

#参考URL
[アルゴリズム : アルゴリズムとデータ構造](https://www.codereading.com/algo_and_ds/algo/)
[一週間で身につくアルゴリズムとデータ構造|入門編2日目：アルゴリズムの基本](http://sevendays-study.com/algorithm/pr-day2.html)
form_withで非同期通信(ajax)

https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502
form_withを使用するとき、local: trueをつけないとXMLHTTPRequest通信が行われる。
初期状態がXMLHTTPRequestなので、ajax通信できるやん！！！
ってことで、やってみました。（少し苦労した）

jqueryを使用して実装

```ruby:routes.rb
resources :posts, only: [:new, :create]
```

```ruby:post_controller.rb
class PostsController < ApplicationController
def index;@posts = Post.all;end

def new;@post = Post.new;end

def create
	@post = Post.new(content_params)
	@post.save
end

private
def content_params
	params.require(:post).permit(:content)
end
end
```

```ruby:new.html.erb

<%= form_with model: @post do |f|%>
<%= f.text_field :content %>
<%= f.submit "投稿する",id: "submit"%>
<% end %>
<div id="jquery"></div>
```

```ruby:create.js.erb
$(function(message) {
		let message_content = (<%= @post.content %>)
		var html = `<div class="action">${message_content}</div>`
		$("#jquery").append(html)
	})

```

自分が知ってる方法だと、js fileで submitを押したら、rails のrouting => controllerに行って、jbuilder => js fileのdone functionにいく。という手法だったのですが

form_withを使うと、
controllerからaction名に応じた、js.erb fileが呼び出されるという内容になりました。


create.js.erbには、railsのインスタンスの情報が送られていますし、使い方はhtml.erb fileと同じ<%= @post.id %>のような書き方です。

でも、ajaxでhtmlを作成したいという処理はjqueryで書くので上の書き方になりました。


追記：
validationかけた時、

```ruby:post.rb
validates :content, presence: true
```
contentが空でも、create.js.erbが呼ばれてしまう。
それを防ぐために
`redirect_to root_path if @post.content? == false`
をcontrollerに記述してみました。
Automation Anywhere EnterpriseでMetabotを含むBotを実行するためのロールを作成する


Automation Anywhere Enterprise導入後、初めてサーバーにMetabotをアップロードしたり、
Metabotを使ったBotを実行しようとした際に出来なくて困るケースがあるので、その時の設定のためのメモ。

#手順
###1. Admin権限でControl Roomに入る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/bc1c557e-2219-bebf-001c-167d4cd738ae.png)

※日本語表示へはログイン後、右上の地球のアイコンから変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/8c21003f-7a0e-69ed-9f17-fa75c9894d81.png)

###2. ロールを新たに作成する。
左側のメニューの一番下の「管理」の下にある、ロールをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/37eafba1-d5fb-6e6a-06dd-61a72b0fb561.png)

ロール管理画面のページ右上にある、「ロールを作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/fd93e09d-bd85-1175-f7c4-91c200ef2a2c.png)

以下のような画面が出るので、ロール名を任意に決めて入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/efd602e3-0639-9493-5a67-f13a6984042f.png)


###3. 機能->Botsの以下項目にチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/eee7d2c0-188f-dee6-a461-41e6954f776c.png)

###4. 左のメニューのBOTS -> タブのMETABOT を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/0f116e8f-2731-8f35-396a-c234c1944867.png)


###5. 必要な権限にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/93186f2b-2b10-3b15-10ce-e77b07d46e3c.png)

そして、変更を保存。

###6. 作成したロールを権限をあげたいユーザーに付与する。
ユーザー管理の画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/339824f9-d05d-f7e5-9d38-d86e2b86cce3.png)

権限を付与したいユーザーの右端のメニューから「ユーザーを編集」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/1c3341ab-654a-873a-1bfb-2da50cbc3872.png)

左側のロールの一覧から、作成したロールを選択し、「->」ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/1ae06e5f-59ca-221a-186d-25a6968e7479.png)

右上にある、「変更を保存」ボタンを押し、変更完了。

###7. Done！
これで新しくロールを付与したユーザーがMetabotをControl Roomにアップロードしたり、Metabotを含むBotを実行したりすることが出来ます。
rails dbコマンドでConcurrentMigrationErrorが出た場合の対処法

`rails db` コマンドで次のエラーが出た場合の対処法を整理します。

```
rake aborted
ActiveRecord::ConcurrentMigrationError
Cannot run migrations because another migration process is currently running
```

# 環境

* ruby 2.4.5
* rails 5.2.2
* MySQL 5.7.17

# 経緯

以下コマンドの実行後、処理が固まったので `Control + C` で一旦処理を中断。すると、それ以降の `rails db` コマンドでエラーが出るようになってしまいました。 

```
bundle exec rake db:migrate:reset RAILS_ENV=production
```

```
rake aborted
ActiveRecord::ConcurrentMigrationError
Cannot run migrations because another migration process is currently running
```

# エラー内容

エラー内容は、「現在処理中のマイグレーションがある」というものです。先ほど中断したコマンドが悪さをしていそうですね。

# 対処法

MySQLにログインし、問題となっているマイグレーションプロセスを中断させます。

```
msql -h [YOUR_DB_ADDRESS] -u [YOUR_USER_NAME] -p
```

`SHOW PROCESSLIST` コマンドで処理中のプロセスを一覧表示します。

```sql
USE [YOUR_DB_NAME];
SHOW PROCESSLIST;
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
| Id    | User           | Host               | db           | Command | Time | State                            | Info                                                |
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
| 93968 | YOUR_USER_NAME | xxx.xx.xx.xx:43364 | YOUR_DB_NAME | Sleep   | 1639 |                                  | NULL                                                |
| 93972 | YOUR_USER_NAME | xxx.xx.xx.xx:43422 | YOUR_DB_NAME | Query   | 1187 | Waiting for table metadata lock  | ALTER TABLE `contracts` DROP COLUMN `code`          |
| 93977 | YOUR_USER_NAME | xxx.xx.xx.xx:43430 | YOUR_DB_NAME | Query   | 1095 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME`              |
| 93979 | YOUR_USER_NAME | xxx.xx.xx.xx:43434 | YOUR_DB_NAME | Query   | 1006 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME`              |
| 93983 | YOUR_USER_NAME | xxx.xx.xx.xx:43482 | YOUR_DB_NAME | Query   |    0 | starting                         | SHOW PROCESSLIST                                    |
| 93987 | YOUR_USER_NAME | xxx.xx.xx.xx:43488 | YOUR_DB_NAME | Query   |   80 | Waiting for schema metadata lock | DROP DATABASE IF EXISTS `YOUR_DB_NAME`              |
+-------+---------------------+--------------------+---------------------+---------+------+----------------------------------+-----------------------------------------------------+
```

一番上の「Command: Sleep」になっているプロセスが怪しそうです。`KILL` コマンドで問題のプロセスを強制終了させます。今回の場合は、`ID: 93968` ですね。

```sql
KILL [ID];
```

もう一度 `SHOW PROCESSLIST;` でプロセス一覧を表示し、他のプロセスが全て掃けていればOK。

これで `rails db` コマンドも通ります。

```
bundle exec rake db:migrate RAILS_ENV=production
```

# Reference

* [プロセスを強制終了する - MySQL 逆引きリファレンス](http://mysql.javarou.com/dat/000580.html)
2019-10-10 WRF v4.1.1 > ./real.exe > FATAL CALLED FROM FILE:  <stdin>  LINE:    7259 > 対処: namelist.inputのe_vertを31から35へ変える

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。

### 概要

- CentOS 7.7 + WRF v4.1.1のシステムを構築中
- WPSの動作はできたが、WRFの./real.exeにてエラーが出ている


### エラーメッセージ

以下はrsl.out.0000の後ろにあるエラー。

```
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    7259
Upper levels may be too thick
-------------------------------------------
```

### エラーの発生しているコード場所

`dyn_em/module_initialize_real.f90`の以下の部分のようだ。
dzがdzmaxの1.5倍のしきい値を超えていることが問題、とまでは分かった。

```fortran
         IF ( dz .GT. 1.5*dzmax ) THEN       
...
            CALL wrf_error_fatal3("<stdin>",7259,&'Upper levels may be too thick')
```

上記は関数levels()の実装である。
関数levelsには引数dzmaxがある。関数levels()をコールしている場所は以下のようだ (7172行目)。

```
dyn_em/module_initialize_real.f90:         CALL levels(kte-1, p_top, znw, max_dz, dzbot, dzstretch_s, dzstretch_u, r_d, g )
```

### エラーメッセージ

rsl.out.0000にWarningがあり、その対処方法が記載されていた。

```rsl.out.0000
...
d01 2019-06-14_00:00:00 Warning: Upper levels may be too thick
d01 2019-06-14_00:00:00 You need one of five things:
d01 2019-06-14_00:00:00 1) More eta levels: e_vert
d01 2019-06-14_00:00:00 2) A lower p_top: p_top_requested
d01 2019-06-14_00:00:00 3) Increase the lowest eta thickness: dzbot
d01 2019-06-14_00:00:00 4) Increase the stretching factor: dzstretch_s or dzstretch_u
d01 2019-06-14_00:00:00 5) Increase the maximum allowed thickness: max_dz
d01 2019-06-14_00:00:00 All are namelist options
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    7259
Upper levels may be too thick
-------------------------------------------
```


### 対処

namelist.inputのe_vertを31から35へ変更する。
35というのはWRF v4.1.1のサンプルのnamelist.input.4kmなどに使われている値。
31はWRF v3.7.1のnamelist.inputにて使っていた値。

結果、上記のエラーは発生しなくなった。
GPSカー その16

#概要

GPSで自動走行する、コンテストがある。
実機を作ってみた。
8の字運転してみた。

#動画

https://www.youtube.com/watch?v=CBKuyi1eQcc

https://www.youtube.com/watch?v=hu8R4C_q4Ho

https://www.youtube.com/watch?v=MAElGimGgGA

以上。
[ただのぼやき] React renderer for Alexa APLが欲しい

APLをJSXで書きたいんです・・・
途中までやってみ<small>
て飽き
</small>たので、「こうしたらどう？」とか「これ使えばいいよ」みたいなコメントもらえると嬉しいです。

## Input

```jsx
const Template = ({ name }) => (
  <Sequence>
    <Container>
      <Text
        width="100%"
        textAlign="center"
        style="textStylePrimary2"
        maxLines={2}
        text={`<b>こんにちは。${name}</b>アシスタントのアレクサです。`}
      />
    </Container>
  </Sequence>
)

renderAlexaAPL(<Template name="John" />)
```

## Output

```js
{
  "type": "Sequence",
  "item": {
    "type": "Container",
    "items": [
      {
          "type": "Text",
          "width": "100%",
          "textAlign": "center",
          "style": "textStylePrimary2",
          "maxLines": 2,
          "text": "<b>こんにちは。</b>アシスタントのアレクサです。"
      }
    ]
  }
}
```

## 途中までやろうとしたもの

react-json-rendererでJSONにはできるので、プロパティ変換処理書けばいけそうな気はするんです。

```jsx
import React from 'react';
import { Renderer, convertToJSON } from 'react-json-renderer'
import JSONPretty from 'react-json-pretty';
import logo from './logo.svg';
import Greeding from './test'
import './App.css';

 
// Simple strings will be exported as component types and functions will be executed
const Sequence = 'Sequence'
const Text = 'Text'
const Container = 'Container'
const Welcome = ({ name }) =>
  <Sequence>
    <Container>
      <Text
        width="100%"
        textAlign="center"
        style="textStylePrimary2"
        maxLines={2}
        text="<b>こんにちは。</b>アシスタントのアレクサです。"
      />
    </Container>
  </Sequence>
 
// Returns the JSON payload to provide to the client

const convertToAPLJSON = (json) => {
  const obj = JSON.parse(json)
  switch (obj.type) {
    case 'Sequence': {
      let item = obj.props.children
      if (item.props.children) {
        item = convertToAPLJSON(JSON.stringify(item))
      }
      obj.props.item = item
      delete obj.props.children
    }
    case 'Container': {
      let items = obj.props.children
      if (items && items.props.children) {
        items = convertToAPLJSON(JSON.stringify(items))
      }
      if (!Array.isArray(items)) items = [items]
      obj.props.items = items
      delete obj.props.children
    }
    default:
      break
  }
  const template = {
    type: obj.type,
    ...obj.props
  }
  return template
}
export const createWelcome = (name) => {
  const json = convertToJSON(<Welcome name={name} />)
  return convertToAPLJSON(json)
}

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <div style={{textAlign: 'left'}}>
          <JSONPretty
            id="json-pretty"
            data={createWelcome()}
          />
        </div>
      </header>
    </div>
  );
}

export default App;
```

これだとこんな感じになる。

<img width="883" alt="スクリーンショット 2019-10-10 17.39.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23936/8cf1a6a5-a42d-b53f-dc99-d92dd601d616.png">
statuscakeの注意点メモ

### 要約
- statuscakeのuptime monitoringでslack連携したいときに、先にtestの方を作って、emailだけ設定したcontact groupを作ってそれにひもづける
- contact groupにslackのintegrationを追加
- これだとエラーになった後どれだけ待ってもslackに通知が行かなかった
- メールは通知行った
- testを作り直したら通知行った
- test作成時点でのcontact group設定がずっと保持されるのかな
- 2019/10/10時点
- フリープラン
ActiveAdminのassociation検索カスタムがついにできた

### 要約
- modelのscopeで検索できた！
- ので、応用範囲が広い(これだけ覚えておけばfilterのカスタム全部いけそう)
- ActiveAdminのカスタムはなかなかググりづらい
- associatedなmodelのカラムを文字列で検索する
- 最新情報(2019/10/10時点)
- 基本的に[この記事](http://masacandy.hatenablog.com/entry/2018/07/02/144740)方法でできる
- stringで検索するには

### やり方
[この記事](http://masacandy.hatenablog.com/entry/2018/07/02/144740)の方法でできること確認しました(2019/10/10時点)
ありがとうございます！
具体的には

- 引数一つでmodelにscopeつくる
- `self.ransackable_scopes` の中でそのscopeを渡す
- `admin/model_names`の中で`filter :scope_name, as: :string`

元記事になかった注意点として、
- `as: :string`は[activeadminドキュメント](https://activeadmin.info/3-index-pages.html#index-filters)で書いてある、filterに使いたいクラスを指定する。指定しないとfilter自体が出てこない。(多分scopeだから自動判定できないため)
- activeadmin_addons gemを使ってる人は、`as: :search_select_filter`使うとエラーになる

### なにがうれしいか
activeadminて独自の記法が多くて、ドキュメントされてないことが多いと思っているので、独自記法関係なくscope使ってそのまま検索できる方法がわかったのはうれしい

```ruby
class Post < ApplicationRecord
  has_many :authors, through: :...
  scope :created_by_author_profile_name, -> (author_profile_name) {
    # 検索ロジック
  }

  def self.ransackable_scopes(_auth_object = nil)
    %i(created_by_author_profile_name)
  end
end

ActiveAdmin.register Post do
  filter :created_by_author_profile_name, as: :string
end
```
【Rails】時間表示を日本時間に修正する

##はじめに
``created_at``で時間を表示すると日本時間で表示されなかったので、修正します。

##方法
``config``の``application.rb``ファイルに、以下を記述します。

```application.rb
config.time_zone = 'Tokyo'
```

次に、railsサーバーを再起動します。

このままですと、時間表示の最後に``+0900``と出てくるので修正します。
以下のように、``.strftime("%Y-%m-%d %H:%M")``を追加します。

```
created_at.strftime("%Y-%m-%d %H:%M")
```

**これで、日本時間に修正出来ます！！**
コマンドプロンプトからファイル/フォルダに対して文字列検索する

# 文字列検索
コマンドプロンプトを使用して、ファイルやディレクトリに対して文字列検索を実行する。

## ファイル内検索
###サンプルコマンド

 ```
for /f "usebackq" %i in (`dir /a-d /s /b 検索対象パス`) do find /i "検索文字列" %i
```
### 実行例

 ```
for /f "usebackq" %i in (`dir /a-d /s /b C:\documents\test.txt`) do find /i "TEST" %i
```

## フォルダ内検索
### サンプルコマンド

 ```
findstr /s /i “検索文字列” 検索対象パス
```

### 実行例
フォルダ内への検索は検索結果が大量に出る可能性もあるので、検索結果をテキストへ出力しておくのがおすすめ。

 ```
findstr /s /i “TEST” C:\documents\* > C:\findstr\list.txt
```
MySQL 5.7以前のAUTO_INCREMENTはサーバ再起動すると値が変わるがMySQL 8.0では変わらなくなった

# 結論
タイトルの通り、
**MySQL 5.7以前のAUTO_INCREMENTはサーバ再起動すると値が変わるが
MySQL 8.0では変わらなくなった**
みたいです！

# 公式リファレンスの引用
引用元: https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
>If you specify an AUTO_INCREMENT column for an InnoDB table, the in-memory table object contains a >special counter called the auto-increment counter that is used when assigning new values for the column.

>In MySQL 5.7 and earlier, the auto-increment counter is stored only in main memory, not on disk. To >initialize an auto-increment counter after a server restart, InnoDB would execute the equivalent of the >following statement on the first insert into a table containing an AUTO_INCREMENT column.
>```SELECT MAX(ai_col) FROM table_name FOR UPDATE;```
>In MySQL 8.0, this behavior is changed. The current maximum auto-increment counter value is written to >the redo log each time it changes and is saved to an engine-private system table on each checkpoint. >These changes make the current maximum auto-increment counter value persistent across server restarts.

まとめますと下記の通りかと思います。
## MySQL 5.7以前
- AUTO_INCREMENTはディスクではなく**メインメモリ**にのみ保存される。
- サーバ再起動後にAUTO_INCREMENTの値を初期化する。
- AUTO_INCREMENTの値が**最大値+1**となる。

## MySQL 8.0
- AUTO_INCREMENTの値は、変更されるたびにREDOログに書き込まれ、  
  各チェックポイントで**システムテーブルに保存**される。
- サーバ再起動後も**現在のAUTO_INCREMENT値が維持**される。

# この件について調べたきっかけ
あるテーブルの**AUTO_INCREMENTが突然1になる事象**が発生しました。
リファレンスを参照した結果、サーバ再起動が起因であることがわかりました。

AUTO_INCREMENTが"1"になっていた原因は、
**テーブル内のレコードが0件**となったタイミングで再起動が行われたためでした。

対象のテーブルは一時保存するような使い方をしており、レコード内のデータの状態が変わったら、物理削除しつつ別のテーブルへ移動させるという実装となっていました。

設計が微妙でしたが、AUTO_INCREMENTの値が変動するというのは予想外でしたorz
今すぐ使えるrobocopy

# robocopy

ファイルサーバ等のファイル/フォルダをアクセス権ごとコピーできる便利コマンド。

指定したパスの配下のファイル/フォルダを全コピーできる。
使い方を間違えると一瞬でデータを消すので注意。

特に最近データ移行作業が立て込んでたのでここぞとばかりに使い込んだ実績あるコマンド。

```
C:\>robocopy コピー元 コピー先 /MIR /COPYALL /R:0 /W:0 /LOG+:ログファイル出力先 /NP /NDL /TEE /XJD /XJF /XD "除外ディレクトリ" /XF "除外ファイル" /L
```

## 解説

- `/MIR` 

　ミラーリングオプション。コピー元と先のデータ情報を同期させる。

　元が消えれば先も消え、元が増えれば先が増える、**増減両方の差分コピー**が可能。

　お察しの通り、元と先を間違えればあっという間にデータ損失。

- `/COPYALL` = `/COPY:DATSOU`

　ファイルのどの情報をコピーするか指定する。

　D=データ本体

　A=アーカイブ情報

　T＝タイムスタンプ

　S=セキュリティ(NTFSアクセス権)情報

　O=ファイルオーナー(所有者)情報

　U＝監査設定情報

- `/R:0`

　コピー失敗時、何回リトライするか。

　**デフォルトは100万回**なので失敗すると一生終わらない。

- `/W:0`

　コピー失敗と判断するまでの待ち時間。

　デフォルトは30秒

- `/LOG+:LogfilePath`

　ログ出力オプション。+をつけることで追記になる。

　**ログ出力先ディレクトリは事前に作成しておくこと**。

　ログファイルが作れないよってエラーになる。

- `/NP`

　進捗非表示(No Progress)オプション。進捗率があるとログが非常に見づらい。

- `/NDL`もしくは`/NFL`

　コピー成功時にフォルダ名/ファイル名のログを出力しない。失敗時は出力される。

- `/TEE`

　結果をログファイルとプロンプトの両方に出力する。

- `/XJD`もしくは`/XJF`

　フォルダ/ファイルの接合ポイントを除外する。(ジャンクションリンクとかでググる...)

　**両方とも必ずパラメータに含めること!**

　無限ループに陥る。

- `/XD`もしくは`/XF`

　フォルダ/ファイルを除外する。

- `/L`

　テストモードで実行。実際にコピーはされない。

　まずはこいつで軽くテストしてから本実行するべき。
  
　元と先を間違えるなんてミスは減るはず。

# 付録

batのひな形。

コピーエラーは【エラー 5】が出やすかった。フォルダのAdmin権限が抜かれててコピーできないらしい。(そういうところはお客さんに頼んで手動コピーしてもらったり)
`/B`オプションでどうにかなった気もするけど検証してない。

それと「コピー元とコピー先の認証情報(ユーザ)が違うから入れないよ」的なエラーを以前見た気がする...(コピー元・先で同じユーザ・パスワードでログインのうえ、実行すると良い？)

```robocopy.bat
@echo off

set /p pushKey="データコピーを実行しますか(y/n)？  : %pushKey%"

if "%pushKey%"=="y" (
  robocopy \\10.0.0.1\D$\FILE D:\FILE /MIR /COPYALL /R:0 /W:0 /LOG+:D:\robocopy.log /NP /NDL /TEE /XJD /XJF /XD "System Volume Information" /XD "$RECYCLE.BIN" /XD "ごみ箱" /XF "Cavoltrc.dat"
  echo ----- データコピー終了 -----
)else (
  echo ----- キャンセルしました ----
)

pause
exit
```
telnetをインストールせずにPowerShellからポートの疎通確認をする

# はじめに
- telnetはポートの疎通確認に便利だけど、「Windowsの機能の有効化または無効化」からインストールしないといけないため、環境によっては面倒な時がある。
- PowerShellのコマンドを使うことで、telnetの代わりにポートの疎通確認ができる。

# PowerShellでポート疎通確認

```
Test-NetConnection [ターゲット] -Port [ポート番号]
```
接続しているネットワーク(パブリック/プライベート)をPowerShellで変更する。

# ネットワークの確認
ネットワークの名前(Name)や場所(NetworkCategory)を確認する。

```
Get-NetConnectionProfile
```

## プライベートネットワークに変更
ネットワークの名前を指定して、プライベートネットワークに変更する。

```
Get-NetConnectionProfile | where Name -eq ネットワーク | Set-NetConnectionProfile -NetworkCategory Private
```

## パブリックネットワークに変更
ネットワークの名前を指定して、パブリックネットワークに指定する。

```
Get-NetConnectionProfile | where Name -eq "ネットワーク" | Set-NetConnectionProfile -NetworkCategory Public
```
今日学んだ基本情報の勉強内容(6)　～過去問編～

##過去問で分からなかったことをメモ

 - 相対誤差は誤差÷真値で真値に対する誤差の割合
 
 - アナログ音声を録音する際は連続的なアナログ値を一定の間隔で測定し、連続でない値にする<font color="Red">標本化</font>と標本化で得られたデータをディジタルデータに近似する<font color="Red">量子化</font>、最後に量子化で得られたデータを数値化する<font color="Red">符号化</font>を行う。

 - CPUと入出力装置の間の速度の違いによりCPUの待ち時間を起こさないために、CPUからの出力データを補助記憶装置を介して入出力装置に送る仕組みを<font color="Red">スプーリング</font>という。

 - 文字や静止画など複数の素材をシナリオに沿って編集、配置してコンテンツにすることを<font color="Red">RIA</font>という

 - JAVAでデータベースにアクセスするためのAPIは<font color="Red">JDBC</font>

 - ADSLは一般家庭のアナログ電話回線をそのまま利用し、それまでに使われてなかった周波数帯域を利用することでディジタル通信を行う方法。ADSLでは直交周波数分割という多重方式を用いる。電話音声とデータの分離はスプリッタで行う。

 - インターネットVPNはTLSなどを使ってインターネット上に仮想の専用通信路を構築する技術。暗号化やメッセージ認証コードによって盗聴や改ざんを防ぐことができる。

 - <font color="Red">ルートキット</font>は攻撃者がシステムへ不正侵入した後に侵入した跡を隠蔽したり、再び侵入するためのバックドアを設置するためのソフトウェア群。

 - <font color="Red">プログラミングの標準化</font>は変数や関数名に一定の規則を設けること。

 - <font color="Red">BCP</font>は予期せぬ災害が発生した場合に、最低限の事業を継続し早期に復旧と再開ができるようにする企業が定めた行動計画

 - <font color="Red">コアコンピタンス</font>は他社と差別化することができる企業独自のノウハウや技術。







###参考文献
[基本情報技術者試験ドットコム　過去問道場](https://www.fe-siken.com/fekakomon.php)
Firebase ionic サインアップのエラータイプを判別して、アラート表示を変える

#はじめに
環境は以下の通り
・Firebaseの認証（メールアドレスとパスワード）
・ionic4 

Firebase + ionicの認証をサクッと試してみる場合、[こちら](https://qiita.com/se_fy/items/386418f123fc30c306e6)がオススメ。

サインアップ失敗の原因が文字制限とかの場合は、ReactiveFormsModuleなんかが使える。
[参考](https://www.freakyjolly.com/ionic-4-firebase-login-registration-by-email-and-password/)

#サインアップの時のエラーを判別する

Firebase認証でユーザーを新規登録する時に発生するエラーを、タイプ別に判別して表示したい。

「エラー」と一括りに言ってもエラータイプ（原因）は色々。
**まぁログインの時の方が圧倒的に複雑そうだが・・・**それは置いといて、、、

今回はサインアップの時に限定する！

##エラーコードを取得
サインアップ時もし問題があれば、Firebaseさんからエラーの原因が返ってくる。
**まずはそれを`catch`する**

```typescript
 signup() {
    this.fireauth.auth.createUserWithEmailAndPassword(this.email, this.password)
      .then(res => {
     // サインアップ成功時の処理
        if (res.user) {
          console.log(res.user);
        }
      })
    // サインアップ失敗時の処理
      .catch(error => {
         console.log(error);
      });
  }

```

これでエラー内容をコンソールに出してみる。
もし、エラーの原因が`同じメールアドレスが既に登録されている`場合なら、こんな感じで返ってくる（あくまで2019年10月の時点で）

<img width="764" alt="スクリーンショット 2019-10-10 20.16.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/55aa73a9-49ca-bab6-1ba8-14f4a26b62c5.jpeg">

その中の
`code: "auth/email-already-in-use"`を使うとしよう。

##エラー内容によって出すアラートを変える
`catch`の部分をこうする

```typescript
import { AlertController } from '@ionic/angular';

// 省略

constructor(
    private alertCtrl: AlertController
  ) { }

// 省略

 private showAlert(message: string) {
    this.alertCtrl
      .create({
        header: 'ユーザー登録失敗',
        message: message,
        buttons: ['OK']
      })
      .then(alertEl => alertEl.present());
  }

signup() {
    this.fireauth.auth.createUserWithEmailAndPassword(this.email, this.password)
      .then(res => {
     // サインアップ成功時の処理
        if (res.user) {
          console.log(res.user);
        }
      })
    // サインアップ失敗時の処理
     .catch(error => {
        console.log(error);
        const code = error.code;
        let message = 'エラーが発生しました。もう一度お試しください。。。';
        if (code === 'auth/email-already-in-use') {
          message = 'このメールアドレスは既に登録されています。。。';
        }
        this.showAlert(message);
      });
  }
```

もし`同じメールアドレスが既に登録されている`以外の理由でエラーが起こってるなら、`'このメールアドレスは既に登録されています。。。'`のアラートを出す。

これを応用すればログインの場合も使えるだろう:relieved:
Windows Server 2016 評価期間の延長

# はじめに
- プロジェクト都合でライセンスの手配が遅れて、評価版で構築開始→それでもライセンス手配が間に合わないということがあった。
- 評価版のライセンスが切れると勝手に再起動はじめたりといろいろ不都合がある。
- **そういったときの暫定的な対策として、評価版のライセンス期間を延長することができる。**

# 評価期間の延長手順
コマンドプロンプト(管理者権限)で実行すること。

## ライセンス状態の確認
「時間単位のライセンス認証の有効期限」「残りのWindows猶予期限リセット可能回数」を確認する。

```
slmgr -dlv
```

> 時間単位のライセンス認証の有効期限
>> 評価期間の残り日数

> 残りのWindows猶予期限リセット可能回数
>> 評価期間の延長可能回数

私の環境(評価期間の延長は一度も実行していない)では、以下のように表示された。

- 時間単位のライセンス認証の有効期限:24日
- 残りのWindows猶予期限リセット可能回数:6

## 評価期間の延長を実行
コマンド実行後、再起動する。

```
slmgr -rearm
```
### 再びライセンス状態を確認
再起動後、ライセンスの状態を確認すると以下のようになった。

- 時間単位のライセンス認証の有効期限:180日
- 残りのWindows猶予期限リセット可能回数:5

```
slmgr -dlv
```

# 最後に
- 評価期間の有効期限については、「残り日数+180日」ではなく180日へ変更されるみたい。
- やろうと思えば、インストール時の180日+(180日×6回)で合計1260日間、延長可能。
- 試用期間が切れたあとでも延長できるらしい(未検証)
【Git】initial commitをミスった時に初回のcommitを取り消す方法

あんまり起こり得ないことだが、初回のコミットをを取り消したい状況に出くわした。
普段commitを取り消すならば `git reset --soft HEAD^` などで取り消せるのだが、なぜかそれができなかった。

# 方法
`git update-ref -d HEAD`

で初回のコミットがステージングされた状態に戻る。

# 参考という名の引用
https://suzuken.hatenablog.jp/entry/2014/03/28/100311