OmniAICreator/Qiita-1.07M huggingface dataset:
Python入門〜よく使う文法〜

# はじめに

自分の備忘録用。

# 環境

- Python3.9

# 変数

変数について

## 命名規則

- 変数名、関数名
    -  スネークケース（例：my_name）
-  クラス名
    -  パスカルケース（例：SampleClass）

## 変数宣言

Pythonの場合には利用する前に変数宣言は必要ない。
そのため、使いたいタイミングでいきなり代入する。
代入した値によって、変数から参照される値の型が動的に決まる。

文字列を代入した場合
```python
value = "あいうえお"
type(value) 

# 出力結果
<class 'str'>
```

数値を代入した場合
```python
value = 10
type(value)

# 出力結果
<class 'int'>
```

## 文字列型（str）

```python
value = "あいうえお"
type(value) 

# 出力結果
<class 'str'>
```

プレイスホルダーを使ってフォーマットする

```python
value = "{}です".format("田中")
print(value) 

# 出力結果
田中です
```

## リスト型（list）

```python
value = ["apple", "orange", "grape"] 
type(value) 

# 出力結果
<class 'list'> 
```

値の追加
```python
value.append("lemon") 
print(value) 

# 出力結果
['apple', 'orange', 'grape', 'lemon']
```

リスト内包表記

```python
value = [1, 2, 3, 4, 5] 
print(value) 

# 出力結果
[1, 2, 3, 4, 5] 

new_value = [i * 2 for i in value]
print(new_value) 

# 出力結果
[2, 4, 6, 8, 10] 
```

# 日付

日付関係の処理について。
datetimeモジュールを使う。

## 現在日時の取得

```python
import datetime 
print(datetime.datetime.today()) 

# 出力結果
2022-05-03 21:34:00.460758 
```

タイムゾーン指定の場合

```python
import datetime 
tzone = datetime.timezone(offset=datetime.timedelta(hours=9), name="Asia/Tokyo") 
print(datetime.datetime.now(tzone)) 

# 出力結果
2022-05-03 21:47:05.935918+09:00 

print(tzone) 

# 出力結果
Asia/Tokyo 
```

## 現在よりも〇〇時間経過後

```python
import datetime 

tzone = datetime.timezone(offset=datetime.timedelta(hours=9), name="Asia/Tokyo")
now = datetime.datetime.now(tzone) 
print(now) 

# 出力結果
2022-05-03 21:53:00.147739+09:00 

# 30日後の日時
future = now + datetime.timedelta(days=30) 
print(future)

# 出力結果 
2022-06-02 21:53:00.147739+09:00
```

## 日時の比較

```python
import datetime 

tzone = datetime.timezone(offset=datetime.timedelta(hours=9), name="Asia/Tokyo")
now = datetime.datetime.now(tzone) 
future = now + datetime.timedelta(days=30) 

print(now < future) 
# 出力結果
True 

print(now > future) 

# 出力結果
False 
```

## フォーマットして出力

```python
import datetime 
tzone = datetime.timezone(offset=datetime.timedelta(hours=9), name="Asia/Tokyo")
now = datetime.datetime.now(tzone) 

print(now.strftime("%Y-%m-%d %H:%M:%S%z"))

# 出力結果 
2022-05-03 21:53:00+0900
```
WireMockでjsonをPOSTするリクエストとのマッピングルール

wiremock-jre8-standalone-2.31.0.jar で確認。

POSTでリクエストボディがjsonとのマッピングルールの基本的な書き方。一通りの書き方のサンプルは公式ドキュメント https://wiremock.org/docs/request-matching/ にある。

<code>equalToJson</code>にjsonをそのまま書く。

```json
{
  "request": {
    "method": "POST",
    "url": "/post-sample",
    "bodyPatterns" : [ {
      "equalToJson" : {"first":"a", "second":"b", "list":[3,2,1]}
    } ]
  },
...
```

文字列リテラルとして指定も出来る。

```json
...
    "bodyPatterns" : [ {
      "equalToJson" : "{\"first\" : \"a\",\"second\" : \"b\",\"list\" : [ 1, 2, 3 ]}",
...
```

デフォルトはstrictにマッチングするのでこれを弱めるオプションがある。

* ```ignoreArrayOrder``` - 配列の順序が違っていてもマッチングする。
* ```ignoreExtraElements``` - ```equalToJson```に無い要素が合ってもマッチングする。

```json
...
    "bodyPatterns" : [ {
      "equalToJson" : "{\"first\" : \"a\",\"second\" : \"b\",\"list\" : [ 1, 2, 3 ]}",
      "ignoreArrayOrder" : true,
      "ignoreExtraElements" : true
    } ]
  },
...
```

プレースホルダーで任意の値でマッチングできる。以下の```${json-unit.any-string}```は任意の文字列にマッチングする。https://github.com/lukas-krecan/JsonUnit#typeplc にあるとおり、型ごとにいくつか用意されている。

```json
...
    "bodyPatterns" : [ {
      "equalToJson" : {"first":"${json-unit.any-string}", "second":"b", "list":[3,2,1]},
...
```

なお、JSONのマッチングは https://github.com/lukas-krecan/JsonUnit を使ってる、と書いてあるので、もっと複雑な事をしたい場合はこっちのドキュメントとかソースコードとか見るのが良いと思う。

あと、ドキュメントにもある通りJSON Pathでのマッチングもできる。こちらも複雑なマッチングの式が書けるので、場合によって使い分けると思われる。
Your requirements could not be resolved to an installable set of packages. 解決方法

## 経緯
以下の手順でエラーが発生しました。

```
$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

Problem 1
    - asm89/stack-cors is locked to version v2.0.1 and an update of this package was not requested.
    - asm89/stack-cors v2.0.1 requires php ^7.0 -> your php version (8.1.2) does not satisfy that requirement.
   
・
・
・
```

とりあえずメッセージの通り`composer update`してみる。

```
$ composer update
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires php ^7.3 but your php version (8.1.2) does not satisfy that requirement.
```

composer updateもできませんでした。。
どうやら`php7.3が必要なのにphp8を使っていること`が原因のようです！

## 解決
以下のように、`composer.json`に`phpバージョン8`を追加してあげます！
これでphp8でコマンド実行してもエラーは出なくなります!

```
"require": {
    "php": "^7.3",
},

↓ //8.0を追加

"require": {
    "php": "^7.3|^8.0",
},
```

再度composer updateからinstallまで実行

```
$ composer update
・
・
・
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

```
$ composer install
・
・
・
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

これで無事成功です！

## 参考記事

https://stackoverflow.com/questions/65454412/error-root-composer-json-requires-php-7-3-but-your-php-version-8-0-0-does-no
Integration of DDS Security, No.1027 , AUTOSAR R21-11 (29) AP

Integration of DDS Security, No.1027 ,  2021-11

https://www.autosar.org/fileadmin/standards/adaptive/21-11/AUTOSAR_TR_DDSSecurityIntegration.pdf

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|term| Description|
|:--|:--|
|ACL| Access Control List|
|CA| Certificate Authority|
|DDS| Data Distribution Service|
|IAM| Identity and Access Management|
|QoS |Quality of Service|
|URI |Uniform Resource Identifier|
## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|299|the|その|
|2|250|service|奉仕|
|3|225|of|の|
|4|140|dds|Data Distribution Service(短縮名）|
|5|122|interface|界面|
|6|113|to|に|
|7|111|atp|AUTOSAR template profile(短縮名)|
|8|108|draft|下書き|
|9|106|a|一つの|
|10|106|instance|実例|
|11|93|status|状態|
|12|92|tags|札|
|13|89|element|要素|
|14|81|and|と|
|15|71|this|これ|
|16|66|security|安全|
|17|61|topic|話題|
|18|59|autosar|AUTomotive Open System Architecture(短縮名)|
|19|58|for|にとって|
|20|58|value|価値|
|21|54|com|communication(短縮名）|
|22|54|in|の|
|23|53|deployment|展開|
|24|52|document|資料|
|25|48|by|に|
|26|47|name|名前|
|27|44|class|級|
|28|44|takes|かかります|
|29|44|tr_ddssecurityintegration_|tr_ddssecurityintegration_|
|30|42|crypto|暗号|
|31|42|with|と|
|32|41|id|identifier, 識別子(短縮名）|
|33|38|attribute|属性|
|34|38|note|覚書|
|35|37|platform|土台|
|36|36|package|小包|
|37|35|set|設定する|
|38|34|attr|attribute(短縮名）|
|39|34|is|です|
|40|34|referrable|参照可能|
|41|34|services|奉仕|
|42|33|ara|AUTOSAR Runtime for Adaptive Applications(短縮名)|
|43|32|adaptive|適応|
|44|32|field|分野|
|45|31|ar|Autosar(短縮名）|
|46|31|be|です|
|47|31|that|それ|
|48|30|certificate|証明書|
|49|30|event|行事|
|50|29|access|接続|
|51|27|ap|adaptive platform(短縮名)|
|52|27|governance|統治|
|53|27|object|物体|
|54|27|r|r|
|55|26|integration|統合|
|56|26|key|鍵|
|57|26|or|また|
|58|25|autosar_tr_ddssecurityintegration|autosar_tr_ddssecurityintegration|
|59|25|via|経由|
|60|24|each|各|
|61|24|major|選考科目|
|62|24|minor|小さい|
|63|23|associated|関連する|
|64|23|kind|親切|
|65|23|type|型|
|66|22|ref|reference(短縮名）|
|67|22|through|終えた|
|68|21|as|なので|
|69|21|methods|方法|
|70|20|add|追加|
|71|20|base|基づく|
|72|20|elements|要素|
|73|20|table|表|
|74|19|an|一つの|
|75|19|grant|許す|
|76|19|m|m|
|77|19|mult|複数の（接頭辞）|
|78|19|represents|を表す|
|79|19|shall|しなければならない|
|80|19|templates|雛形|
|81|18|configuration|構成|
|82|18|required|必要|
|83|18|version|版|
|84|17|aggr|aggregation(短縮名)|
|85|17|context|文脈|
|86|17|identifiable|識別可能|
|87|17|multilanguage|多言語|
|88|17|slot|枠|
|89|16|c|c|
|90|16|meta|超|
|91|16|permissions|権限|
|92|16|reference|参照|
|93|15|defined|定義済み|
|94|15|referencing|参照|
|95|15|secure|安全|
|96|14|are|それは|
|97|14|defines|定義する|
|98|14|fields|田畑|
|99|14|identity|身元|
|100|14|under|下|
|101|14|where|どこ|


# 参照(reference)

Glossary も　参考に入れましょう。
https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf

[1] Specification of Communication Management, AUTOSAR_SWS_CommunicationManagement
[2] DDS Security, Version 1.1, https://www.omg.org/spec/DDS-SECURITY/1.1
[3] Specification of Manifest, AUTOSAR_TPS_ManifestSpecification
発表スライド作成環境をreveal-ckからvscode-revealに乗り換えた話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/ca9575c6-67e1-cc11-7570-9c3271e0ba49.png)


## 概要

乗り換えたら

- 環境準備が楽
- 開発体験が向上

しました。

## 環境準備

1. VSCodeをインストールする
1. VSCodeを起動して、vscode-revealという拡張をインストールする

調べたらすぐわかるような内容なので解説は割愛。

## 動作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/d1e7c4b9-8ca2-3980-16f8-816af53a3915.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17353/731827cf-c518-2c77-2021-e4cc6f6bd7df.png)

プレビュー機能がめっちゃ優秀で、保存を待たずにプレビューを更新してくれますし、mdファイル上でカーソル移動したらそれに合わせてページが遷移します。このへんはreveal-ckよりも開発体験が良いです。

## 背景：reveal-ckを今の環境で使うのは割と難しくなってきた

（個人的な事情を多分に含みます）

発表スライド共有サービスには不都合がある事が少なからずあり（Slideshareが突然閲覧制限を設けた件が記憶に新しいですが、speakerdeckも長らくリンクがうまくクリックできないなどの不都合があります）、最近はGithub Pagesにhtmlとして公開するようにしています。htmlでスライドを作る際に、reveal.jsを使用しています。

rubyにreveal-ckというgemがあり、reveal.jsを生で使うのに比べると「markdownだけ書いたらファイルを全部生成してくれる」環境を準備しやすかったので、（私がrubyを仕事で使っている事もあり）発表スライドを作る時に好んで使っていました。

久しぶりに発表スライドを作る機会を得たので作り始めました。最近使い始めたPCで制作環境を用意しなおしたのですが、

- rubyの3.1.2ではうまく動かない
- M1のmacbookでは `reveal-ck serve` が動く環境を準備するのが難しい
  - eventmachineとopenssl絡みのエラーが実行時に出る状態になりました、これは頑張れば解決できるかも
    - でも環境準備を頑張るよりも発表スライド制作を頑張りたいですよね……
- dockerで頑張ろうとして、エラーなしで動作するところまで出来たが、JSのエラーで発表スライドの内容が表示されなくなった
  - rubyは2.7.6
- reveal-ckの最後の更新は2020年であり、今後の活発な更新や不具合解消を見込みにくい

というように様々な壁にぶつかったため、他の方法を模索した結果、「markdownだけ書いたらファイルを全部生成してくれる」環境としてvscode-revealが優秀そうだったので試してみました。
[Android + boost] Android NDKでboostライブラリ(ptree)を使用したときのメモ

# 概要
行いたいこと : Android用のappでxml形式のファイル(colladaファイル)を読み込みたい
環境 : NDK(C++)
方法 : boostライブラリに含まれるproperty_tree(ptree)ライブラリを用いてxmlファイルをパースする

# boostライブラリとは
wikipediaより
>Boost （ブースト）とは、C++の先駆的な開発者のコミュニティ、およびそのコミュニティによって公開されているオープンソースのソフトウェアライブラリのことを指す。
https://ja.wikipedia.org/wiki/Boost_C%2B%2B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

ライセンスは[Boost Software License](https://www.boost.org/users/license.html)であり、抜粋すると
* 本ライセンスの対象となる本ソフトウェアのコピーおよび付属文書を入手した個人または組織に対して、本ソフトウェアの使用、複製、公開、頒布、実行、伝送、および二次的著作物の作成を無償で許可します。
* 本ソフトウェアのコピーの一部または全部、あるいは本ソフトウェアのすべての二次的著作物に添付されなければなりません。

となっている。
日本語訳参考サイト : https://licenses.opensource.jp/BSL-1.0/BSL-1.0.html

# ptreeの導入方法
ここではptreeだけを使用したいという要求なので、使用したい分だけ該当ファイルでincludeするようにする。
[boostホームページ](https://www.boost.org/)のDOWNLOADから最新版をダウンロード後、boostのディレクトリとライセンス関係のファイルだけをプロジェクトに追加する。
ptreeについてはヘッダーファイルの中に定義まで書かれているので、CMakeListのinclude_directoriesにboostファイルのパスを追加するだけでよい。

``` CMakeList.txt
set(BOOST_DIR ${SRC_DIR}/boost)   //boost ライブラリのパス
include_directories( /*他のパス*/ ${BOOST_DIR})
```

<b>※モジュールにboostライブラリを使用する場合であっても、appのCMakeListにも同様のパスの追加が必要。</b>

あとはboostライブラリを呼び出す箇所でincludeする。

``` c++
#include "boost/property_tree/ptree.hpp"
#include "boost/property_tree/xml_parser.hpp"
#include "boost/foreach.hpp"
#include "boost/lexical_cast.hpp"
```

# Androidでの注意点
ファイル読み込みの部分にて、windows/Linuxであればファイルストリーム(std::ifstream)を使用できるが、Androidではファイルストリームを使用できない。
xml_parser.hppを見ると

``` c++ xml_parser.hpp
void read_xml(std::basic_istream<
                  typename Ptree::key_type::value_type
              > &stream,
              Ptree &pt,
              int flags = 0)
{
    read_xml_internal(stream, pt, flags, std::string());
}
void read_xml(const std::string &filename,
              Ptree &pt,
              int flags = 0,
              const std::locale &loc = std::locale())
{
    BOOST_ASSERT(validate_flags(flags));
    std::basic_ifstream<typename Ptree::key_type::value_type>
        stream(filename.c_str());
    if (!stream)
        BOOST_PROPERTY_TREE_THROW(xml_parser_error(
            "cannot open file", filename, 0));
    stream.imbue(loc);
    read_xml_internal(stream, pt, flags, filename);
}
```
とあって、ファイル名を指定せずにisteamから読み込めるバージョン(1つめのread_xml関数)がありがたくも用意されているので、こちらを使用する。
AAsetManagerの関数でファイルをchar配列に読み込み、それを一旦stringbufに書き込む。
その後、stringbufを引数にistreamを作成し、先ほどのremd_xmlに渡す。

``` c++ sample.cpp
using namespace boost::property_tree;
ptree tree;
AAsset* file = AAssetManager_open(app->activity->assetManager,
                                  filePath, AASSET_MODE_BUFFER);
size_t fileLength = AAsset_getLength(file);
char* fileContent = new char[fileLength];
AAsset_read(file, fileContent, fileLength);
std::stringbuf strbuf(fileContent);
std::basic_istream stream(&strbuf);
read_xml(stream, tree);
```

# 最後に
はてなブログにも色々書いているので、興味のある方はご覧ください。
https://blog.hatena.ne.jp/Aqoole_Hateena/aqoole-hateena.hatenablog.com/
ソースコードはGitHubに上げております。
https://github.com/kodai731/Aqoole-Engine-Android-Vulkan-Rendering-Engine-
AWS学習メモ(01)　AWSのネットワーク・サーバの基礎




AWSをUdemyの講義を受講しながら学習中。わからない用語・理解できない仕組み等を調べて備忘録としてメモする。

## 何となくVPCというものが大事そう↓

### Amazon VPC(Virtual Private Cloud)とは
AWS上にプライベート仮想ネットワーク空間を作成できるサービス。この中にEC2などを配置できる。EC2よりも設定項目は少なく、VPC名、CIDR(Classless Inter-Domain Routing)、IPv(インターネットプロトコルの規格)の設定、テナンシーといった項目を指定することによりVPCを作成できる。
VPCの中に、パブリックサブネットとプライベートサブネットが存在し、前者はインターネットから接続できるが後者は接続できない。

### EC2って何？
LinuxやWindowsなどの仮想サーバを作成できるサービス

### VPCを使ったネットワークの構築
インターネットゲートウェイにルーティングできるルートテーブルに関連づけられればパブリックサブネットとなり、そうではない、ルーティングされていないルートテーブルに関連づけられればプライベートサブネットとなる。



### 引用：
>・Amazon VPCとは何か？使い方や構成例を詳しく解説https://www.sbbit.jp/article/cont1/51188
>・IPv6とは？通信速早くなる理由と回線が遅い時の対処法https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_12.html
Google検索結果をスクリーンショット エクセルでお気軽RPA③

# 概要

インストールしたSeleniumBasicを使って、実際にRPAを作ってみます。
[インストール方法(Qiita記事)](https://qiita.com/Rui010/items/0a226c26fe44e56c9c39)
この記事は、簡単なRPAを作成する手順を説明し、コードを提示することで、EXCELを使ったRPAを作れるということを知ってもらうのが目標になります。

# 要件定義

企業情報を収集するために、Googleの検索結果をスクリーンショットを取る。

# 設計

1. ブラウザを立ち上げる
1. Googleを開く
1. Googleの検索ボックスに企業名を入力する
    - 企業名は、Sheet1のA列2行目から縦に入力されているとする
1. 検索を実行する
1. 検索結果が開いたら、スクリーンショットを取る。
1. Sheet1のA列に文字が入力されていれば、3に戻る。ブランクであれば、終了

# コード

```vb
Sub main()
    ' Chrome driverの定義
    Dim driver As New Selenium.ChromeDriver
    ' 検索語句の記載されているシート（Sheet1）
    Dim ws_data As Worksheet
    Dim row As Long
    ' EXCELシートの非表示、画面更新停止
    ActiveWindow.WindowState = xlMinimized
    Application.ScreenUpdating = False

    Set ws_data = ThisWorkbook.Worksheets("Sheet1")

    ' ドライバー＝ブラウザの起動→Googleを開く
    ' ①
    driver.Start
    driver.Get "https://www.google.com/?hl=ja"
    
    row = 1
    Do While ws_data.Cells(row, 1) <> ""
        ' getSSInGoogle関数で、検索とスクリーンショットを取る操作を定義
        Call getSSInGoogle(driver, ws_data.Cells(row, 1).Value)
        row = row + 1
        driver.Wait 1000
    Loop
    ' ブラウザを終了させる
    driver.Quit
    MsgBox "終了しました"
    ' EXCELシートの表示、画面更新再開
    ActiveWindow.WindowState = xlNormal
    Application.ScreenUpdating = True

End Sub

' ドライバーとキーワードを引き渡して、Googleで検索→スクリーンショットを取る
Function getSSInGoogle(driver As WebDriver, keyword As String)
    
    Dim ks As New Keys
    Dim h As Long
    Dim w As Long
    
    driver.FindElementByName("q").Clear
    driver.FindElementByName("q").SendKeys keyword
    driver.SendKeys (ks.Enter)
    ' ②
    driver.TakeScreenshot.SaveAs ThisWorkbook.Path & "\ss\" & keyword & ".png"
    driver.Wait 1000
    
End Function
```

# ヘッドレスブラウザ

SeleniumBasicのスクリーンショットではあくまでもブラウザを開いた状態になるため、見えている範囲のみになります。そのため、縦スクロールするページは途中で切れてしまいます。それを防ぐにはヘッドレスブラウザを使うと便利です。

ヘッドレスブラウザとは、ユーザインタフェースのないブラウザのことです。簡単には、画面表示がないブラウザと考えてもらって大丈夫です。画面表示がないので、実際に使用しているPCの画面サイズを超えた表示領域にすることで、縦スクロールなしの表示をスクリーンショットが取れます。
上記コードの①と②に下記を追加します。

```vb
' ①：ヘッドレスブラウザにする
driver.AddArgument "--headless"
driver.AddArgument "--disable-gpu"
driver.AddArgument "--window-size=1024,768"

' ②：表示しているページの縦と横幅を取得して、ウィンドウのサイズにセット
h = driver.ExecuteScript("return document.body.scrollHeight")
w = driver.ExecuteScript("return document.body.scrollWidth")
driver.Window.SetSize w, h
```

# まとめ

かなり簡易的な例ですが、RPAを作ることができました。今回はGoogleの検索結果ですが、別のWebサイトにしてみたり、検索ではなく登録操作にしてみたりすることで、繰り返していることを自動化することができることが掴めてもらえると幸いです。
COLMAP 3.7 をubuntu20.04で使えるようにする

# COLMAP 3.7を使いたい
COLMAP3.7をインストールするときに色々つまづいたので，少しまとめておきます．
https://colmap.github.io/install.html の *Build from Source -> Linux* に書いてあることをそのままやれば基本的にOKですが，一部変更点があります．
変更前と変更後を以下に書いていきます．

## Install Ceres Solverについて

```
(変更前)
$ sudo apt-get install libatlas-base-dev libsuitesparse-dev
$ git clone https://ceres-solver.googlesource.com/ceres-solver
$ cd ceres-solver
$ git checkout $(git describe --tags) # Checkout the latest release
$ mkdir build
$ cd build
$ cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
$ make -j
$ sudo make install
```
```
(変更後)
$ sudo apt install libatlas-base-dev libsuitesparse-dev
$ git clone https://ceres-solver.googlesource.com/ceres-solver -b 1.14.0
$ cd ceres-solver
$ mkdir build
$ cd build
$ cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=ON
$ make -j
$ sudo make install
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
```
なぜか知りませんが，ceres-solverのversionが1でないと動作しないようです．
もし，最新のceres-solverをコンパイルしてしまうと，COLMAP 3.7を実行したときに動的リンクのエラーを吐いてしまいます．
また，-DBUILD_SHARED_LIBS=ONをすることで，ceres-solverの動的ライブラリを作ってくれるみたいです．
-DBUILD_SHARED_LIBS=ONを書き忘れると静的ライブラリになってしまうので注意です．
最後に，動的リンクのパスを通せばOKです．

## gccのバージョンについて

cudaの都合でgccのバージョンが8でないとダメみたいです．
バージョン8のgccをインストールした後に，CMakeList.txtを少し書き換えます．

```
(terminal)
$ sudo apt install gcc-8
```

```
(colmapディレクトリにあるCMakeList.txtの先頭に以下を追加)
set(CMAKE_C_COMPILER /usr/bin/gcc-8)
set(CMAKE_CXX_COMPILER /usr/bin/g++-8)
```
【jQuery】vTickerで垂直スクロールのティッカー作成

# はじめに 
「[このwebサイト](https://elderaffairs.org/)のように自動縦スライドをヘッダーに入れたい！」と、Google先生に尋ねまわったところ、jQuaryプラグイン「vTicker」で実装可能なことが判明。
あわせてこのような表示形式をティッカーと呼ぶことも判明（以下引用参照）。
さっそく設定してみました。

#### ティッカーとは 　
>特定範囲内に文字列を流して表示させる表示方式のことである。右から左（あるいは上から下へ）文字が次々に流れてゆくのを読ませる方式であるので、限られた狭い領域で多くの情報を表示することができる。
ティッカーの代表的な例としては、新幹線の車内や看板、証券取引所などにある電光掲示板がある。Webページにおいても、左右に文字の流れるティッカー表示が用いられる場合が珍しくない。
（引用元：[IT用語辞典バイナリ](https://www.sophia-it.com/content/%E3%83%86%E3%82%A3%E3%83%83%E3%82%AB%E3%83%BC)）

# 基本設定
### vTickerをGithubから入手
[こちら](https://github.com/richhollis/vticker)からzipファイルをダウンロード

### jsの読み込み
\<header>内にjqueryとjquery.vticker.jsを設定
```html
<script src="./jquery-3.6.0.min.js"></script>
<script src="./jquery.vticker.js"></script>    
```
### htmlにul要素を設定
スクロールさせる要素の親要素にclassまたはidを指定。
```html
<div class="ticker">
  <ul>
    <li>サンプルサンプル</li>
    <li>さんぷるさんぷる</li>
  </ul>
</div>
```

### vtickerのスクリプトを記述
ul要素で指定したclassまたはidに対してvtickerを記述すれば、基本設定は完了。
スクロールの回転速度、停止時間などはオプションで設定。
```js
<script type="text/javascript">
$(function() {
   $('.ticker').vTicker();
});
</script>
```
# vtickerオプション
以下参照
```js
$('.ticker').vTicker({
 speed: 1000, // ティッカーが切り替わる速度
 pause: 2000, // ティッカーの表示（停止）時間
 showItems: 1, // ティッカーの表示行（項目）数
 animate: true, // スクロールアニメーションの動作有無（デフォルトはtrue）
 mousePause: false, // ポインターが乗っているときの動作有無（デフォルトはtrue）
 startPaused: false, // 自動開始の有無（デフォルトはtrue）
 height: 0, // 表示領域の高さ（指定なしと0はauto）
 margin: 0, // 表示領域のマージン量（cssでは設定不可）
 padding: 0 // 表示領域のパディング量（cssでは設定不可）
});
```

# 応用　―　他の要素と横並びで表示
htmlでスクロール項目の親要素に指定したclassまたはidに、cssでwidthを設定。
すると、一段上の親要素へのdisplay:flex設定により、他の要素と横並び表示することができました。
（vtickerオプションではwidthの設定不可）
### サンプル
サンプルは[こちら](https://rankot.sakura.ne.jp/vTicker/)
### html
```html
<div class="sample">
  <div class="logo">SAMPLE</div>
  <div class="ticker">
    <ul>
      <li class="red">サンプルサンプル</li>
      <li class="green">サンプルサンプル</li>
      <li class="purple">サンプルサンプル</li>
      <li class="blue">サンプルサンプル</li>
    </ul>
  </div>
  <div class="search">
    <form action="cgi-bin/example.cgi" method="post">
      <input type="search" name="search" placeholder="キーワードを入力">
      <input type="submit" name="submit" value="検索">
    </form>
  </div>
</div>
```
### css
```css
.sample {
  display: flex;
  justify-content: space-between;
}
.ticker {
  width: 130px;
}
.red {
  color: red;
}
.green {
  color: green;
}
.purple {
  color: purple;
}
.blue {
  color: blue;
}
```
### js
基本設定から変更なし

# 参考URL
[数秒ごとに1行ずつ縦スクロールするティッカーを作る](https://allabout.co.jp/gm/gc/432067/)
[縦にスクロールするティッカー機能を持つjQueryプラグイン「vTicker」の使い方](https://www.oosaka-web.jp/column/web/160908/)
埋め込みのTwitterをライト・ダークモード、動的に切り替える

## JavaScriptかjqueryで簡単に切り替えることができます

### Twitterのダークモードの入れ方

```HTML
<script defer async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<a class="twitter-timeline" data-theme="dark" href="https://twitter.com/hogehoge">@hogehoge</a>
```

data-theme が dark であればダークモードになります。

### jqueryで切り替える

```HTML
<script defer async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<div id="twitter"></div>
<script>
	var isdark=1,
		darkstr="";

	if(isdark == 1) {
		darkstr=' data-theme="dark"';
	}

	$('#twitter').html('<a class="twitter-timeline"' + darkstr + ' href="https://twitter.com/twitter">@hogehoge</a>');
</script>
```


## 参考までに
うちの場合は iframe 以下のHTMLで切り替えていますが、こちらのが安定するようです。

また、現時点でFacebookは埋め込みのダークモードは未対応です
PowerShellのベストプラクティス 

PowerShellで開発したので、個人的なベストプラクティス

# Version
```:cmd
>powershell

\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.1237
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1237
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

# 構成
batファイルからps1ファイルをキックして、
ps1ファイルでpsm1(module)を読み込む

※batファイルだとWindowsでダブルクリックで実行できる

```:関係図 
bat → ps1 (1:1)
ps1 → psm1 (1:N)
psm1 → psm1 (1:N)
```

# ディレクトリ構成

```
:batはディレクトリ直下
bat1.bat
bat2.bat

Config: const格納用
    Config.psm1

Module: ps1(モジュール)格納用
    module1.psm1
    module2.psm1

Ps: ps1ファイル格納用
    ps1.ps1
    ps2.ps1
```

※ディレクトリ名はお好みで

# const
`$env`変数につっこむ

```: Config¥Config.psm1
# ディレクトリのセパレータ文字列
$env:DIRECTORY_SEPARATOR_CHAR = [string]([IO.Path]::DirectorySeparatorChar)

# configディレクトリ
$env:CONFIG_LOCATION = $PSScriptRoot + $env:DIRECTORY_SEPARATOR_CHAR

# rootディレクトリ
$env:ROOT_LOCATION = $env:CONFIG_LOCATION + '..' + $env:DIRECTORY_SEPARATOR_CHAR

# moduleディレクトリ
$env:MODULE_LOCATION = $env:ROOT_LOCATION + 'module' + $env:DIRECTORY_SEPARATOR_CHAR
```

> $PSScriptRoot
スクリプトの親ディレクトリが格納されている特殊変数

### 利用方法

```:¥Ps¥ps1.ps1
using module '../config/App.psm1'
```



# Moduleファイルの読み込み

`Export-ModuleMember`・`Import-Module`を利用

### module側
```¥Module¥module1.psm1
class Module1
{
    # ...
}

function newModule1() {
    return [Module1]::new()
}

Export-ModuleMember -Function 'newModule1'
```

### 利用側
```:¥Ps¥ps1.ps1
# ... configファイルの読み込み / 引数取得など

$import_module = $env:MODULE_LOCATION + 'Module1.psm1'
Import-Module $import_module -Function 'newModule1'

$module1 = newModule1
```

PowerShellのクラスにはnamespace的なものがないらしい
class名のバッティング回避のため、`Export-ModuleMember`の利用を選択しました

`Import-Module`の構文中に`+`での文字列連結はできないので、
上記のように文字列連結する場合にはあらかじめ変数に格納しておく必要があります


#### 関数名がバッティングした際の回避方法

`Import-Module`のオプションに`-Prefix`があり、こちらを設定することで回避が可能です

```: 例
$import_module = $env:MODULE_LOCATION + 'Module1.psm1'
Import-Module $import_module -Function 'newModule1' -Prefix 'x'

# xnewModule1 で呼び出し可能
```

# さいごに

公式のドキュメントがしっかりしてますが、
サンプルコードがあまりないので、
トライアンドエラー+検索って感じで開発しました
MAiX Qube 奮闘記09 I2C通信でキャラクタLCD表示(2)

今回はキャラクタＬＣＤに文字表示するところに挑戦。
ネットでいろいろなプログラムの断片をかき集めいろいろ試行錯誤しましたが
最終的にはオリジナルキャラクタの登録にも成功しました。

全体の接続
![IMG_0028.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/1208bbfb-5c21-f942-96ef-6b8aea0a4b3a.jpeg)

液晶画面
上段右側のスマイルマークとベルマークは本プログラムで登録したものです。
プログラムを実行すると下段の数値部分が0から99にカウントアップします。

![IMG_0029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/12e7b531-464a-f0a9-4845-65d9348d73b3.jpeg)



```python:i2c_CharacterLcd.py
from machine import I2C
import utime

def putstr(string):
    StringBuff = bytearray([0x40])    #Co=0,RS=1 Data
    for char in string:
        StringBuff += char
    print(StringBuff)
    i2c.writeto(DEFAULT_I2C_ADDR,StringBuff)
def putcmd(command):
        CommandBuff = bytearray([0x00,command])    #Co=0,RS=0 Control byte
        print(CommandBuff)
        i2c.writeto(DEFAULT_I2C_ADDR,CommandBuff)
def custom_char(location,charmap):
    #"""Write a character to one of the 8 CGRAM locations, available
    #as chr(0) through chr(7).
    location &= 0x07
    #CommandBuff = chr(0x00)+ chr(0x40|(location << 3))
    CommandBuff = bytearray([0x00,(0x40|(location << 3))])
    i2c.writeto(DEFAULT_I2C_ADDR,CommandBuff)
    utime.sleep_ms(50)
    CommandBuff = chr(0x40)  #Co=0,RS=1 Data

    for i in range(8):
        CommandBuff += chr(charmap[i])
    i2c.writeto(DEFAULT_I2C_ADDR,CommandBuff)
if __name__ == "__main__":
    DEFAULT_I2C_ADDR = 0x3E
    print(DEFAULT_I2C_ADDR)
    i2c = I2C(I2C.I2C3, freq=300*1000, sda=7, scl=6) # cube
    #オリジナルキャラクタの定義
    happy = bytearray([0x00,0x0A,0x00,0x04,0x00,0x11,0x0E,0x00])
    bell = bytearray([0x04,0x0e,0x0e,0x0e,0x1f,0x00,0x04,0x00])

    putcmd(0x38)#ファンクションリセット
    utime.sleep_ms(5)
    putcmd(0x39)#ファンクションセット
    utime.sleep_ms(5)
    putcmd(0x14)#発信周波数
    utime.sleep_ms(5)
    #液晶のコントラスト
    putcmd(0x70|0x03)#下位4ビットがコントラスト下位4ビット　デフォルト0x03
    utime.sleep_ms(5)
    putcmd(0x54|0x02)#下位2ビットがコントラスト上位2ビット　デフォルト0x02
    utime.sleep_ms(1)
    putcmd(0x6C)
    utime.sleep_ms(300)
    putcmd(0x38)#ファンクションリセット
    utime.sleep_ms(5)
    putcmd(0x01)
    utime.sleep_ms(1)
    putcmd(0x0C)
    utime.sleep_ms(1)
    custom_char(0x0,happy)
    custom_char(0x1,bell)
    putcmd(0x80)#SET DDRAM ADDRESS 0x00
    utime.sleep_ms(1)
    #文字とオリジナルキャラクタの表示
    putstr('keita  '+chr(0)+chr(1))#文字と登録したオリジナルキャラクタを表示
    putcmd(0x80|0x40)#SET DDRAM ADDRESS 0x40
    putstr('Count=')
    for num in range(100):
        putcmd(0x80|0x46)#DDRAMアドレスを下段の左から7つめ0x46にセット
        utime.sleep_ms(100)
        putstr(str('{:3d}'.format(num)))
        utime.sleep_ms(100)
    i2c.deinit()
```
エンティティを不変（イミュータブル）にする実装

# はじめに

SpringBootのエンティティは便利だが、可変（ミュータブル）な実装になりがちなので、
不変（イミュータブル）にできないか検討する。

# ありがちな実装

* エンティティ

```java
@Entity
@Table(name = "company")
@Getter
@Setter
public class Company {

    @Id
    private String companyId;
    private String companyName;
}
```

* 呼び出し元

```java
Company company = new Company();
```

晴れて、生焼けオブジェクトのできあがり！！
変数```company```がどのような状態かよく分からない。。
この状態を避けるために、```Company```エンティティを不変にしてみる。

# エンティティの制約

エンティティには、引数を持たないコンストラクタが必要。
引数を持たないコンストラクタが存在しないと、
リポジトリのfindByIdとか実行すると、下記のように例外が発生する。

```
org.hibernate.InstantiationException: No default constructor for entity:  : ~~~
```

引数を持たなければアクセス修飾子は何でもよく、privateでも実行できる。
試しにprivateな引数なしのコンストラクタにブレークポイントを設定したところ、
下記のようにリフレクションで呼ばれていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/c5461e62-193b-aa69-75e2-76306c8d2639.png)

リフレクションで```setAccessible(true)```をされたらどうしようも無いが、
こればかりは諦める。

# 実装例

```@Setter```を削除し、privateな引数なしコンストラクタと、引数ありコンストラクタを用意。
フィールドが多くなると引数渡しは呼び出し元がツライため、ビルダーにした。

* エンティティ

```java
@Entity
@Table(name = "company")
@Getter
public class Company {

    @Id
    private String companyId;
    private String companyName;

    private Company() {}

    private Company(final String companyId, final String companyName) {
        this.companyId = companyId;
        this.companyName = companyName;
    }

    public static class CompanyBuilder {

        private String companyId;
        private String companyName;

        public CompanyBuilder companyId(final String companyId) {
            this.companyId = companyId;
            return this;
        }

        public CompanyBuilder companyName(final String companyName) {
            this.companyName = companyName;
            return this;
        }

        public Company build() {
            return new Company(companyId, companyName);
        }
    }
}
```

* 呼び出し元

```java
Company company = new CompanyBuilder()
                        .companyId("12345")
                        .companyName("株式会社ほげ")
                        .build();
```

# 最後に
もっといい実装方法があれば教えてください。
音声認識でオンライン会議の議事録自動化（Google Meet, Teams, Slack コール 対応）

# 何がしたいのか？
コストをかけずにオンライン通話アプリでの会話の記録を取りたい。
あわよくば取れた記録をそのまま議事録として関係者に展開したい。

# 今回の到達点
- コストについて
ドネーションウェアを使って環境を作ります。
本格的に使っていくなら寄付するべきですので、コスト面でまだ課題が残っています。
- 精度について
正直なところ、そのまま議事録として残せる精度ではありません。
議事録をまとめる時にどんな事話したか思い返すためのメモとしては使えます。

# 使用するアプリ
[Speechnotes](https://speechnotes.co/ja/)
（アクティブウィンドウ、アクティブタブじゃなくても動作し続けてくれるので便利）
[VoiceMeeter](https://vb-audio.com/Voicemeeter/index.htm)
（bananaも入れてみたけどこっちで十分だった）

![VoiceMeeter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/041b119c-d4a2-efa7-f02b-2dfe3263ee64.png)

# 目次
1. [VoiceMeeterのセットアップ](#Chapter1)
1. [実際に使ってみる](#Chapter2)

<a id="#Chapter1"></a>
# VoiceMeeterのセットアップ
1. 使用するアプリのリンクからインストーラーをダウンロードしてインストールします。
1. 出力はVoiceMeeter Inputを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/5d244608-9f1b-7cc7-8930-4fee74a45d88.png)
1. 入力は物理デバイスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/0fa1c400-ec11-aaa6-872a-f4583c25ad98.png)
1. VoiceMeeterのコンソールを開いてHardwareOutを指定します。
WDMの方が新しい規格のようなので、実際に音を出したいデバイスのWDMの方を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/7b2e6432-43fc-c224-ca60-58b35ae3cadb.png)
1. 続けてHardwareInputを指定します。
いつも使っているマイクデバイスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/ada353d3-4796-1592-34f2-176a65061547.png)
1. そのままだと自分の声がスピーカーから出てしまうので、マイクの音はVirtualOutからだけ流します。
A（MainOut）のチェックを外す
![VoiceMeeter02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/2117f11e-adf5-1e43-62d3-866e235d4441.png)
1. Windows起動時にアプリが自動で立ち上がるようにします。
※標準出力をVoiceMeeter Inputにしているため、アプリを起動していないと音が出ません。
Menuから「System Tray」と「Run on Windows Startup」にチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/9795ebce-2dbe-a7ce-63db-7fcfdabe817c.png)

<a id="#Chapter2"></a>
# 実際に使ってみる
1. 使用するアプリのリンクからSpeechnotesを開きます。
1. マイク入力をVoice Meeter Outputに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314253/0775a0d2-52ed-7066-965d-fbb61c4f4e77.png)
※設定アイコンが表示されず、変更できない場合は一度マイクアイコンをクリックしてディクテーションを開始するとアイコンが表示されると思います。
1. マイクから喋った自分の声とニュース動画辺りを再生してその内容がテキスト化できていれば成功です。
（最初に書いた通り、認識精度はお察しなので、今後良い方法を考えていきます）

# 今後について
ドネーションウェアに頼ってしまっているのがネックです。
まずは音声認識の部分を自作アプリに置き換えたい。
クラウド環境を整えたほうが良いんでしょうが、コスト面からWindowsに頼ってしまうのが良いのかなーと思ってます。
Windows頼りとなるとUWPかなー。
GitLab で Merge Request を作る

オーナーでなくて、メンバーの時に、main ブランチのファイルを編集するには Merge request を出す必要があります。

ファイルを編集
![merge_request01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a51a6886-d5ba-4dbc-888e-d260f560095e.png)

Commit changes
![merge_request02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7acc34cf-f447-1cc6-854c-e2e40dd2342a.png)

Create merge request
![merge_request03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6d241cb5-1a86-1169-1380-3bd5e8abe974.png)

左の Merge requests が 0 から 1 になっています。
![merge_request04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/850bf254-d209-1a51-dc9e-ec12cc87ad6d.png)
Redshiftのノードタイプを2ノードのdc2.largeから1ノードのra3.xplusに変更してみた

2ノードのdc2.largeを1ノードのra3.xplusに変更してみようと思います。
以下の記事を参考に設定してみます。
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/working-with-clusters.html#rs-ra3-node-types

参考記事によると、2ノードのdc2.largeのクラスターを直接1ノードのra3.xplusに変更することはできないようです。
そこで参考記事に記載のあるように**マルチノードのdc2.xlargeを経由させる**ことで最終的に1ノードのra3.xplusにしようとしたのですが、2022年5月現在dc2.xlargeはノードタイプとして選択肢に表示されませんでした。

>従来のサイズ変更による、マルチノードの dc2.xlarge から 1 ノードの ra3.xlplus への、およびその逆方向での変更。

①2ノードのdc2.large
②2ノードのdc2.xlarge
③1ノードのra3.xlplus

そのため、参考記事によるとdc2.xlargeの代わりに**1ノードのds2.xlargeを経由させる**ことでも目的が達成できそうなので、試してみようと思います。

>従来のサイズ変更による、1 ノードの ds2.xlarge から 1 ノードの ra3.xlplus への、およびその逆方向での変更。

①2ノードのdc2.large
②1ノードのds2.xlarge
③1ノードのra3.xlplus

# 検証

### 2ノードのdc2.largeを1ノードのds2.xlargeに変更する
変更対象のクラスターを選択し、アクション > サイズ変更をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/6c5eb6c0-1d4b-1e2f-b813-1add065e25ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/9bcc0bb4-869a-bd72-57f4-7cbd5d11209b.png)

データを何も入れていないせいか、20分ほどで1ノードのds2.xlargeに変更できました。

### 1ノードのds2.xlargeを1ノードのra3.xplusに変更する
もう一度変更対象のクラスターを選択し、アクション > サイズ変更をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/0106bcb5-531c-b4ac-325e-21c0f8c2d0f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/8a19be28-4b1b-f6bf-34f1-f1fa47ca8d7c.png)

こちらも20分ほどで1ノードのra3.xplusに変更できました。
検証成功です！
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/85426537-257a-125b-9a34-d6f87e6a926c.png)
Windows11のWSL2にVivadoをインストールする

**※Vivado2022.2でWindows11がサポートされたようなので、現在ではもはや必要ないかもしれません。**

新しいパソコン（Windows11）にVivadoをいれようと思ったら、これはVivadoさんが（現在は？）対応していないOSだった。代わりにWSLgなるものでWSLからGUIが使える仕組みがWindows11では最初から入っているらしい、ということでWSL上にインストールしようとしたら、何回か途中の状態からインストールが進まなくなってしまった。なんとか回避できたのでその記録を含めて一通りの手順を書いてみる。

# 環境/バージョン
+ Ubuntu 20.04.4 LTS
    + WSLのUbuntuのデフォルト？かもしれない
+ Vivado 2021.2 (64-bit)
    + フリーで使えるStandard Editionを選択

# この手順で回避できる（かもしれない）問題
+ Final Processing の "Generating installed device list" でプログレスバーが止まってしまう問題
+ Final Processing の "Optimize Diskspace Usage" でプログレスバーが止まってしまう問題

# 手順
### 0. Ubuntuにライブラリを追加
```
sudo apt install libtinfo5
```
をする。WSLにUbuntuを入れた直後なら`apt update`してから。
これをしないと上記一つ目の"Generating installed device list"で止まる問題がおこる。

https://support.xilinx.com/s/article/76616

に書かれている通り、Ubuntu 20.04 に足りないライブラリがある、らしい。

### 1. インストーラをダウンロードする
ホームページからLinux用インストーラをダウンロードする。バージョンは適宜使いたいものを選ぶ（今回想定しているのは上記の通り 2021.2）。

### 2. WSL上で実行する
ただし`sudo "インストーラのパス"`等しないとインストーラがデフォルトでインストールしようとする場所へは書き込みのパーミッションがないといわれるので、注意。

### 3. Enable Disk Usage Optimization を外す
これが上記2つ目の"Optimize Diskspace Usage" でプログレスバーが止まってしまう問題の対策。

https://support.xilinx.com/s/article/72280

にある通り、ウィザードの最初の画面下のPreferencesから、Disk Usage Settingsタブを選んでEnable Disk Usage Optimization のチェックを外す。最終的な容量をいくらか削減するということを本来しているらしいが、インストール自体できないのではしかたないので、外す。

### 4. あとはウィザードに従って適当に進める

自分は途中のSelect Destinationのようなステップで Create program group entries と create desktop shortcuts のチェックも外したが、これが必要だったかはわからない。
ほかは特筆することもない、はず。（いろいろダウンロードするとかで3時間くらいはかかるけど）

### 5. おしまい
必要ならVivadoのあるところにパスを通す等するのが便利。
インストールできたらVivadoを起動すると、WSL上でGUIでVivadoが開く。
SQLite3のデータベースをMySQLに移行するときに文字コード（照合順序）でハマった話

# はじめに
こんにちは～。さきやです。

今回は、DjangoのSQLite3データベースをMySQLサーバーに移行する作業で１日くらいハマりました。
原因は文字コードの照合順序だったんですが、意外なところに落とし穴がありました。

初投稿なので、読みにくいところもあるかもですがご了承下さい。
それでは本編どうぞ

# 環境
Windows（Ubuntu 20.04）
Docker　4.20
Django　3.2
MySQL　8系

※今回はDockerの環境は関係ありませんが、参考までに載せています！

# 経緯
データベースを移行する際、Django で下記のようなコマンドをよく実行しますよね。

```
#1. 現在のデータベースを json 形式のファイルで出力する (-eオプションなどをつけてエラー回避することが多いですが、詳しい説明は割愛します。)
python manage.py dumpdata > dump.json
```

```
#2. 1で出力した dump.json を他のデータベースに読み込ませる
python manage.py loaddata dump.json
```
　
僕はDB移行が初体験だったので、ドキドキしながら移行作業を続けてたところ、

発生したエラーがこれ。
```django.db.utils.IntegrityError
django.db.utils.IntegrityError: Problem installing fixture '***/dump.json': Could not load ***.******(pk=**): (1062, "Duplicate entry '**' for key '*****'")
```

「エラーに出してるデータが重複しちゃうからデータ挿入できないよー」って言ってますね。
そして、このエラー自体は１０年以上前からあるようで解決ソースはたくさん出てきました。

が、どれも解決には至らず…。

>↓僕のエラー吐いていたデータ
魔女ッ子メグちゃん

そもそも重複しているデータなんて見当たらなかったので、「なんのこと？」って状態でした。

それでハマってしまったのが今回記事を書いた経緯です。
　
# 原因
単純なことが原因でした！

僕は趣味でアニメのレビューサイトを制作しているのですが
今回は、データベースに格納していた２つの「アニメタイトルの文字列」が原因でした。

>魔女ッ子メグちゃん
>魔女っ子メグちゃん

この２つのタイトルの違い分かりますか？
「魔女」の後ろに「っ」と「ッ」が入ってますよね。
　
　
　　　原因これです。
　
　
要は、「カタカナとひらがなを区別する文字コード（照合順序）」を指定してなかったんですね。

おそらく僕と同じエラーでハマっている人はエラー文に
『ひらがな又はカタカナが含まれる文字列』が含まれていると思います。


# 解決方法

ということで、

『カタカナとひらがなを区別する文字コード（照合順序）』ってなんぞや～って思った方。

正解は、こちらです！

```
utf8_general_ci
```
　
これを Docker の MySQL コンテナの起動時コマンドで指定してやれば、、、
```Docker:docker-compose.yml
version: '3.7'

services:
・・・略・・・
    database:
        image: mysql
        # 僕のDocker環境では character-set-server=utf8mb4 としているので、collation-server=utf8mb4_general_ci となる
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default_authentication_plugin=mysql_native_password
        env_file:
            - database-docker-compose.env
```
解決(´・ω・`)

※ my.cnf ファイルに直接設定を書き込んでいる場合は、そのファイルに collation-server=``使用している文字コード``_general_ci のように追記してください。

# まとめ
今回はかなり珍しいケースかもしれませんが

英語の記事ばかり読んでいて、日本語特有の思わぬ落とし穴に気づきませんでした（笑）
あと、文字コードってカタカナとひらがな区別するもの（照合順序）があるんだな～っと勉強になりました・・・。

今回 Qiita 初投稿だったので読みづらいところもあったと思いますが、
日本語の記事がパッと見当たらなかったので自分で記事にしてみました。

参考になれば幸いです(´・ω・`)

ありがとうございました。


参考記事：

https://qiita.com/oooosawa/items/55a3c788043d229ced1a
ExcelVBAマクロの開発・実行環境を準備する

# はじめに

Excel 2019 on Windows10 を対象としています。
公開されている情報を参照して、プライベートの時間に整理したものです。

# 関連記事
- [ExcelVBAマクロのチートシート](https://qiita.com/yikemac/items/68413ab07509c292c615)

# 開発環境の準備

## 開発メニューを表示する
1. Excelを開いて上側のリボンを右クリックして「リボンのユーザー設定」を選択する
2. 右側の一覧からメインタブの「開発」をチェックしてOKをクリックする
3. 開発メニューが表示される

## アドインを作成する
1. ファイル→新規→空白のブックを選択する
2. ファイル→名前を付けて保存を選択して、ファイルの種類を「Excelアドイン(*.xlam)」に変更する
3. ファイル名を変更して「保存」をクリックする

## VBA開発環境を開く
1. 開発メニューから「Visual Basic」を選択する
2. 左上のプロジェクトツリーから先ほど保存したアドイン名「VBAProject (～.xlam)」を選択する
3. 右クリックして挿入→標準モジュールを選択する
4. 作成された標準モジュールをクリックして左下のプロパティから「(オブジェクト名)」を変更する

## 最初のマクロを作成する
1. 作成された標準モジュールをクリックした状態で、右側の編集画面に下記を入力する
```vb
Option Explicit

Public Sub サンプルを表示()
    ' イミディエイトウインドウに「サンプル」と表示する
    Debug.Print "サンプル"
End Sub
```
:::note
Public Subにより定義した関数がマクロとして呼び出しできます。一般的なプログラムでは日本語の関数名を使用しないことが多いですが、リボンにマクロ実行ボタンを追加した場合に、そのまま表示名にできることの利便性を優先して日本語名にしています。
:::

## リボンにマクロ実行ボタンを追加する
1. リボンを右クリックして「リボンのユーザー設定」を選択する
2. 右下の「新しいタブ」をクリックすると、新しいタブとグループが作成される
3. 「名前の変更」をクリックして、新しいタブとグループを適切な名前に変更する
4. マクロ実行ボタンを追加したいグループを選択する
5. 左上のコマンドの選択から「マクロ」を選択する
6. 追加したいマクロを選択して「追加」をクリックする
7. 「名前の変更」をクリックして、アイコンと表示名を変更する

# 実行環境の準備

## アドインを参照する
1. 開発→Excelアドインを選択する
2. 「参照」をクリックして、作成していたアドインファイルを選択する

## マクロの実行を許可する
1. ファイル→オプションを選択する
2. 左側タブから「トラスト センター」を選択して「トラスト センターの設定」をクリックする
3. 左側タブから「マクロの設定」を選択して「警告を表示してすべてのマクロを無効にする」をチェックする
4. 左側タブから「メッセージ バー」を選択して「ActiveX コントロールやマクロなどのアクティブ コンテンツがブロックされた場合、すべてのアプリケーションにメッセージ バーを表示する」をチェックする
5. OKボタンをクリックする
6. 開いているExcelファイルをすべて閉じる
7. Excelファイルを開いたときに「セキュリティの警告　マクロが無効にされました。」と表示されるので、マクロを実行したい場合は「コンテンツの有効化」ボタンをクリックする
8. リボンから追加したマクロ実行ボタンをクリックして動作確認をする

# 他のパソコンで実行したい場合
1. リボンを右クリックして「リボンのユーザー設定」を選択する
2. 右下の「インポート/エクスポート」から「すべてのユーザー設定をエクスポート」を選択して、ユーザー設定ファイルを保存する
3. ユーザー設定ファイルとアドインファイルを、対象のパソコンにコピーする。アドインファイルは、デフォルトでは C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns に保存されている
4. 対象のパソコンで[実行環境の準備](#実行環境の準備)をする
5. ユーザ－設定ファイル(*.exportedUI)をエディッタで開き、含まれているユーザー名を、インポート対象のパソコンでログインしているユーザー名に置換する
6. 対象のパソコンで「リボンのユーザー設定」→「インポート/エクスポート」→「ユーザー設定ファイルをインポート」をクリックして、ユーザー設定ファイルを読み込む
cscの作法 その163

# 概要
cscの作法、調べてみた。
DxLibDotNet.dll、使ってみた。
DX.LoadDivGraph、使ってみた。
走る人、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/47b7e289-f942-398c-c73c-5d3d2f51021b.png)

# サンプルコード

```
using DxLibDLL;
using System;

class dxtest {
	[STAThread]
	static void Main() {
		int[] GrHandle = new int [30];
		int GNum = 0;
		int loopcnt = 0;
		DX.ChangeWindowMode(DX.TRUE);
		if (DX.DxLib_Init() == -1) 
			return;
		DX.LoadDivGraph("sprite-animation4.bmp", 30, 6, 5, 85, 102, GrHandle);
		DX.SetDrawScreen(DX.DX_SCREEN_BACK);
		while (DX.ProcessMessage() == 0)
		{
			loopcnt++;
			if (loopcnt % 20 == 19)
			if (GNum < 29)
			{
				GNum++;
			}
			else
			{
				GNum = 0;
			}
			DX.ClearDrawScreen();
			DX.DrawGraph(200, 200, GrHandle[GNum], DX.TRUE);
			DX.DrawString(100, 80, "loopcnt = " + loopcnt, DX.GetColor(255, 255, 255));
			DX.DrawString(100, 100, "GNum = " + GNum, DX.GetColor(255, 255, 255));
			DX.ScreenFlip();
		}
		DX.DxLib_End();
	}
}




```


以上。
[備忘録]Nuxt3でGoogleMaterialIconを使う（CDN）

参考：https://github.com/nuxt/framework/discussions/1640#discussioncomment-2090613


```nuxt.config.ts
export default defineNuxtConfig({
  ・・・
  meta: {
    link: [
      {
        rel: 'stylesheet',
        href: 'https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined',
      },
    ],
  },
});
```


```app.vue
<template>
  <i class="material-icons-outlined">home</i>
</template>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/7128ff33-53e9-44f6-ded3-5f6c5f17e109.png)
Power BI基本学習。CALCULATE関数をSQLBIのビデオで勉強したことまとめ

SQLBIのYouTubeビデオで学習したこと、何度やっても忘れちゃうので書き留めておくことにします。
英語も得意じゃないので、訳しながらやってみながらなのでもしかしたら、受け止め方が違っている可能性もあります。

CALCULATE in DAX #01 から

https://www.youtube.com/watch?v=Tk-7gBt9CDE


自分で用意したデータです。▼

![clculate#1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/30c26d5c-913e-f135-21e4-ea61ed4eb609.png)

合計額の検証用にあらかじめ金額を計算しておきました。
（ビデオとかで出てくる数字は大きすぎてなかなか正しいかどうかわかんないから、正しい数字がわかってると理解しやすいので）

Power BIに取り込んで、色ごとの売上高をテーブルビジュアルにしました。

![clculate#1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/6698e962-9e28-9180-bb4e-683c6807356c.png)

おっと！待て待て。
どうやら、ビデオの中はちゃんとモデリングしてあるっぽい。
これはベタ打ちのデータ。ファクトしかないんだよねと。

まぁ、いいか。これでモデリングしてあるときと、どう動きが違うかやってみることにしよう。せっかくだから。

![clculate#1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/29a2efd3-ebd8-0c14-0c8a-bd43771f2bdb.png)

おお、言われてるとおり、みんな同じ値になってますな。

書いたDAX式は↓↓↓だけ

~~~
Greenの売上 = CALCULATE('売上'[売上高],'売上'[color]="Green")
~~~

ちなみに、この「9000」という数字はGreenの売上合計の数字。でも、どう考えてもblackやGlodの中にGreenの売り上げがあるわけがない。

売上高の中から色がGreenのものをフィルターしているつもりの式だけど実際には違う動きをしているとのこと。
DAX式で実際にはどんな事をしているかを記述すると

~~~
Greenの売上 = CALCULATE('売上'[売上高],FILTER(ALL('売上'[color]),'売上'[color]="Green"))
~~~

なるほど。「black」の行でもすべての売り上げの中から「Green」のだけでフィルターし、次の「Blue」の行でも同じようにすべての売り上げの中から「Green」だけで売上をフィルターするという具合に、すべての行で同じことをしているから全部が同じ値になっているってことだったんだ。

****************************************************************************

ではでは、どうしたら正しく集計して数値をだせるの？
続きのビデをを見てみた。　

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


新顔　KEEPFILTERS関数が出てきた！
この関数はどうやら今されているフィルターをキープしてくれそうだ。さっきのDAX式を変更してみた

~~~
Greenの売上 = CALCULATE('売上'[売上高],KEEPFILTERS('売上'[color]="Green"))
~~~

こうすることで、書いてなくても影響してしまうALL関数の影響をうけずに各色にフィルターされた状態をキープし、そのうえでGreenでフィルターしてくれるということだ！

![clculate#1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/ca1bba98-9319-4ab3-c2d0-ef02e21033a0.png)

わーい！当たり前といえば当たり前の結果だが、さっきはできなかった。そう、Greenの売り上げと言っているのだから、Greenの行だけに集計値がでるのが正しい。なるほど、KEEPFILTERS関数覚えておこう。
さて、続きがある。

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


次はREMOVEFILTERS関数の話のようだ。この関数は今あるフィルターをなしにしてくれる関数とな。
~~~
Allcolors = CALCULATE('売上'[売上高],REMOVEFILTERS('売上'[color]))
~~~

肝心なのはこの、REMOVEFILTERS関数はすべてのフィルターを解除すること。
テーブルの中の色ごとのフィルターだけでなく、スライサーの選択によるFILTERも解除してくれる事を覚えておかなければ！

![clculate#1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/32ba126b-f215-ebbf-c6f9-d6b4d16c5a75.png)

確かに色ごとのFILTERもはずれて、合計売上額と同じ値になっている。

![clculate#1-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/62469fbe-fcf5-d1b2-7701-eaa67fa7e2e7.png)

スライサーでblack、Blue、Goldに絞ると、売上高は３アイテムの売上額になっているけれど、ALLcolorsはスライサーにも影響されずすべての売上高の合計値を保っている。
全体に対する割合などを出すときは必要になるなぁ。なるほど。

このまま、色ごとの集計ではなく店舗ごとの集計になるように変えてみる。

![clculate#1-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434484/f126beba-8cf3-0aff-36ce-918e0f903f2d.png)

おお！！なるほど！！！
色ではなく、店舗ごとの集計にしさらにスライサーでBlack、Blue、Goldを選択している。売上高の列はスライサーの影響で今は３色の合計値が表示されているが、REMOVEFILTERS関数を使ってあるAllcolors列では、スライサーに影響されずに店舗ごとのすべての色の売上合計値を保った値になっている。。。という事だね。

今日の学習はここまで。
続きはまた明日！
謎の/nullリクエストが飛ぶようになって困った話

## 結論

先に結論です。

**`crxMouse Chrome™ Gestures`というChrome拡張機能が原因でした。**

`crxMouse Chrome™ Gestures`を停止すると謎の/nullリクエストは飛ばなくなりました。

## 経緯
最近、WSL版のUbuntu22.04が出たので検証も兼ねて開発環境構築していました。

問題なく動作していたのですが、docker-compose upしてログイン画面からログインするとログインは成功するのですが正しい画面に遷移しませんでした。

Chromeの検証ツールを見ると、ログインリクエストの後に必ず謎の/nullリクエストが飛んでいるようでこのリクエストをルーティングが拾ってしまい404エラーになっていました。

原因は分かったのですが、WSL版のUbuntu22.04起因なのか検証を行いました。

- アプリ側の影響か、Ubuntu22.04の影響か切り分けのため、同じUbuntu22.04上に別アプリでDocker環境を作りリクエスト → 同じく謎の/nullリクエスト
- Ubuntu22.04の影響か切り分けのため、Ubuntu20.04上でDocker環境を作りリクエスト → 同じく謎の/nullリクエスト

ここまでで、アプリでもUbuntu22.04の影響でもなさそうなことがわかりました。また、今まではUbuntu20.04でも発生していなかったため、ほかのことが原因になっていそうです。

色々調べたのですが全然ヒットせず。。

**そういえば、以前Sentry対応をしていたときに謎にURL末尾がxxx/nullのリクエストがあったのを思い出して、「もしかして普通にブラウザ開いたときにもnullリクエストが飛んでいる？」と思いQiitaを開いたところ再現しました。**

**あとは、普通のブラウジングでも発生することが分かったのでChrome拡張機能を疑い切り分けしたところ、`crxMouse Chrome™ Gestures`というChrome拡張機能が原因だということがわかりました。**

## crxMouse Chrome™ Gesturesの検証
### crxMouse Chrome™ Gesturesをオンして、Qiitaを開く

nullのリクエストが飛んでいることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/77a53fc4-6aae-0248-e545-4ed16bbd5e68.png)


### crxMouse Chrome™ Gesturesをオフして、Qiitaを開く

nullの結果はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/2d468f51-2e07-ab35-e6a7-2417ad54a556.png)

## まとめ

思わぬところでハマりました。。
作業しているのがちょうど新しいWSL版のUbuntu22.04を試していたところだったので原因がChrome拡張機能とは思いもよりませんでした。。
同じ症状で困っている人の助けになればうれしいです。
マルチステージビルド使ってみた

# 概要
Dockerfileにてコンテナイメージを作成する際、イメージサイズを削減することが一つのポイントとなってきます(コンテナの起動時間を短縮するため)。イメージサイズの削減を単純に実施するには、レイヤ数を削減することが手っ取り早いですが、これを多用すると保守性が下がってしまいます。

Dockerfileではイメージサイズの削減を目的にマルチステージビルドという実装方法があります。
デプロイ対象のイメージと別にビルド用のイメージを生成し、ビルド用のイメージ内で生成したコンポーネントをデプロイ対象のイメージにコンテンツをコピーしデプロイ対象のイメージサイズを削減することが可能です。

例えば、ビルド用のイメージにてyumでパッケージをインストールし、実行ファイルのみをデプロイ対象のイメージへコピーする、といったことが可能です。
これにより、yumでパッケージをインストールするよりもデプロイ対象のイメージを削減することができます。

# 使ってみた
本記事では、AmazonLinux2のベースにJDK(AmazonCorretto)をインストールしたコンテナイメージを生成します。これをマルチステージビルドを使わない場合、使う場合でイメージサイズの比較を行います。
```Dockerfile:非マルチステージビルド Dockerfile
FROM public.ecr.aws/amazonlinux/amazonlinux:2
# JDKインストール
RUN yum -y install java-11-amazon-corretto-headless
```

```Dockerfile:マルチステージビルド Dockerfile
# build-stage
FROM public.ecr.aws/amazonlinux/amazonlinux:2 as build-stage
# JDKインストール
RUN yum -y install java-11-amazon-corretto-headless

# Deploy
FROM public.ecr.aws/amazonlinux/amazonlinux:2
# コピー先のディレクトリを作成
RUN mkdir -p /usr/lib/jvm/java-11-amazon-corretto.x86_64/
# JDK(headless)をコピー
COPY --from=build-stage /usr/lib/jvm/java-11-amazon-corretto.x86_64/ /usr/lib/jvm/java-11-amazon-corretto.x86_64/
# javaコマンドを利用するためのシンボリックリンクの作成
RUN ln -s /usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java /usr/bin/java

```
マルチステージビルド補足：
ビルド用イメージはFrom句にasを付与しビルドイメージ名を指定します。
```
FROM public.ecr.aws/amazonlinux/amazonlinux:2 as build-stage
```

ビルド用イメージの生成物を利用するためには、COPY句に--from=＜ビルドイメージ名＞という感じで指定します。
```
COPY --from=build-stage ・・・
```

なお、asの指定がない場合、数値になります。(0,1・・・)
この場合、"COPY --from=0"のような感じになります。

```sh:結果
$ docker image ls
REPOSITORY                               TAG       IMAGE ID       CREATED         SIZE
not-multi                                v01       76f28683e68d   14 minutes ago  852MB
multi                                    v01       9ec10bdf41bc   4 seconds ago   484MB
```

マルチステージビルドを利用した場合、約40%のイメージサイズ削減になりました。

# まとめ
マルチステージビルドは学習コストがかかりますが、利用することでイメージサイズを削減することができる方法です。
pythonによるStandard受験編254

問題254


```math
p,qを定数としてp≠0とする\\
関数f(x)=px^3-qx+p
はx=αで極大値αを持つとする。\\
このときαの値

を求めよ。
そのときのqをpで表せ


```







```
import sympy 
α,x,p,q= symbols('α x p q')
f=p*x*x*x - q*x+p
fa=f.subs(x,α)-q#f(α)=qなので
fa
```

```
f1=sympy.diff(f, x)#f(x)を微分
expr1=f1.subs(x, α)#
expr1
```

```
solve([expr1, fa],[q,α])#連立方程式を解く,q,αに関して
```
問題256
```math
関数f(x)=(x-1)^2(x+1)^2について次の問いに答えよ\\
(1)関数Y=f(x)の増減及び極値を調べてそのグラフの概形をかけ\\

(2)tを変数とする。関数をy=f(x)のグラフ上の点(t,f(t))における接線lの方程式tを用いて表せ\\


```


```
import sympy as sp
x,t= sp.symbols('x t')

f=(x-1)*(x-1)*(x+1)*(x+1)
f1=sympy.diff(f, x)
katamuki=f1.subs(x,t)

yy=katamuki*(x-t)-f.subs(x,t)
sp.expand(yy)

```


```

ans=sp.solve(f1,x)
for xx in ans:
    fa=f.subs(x,xx)
    print("x=",xx,"極値",fa)



```

```
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-2, 2, 0.02)
y=(x-1)*(x-1)*(x+1)*(x+1)
plt.grid()
plt.ylim(-0.5,2)
plt.plot(x, y)




```
Android Work Manager version 2.7.1にてPeriodicWorkRequestが実行されない場合の対処方法

# 概要
Work Manager version 2.7.1 にてPeriodicWorkRequest.Builder() class を使用した際に処理が実行されない。

# 動作環境

* Android 12
* compileSdkVersion：31
* targetSdkVersion：31

# 処理が実行されない例

``` kotlin:

fun createPeriodicWork24Hr () {
    val periodicWork = PeriodicWorkRequest.Builder(
        MyPeriodicWorker::class.java,
        24, TimeUnit.HOURS,
        15, TimeUnit.MINUTES  
	).build()
}

```

# 処理の実行を確認した例

``` kotlin:

fun createPeriodicWork24Hr () {
    val periodicWork = PeriodicWorkRequestBuilder<MyPeriodicWorker>(
        24, TimeUnit.HOURS,
        15, TimeUnit.MINUTES
    ).build()
}

```
初投稿！Parsing error

# Vue.js　初エラー

Vue.jsでアプリ開発してみようという事で、
初めて vue create （ファイル名）　を実行しました。

すると、どのファイルを開いても以下のエラーが出てきました。

```

"Parsing error: No Babel config file detected for....

```

調べてみたところ、
__VS Codeで、Vueプロジェクトが作成され、Vueプロジェクトのルートディレクトリで開かれていない場合、babel.config.jsが読み込まれず、IDEがbabelconfigの場所について混乱するという問題に遭遇する。__
とのこと




## 解決策

__VScodeのsetting.jsonに以下を追記__

```
"eslint.workingDirectories": [
        {"mode": "auto"}
 ],
```


__settings.jsonファイルにアクセスするには、[Ctrl+,ファイル]>[設定]>[設定]をクリックし、検索バーにeslintと入力して、[オプション]の[settings.json]で[編集]があります。__


これで私は解決できました。
私と同じく初学者の方などの参考に少しでもなれたら嬉しいです。



[参考記事](https://stackoverflow.com/questions/71271760/parsing-error-no-babel-config-file-detected-when-ide-not-open-at-vue-projects)