OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】Pandasを使って売上分析【xlsxを読み込む】

<h2>目的</h2>
某サイトの売上分析を行う。
売上増減の要因を把握するために、商品ごとに売上を確認。
増減への貢献度（が高い商品についてさらに詳しく分析。

いつもやっている流れは
1.週間レポート（全トランザクションデータ）を商品名ごとに集計
2.増減に関与している商品を見つける
3.そこからリファラルなど詳細を調べて、解決策を探る。

特に統計的なことはなく、単純にEXCELで毎週しているデータ整理などの作業を自動化し、分析自体にもっと時間を費やしたいと思い、初心者ながらやってみることに。


<h2>Pythonにやってもらうこと</h2>
1.EXCELファイル（.xlsx）を読み込んで、データフレームに落とし込む
2.いらない行を削除
3.商品名やその他必要な項目ごとに集計
4.シートに書き出して、保存

<h2>xlsxファイルを読み込む</h2>
pandasはインストール済みなので、

```
import pandas as pd

df = pd.read_excal('ファイルパス')
```

すると次のエラーが発生。

```
ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.
```

調べてみると、EXCELファイルを読み込むにはxlrdをインストールしないといけないらしい。
ということで、Terminalで以下を実行。

```
pip3 install xlrd
```

次に出たエラーがこちら。

```
raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+'; not supported')
xlrd.biffh.XLRDError: Excel xlsx file; not supported
```

調べてみると、xlrd(2.01)はxlsファイル以外のサポートを終了したとのこと。
解決方法は
1. xlrdのふるい古いバージョンをインストールする（セキュリティ上の問題があるかも）

```
pip install xlrd==1.2.0
```

2. openpyxlを用いてxlsxファイルを開く


```
import openpyxl
pandas.read_excel(‘ファイル名（ファイルパス）’, engine=’openpyxl’)
```

セキュリティの観点からこちらを採用。
xlsxファイルの最終的な読み込み＋データフレームへの落とし込みコードはこちら。

````
import pandas as pd
import openpyxl

df = pd.read_excel('ファイル名', engine='openpyxl')
```


参照
https://obgynai.com/python-pandas-excel-read/
https://stackoverflow.com/questions/65254535/xlrd-biffh-xlrderror-excel-xlsx-file-not-supported
https://exerror.com/xlrd-biffh-xlrderror-excel-xlsx-file-not-supported/

<h2>ピボットテーブルの要領で商品ごとに集計</h2>
EXCELのピボットテーブルの機能は、pivot_tableで実行できます。

基本の型はこちら。

```
pd.pivot_table(df, index='行データ', columns='列データ', values='数値', aggfunc='sum')
```

indexとcolumns,valuesには、表のデーブルヘッダー名に置き換える。
aggfuncは集計方法です（sumは合計）。
今回は'商品名'ごとの売上'数量'の'合計'を見たいだけなので、columnsは削除。

実行結果はこんな感じになります。

```
商品名　　数量
A　　　　　12
B　　　　　55
C　　　　　8
```

ひとまずここまで。

参照
https://pyhoo.jp/pivot
FlutterでCanvasで作った図形をビットマップ画像に変換する

FlutterでGoogleMapを使用するためのパッケージ google_maps_flutter を設定するにあたり、マーカーを独自に設定する必要がありました。
ビットマップイメージに変換する事に馴染みがなく、思いのほか手こずったので、共有したいと思います。

##### 使用しているツールのバージョン
 - Dart SDK version: 2.10.4
 - Flutter version: 1.22.5
 - google_maps_flutter: ^1.0.6


##### やりたいこと
- Canvasで作った図形をマーカーとして表示したい

##### 難しかったこと
- Canvasで作った図形は、マーカーとして直接指定できない
- GoogleMapに渡すには、画像データに変換する必要がある

```dart:main.dart
import 'dart:ui' as ui;

// Canvasの図形をビットマップにして返す
Future<BitmapDescriptor> getMarker() async {

  // Canvasの命令をレコーディングするPictureRecorderを宣言
  final ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
  
  // Canvasにレコーダーを設定
  final Canvas canvas = Canvas(pictureRecorder);
  
  // 塗り潰しを設定
  final Paint paint = Paint()
    ..isAntiAlias = true
    ..color = Colors.orange
    ..strokeWidth = 1.0
    ..style = PaintingStyle.fill;

  // 図形を描いていく
  var path = Path();
  path.moveTo(xxx, xxx);
  path.lineTo(xxx, xxx);
  .......
  canvas.drawPath(path, paint);

  // レコーディング完了、Imageに変換
  final image = await pictureRecorder.endRecording().toImage(xxx, xxx);
  // PNGのバイトデータに変換
  final data = await image.toByteData(format: ui.ImageByteFormat.png);
  // バイトの配列に変換
  final Uint8List bytes = data.buffer.asUint8List();
  // バイトをビットマップに変換
  return BitmapDescriptor.fromBytes(markerIcon);
}
```

`BitmapDescriptor` は google_maps_flutter に定義されているクラスで、マーカーの定義クラスです。
Node.js 特定の値が含まれているJSONファイルを振り分ける

エンタメ系企業の社内もろもろを担当しているakibinです。

[Twitterアカウント](https://twitter.com/akibinmusic)
[Youtubeチャンネル](https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg)

最近、[Shuta Hasunuma Philharmonic Orchestra / HOLIDAY feat. Moeka Shiotsuka](https://www.youtube.com/watch?v=MZ6rCoJGTdA)にハマってます。春らしくて春が待ち遠しくなりますよ寒いの飽きたよいいかげんにしてほしい。

# 概要
Node.jsで特定の値が含まれているJSONファイルをピックアップして、他のディレクトリにコピーしました。
なぜかと言うと、Markdown形式のWikiアプリから他のアプリに移行するのに、特定の値から移行したいJSONファイルを振り分ける必要があったからなのです。

# そのもの
今回はJSONファイルのgroupsという項目の中のIDが"1111"だった以下のような場合にコピーする感じです。
`"groups":[{"id":1111,"name":"ファイルが所属していたグループ名"}]`

```js
'use strict';

// ターゲットのグループIDを指定
const targetGroup = "1111";

// 全ファイル名を取得
const fs = require("fs");
const dirPath = "./全jsonファイルの保存先";
const allDirents = fs.readdirSync(dirPath, { withFileTypes: true });
const fileNames = allDirents.filter(dirent => dirent.isFile()).map(({ name }) => name);

//ファイル数取得
const allFilesNum = fileNames.length;

//ターゲット数カウント(無くても良い)
var targetGroupNum = 0;

//カウンター
var counter = 0;

//コピー先
var copyFileDir = "./ｊｓｏｎファイルのコピー先";

for (let counter = 0; counter < allFilesNum; counter++) {
    var fileData = require(dirPath + "/" + fileNames[counter]);
    var fileGroups = fileData["groups"][0]; //groupsの項目がグループIDの１つであれば、これだけでグループIDを取得可能

    // groupsに値の有無確認、ある場合はグループIDを取得
    var notValue = undefined;

    if (fileGroups != notValue){
        var groupId = fileGroups.id;

        // ファイルのグループIDがターゲットのIDだった場合の処理
        if (groupId == targetGroup){
            //ターゲットグループ数をカウント(無くても良い)
            var targetGroupNum = ++targetGroupNum;
            console.log(targetGroupNum);

            //ファイルのコピー
            fs.copyFile(dirPath + "/" + fileNames[counter], copyFileDir + "/" + fileNames[counter], (err) => {
                if (err) throw err;

                console.log('ファイルをコピーしました');
            });
        }
    }
}
```

以上！
【Laravel】Dockerコンテナ内でのユーザー認証導入

初めまして！
スクールではRuby on Railsを学習。
就活の関係でPHPの学習始めたばかりです。
初めて1からLaravelで作成するので記録を残します。


## DockerでLaravelの開発環境を作成

これに関しては[こちら](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)の記事を参考にというかもうそのまま使わせて頂きました！
大変わかりやすかったです。
ありがとうございました！


## ユーザー認証導入

ユーザー登録やログイン機能の実装です。
Railsだとdeviseで簡単にできるイメージでしたが結構つまりました。
Dockerというのが理解が追いついていないので難しかったです。

`目標物`
Laravelの標準のユーザー認証機能の導入
![スクリーンショット 2021-01-25 13.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/6387d6cf-83ab-5d98-bcf3-85d7e47aad7c.png)


### まずコンテナ内に入ります

```PHP:ターミナル
% docker-compose exec app bash
```

### コンテナ内でユーザー認証導入のコマンドを入力します

```PHP:コンテナ
composer require laravel/ui
```

ここで下記のエラーが発生しました。

```
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)
```

調べると「メモリ不足なのでインストールできないよ」とのこと。
なので

```PHP:コンテナ
COMPOSER_MEMORY_LIMIT=-1 composer require laravel/ui
```

上記のコマンドは一時的に容量を無制限にするコマンドのようです。
[こちら](https://qiita.com/96kuroguro/items/51a7be874e624227a3bb)の記事を参考にさせていただきました！ありがとうございます。

### vue.jsを元にしたテンプレートの認証機能を追加します

```PHP:コンテナ
php artisan ui vue --auth
```

下記のように出れば成功です。

```PHP
Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
Authentication scaffolding generated successfully.
```

これでvue.jsを書く初期状態が完成。
`app/Http/Controllers/Auth`にはバックエンドでの認証機能関係のファイルが追加されます。
`resources/views/auth`にはフロントエンド関係のviewファイルが追加されます。


ここまでで一旦は認証機能の導入が終わりましたが、まだ表示が崩れたままです。


### 画面を整えるためNode.jsのパッケージ管理ツールをインストールします。

```PHP:コンテナ
npm install && npm run dev
```

そうすると

```PHP
npm: command not found
```

とエラー。
Node.jsのインストールしてなかったからみたいです(それはそうですね)
[公式](https://nodejs.org/ja/)からインストールし再実行するも変わらず。
インストールの確認のためコンテナから出て
`which node`と入力すると`/usr/local/bin/node`と出力され
`npm -v`と入力すると`6.14.10`と出力されるがコンテナ内で行うと出てこないのでコンテナ内にNodeが存在しないことが原因と分かりました。

コンテナ内に反映させるため,`php/Dockerfile`のWORKDIRの前に以下を追加します。

```PHP
COPY --from=node:12.20 /usr/local/bin /usr/local/bin
COPY --from=node:12.20 /usr/local/lib /usr/local/lib
```

コンテナから抜けてビルドし直します。

```PHP
docker-compose up -d --build
```

このあと再度コンテナ内に入り`npm install && npm run dev`で無事完了。
`public/js`と`public/css`に新しいファイルが生成されます。


### リアルタイムでコンパイルさせる

phpのコンテナ内で

```PHP
npm run watch-poll
```

を実行することでコードを書きながらでもリアルタイムでjsがコンパイルされ画面が反映されます。


## 完成


以上です！
ご指摘などございましたらよろしくお願い致します！
cronでpythonプログラムの実行をスケジューリングする方法

1時間おきにpythonプログラムを実行させたいとする。
例として1時間おきに更新される情報をスクレイピングしたい場合などである。
その様な場合、例えばfor文で回して処理の最後にtime.sleepすることで対応できる。
ただ、これは処理を実行させ続けるという意味でリソースの無駄遣いである。
この様な場合はtime-based schedulerでプログラムの実行管理ができる。

このtime-based schedulerとしてUNIX系ではcronが使える。

#####その際には以下が必要になる。
- 実行するプログラム(pythonプログラム)
- いつそのプログラムが実行されるかを指示するファイル(crontab)


# 本記事に含まれる内容
- crontabの書式
- cronの実行手順

# crontabの書式
cronではまずcrontabを用意する必要があり、cronを管理するconfigファイルの様なものである。書式は以下の通りである。以下を見ても明らかな通り、最短の実行間隔は1分である。

```bash
# +------------ minute (0 - 59)
# | +---------- hour (0 - 23)
# | | +-------- day of the month (1 - 31)
# | | | +------ month (1 - 12)
# | | | | +---- day of the week (0 - 6) (Sunday=0)
# | | | | |
# * * * * * command to execute
```

毎日、0時0分に実行したい場合は以下となる

```bash
0 0 * * *
```

30分おきに実行したい場合は以下となる

```bash
0,30 * * * *
```

オフセットが違うだけで以下も30分おきの実行となる

```bash
15,45 * * * *
```

月曜日の午前6時40分のみ実行したいとする

```bash
40 6 * * 1
```

午前9時から午後6時まで30分おきの実行をしたい場合は以下である

```bash
0, 30 9-18 * * *
```

毎時10分おきの実行をしたい場合は以下である

```bash
0-59/10 * * *
```

予め用意されている定義もある
以下は1月1日の24時に実行される(= 0 0 1 1 *)

```bash
@yearly command
```
以下はrebootされる度に実行したい場合

```bash
@reboot
```
# cronの実行手順

実行するpythonプログラムとして以下を用意する。
実行内容としてはtimeスタンプ結果を名前とするディレクトリの作成である。


```mkdir.py
import os
import time

print('Now : ', time.time())
os.mkdir(str(int(time.time())))
```

上記のファイルを毎分実行したいとする。
ここでcronを使うため、crontabを編集モードで開く。

```bash
$ crontab -e
```

内容を確認する場合は以下の引数となる。

```bash
$ crontab -l
```
実行ファイルを毎分実行したい場合は以下の通り。

```bash
* * * * * cd {実行ファイルの保存先} && python mkdir.py
```

cronはsh shellを使っており低レベルのエイリアスがわからない場合がある。
例えばファイル実行時にpython3を用いる場合はpython3の場所を絶対pathで示す必要がある。
以下でpython3の場所を取得し、

```bash
$ whereis python3
```

取得したpathは以下の様に記載する。

```bash
* * * * * cd {実行ファイルの保存先} && {python3の絶対パス} mkdir.py
```

一方、cronはback ground processなのでmkdir.py内のprint関数の出力は目視で確認できない。以下とすることで、print関数の出力をlogファイルに出力できる。

```bash
* * * * * cd {実行ファイルの保存先} && python mkdir.py >> mkdir.out
```
以上までで、crontabの編集は終了しており、毎分の書き込まれるlogファイルの内容は以下のコマンドで確認できる

```bash
$ tail -f mkdir.out
```
Material-UIのusemediaQueryの初期値が常にfalseになる事を回避する方法

日本語情報が見つからなかったため(※1)備忘録として残しておきます。

※1: Material-UIの公式ドキュメントの日本語訳には存在するが翻訳が少しわかりにくい

# 状況

`useMediaQuery()`で横幅が`992px`以上であることを判定したいが、初回の`useMediaQuery`の返り値が`false`のため2回レンダーされパフォーマンス的によろしくない。

```react
const isWide = useMediaQuery('(min-width: 992px)')
console.log(isWide)

// console↓
// false
// true
```

# 対応策

この機能はサーバーサイドレンダリング(SSR)をする時には必要(あると便利・・・？)らしいのですが、SSRが必要ないアプリのためこの機能をオフにします。

```react
const isWide = useMediaQuery('(min-width: 992px)', {noSsr: true})
console.log(isWide)

// console↓
// true
```

# 参考

[useMediaQuery - Material-UI](https://material-ui.com/components/use-media-query/)

>Arguments
1. query (String | Function): A string representing the media query to handle or a callback function accepting the theme (in the context) that returns a string.
2. options (Object [optional]):
- options.defaultMatches (Boolean [optional]): As window.matchMedia() is unavailable on the server, we return a default matches during the first mount. The default value is false.
- options.matchMedia (Function [optional]) You can provide your own implementation of matchMedia. This can be used for handling an iframe content window.
- **options.noSsr (Boolean [optional]): Defaults to false. In order to perform the server-side rendering reconciliation, it needs to render twice. A first time with nothing and a second time with the children. This double pass rendering cycle comes with a drawback. It's slower. You can set this flag to true if you are not doing server-side rendering.**
- options.ssrMatchMedia (Function [optional]) You can provide your own implementation of matchMedia in a server-side rendering context.
pythonプログラムをbackground processで使用する方法

procesには2種類あり、forward processとbackground processである。
forward processは処理が終了するまで他のプログラムの実行ができない。
プログラムの実行をしつつ、他の作業も行いたい場合にはbackground processが有効である。

# 本記事に含まれる内容
- background process化と終了方法
- 実行結果をファイルに出力する方法
- ターミナルウィンドウを閉じてもプロセスを終了させない方法


# background process化と終了方法

数字を毎秒足し上げていくsum.pyを実行したいファイルとする。

```sum.py
import time

x = 0
while True:
   time.sleep(1)
   x += 1
   print(x)
```
下記実行後、毎秒加算の結果が出力される

```bash
$ python sum.py
```
以下とすることで、プロセスIDが出力されbackgroundで実行され続ける

```bash
$ python sum.py &
```
このプロセスを終了する場合は以下の通り

```bash
$ kill -9 {プロセスID}
```
# 実行結果をファイルに出力する方法

上記のまでの方法ではterminalに実行結果が出力され続ける。
他の作業を行なっている場合にこれは煩わしいので、新規にファイルを作成し、実行結果をファイルに出力することを考える。

以下でoutという名前のファイルを作成した。

```bash
$ python sum.py > out &
```
作成したoutというファイルに出力があるか確認するため、outの最終行を確認する。

```bash
$ tail -f out
```
上記を実行しても出力はない。
また、以下を実行してもファイルは空であることが確認される。

```bash
$ cat out 
```

これは実行されたPythonプログラムの出力はバッファメモリに保存されるためである。つまり実行したPythonプログラムの処理が終了するまでoutには書き込みされない。


以下とすることで、逐次的にファイルに保存される。

```bash
$ python -u sum.py > out &
```
作成したoutというファイルに出力があることが確認できる。

```bash
$ tail -f out
```
# ターミナルウィンドウを閉じてもプロセスを終了させない方法

上記までの方法ではファイル実行中のターミナルウィンドウを閉じると処理が停止する。以下を実行することで処理が終了されない。

```bash
$ nohup python -u add.py &
```
(nohupはno hung upの略)

以下を省略した理由は、nohupを使用した場合出力先を指定しなくても自動的にログファイルが生成されるからである。

```bash
> out
```

以下の様にプロセスを終了したい場合、
まず実行中のプロセスのうち、add.pyに関わるものをマッチングで検索する。

```bash
$ ps ax | grep add.py
```
取得したプロセスIDを終了する。

```bash
$ kill -9 {プロセスID}
```
【ExcelVBA】緯度経度の表示変換（度分秒→10進、10進→度分秒）

```vb

'############################################################
'#緯度経度の表示方法を変換する
'#
'#　引数1：str（度分秒もしくは10進数で書かれた緯度or経度）
'#　引数2：i（省略時0：小数第何位まで表示させるか。四捨五入）
'#　戻値：度分秒の場合は10進数表記、10進数の場合は度分秒表記に変換された結果
'#　想定：日本国内（緯度経度ともに正の場合）
'#　対応表記：「°」「′」「’」「'」「″」※日本語の「度分秒」には対応していない
'#
'############################################################
Function Conv経緯度(ByVal str As String, Optional ByVal i As Long)

Dim 度 As Long, 分 As Long, 秒 As Double
If IsNumeric(str) = True Then
    '10進数→度分秒
    度 = Int(str)
    分 = Int((str - 度) * 60)
    秒 = Round(((str - 度) * 60 - 分) * 60, i)
    Conv経緯度 = 度 & "°" & 分 & "′" & 秒 & "″"
Else
    '度分秒→10進数
    str = StrConv(str, vbNarrow)        '「’」（全角）と「'」（半角）混在対処で半角に
    str = Replace(str, "'", "′")       '「'」を「′」に統一
    
    度 = Split(str, "°")(0)
    分 = Split(Split(str, "′")(0), "°")(1)
    秒 = Val(Split(str, "′")(1))
    Conv経緯度 = 度 + 分 / 60 + 秒 / 3600
End If

End Function

```
```c

Sub test()
Debug.Print Conv経緯度("35°41′9.564""", 3)
Debug.Print Conv経緯度(35.68599, 6)

 35.686
35°41′9.564″
End Sub
```
JavaScript: 型変換を利用した簡易的な書き方

# 数値型から文字列への変換
```javascript:足し算は文字列連結の可能性と数値計算の可能性があるが、前者とみなされる。
const num = 999;
console.log(typeof num); //number
console.log(typeof num.toString()); //string
console.log(typeof (num + '')); //string
```

# 文字列から数値型への変換
```javascript:引き算によって数値型に暗黙的に型変換される（文字列連結の可能性はないため？）
const str = '1000';
console.log(typeof str); //string
console.log(typeof Number(str)); //number
console.log(typeof parseInt(str)); //number
console.log(typeof +str); //number
console.log(typeof (str - 0)); //number
````
AppleScript スクリプトバンドル覚え書き

#オブジェクト指向言語 AppleScript
**DTP** の現場での **AppleScript** は、
**Illustrator** や **InDesign** の流し込みをさせたり、
ファイルの管理や整理を行なわせたりと、
**「かゆいところに手が届く」**使われ方をしています。

クライアントが増えるごとに
クライアント特有の流し込みやデータベース管理を
**AppleScript** で組むことになりますが、
似たような処理を使い回す必要が出てきます。

この**「似たような処理を使い回す」**という点について、
ユーザーによっては
過去に作ったプログラムを開いて、
必要な部分をコピペして新たなプログラムに組み込む、
という作業を行なっていると思います。

ところが、
**AppleScript** は
**Script Libraries** という機能を実装しており、
過去に作ったプログラムをライブラリ(パーツ)として
そのまま使い回せるようになっています。

いわゆる
[オブジェクト指向プログラミング](https://e-words.jp/w/オブジェクト指向プログラミング.html)が
実践できるのです。

#スクリプトバンドルを作る
論より証拠、作ってみましょう。
最初にライブラリとなるスクリプトを作成します。

**(1)以下のスクリプトを、デスクトップに保存。
　ファイル名は「myAlert.scpt」とします。**

```AppleScript:sample1
on do(theTXT)
	display alert theTXT
end do
```
<details><summary>**手順1**(gif)</summary><div>
![0125_13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/06034526-89ea-4bcf-2db6-1789032c17ec.gif)
</div></details>
***
次に スクリプトバンドル のファイルを作ります。
**(2)新規ドキュメントを開いて、保存。
　「ファイルフォーマット」を「スクリプトバンドル」に。**
※拡張子が「.scptd」になっていればOK。

<details><summary>**手順2**(gif)</summary><div>
![0125_11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/b3e764bf-425e-8875-0ee8-968552025778.gif)
</div></details>
***
**(3)ウィンドウの「バンドルの内容」をクリック、
　 右側にウィンドウが表示されたら、右クリックで「新規フォルダ」を選択。
　 さらに「名称未設定フォルダ」を右クリックして「名称変更」、
　「Script Libraries」に変更。**

<details><summary>**手順3**(gif)</summary><div>
![0125_12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/8c7b3d64-f92b-6d0f-67f2-44a296fe3650.gif)
</div></details>
***
**(4)今作った「Script Libraries」フォルダに、
  (1)で作った「myAlert.scpt」ファイルを入れます。**

<details><summary>**手順4**(gif)</summary><div>
![0125_14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/e8a2db4d-dce0-c89b-13e0-357ec6147722.gif)
</div></details>
ここまでで、準備完了です。
#スクリプトバンドルの使い方
あとは、
「Script Libraries」フォルダに入れたファイルから、
サブルーチン(ハンドラ)を呼び出すだけです。

スクリプトバンドル「名称未設定.scptd」に、
以下を打ち込んで実行してみてください。

```AppleScript:sample2
script "myAlert"'s do("Hello World")
```

<details><summary>**手順5**(gif)</summary><div>
![0125_15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/0da81b09-6ef1-239e-ec5c-da678f45f58e.gif)
</div></details>
***
**「こんなの、わざわざライブラリにしなくても、display alert でよくね？」**

と思った方は、
スクリプトバンドル「名称未設定.scptd」に、
以下を打ち込んで実行してみてください。

```AppleScript:sample3
property myAlert : script "myAlert"'s do

myAlert("Hello World")
```
<details><summary>**手順6**(gif)</summary><div>
![0125_16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/fc47548a-45e2-73c4-f121-505e90cfceea.gif)
</div></details>
こうすることで、トップレベル(メインスレッド)なら
いつでも「myAlert()」でハンドラ呼び出しができるので、
見通しがかなりすっきりします。

#ライブラリファイルはエイリアスも可
やってみたらできました。

<details><summary>**手順7**(gif)</summary><div>
![0125_17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500852/70c139b2-1c19-6194-ccf1-3c6b9d7b1477.gif)
</div></details>
#次は！
ということで、
「スクリプトバンドル」とは、
・スクリプトファイルなのにフォルダを内包している不思議なファイル
なのでした。

これを使うことで、
過去に作ったハンドラをライブラリとして保管、
使い回しが簡単に行なえます。

次回はこれに
**script object** を入れて
高速処理をしてみたいと思います。
【BizRobo!】 Clickステップでエラーが出る際のTips

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
DeviceAutomation(以下DA)にて、Clickステップを作成し、
実行した際に、該当の箇所が上手くクリック出来ていないまま、
次のステップに進んでしまい、LocationFoundなどでエラーが出てしまっている際のTipsです。

## Tips概要
DA上のClickステップは以下の3ステップで出来上がっています。
![Clickステップ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/24439047-d444-f3bd-ffea-25929448d824.png)

上記のステップ中にある、「MoveMouse」で上手く該当箇所まで、
ポインタが動き切らず、ポインタ到着前に次の「Click」ステップが開始されてしまう事で、
エラーとなっていまうケースがあります。
本Tipsは、そんなエラーを解消する可能性のある内容となります。

## Tips詳細
実施する事はシンプルです。
上記の図にある「Guard」の『Component』と、「Move Mouse」の『Component』を一致させ、
ポインタが移動する先を、なるべく特定した状態で稼働させる事で、
エラーを発生させにくくする方法になります。
![Clickステップ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/1c64a50f-013c-e776-2249-bd22c9caf4cd.png)

<設定前>
![Clickステップ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/25ba5093-e4cc-fd88-1827-c99b87e423f4.png)


<設定後>
![Clickステップ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/60b832f7-0d89-d56c-e01f-287339ddf02f.png)

以上で設定は完了です。
あとは、何度かステップをテストし、問題なく稼働するか確認する。
(※ただし、設定後にクリックする箇所が変わったりなどのメンテナンスが発生した際に、
　　Componentを二度修正しなければいけないという手間は若干発生します。)


## まとめ
今回は、クリックステップでエラーが発生した際のステップの作成方法になります。
こういったTipsは公式のknowledgeBaseなどにも載っていないかなと思うので、
引き続き展開していきますので、よろしくお願いいたします！！
ベイズフィルタからカルマンフィルタを導出


タイトルの通り、ベイズフィルタからカルマンフィルタを導出します。
ベイズフィルタについては以前[こちら](https://qiita.com/hokudai_meiyo/items/007129dd7fb038bd2375)で書きました。その確率密度関数に正規分布の確率密度関数を代入しカルマンフィルタの公式がきちんと導出されるか確認いたしました。非常に数式が多くなるので、導出に関しては作成したPDFを[こちら](https://drive.google.com/file/d/1QlCyj9f5KY0gbyronkacLg7EfEMMWi5_/view?usp=sharing)にうpしときます。今回もいつにもまして手抜き記事ですいません！許してください！何でもしますから！


記事の内容はリンク先のPDFに書いたので、結果だけ申し上げますと、予測分布、フィルタリング分布、平滑化分布がすべてが正規分布になることが示せました。それぞれのパラメータも導出できましたが、特に平滑化分布のパラメータは非常に汚い形となり、これを整理していけばカルマン平滑化の公式に一致するのか疑問です。まだ検証していませんが、今後検証していきたいと思います。

計算ミスや論理的な誤りなどございましたら何なりとお申し付けくださいませ。
面倒な作業を自動化する秀丸マクロの使い方



##手順：
・秀丸インストール
https://hide.maruo.co.jp/software/hidemaru.html

・新規マクロの作成
マクロタブ→マクロ実行→マクロ編集

・マクロファイル内に以下のような要領で記入
replaceall "変換対象文字列","変換後文字列"; 
※細かいマクロの内容については以下のリンク参照
https://help.maruo.co.jp/hidemac/html/080_CmdStatement_Search_replaceall_replaceallfast.html

・マクロ実行


```bat:relpace.mac
// 通常の置換
replaceall "検索文字列", "置換後文字列";

// 正規表現の置換
replaceall "¥"検索文字列¥".*", "置換後文字列",regular;


```
JavaScript: truthyとfalsy、およびショートサーキット評価

# Truthy or Falsy

- Booleanコンテキストに現れた時に true とみなされる値=truthy
- Booleanコンテキストに現れた時に false とみなされる値=falsy
- falsyのものは以下のもののみ。
    - false
    - 0
    - -0
    - 0n
    - "" （空文字）
    - null
    - undefined
    - NaN(Not a Number)

https://developer.mozilla.org/ja/docs/Glossary/Truthy

# 確認

```javascript
console.log(Boolean(false)); //false
console.log(Boolean(0)); //false
console.log(Boolean(-0)); //false
console.log(Boolean(0n)); //false
console.log(Boolean("")); //false
console.log(Boolean(undefined)); //false
console.log(Boolean(NaN)); //false
```

これ以外のものは全部truthyである。例えば、すごく奇妙なことではあるが、以下の結果はtrueである。

```javascript
console.log(Boolean(new Boolean(false))); //true
```

#利用例1:変数チェック

```javascript:文字列が空であるかどうかのチェック
function helloname(name) {
    //nameが空であるかどうかのチェック
    if (!name) {
        name = 'Taro';
    }

    console.log("Hello " + name)
}
helloname();
```


# 利用例2:変数チェック＋代入を一気にやる方法（ショートサーキット評価）

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators
>論理演算子は左から右へ評価されるため、論理演算子で左辺を評価した時点で論理式の結果が確定した場合には右辺の評価を行わないことを、ショートサーキット評価といいます。例えば、A && Bという論理式があった場合、Aがfalseなら、その時点で式全体の結果はfalseで確定するため、Bがどうであるかについてはチェックしません。:

```javascript:valがtruthyならそのまま代入。valがfalsyなら評価を終了して右項に移動。
let val = "";
let x = val || "Bob";
console.log(x); //Bob
```

```javascript:エラーがあればエラーメッセージを表示
error = new Error('foo');
console.log(error && error.message); //foo
```
E137:viminfoファイルが書き込みできない時に確認すること

※メモとして残しておく、あくまで一つの方法として試してください
すぐに知りたい人は解法へ

#前置き
新年を迎え、サーバーを立ち上げた後から突然に、
```E137:viminfoファイルに書き込みできません　
```

と告げられた


##root権限なんて持ってない

ネットで調べるもroot権限でviminf*を削除しろとか書いてあるけれども、そんな権限は持ってない

##環境
cent os(7, 8)でこれ以上の詳しいことは知らない。




#解法：権限を確認
~/.viminfoファイルの　権限を確認して欲しい
```-rw-------  1 nobody nobody  2153  1月 25 13:50 .viminfo```

と、なっていた

```chmod 606 .viminfo```

筆者に　read write 権限
グループに　権限なし
他に　read write　権限
となるようにコマンドを入力して権限を変更した

参考- [Linuxの権限確認と変更(chmod)（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)

変更後
```-rw----rw-  1 nobody nobody   976  1月 25 14:05 .viminfo```


**エラーが出なくなった!!!**

#終わり
おそらく何らかの影響かミスで権限が変更されてしまっていたのだろう

権限というのは意外と見落としてしまう点かもしれないので、このエラーが起きた人はまず確認してみて欲しい
Flutterの勉強内容を書き出すだけのやつ1(環境構築編)

#モチベーション
Flutterは2018年にVersion 1.0が正式リリースした比較的新しいツールキットです。そのため、初めてFlutterを触る人、Flutterを学びたいという人が情報を得ようとすると数少ない日本語サイトを探したり、英語の公式サイトを見たり、正直に言って面倒です。私もこれを書いている現在、Flutterに関しては初心者ですが、今後新しく勉強しようという人たちのための助けになればいいかなと思います。

#Flutterとは
[Flutter](https://flutter.dev/)とは、モバイルアプリやウェブアプリ、デスクトップアプリを単一のコードから開発するGoogle製のUIツールキットです。iOSやAndroidのアプリ作成できるフレームワークには他にReact Native やXamarinがありますが、最近のGoogleトレンドによるとしばらくFlutter優位が続いているようです。

![trend.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/4be5d45d-6b10-1dc8-bc96-9328a6c10341.jpeg)


Flutterでのアプリ開発にはDartというプログラミング言語を使います。

#Flutterの環境設定
Flutterの環境設定のために
[https://flutter.dev/docs/get-started/install](https://flutter.dev/docs/get-started/install)
からFlutter SDKをタウンロードし、環境変数を設定します。

その後、コマンドプロンプトかPowerShellから以下のコマンドを実行します。
※私の開発環境はWindowsなので、Windowsでの設定を説明します。

```
flutter doctor
```

各項目でチェックがついていない場合、注釈に従えば問題ないと思いますが、

+ AndroidStudioを入れる。環境変数ANDROID_HOMEを設定する。
+ Xcode(Macユーザー)を入れる。
+ IDEのFlutterプラグインを追加する。
+ 仮想デバイスシミュレータを起動する。(Connected deviceはシミュレータを起動していないとチェックされない)
+ Android toolchainに表示されているコマンドを打ってもエラーになる。 => Java8をインストールする。

あたりを気を付ければ良いと思います。

# Flutterプロジェクトの作成
Flutterプロジェクトの作成するためにAndroid Studioを起動します。(エディタに指定はありませんが今回はAndroid Studioで解説します)Android Studioを起動したら、Create New Flutter Project　⇒ Flutter Application[Next]の順に選択します。

![AndroidStudio1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/469ed74d-b969-a040-0136-274980cce1a8.jpeg)

![AndroidStudio2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/70473035-0eca-c0d5-7e86-6821b2b09cae.jpeg)

次にプロジェクト名、Flutter SDKへのパス、プロジェクトディレクトリ位置、プロジェクト説明を設定します。Flutter SDKへのパスは...\flutter\binではなく、...\flutterまでの指定です。

![AndroidStudio3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/18004111-0a2c-c63d-6087-98d057ea6a3d.jpeg)

最後にパッケージ名を指定して終了です。今回はリリース予定がないためデフォルトからの変更はありませんが、Google Playストアなどにリリースする場合は一意に定まるアプリケーションIDが必要となるため、パッケージ名を予め設定しましょう。

![AndroidStudio4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/b5c3746f-f67e-abca-7398-45a2a7cc9e62.jpeg)

エディタが開かれた後、シミュレートするデバイスを選択し、再生ボタンをクリックしてテンプレートアプリが立ち上がったら環境構築は終わりです。

![AndroidStudio5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167019/7cbbedc2-80d3-4e84-ef5a-4028cb2055e1.jpeg)

# 参考になりそうなサイト等
+ [Flutter公式](https://flutter.dev/)
+ [Flutter Doc JP](https://flutter.ctrnost.com/)
+ [Dart](https://dart.dev/)
+ [Flutter of the Week](https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG)
+ [Flutterの効率良い学び方](https://medium.com/flutter-jp/flutter-learning-c5640c5f05b9)
+ [Flutter Layout Cheat Sheet](https://medium.com/flutter-community/flutter-layout-cheat-sheet-5363348d037e)
DockerでAlpine LinuxのZabbix 5.0グラフが豆腐になる日本語表示を修正するメモ

# 背景
Zabbixのグラフ表示で日本語が豆腐に文字化けする件は古からよくある話で、
ネットで検索すると色々解決方法があります。
まずはそれらを参考にした方が良いかと思います。

そんな中でここでは昨今ではよく使われるDockerコンテナ環境での事例になります。
Zabbixの公式Dockerコンテナには、Alpine,CentOS,Ubuntuの3つがあります。
今回はあまり情報が少ない感じのAlpine LinuxのDockerコンテナ環境をメモします。


# 動作環境

## ホスト側

- OS:Ubuntu 18.04LTS Docker環境
- Docker version 20.10.2
- docker-compose version 1.27.4


## コンテナ側

- Zabbix 5.0 公式 Docker コンテナ Alpine版


# Zabbix Docker動作方法

以下のページにて紹介しています。参考にしてみて下さい。

- [DockerでZabbix Server 5.0の構築してみた - Qiita] (https://qiita.com/ohhara_shiojiri/items/90e692c19af760ab4e53)


# Zabbix Dockerコンテナのフロントエンドでの修正方法

Zabbix webフロントエンド側のコンテナに入ります。
5.0と5.2まではapacheコンテナ側でしたが、5.4ではnginxコンテナ側に変わりました。

5.4の場合

```
$ docker exec -it -u root zabbix-docker_zabbix-web-nginx-mysql_1 /bin/bash
```

5.0または5.2の場合

```
$ docker exec -it -u root zabbix-docker_zabbix-web-apache-mysql_1 /bin/bash
```

Alpineのパッケージを一通り更新しておきます。

```
$ apk update && apk upgrade
```

日本語のフォントをインストールします。

```
$ apk add font-noto font-noto-cjk
```

フォント情報を更新します。

```
$ fc-cache -fv
```

既存のZabbixグラフの文字フォントをバックアップします。

```
$ mv /usr/share/zabbix/assets/fonts/DejaVuSans.ttf /usr/share/zabbix/assets/fonts/DejaVuSans.ttf.bak

```

日本語のフォントをシンボリックリンクで割り当てます。

```
$ ln -s /usr/share/fonts/noto/NotoSansCJK-Regular.ttc /usr/share/zabbix/assets/fonts/DejaVuSans.ttf
```

これでZabbixのグラフで豆腐の文字化けから日本語に修正出来ていると思います。

お疲れさまでした。
【Ruby on Rails Tutorial】6章のテストでエラー

# 【Ruby on Rails Tutorial】6章のテストでエラー
<!-- 発端や概要を記載 -->
Ruby on Rails Tutorial 6章の「リスト 6.10」を実行。
すると、あるエラーが発生した。
その後はいつも通りライアーゲームのBGMが脳内で流れると共に膝から崩れ落ちて就寝。
次の日の朝「直すか……」

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [どういうエラー？](#どういうエラー)
1. [解決法は？](#解決法は)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#どういうエラー"></a>
# どういうエラー？

以下のようなエラーが発生。

```言語名:ターミナル

PS C:\Users\(ユーザー名)\Desktop\Web\Ruby\rails_tutorial\sample_app2> rails test:models

ansi: 'gem install win32console' to use color on Windows
LoadError: UNIXServer is required
per.rb:9:in `<class:TestCase>'
C:/Users/(ユーザー名)/Desktop/Web/Ruby/rails_tutorial/sample_app2/test/test_helper.rb:7:in `<top (required)>'
C:/Users/(ユーザー名)/Desktop/Web/Ruby/rails_tutorial/sample_app2/test/models/user_test.rb:1:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => test:models
(See full trace by running task with --trace)
```


　エラー文を読み解いてみる→それで頑張ってググるなどした。しかし、そのように出てきた情報で解決したわけではない。
　なんか前にも似たようなことがあった気がすると考え、それをやってみたら直った。それを記す。

####

<a id="#解決法は"></a>
# 解決法は？

まず悪さをしていたのは以下の「これを直すんや」の部分である。
ちなみに正確に言うと悪いのはこいつではない。
テストコードのテストを１つずつやってみたら、すんなりと成功(GREEN)するのだ。
つまり、悪さをしているのは並行処理を行うことでエラーが起きるRailsの方である。

```Ruby:system>test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative "../config/environment"
require "rails/test_help"

class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  parallelize(workers: :number_of_processors, with: :threads) # ←これを直すんや

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

```

```Ruby:system>test_helper.rb
  parallelize(workers: 1) # ←こうするんや
```
すると

```ターミナル
 PS C:\Users\(ユーザー名)\Desktop\Web\Ruby\rails_tutorial\sample_app2> rails test:models
Started with run options --seed 34075


  /0: [=---=---=---=---=---=---=---=---=---=-] 0% Time: 00:00:00,  ETA: 
  2/0: [                                     ] 0% Time: 00:00:00,  ETA: 
  2/1: [==================                  ] 50% Time: 00:00:00,  ETA: 
  2/2: [===================================] 100% Time: 00:00:00, Time: 
00:00:00

Finished in 0.23506s
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
```

テスト成功。



<a id="#参考文献"></a>
# 参考文献
- [Ruby on Rails Tutorial 3章](https://railstutorial.jp/chapters/static_pages?version=6.0#cha-static_pages)
- [わいの脳みそ](URL)
MS Learnアカウントに複数アカウントを紐づける方法

# MS Learnアカウントに複数アカウントを紐づける方法

## MS Learnにログイン後、プロフィール設定に移動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/0af68198-1b41-d552-1285-d3fd90172b00.png)

## プロフィール画面に移動したら、ひだり側の `設定` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/a33d0528-a5a7-772b-ddf8-13b0441c8235.png)


## アカウント管理項目のアカウント追加をクリックする
 - アカウントの追加をクリックして、紐づけを行いたいアカウントを追加する
    - 例：会社のアカウントなど
 - 認証後、プライバシーに関する声明が表示される。同意するとアカウントが追加される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/2a07c2e5-61d1-4da6-19e4-955fafe0d2e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/4432cf31-591d-ee6f-8e24-7f222723e564.png)

# 注意：統合しようとしてるMS Learnアカウントがすでにアカウント作成済だとエラーになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227518/d0ceb53e-3286-a869-9e6c-5faf7b03b3de.png)
python のクラス

#python クラス
##参考
https://rinatz.github.io/python-book/ch03-02-scopes/
## クラス定義

```python:test.py
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def area(self):
        return self.width * self.height


def main():
    rectagle = Rectangle(10, 20)
    print(f'The value of width is {rectangle.width}')
    print(f'The value of height is {rectangle.height}')


if __name__ '__main__':
    main()
```

###関数
クラスのメンバとして定義された関数はメソッドとも呼ばれる。クラスに関数を定義するとき、第1引数が`self`である必要がある。実際には`Rectangle.area(rectangle)`にように呼び出される。
###継承

```python:test2.py
class Square(Rectangle):
    def __init__(self, size):
        super().__init__(size, size)


def main():
    square = Square(10)
    area = square.area()
    print(f'The area is {area}')


if __name__ == '__main__':
    main()
```

`Square`クラスは`Rectangle`クラスのメンバをすべて引き継いでいる。これをクラスの継承という。`Rectangle`が長方形を扱うのに対して`Square`は正方形を扱う。`Rectangle`が持つすべてのメンバ`square.width, square.height, square.area()`を参照できる。


## スコープ
Pythonではすべてのメンバが`Public`として扱われるが、習慣として下記のようにスコープを区別するようになっている。

| スコープ | 命名規則 |
|:-:|:-:|
| public | method() |
| protected | _method() |
| private | __method() |

## 特殊属性
### \_\_doc__
`Print.__doc__`には`"""..."""`で囲まれた改行を含む複数行の文字列を定義できる。

```
"""この文字列は
1つの文字列として
扱われます。"""
```

### \_\_init__
クラスのインスタンスを初期化する。

### \_\_getattribute__
クラスのメンバやメソッドを参照したときに呼び出される。

```python:test4.py
point = Point(10, 20)
point.x # point.__getattribute__('x')
point.distance() # point.__getattribute__('distance')()
```
### \_\_getattr__
`__getattributrre__()`でのメンバ参照に失敗した場合に呼び出される。定義されていないものにアクセスすると起こる。

```python:test5.py
point.x2 # point.__getattribute__('x2')
```

### \_\_getitem__
クラスインスタンスに対して`[]`を使用したときに呼び出される。

```python:test6.py
point = Point(10, 20)
point['x'] # point.__getitem__('x')
```

### \_\_setattr__
メンバの代入をしたときに呼び出される。

```python:test7.py
point = Point(10, 20)
point.x = 30 # point.__setattr__('x', 30)
```

### 比較
| 特殊属性 | 意味 |
|:-:|:-:|
| \_\_ne\_\_ | point1 != point2 |
| \_\_le\_\_ | point1 <= point2 |
| \_\_lt\_\_ | point1 < point2 |
| \_\_ge\_\_ | point1 >= point2 |
| \_\_gt\_\_ | point1 > point2 |

### \_\_str__
文字列へのキャストを行うときに呼び出される。

```python:test8.py
point = Point(10, 20)
print(point) # print(point.__str__())
```
【備忘】Ubuntu proxy設定

# 環境変数

```bash
export http_proxy=<proxyのURL>
export no_proxy=<no_proxyのホスト>

cat <<EOF | sudo tee /etc/profile.d/proxy.sh
export http_proxy=${http_proxy}
export https_proxy=\${http_proxy}
export HTTP_PROXY=\${http_proxy}
export HTTPS_PROXY=\${http_proxy}
export no_proxy=${no_proxy}
export NO_PROXY=\${no_proxy}
EOF
source /etc/profile.d/proxy.sh
```

# Apt

```bash
export http_proxy=<proxyのURL>

cat <<EOF | sudo tee /etc/apt/apt.conf.d/90proxy
Acquire::http::Proxy "${http_proxy}";
Acquire::https::Proxy "${http_proxy}";
EOF
```

# Snap

```bash
export http_proxy=<proxyのURL>

sudo snap set system proxy.http=${http_proxy}
sudo snap set system proxy.https=${http_proxy}
```

確認方法

```bash
sudo snap get system proxy.http
sudo snap get system proxy.https
```

# Docker

```bash
export http_proxy=<proxyのURL>
export no_proxy=<プライベートリポジトリがあれば、そのホストを指定>

sudo mkdir /etc/systemd/system/docker.service.d
cat <<EOF | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=${http_proxy}"
Environment="HTTPS_PROXY=${https_proxy}"
Environment="NO_PROXY=${no_proxy}"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker.service
```

# containerd

```bash
export http_proxy=<proxyのURL>
export no_proxy=<プライベートリポジトリがあれば、そのホストを指定>

cat <<EOF | sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=${http_proxy}" "HTTP_PROXY=${http_proxy}" "NO_PROXY=${no_proxy}"
EOF
sudo systemctl daemon-reload
sudo systemctl restart containerd.service
```

# 参考

* https://github.com/kubernetes-sigs/kind/issues/688#issuecomment-508782438
* https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
WOLFMQTT の使い方

wolfssl のインストール

クローン

```bash
git clone https://github.com/wolfSSL/wolssl
```

コンパイル、インストール

```bash
./autogen.sh
./configure
make
make check
sudo make install
```

wolfMQTT のインストール

クローン

```bash
git clone https://github.com/wolfSSL/wolfMQTT
```

コンパイル、インストール

```bash
./autogen.sh
./configure
make
sudo make install
```

確認

./examples/mqttclient/mqttclient は、'test' という文字列を publish して、subscribe 状態に入る。
broker.emqx.io をブローカーとしてテストする。

subscribe

```bash
./examples/mqttclient/mqttclient -h broker.emqx.io
```

別のターミナルで次のように publish

```bash
message="Hello Mqtt "`date`
mosquitto_pub -d -t orz -m "${message}" \
	-h  broker.emqx.io \
	--topic wolfMQTT/example/testTopic
```

subscribe

別のターミナルで次のように subscribe

```bash
mosquitto_sub -d -t orz -h broker.emqx.io \
    --topic wolfMQTT/example/testTopic
```

```bash
./examples/mqttclient/mqttclient -h broker.emqx.io
```
cssが適用されない

# 起こった問題
ヘッダーにif文を書き足したらなぜかcssが適用されなくなった。
_header.html.haml

```
// 省略

%ul.lists
-if user_signed_in?
  %li.my-page
    = link_to "名前", user_path(current_user)
  %li.logout
    = link_to "ログアウト", destroy_user_session_path, method: :delete
- else
  %li.login
    = link_to 'ログイン', new_user_session_path
  %li.sign-up
    = link_to '新規登録', new_user_registration_path
```

_posts.scss

```
.lists {
  display: flex;
  align-items: center;
  margin-left: auto;
  font-size: 20px;
  line-height: 20px;
  li {
    margin-right: 30px;
    cursor: pointer;
    }
    a {
      text-decoration: none;
      color: black;
    }
}
```

# 試したこと
1、キャッシュが残っていないかの確認（⌘キーとShiftキーとR同時押し）
2、cssの記述ミス確認
3、他の記述が優先されてないか
4、検証ツールで確認

# 解決した方法
検証ツールで確認したところul要素の中にli要素が入っていなかった。
よくhamlの記述を確認してみるとif文のインデントが一つズレていたそのため、cssが適用されなかった。
_header.html.haml

```
// 省略

%ul.lists
  -if user_signed_in?
    %li.my-page
      = link_to "名前", user_path(current_user)
    %li.logout
      = link_to "ログアウト", destroy_user_session_path, method: :delete
  - else
    %li.login
      = link_to 'ログイン', new_user_session_path
    %li.sign-up
      = link_to '新規登録', new_user_registration_path
```
# 終わりに
cssの記述が間違っていると思ってずっとcssを確認していたがhamlにミスが。
結局初歩的なミスだったのでインデント、タイポなどのミスはなるべく減らしたい。
Djangoの環境構築からプロジェクト作成まで〜

#はじめに
Linux(Ubuntu)でのDjangoの環境構築からプロジェクト作成までをまとめました。
Djangoを勉強し始めたのはつい先日で、使ったコマンドからアウトプットとして記録していきたいなぁと思います。
また、今回の記事は以下の参考サイトに書かれていることを簡易的にまとめたものですので、詳しく知りたい方はそちらの方をご覧ください。

#参考
* [Django Girls](https://tutorial.djangogirls.org/ja/)
* [Django公式](https://docs.djangoproject.com/en/1.11/ref/django-admin/)

#仮想環境(virtual environment)の作成
###ディレクトリの作成
```html:command-line
$ mkdir (作成するディレクトリの名前)
$ cd (作成したディレクトリの名前)
```

###仮想環境の作成
```html:command-line
$ python -m venv myvenv
```
myvenvは仮想環境の名前は以下の条件を守ればどんな名前でも作成可能
* 必ず小文字で表記する
* スペースは入れないこと
ここで作成した名前は今後多く使うことになるからわかりやすいものにしといたほうがいいかも？

###仮想環境を起動
```html:bommand-line
$ source myvenv/bin/activate
```
`source`でできない場合もあるからその時は以下のコマンドを実行

```html:command-line
$ . myvenv/bin/activate
```
行頭に(myvenv)がついたら成功！

#Djangoのインストール
###Djangoのインストールに使うソフトウェアpipの確認

```html:command-line
(myvenv) ~$ python -m pip install --upgrade pip
```

###パッケージのインストール
requirementsファイルでパッケージをインストールする。
requirementsは`pip install`でインストールする依存関係の一覧が記載されているファイル
`requirements.txt`を(作成したディレクトリ)の中に作成する
`requirements.txt`中に以下のテキストを記述

```html:requirements.txt
Django~=2.2.4
```
###Djangoのインストール
以下のコマンドを実行してDjangoをインストールする

```html:command-line
(myvenv) ~$ pip install -r requirements.txt
```

これでDjangoの環境構築が完了！

#Djangoのプロジェクト作成
下記のコマンドでプロジェクトが作成可能

```html:command-line
$ django-admin startproject <プロジェクト名> <作成するディレクトリ>
```
(プロジェクト名)には()を外した状態で好きなものを入れる
一般的に、(作成したディレクトリ)の名前をいれるらしい
作成するディレクトリは省略可能で`.`にすることでカレントディレクトリの直下に展開できる。

###現在のファイル構造

```html:作成したディレクトリ
(作成したディレクトリ)
├── myvenv
├── (プロジェクト名)
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt
└── manage.py

```
ここまでできてたらもう少し...

###各ファイルの説明
(プロジェクト名)の中に入っているファイルの説明をします。
４つのファイルが作成されているはず...
`__init__.py`
Pythonにディレクトリを認識させる為のファイル

`settings.py`
Djangoのプロジェクトに関わる設定を記述したもの

`urls.py`
URLの設定が記述されたもの

`wsgi.py`
サーバーに関する設定が記述されたもの

そのほかにも
`manage.py`
サイトの管理に役立つものでこのファイルを利用することで他のものをインストールすることなく、Webサーバーを起動することができる

###開発用サーバーの起動
以下のコマンドで開発用サーバーを起動できる

```html:command-line
(myvenv)~/<作成したディレクトリ名>$ python manage.py runserver
```

```html:command-line
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
```
上記のようなエラーが出ると思いますが一旦無視して大丈夫です。

ブラウザでhttps://127.0.0.1:8000/ にアクセスする
ロケットが飛んでいる画面が出たら無事にプロジェクトが作成できてます！

#さいごに
自分は最近勉強を始めたばかりの初心者なので間違えている所があったらご指摘していただけたらこちらも勉強になるのでありがたいです。
また、はじめの方にも書きましたが参考にしたサイトの内容を簡易的にまとめた記事なので
これからDjangoを勉強しようとしている方やより詳しいことを知りたい方は参考サイトをご覧ください。
また、アウトプットとしていろいろ書いていきたいなと思います。
今回はご覧いただきありがとうございました。
動かなくなったgcloudを蘇らせる方法

Elixirを使ったIoTプラットフォームのNervesの [Advent Calendar #NervesJP](https://qiita.com/advent-calendar/2020/nervesjp)でNervesととGCP Cloud PubSubを使ってLチカしてました。

- [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜Phoenix/GCPでPub編〜（1/2）](https://qiita.com/nishiuchikazuma/items/6c537342f8815728f69d)
- [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜NervesでSub編〜（2/2）](https://qiita.com/nishiuchikazuma/items/d0d1891349ea5b97a3cc)

久しぶりにGCPでPubSubの動作を確認しようとして、`gcloud`コマンドを実行すると以下のようなエラーが出て動かなくなってしまっていました。

```shell:fish
❯ gcloud -h
...いろいろエラーメッセージ...
AttributeError: module 'importlib' has no attribute 'util'
```

# 環境
- macOS Catalina 10.15.7
- brewを使ってPython等インストール


# 原因
`gcloud`コマンドがpython3.9に対応していないのと新しいバージョンなのでしばらく対応しない方針なので、brewでインストールしているpython3.9だとエラーが出てしまうようです。

# 対応
環境変数`CLOUDSDK_PYTHON`に問題ないバージョン（python3.9じゃないバージョン）のパスを渡してあげるとよいようです。今回はbrewでインストールしていたpython3.8を利用することにしました。

環境変数にパスを設定すると`gcloud`コマンドが使えるようになります。

## 例
```shell:fish
❯ set -x CLOUDSDK_PYTHON /usr/local/Cellar/python@3.8/3.8.7/bin/python3
```

# 参考URL
- [AttributeError:モジュール 'importlib'には属性 'util'がありません](https://python5.com/q/dqdvgbjw)
- [AttributeError: module 'importlib' has no attribute 'util'](https://stackoverflow.com/questions/64010263/attributeerror-module-importlib-has-no-attribute-util)
get-pipを使ったpipインストールでエラーが発生


pipのインストールでエラーが発生しました。

```python
Traceback (most recent call last):
  File "get-pip.py", line 24226, in <module>
    main()
  File "get-pip.py", line 199, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    from pip._internal.cli.main import main as pip_entry_point
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 954, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 896, in _find_spec
  File "<frozen importlib._bootstrap_external>", line 1147, in find_spec
  File "<frozen importlib._bootstrap_external>", line 1123, in _get_spec
  File "<frozen importlib._bootstrap_external>", line 1104, in _legacy_get_spec
  File "<frozen importlib._bootstrap>", line 444, in spec_from_loader
  File "<frozen importlib._bootstrap_external>", line 541, in spec_from_file_location
  File "/tmp/tmphdllod41/pip.zip/pip/_internal/cli/main.py", line 60
    sys.stderr.write(f"ERROR: {exc}")
                                   ^
SyntaxError: invalid syntax
```

get-pipにアップデートがあり、
https://github.com/pypa/get-pip/commit/8cc88aca7d9775fce279e8b84ef163cf1d3e8a2e

get-pip.pyの書き方がpython3.6以降のものになったようです。
https://stackoverflow.com/questions/65866417/pip-install-failing-on-python2

# 解決方法

下記にあるバージョンを指定してあげる
https://bootstrap.pypa.io/

or 

pythonのバージョンを3.6以上にする

で解決できそうです。
AWS Certified Database - Specialty 合格記録

# この記事

**AWS Database Specialty** を取得したので
学習内容や感想を記録します。

# about me

**インフラエンジニア**
AWS関連のインフラ構築や保守を４年ほど経験しています。

Database自体の知識が少ないため、AWSといえど心配でした。

これまでのAWS資格は以下の流れで取得しました。

```
2019
Solution Architect Associate （7月）
SysOps Administrator Associate (9月)
Solution Architect Professional (11月)
Developer Associate (12月)
2020
DevOps Engineer Professional (3月)
Security Specialty（5月）
Advanced Networking(10月)
2021
Database Specialty（1月）
```

# about DBS試験

AWS 認定 データベース – 専門知識
https://aws.amazon.com/jp/certification/certified-database-specialty/

# 試験対策でやったこと

## 試験ガイドとサンプル問題

まずは、どんな内容の問題が出るのか目を通します。
上記リンクの「試験ガイド」「サンプル問題」

>推奨されるAWS の知識
>一般的なデータベーステクノロジーを使用した4年以上の経験。

私の場合、ここが最も不安でした。。

## AWS公式ドキュメントによる対策

ElastiCache、DocumentDB、Neptuneなどあまり使ったことのないDBサービスがあったり
AuroraなどSolution Architectの範囲でも合った部分の復習をしたかったので

毎度おなじみ、こちらで学習しました。
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
※Databases 分野すべて

他に、アーキテクチャはこちらを参考に
https://aws.amazon.com/jp/architecture/
※リファレンスアーキテクチャ「データベース」内

## Udemy

問題集は主にUdemyです。色々漁りました。
様々な問題に慣れる & 不足分の知識を補うというメインの作業です。

## 不足していた知識

学習の前半、主に個人的に知識が不足していた(忘れていたものも多い)のは、以下の様なものでした。

・各DBサービスのバックアップの方法は？制限は？
・MultiAZの有無でどう変わる？どのように動作している？
・監査、セキュリティ対策は具体的にどんなオプションあったっけ？
・復元するのは具体的にどうやるの？

SAPやDOPを取得してから期間も空いていたので、復習作業は半分くらいを占めていたかも。
たまたま学習中にDB移行なんかもやってたので、良い機会でした。
やはり実際に動かすのがベストですね

また、Database自体の知識も最低限は抑えようとしました。
用語の復習などですが。。

```
データ制御（Control）
DCL = GRANT, REVOKE, BEGIN, COMMIT, ROLLBACK

データ定義（Definition）
DDL = CREATE, DROP, ALTER

データ操作（Manipulation）
DML = SELECT, INSERT, UPDATE, DELETE
```

## Tips

問題集やって感じたのが

>分野2: 展開および移行

自分はこの分野が苦手ということでした。

例えば移行要件があった時、時間やコストをかければ手段は複数ありますが、
ベストプラクティスはどれか？という選択が、知識不足だと躓きます。
消去法で２つ残って、そこで悩んでしまう。。

Professionalまでの試験だと、DBサービスの詳細まで聞かれないかも知れないですが、
今回はDatabaseの試験なので隈無くチェックしておいたほうが良いと思います。
問題集やってて、わからなかった点はリストしておき、自分のノートを作ると捗ります。

また、AWSの試験ですので、データベース自体に詳しい方でも
まずはAWSの各DBサービスの違いやそれぞれのメリットからしっかり理解されることをおすすめします。
データベース自体の知識が必要というよりも**AWSDBサービスの知識**が必要でした。
Networkの試験も同様です。

# 結果&まとめ

今回は特に試験が難しく、後半「これは危ういな…」という気持ちでしたがギリギリ合格できました。
あとはいつもの**試験日のルーティン**に助けられました。
試験対策としての学習時間は、40時間程度でした。
場合によっては英語で解いたほうがわかりやすいこともあるので、そちらもおすすめです。

因みに
>分野2: 展開および移行

試験結果もこの分野だけは再学習が必要という内容でした(笑)
あちこち要復習ですね。

## 次の試験
**Data Analytics Specialty**を取ります。
分野的にも続けて取るべきだなと感じたからです。

この記事が何かのお役に立てられれば幸いです。


# 戦いの記録

SAA
https://qiita.com/shinon_uk/items/5525178bf98034676b2f

SOP
https://qiita.com/shinon_uk/items/e60bcb946b49bf5cabda

SAP
・勝利編
https://qiita.com/shinon_uk/items/c6b599d1cd3000e84d59
・敗走編（資料集め）
https://qiita.com/shinon_uk/items/ba839ba048ba439cc3ff

DVA
https://qiita.com/shinon_uk/items/8015953c792ef4bc7223

DOP
https://qiita.com/shinon_uk/items/5646d536e649b60b962a

SCS
https://qiita.com/shinon_uk/items/67fab096f9b85c47de55

ANS
https://qiita.com/shinon_uk/items/05f90e2ff6e9c9e732e8
Djangoでオブジェクトが見つからなかったら404を表示

## 環境
- Django 3.0.3

## オブジェクト1件を取得
オブジェクトを1件取得もしくは、オブジェクトが見つからなかったら404を表示させるには`get_object_or_404 `を使います。

`get_object_or_404(klass, *args, **kwargs)`
[Django のショートカット関数 | Django ドキュメント | Django](https://docs.djangoproject.com/ja/3.0/topics/http/shortcuts/#get-object-or-404)

```
from django.shortcuts import get_object_or_404
from apps.products.models Product

class ProductView(LoginRequiredMixin, generic.TemplateView):
    """ 商品詳細ページ """
    model = Product
    template_name = 'products/detail.html'
    raise_exception = True # 403ページの表示
    pk_url_kwarg = "prroduct_id"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['product'] = get_object_or_404(
                    Product,
                    pk=self.kwargs['product_id']
                 )
        return context
```

### 複数条件で取得
取得条件が複数ある場合はこのように条件を複数指定することもできます。
`filter`を使う必要はありません。

```
from django.shortcuts import get_object_or_404
from apps.products.models Product

class ProductView(LoginRequiredMixin, generic.TemplateView):
    """ 商品詳細ページ """
    model = Product
    template_name = 'products/detail.html'
    raise_exception = True # 403ページの表示
    pk_url_kwarg = "prroduct_id"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['product'] = get_object_or_404(
                    Product,
                    pk=self.kwargs['product_id'],
                    price=10000,
                    title='商品名'
                 )
        return context
```


## オブジェクト複数件を取得
オブジェクトを複数件を取得するには`get_list_or_404 `を使います。
オブジェクトが見つからなかったら404を表示します。

`get_list_or_404(klass, *args, **kwargs)`
[Django のショートカット関数 | Django ドキュメント | Django](https://docs.djangoproject.com/ja/3.0/topics/http/shortcuts/#get-list-or-404)

```
from django.shortcuts import get_object_or_404
from apps.products.models Product

class ProductsView(LoginRequiredMixin, generic.TemplateView):
    """ 商品リストページ """
    model = Product
    template_name = 'products/index.html'
    raise_exception = True # 403ページの表示
    pk_url_kwarg = "prroduct_id"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['products'] = get_list_or_404(
                    Product,
                    price=10000,
                 )
        return context
```

### 複数条件で取得
取得条件が複数ある場合はこのように条件を複数指定することもできます。
`get_list_or_404 `の場合も`filter`を使う必要はありません。

```
from django.shortcuts import get_list_or_404
from apps.products.models Product

class ProductsView(LoginRequiredMixin, generic.TemplateView):
    """ 商品リストページ """
    model = Product
    template_name = 'products/index.html'
    raise_exception = True # 403ページの表示
    pk_url_kwarg = "prroduct_id"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['products'] = get_list_or_404(
                    Product,
                    price=10000,
                    title='商品名'
                 )
        return context
```

## まとめ
`get_object_or_404 `はオブジェクトを1件取得。見つからなかった場合は404を表示。複数条件で検索可能。

`get_list_or_404 `オブジェクトを複数取得。見つからなかった場合は404を表示。複数条件で検索可能。
AWS-RunShellScriptのexecutionTimeout値を変更したい

SSM AutomationのstepにてAWS-RunShellScriptのドキュメントを利用した際のハマったのでメモ。
'aws:runCommand'でEC2インスタンス内shを実行していたが、デフォルトtimeoutの1hを超えてしまった。

# やりたいこと
'aws:runCommand'の実行タイムアウト値を1h→3hに変更したい。

# 前提
Run Commandにはtimeout値が2種類あり、今回変えたいのはExecutionTimeout。
デフォルト3600(1hour)であり、MAX172800(48hours)とのこと。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/monitor-commands.html

# やったこと(NG)
1. ドキュメントのコンテンツにexecutionTimeoutを追加
![スクリーンショット 2021-01-25 11.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294042/417e8a07-9fd4-2113-203b-e682c87dc8d7.png)

実行時間1hを超えるとFailed。
検証のため、60を指定したところ1mの設定になった。1hより短い分には設定できそう。

2. コンソールからexecutionTimeoutを入力
![スクリーンショット 2021-01-25 11.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294042/f5bd26e5-14c1-4842-28b8-c5e93eb7bcdd.png)

同様の結果。

# やったこと(OK)
AWS-RunShellScriptのコピードキュメントを作成し、executionTimeoutを設定。
![スクリーンショット 2021-01-25 11.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294042/ca0646a4-2376-5e80-6724-fbfc91207e9b.png)

複製はできないので、コンテンツをコピーし新規ドキュメントとして作成。
schemaVersion=1.2のドキュメントはバージョン更新できないので注意。