OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】APIから日出、日没、薄明の時間を取得してみた

# 初めに
ダッシュボード作成のために、各種情報をAPIにて取得する
[Sunset and sunrise times API](https://sunrise-sunset.org/api)を使用すると取得できることが判明
⇒Pythonを用い、HP等で表示させる用途を想定
※[PHPバージョン](https://qiita.com/ehjivh/items/03c0507877c6785cd0b6)

## 環境
- Windows10
- Python 3.8.12

## パラメータ
lat (float):必須、取得したい場所の緯度、
lng (float): 必須、取得したい場所の経度
date (string):オプション、YYYY-MM-DDフォーマットにて入力/相対・絶対日時の指定も可能。入力しない場合は現在の時刻を取得する。
callback (string):オプション,Callback function name for JSONP response. 
formatted (integer): オプション、0 か 1 (1 がデフォルト). 0の場合はISO 8601にて出力される。

本コードではsunset_url.formatにてパラメータをセットしてください。

## コード
```python:sunset_time_api.php
# -*- coding:utf-8 -*-
#各種libraryのインポート
import requests
import json
import datetime
from datetime import datetime, timezone, timedelta

# sunset_apiより天気を取得する
sunset_url = "https://api.sunrise-sunset.org/json?lat={lat}&lng={lon}&date={date}&formatted=0"
#各種パラメータをセット
sunset_url = sunset_url.format(lat="35.00000", lon="135.000000", date="today")
sunset_json = requests.get(sunset_url).json()

# ISO8601フォーマット => Datetime_awere(timezoneあり)
utc_sunrise = datetime.fromisoformat(sunset_json["results"]["sunrise"])
utc_sunset = datetime.fromisoformat(sunset_json["results"]["sunset"])
utc_civil_twilight_end = datetime.fromisoformat(
    sunset_json["results"]["civil_twilight_end"])
utc_nautical_twilight_end = datetime.fromisoformat(
    sunset_json["results"]["nautical_twilight_end"])
utc_astronomical_twilight_end = datetime.fromisoformat(
    (sunset_json["results"]["astronomical_twilight_end"]))

# timezone変更（UTC => JST）、表示フォーマットの変更
# 時刻フォーマット例；'%Y年%-m月%-d日 %-H時%-M分%-S秒'
JST = timezone(timedelta(hours=+9), "JST")
sunrise = utc_sunrise.astimezone(JST).strftime('%m/%d %H:%M')
sunset = utc_sunset.astimezone(JST).strftime('%m/%d %H:%M')
civil_twilight_end = utc_civil_twilight_end.astimezone(JST).strftime('%m/%d %H:%M')
nautical_twilight_end = utc_nautical_twilight_end.astimezone(JST).strftime('%m/%d %H:%M')
astronomical_twilight_end = utc_astronomical_twilight_end.astimezone(JST).strftime('%m/%d %H:%M')


print("日の出 : " + sunrise)
print("日の入り："+sunset)
print("市民薄明の終わり：" + civil_twilight_end)
print("航海薄明の終わり：" + nautical_twilight_end)
print("天文薄明の終わり：" + astronomical_twilight_end)
```
# 参考サイト
https://sunrise-sunset.org/api

https://qiita.com/papi_tokei/items/43b1d15a6694f576486c

https://qiita.com/motoki1990/items/8275dbe02d5fd5fa6d2d
Next.jsでIEブロックを行う

動作対象外のブラウザ(IE)でアクセスされた際、警告を出したい場合がありました。
Vue.jsの場合は、index.htmlに直に判定文を記述すればよかったのですが、Next.jsでのやり方がわからず苦戦しました。

調べてみると、当然ながらサポートしていないブラウザで動作させるのでNext.jsのアプリケーション内で制御するのはあまり良くなさそうなので、実現方法を考えてみました。
これ以外にも他にもっといい方法があるかもしれませんが、とりあえず残しておきます。

**※コードはTypeScriptです。**

# IE判定

こんな感じでメッセージを出したいが、pages/_app.tsxに記述するとエラーになる。

```javascript
if (window.document.documentMode) {
  document.write('IEはサポートしていません')
}
```

# _document.tsxの追加

そこで、_document.tsxを利用する。

_document.jsの詳細は[こちら](https://nextjs.org/docs/advanced-features/custom-document)


```react:_document.tsx
import NextDocument, { Html, Head, Main, NextScript } from 'next/document'

export default class MyDocument extends NextDocument {
  render() {
    return (
      <Html>
        <Head>
          <script async src="./scripts/checkBrowser.js" />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    )
  }
}

```

ブラウザの判定ロジックはpublic/scripts/checkBrowser.jsに記述する

```javascript:checkBrowser.js
if (window.document.documentMode) {
  window.location.replace('../ie.html')
}
```

IEの場合、メッセージを表示する用のHTML（public/ie.html）を読み込む


```html:ie.html
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>Unsupported browser</title>
  </head>
  <body>
    <p>
      InternetExplorer（IE）はサポートされていません。最新のブラウザ（Edge）をご利用ください。
    </p>
  </body>
</html>
```

# まとめ

_document.tsxを利用することで、どのURLにアクセスされてもブラウザ判定が可能
raspberry pi 1 model bで、navit その7

#概要

raspberry pi 1 model bで、navitやってみる。
ボタンを表示する。

#ボタンを表示する。

```
sudo nano /etc/navit/navit.xml


```

以下を修正。

```
<osd enabled="no" x="200" y="0" type="compass"/>
<osd enabled="no" type="button" x="-96" y="-96" command="zoom_in()"
     src="zoom_in.xpm"/>
<osd enabled="no" type="button" x="-96" y="0" command="zoom_out()"
     src="zoom_out.xpm"/>


<osd enabled="yes" x="200" y="0" type="compass"/>
<osd enabled="yes" type="button" x="-96" y="-96" command="zoom_in()"
     src="zoom_in.xpm"/>
<osd enabled="yes" type="button" x="-96" y="0" command="zoom_out()"
     src="zoom_out.xpm"/>



```

以上。
AtCoder Beginner Contest 158の[C - Tax Increas]

SwiftでAtCoder Beginner Contest 158の[C - Tax Increas]を解きました。

## 問題内容

> 問題文
消費税率が 8 %のとき A 円、10 ％のとき B 円の消費税が課されるような商品の税抜き価格を求めてください。

> ただし、税抜き価格は正の整数でなければならないものとし、消費税の計算において小数点以下は切り捨てて計算するものとします。

> 条件を満たす税抜き価格が複数存在する場合は最も小さい金額を出力してください。また、条件を満たす税抜き価格が存在しない場合は -1 と出力してください。

https://atcoder.jp/contests/abc158/tasks/abc158_c

## 解答コード

```swift
    import Foundation

    let aa = readLine()!.split(separator: " ").map{ Double($0)! }
    var array : [Int] = []
    
    let minA = Int(ceil(aa[0] / 0.08))
    let maxA = Int(floor((aa[0] + 1) / 0.08))
    
    let minB = Int(ceil(aa[1] / 0.1))
    let maxB = Int(floor((aa[1] + 1) / 0.1))
    
    for i in minA...maxA - 1{
        array.append(i)
    }
    for i in minB...maxB - 1{
        array.append(i)
    }
    var set = Set<Int>()
    let repeated = NSOrderedSet(array: array.filter { !set.insert($0).inserted }).array
    
    print(repeated.first ?? -1)
```

配列の重複部分だけ取り出す際コードは以下のQAを参考にしました。

https://teratail.com/questions/139896

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Raspberry Pi 4B 8GB版にFreeBSDをインストールしRAMDISKからブートしたような環境を作成する

mfsbsdがefiブートに対応していないので、コマンド入力でRAMDISK環境を作成します
今回はラズパイを使用していますが、amd64でも作成可能です

１．準備
　　Raspberry Pi 4B 8GB
　　USBメモリー　８GB以上　または　USB接続できるSSD
　　インターネット環境

２．USBメモリーにFreeBSDをインストールします
　　https://download.freebsd.org/ftp/snapshots/arm64/aarch64/ISO-IMAGES/13.0/
　　から、現時点での最新版　
　　FreeBSD-13.0-STABLE-arm64-aarch64-RPI-20211021-e058d44fda3-247742.img.xz
　　をダウンロードして、お好きな方法でUSBメモリーに書き込みます
　　私は Raspberry Pi Imager を使いました

３．USBメモリーをラズパイに接続してブートします

４．お好みで初期設定をします
　　/etc/rc.conf に以下を追加します
　　keymap=jp
　　powerd_enable="YES"
　　ntpdate_enable="YES"
　　ntpd_enable="YES"

　　/boot/loader.conf の設定を変更します
　　hw.usb.template=0
　　#umodem_load="YES"
　　#boot_multicons="YES"
　　#boot_serial="YES"

　　タイムゾーンを設定します
　　tzsetup

　　SSH サーバーを使用する場合 /etc/ssh/sshd_config を設定してください
　　使用しない場合は /etc/rc.conf で　#sshd_enable="YES" に変更してください

　　reboot します

５．RAMDISK を作成します
　　ramdisk.sh というスクリプトを作成します
　　#!/bin/sh
　　mdconfig -t malloc -s 4g
　　newfs /dev/md0
　　mount /dev/md0 /mnt
　　tar cf - --one-file-system --exclude /usr/tests --exclude /usr/lib/debug
 / | tar xpvf - -C /mnt
　　sed -i -e s/generic/ramdisk/ /mnt/etc/rc.conf
　　sed -i -e s%ufs/rootfs%md0%  /mnt/etc/fstab
　　sed -i -e 3d /mnt/etc/fstab
　　umount /mnt
　　kenv vfs.root.mountfrom=ufs:/dev/md0
　　reboot -r

　　今回は実験用ですので、エラーチェックは行っていません

　　chmod +x ramdisk.sh
　　./ramdisk.sh

　　ホスト名が ramdisk になっていて lonin できれば成功かな？

　　df では
　　Filesystem 1K-blocks   Used   Avail Capacity  Mounted on
　　/dev/md0     4053532 987396 2741856    26%    /
　　となっています


　　厳密には RAMDISK からブートしたのではありません
　　ルートファイルシステムをUSBからmd0に変更していると思われます
　　ごめんなさい、難しいところはよくわかりません

　　これでUSBメモリーを取り外しても大丈夫です
【Jest】APIコールする関数をMock化する【TypeScript】

## Mock化したい関数

例えば、とあるコンポーネントから呼んでいる、下記のようなapiをコールする関数をMock化したいとする

```api.ts

export const sampleApi = async (): Promise<AxiosResponse<Sample>> => {
    return axios
        .get('sample/api')
        .then((res) => {
            return res;
        })
        .catch((err) => {
            return err;
        });
};

```

## Let's Mock化!!

```index.spec.ts
// ①Mock化したい関数をimportする
import { sampleApi } from 'api';

// ②module全体をMock化する
jest.mock('api');

// ③関数をMock化する
const sampleApiMock = sampleApi as jest.MockedFunction<typeof sampleApi>;

// ④③から任意の値を返すようにしたい場合
sampleApiMock.mockResolvedValue({ status: 200, data: 'hogehoge'});

// ⑤beforeEachなりでResetするのを忘れずに
sampleApiMock.mockClear();
```

ちなみに、axios自体をmock化したい場合も同じような形でできます

```index.spec.ts
// ①
import axios from 'axios';

// ②
jest.mock('axios');

// ③
const axiosMock = axios as jest.MockedFunction<typeof axios>;

```


## 参考
[モック関数(Jest公式)](https://jestjs.io/ja/docs/mock-function-api#jestmockedfunction)
Pythonで簡単なc言語のファイルを作成

たくさんのバイナリファイルを作るにあたりc言語のプログラムファイルが必要だったのでPythonでチャチャチャと作った。その回顧録です。
#c言語のプログラムファイルを作成
##数値計算を含まない
文字列をprintfするだけのＣ言語ファイルを100個作るものです。
文字列は、英字の大文字・小文字を5~100文字をランダムに生成したものです。

```strmakefile.py
from random import randint
x_lay = "abcdefghijklmopqrstuvwxyz"
X_lay = str.upper(x_lay)
lay = x_lay + X_lay
laylist = list(lay)
#print(laylist)
#['a', 'b', 'c', 'd'....

for i in range(100):
    str = ""
    strlen = randint(5, 100)
    for k in range(strlen):
        t = randint(0, 45)
        str += laylist[t]
        
    txt = "#include <stdio.h> \nint main(void){\nprintf(\""
    txt = txt+str+"\");\n}"
    filename = f"hoge/hoge{i}.c"
    with open(filename, mode="w") as f:
        s = f.write(txt)
```

これを変数strの生成を行っているところでinputを使うとキーボードで入力したものが表示されるプログラムファイルが作成できる。

##数値計算を含む

これは数値計算をするC言語のプログラムファイルを100個作るものです。
変数txにそれぞれ[a,b,c,d,e]に数値を入れています。
for文でランダムな数字を生成してその長さの式が生成されます。

```nummakefile.py
import random
txt = "#include <stdio.h> \nint main(void){\n"
tx = "int a = 2;\nint b = 3;\nfloat c = 2.34;\nfloat d = 5.98;\nint e = 100;\nfloat x = "
entxt = "\n}"
numlen = ["+","-","*","/"]
var = ["a", "b", "c", "d", "e"]
eof = ";"
for i in range(100):
    m = random.randint(1, 10)
    oppo = txt + tx
    for k in range(m):
        oppo += random.choice(var)
        oppo += random.choice(numlen)
    oppo += random.choice(var)
    oppo += eof + entxt
    filename = f"hoge/hoge{i}.c"
    with open(filename, mode="w") as f:
        f.write(oppo)
```

#コンパイル
まとめてコンパイルする時は、for文を使うといいかも‼

lsの-1オプションでファイル名だけを1行ずつ表示してくれる。
呼び出されたファイル名を変数iに入れてコンパイルする。この時に-oオプションがないと同じバイナリファイルを上書きしていくだけなで、変数iを使ってそれぞれ違う名前のファイルを作成していく。


```
for i in `ls -1 *.c`
do
 gcc $i -o con$i
done
```
[Flutter/Dart] Dependabot がサポートしてくれるまでの繋ぎの GitHub Actions

https://github.com/dependabot/dependabot-core/issues/2166 が resolve されるまで、GitHub Actions で dependencies の定期更新をしたい時の話。

## Flutter
https://github.com/sensuikan1973/pedax/blob/main/.github/workflows/flutter_deps.yaml から抜粋。

```yaml
# TODO: If https://github.com/dependabot/dependabot-core/issues/2166 is resolved, this workflow becomes unnecessary.
name: Upgrade Flutter Dependencies

on:
  schedule:
    - cron: '0 1 * * 5' # every Friday, 01:00 (UTC)
  workflow_dispatch:

jobs:
  upgrade_flutter_dependencies:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: subosito/flutter-action@v1

      - run: flutter doctor -v
      - run: flutter pub upgrade --null-safety # See: https://dart.dev/tools/pub/cmd/pub-upgrade#--null-safety

      # See: https://github.com/peter-evans/create-pull-request/tree/master#reference-example
      - name: create PR
        uses: peter-evans/create-pull-request@v3
        with:
          token: ${{ secrets.PAT }} # See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs
          commit-message: '[Scheduled] `flutter pub upgrade --null-safety`'
          title: '[Scheduled] `flutter pub upgrade --null-safety`'
          body: |
            Auto-generated by [create-pull-request](https://github.com/peter-evans/create-pull-request)
            ---
            See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs
          delete-branch: true
          labels: dependencies
```

## Dart
https://github.com/sensuikan1973/dart-boilerplate/blob/main/.github/workflows/dart_deps.yaml から抜粋。

```yaml
# TODO: If https://github.com/dependabot/dependabot-core/issues/2166 is resolved, this workflow becomes unnecessary.
name: Upgrade Dart Dependencies

on:
  schedule:
    - cron: '0 1 * * 5' # every Friday, 01:00 (UTC)
  workflow_dispatch:

jobs:
  upgrade_dart_dependencies:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: dart-lang/setup-dart@v1

      - run: dart pub upgrade --null-safety # See: https://dart.dev/tools/pub/cmd/pub-upgrade#--null-safety

      # See: https://github.com/peter-evans/create-pull-request/tree/master#reference-example
      - name: create PR
        uses: peter-evans/create-pull-request@v3
        with:
          token: ${{ secrets.PAT }} # See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs
          commit-message: '[Scheduled] `dart pub upgrade --null-safety`'
          title: '[Scheduled] `dart pub upgrade --null-safety`'
          body: |
            Auto-generated by [create-pull-request](https://github.com/peter-evans/create-pull-request)
            ---
            See: https://github.com/peter-evans/create-pull-request/blob/master/docs/concepts-guidelines.md#triggering-further-workflow-runs
          delete-branch: true
          labels: dependencies
```
【Rust】ビルドする時に"Error finalizing incremental compilation session directory `path`: Permission denied (os error 13)" と警告される

#環境
- Windows 10
- Ubuntu 18.04 LTS (WSLで実行)
- VSCodeを使用

#エラー
Rustのチュートリアル([https://www.rust-lang.org/ja/learn/get-started](https://www.rust-lang.org/ja/learn/get-started))でフェリス:crab:を表示させるプログラムをビルドすると以下のような警告が出る。

```
warning: Error finalizing incremental compilation session directory `/home/hoge/hello-rust/target/debug/incremental/hello_rust-299femrl6jqky/s-g37i7q3wft-lcl3r5-working`: Permission denied (os error 13)

warning: `hello-rust` (bin "hello-rust") generated 1 warning

Finished dev [unoptimized + debuginfo] target(s) in 35.92s
```

ビルドは正常に終了してるし、実行も問題なくできていますが、毎回警告されると鬱陶しいので解決します。

#原因
とりあえずググってみると以下のようなトピックを見つけました。
https://users.rust-lang.org/t/strange-cargo-build-file-permission-warnings/46980
https://github.com/rust-lang/rust/issues/62031
どうやらVSCodeを使っていることが問題らしい。

#解決方法
WSLを使っていたので、WSL2にすれば解決しました。
##WSL -> WSL2への移行方法
まずpower shellを開き、現在使っているWSLバージョンを確認。

```
PS C:\Users\hoge> wsl --list --verbose
NAME            STATE           VERSION
Ubuntu-18.04    Stopped         1   
```

VERSIONが1なのでWSL1を使っていると分かる。

https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
にアクセスし、書いてある通りにLinux カーネル更新プログラムパッケージをダウンロードします。
続けて以下を実行すると、今後Linuxをインストールする時にWSLのバージョンが2で固定されます。

```
PS C:\Users\hoge> wsl --set-default-version 2
```

ただこの状態では以前インストールしたLinuxでのWSLのバージョンは1のままなので

```
PS C:\Users\hoge> wsl --list --verbose
NAME            STATE           VERSION
Ubuntu-18.04    Stopped         1   
```

ここから以下を実行して変更します。

```
PS C:\Users\hoge> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります... 
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください 
変換が完了しました。
```

変換は数分で終わると書かれていますが、環境によってはもっと長い時間がかかるので気長に待ちましょう。
最後に変更が完了しているか確かめます。

```
PS C:\Users\hoge> wsl --list --verbose
NAME            STATE           VERSION
Ubuntu-18.04    Stopped         2   
```

VERSIONが2になっており、無事に変更が完了したことが分かります。

##Rustで警告が表示されないことを確認
`./target`を削除してから、ビルドしなおし、実行します。

```
user@DESKTOP:~/rust_program/hello-rust$ cargo run
   Compiling smawk v0.3.1
   Compiling unicode-width v0.1.9
   Compiling smallvec v0.4.5
   Compiling textwrap v0.13.4
   Compiling ferris-says v0.2.1
   Compiling hello-rust v0.1.0 (/home/hoge/rust_program/hello-rust)
    Finished dev [unoptimized + debuginfo] target(s) in 1.98s
     Running `target/debug/hello-rust`
 ___________________________
< Hello fellow Rustaceans! >
 ---------------------------
        \
         \
            _~^~^~_
        \) /  o o  \ (/
          '_   -   _'
          / '-----' \
```

無事に警告なしでフェリスを表示することができました。
#最後に
よいRustライフを！:crab:
某ECショップの管理FTPサーバーが優秀すぎた件

FTPサーバーもかなり優秀なんだなぁと。
いや、FTPソフトが優秀なのか？
...
先日、社内の初心者向けに簡易で作ったHTML・CSS・JSファイルのセットを、URL持たせて誰でもアクセスできるようにしようと、自分が管理している某ECショップのFTPサーバー上にファイルをアップロードすると、何故かHTMLファイルだけがアップロードに失敗し、無理やりアップできたものの50KBほどのファイルが0KBになるという事件が発生。
FTPソフトがバグったのかと思いアンインストール・再度インストールするも、やは0KBになる、、、
...
ネットで同じような事例を発見するも、「0KBになったFTPサーバー上のファイル消して再度アップでいけるべ」の一点張りで、試してみるもやはり0KB。キューに移動させて再度試すも失敗。
...
詰みかと思ったが、そこでようやく気が付いた。
...
HTMLファイルの中のURL、他のモール（AMAZONとかのそれ）のURLも一部混じっとるやないか！
...
独自サーバーにホストを切り替えると、はい、解決。
...
無知だっただけなんですが、中身もしっかり判定してるのねあなた...と感心しました、そんなお話です。
[Rails]初心者でほぼぶっつけ本番で映画レビューサイトを作ってみた件

#前置き
もう3年近く前の話で、すごい今更で記憶もちょっと曖昧ですけど、記録としてまとめてみようと思いました(笑)
就活と学校の進級制作展兼コンテストのために作ったものなので、結構力を入れました

かなり昔に一度だけRuby on Railsを触ったことがあるが、その時はまだjava初心者レベルでhtml/cssやhttpやデータベースなどの知識も一切なかったので、全く理解できず諦めました。
今回は学校の授業でhtml/cssを習って、http関連知識やSQL構文などを少し触ったおかけで、[**チュートリアル**](https://railstutorial.jp/chapters/beginning?version=5.0)を読みながら書いてましたが、思ったより早いペースで順調に進めることができました。

完全に自分の作品なので、試してみたいことをとりあえず一通り詰め込んでみましたw

#画面

###URL
https://moasis.herokuapp.com/
（無料プランなので、DBのレコード数はもう制限オーバーでINSERT処理できなくなりました）
（パソコン画面のために作ったので、スマホ画面のレイアウトは超軽く調整しただけ）
管理者アカウント：julia@example.com/password

###ホームページ
(どうでもいい情報：名前はMOVIE+OASISの組み合わせによる造語、ロゴも合わせて映画のイメージと木のの組み合わせ設計しましたw)
![MOASIS (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310783/2ff7ff02-6b90-61c3-45ea-d0fa3921dcb8.png)


#使用した映画DB及びrailsのAPI利用ツール
こちらの記事でまとめました
https://qiita.com/julia817/items/522da21edee1bf69994b

#詰まってたところ

##チュートリアルのuserモデルとSNSアカウントでログインする機能が衝突によるエラーが発生
こちらの記事でまとめました
https://qiita.com/julia817/items/7908c01984a291b74966

##ページネーション
[チュートリアル](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.0#sec-pagination)通りに試してみましたが、will_paginate gemは確か配列に対応しないので、うまくいかなかったです
調べてみた結果、[kaminari gem](https://github.com/kaminari/kaminari)を使用することにしました
全然記憶がないけど、ぱっと見bootstrapとかは多分[これぽい記事](https://qiita.com/residenti/items/1ae1e5ceb59c0729c0b9)を参考したと思います

##データベースの構築
完全の初心者でマークした映画リストをどうやってユーザと結びつくとかも全然わからなくて、映画をサンプルした記事もほどんとなかったので、音楽リストなどの記事を色々調べて真似してみたらうまく行きましたw
（プレゼンのために軽く図を書いたけど、保存しなかったかも..もし見つかったらまた追記する）

##画像アップロード
なんかリサイズとか色々全然うまくいかなくて、結構詰まってましたが、時間もあんまりないので、最低限のアップロード機能しか実装してないです。本番S3に切り替えるのも諦めて、プロフィール画像アップロードしても30分後ぐらいにデフォルト画像に戻ります

#おすすめツール

##グラフ(chartkick)
https://chartkick.com/
一行で簡単にグラフを作れる

##カウンターキャッシュ(counter_culture)
https://github.com/magnusvk/counter_culture
高度なカウンターキャッシュ機能で、「いいね」カウンターとして使いました

##SNS共有(addthis)
https://www.addthis.com/
2行でSNS共有ボタンを追加できるツール
![スクリーンショット 2021-10-26 13.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310783/52d755c4-ad09-9707-50bb-24e2774cd869.png)


#最後に
一応ソースコードも公開します：https://github.com/julia817/moasis ご参考まで...
とにかく試しに一つの成果物を完成させたいという感覚でしたので、コードの細かいところは全然気にしてなかったし、バグや未完成の部分はもう完全に放置状態です(笑)
とにかく作品作りの達成感と爽快感が最高です！！
これからも頑張って行きます！！
SELECT文でUPDATE文を作成

# はじめに
SQL文(SELECT文)を実行してSQL文(UPDATE文)を作成します。

SELECTした結果を基にSQLを作成したい場合などに使えます。

前まではEXCELに取り込んでSQLを作成していましたが、これのおかげで手間が減りました。知っていればどうという事はないですが。。

## 入力
```sql
SELECT '今回書きたいこと' FROM table WHERE condition;
```

## 出力
```sql
?column?
------------------------------------------------------------------------------
UPDATE table2 SET column3 = 'value1_1' WHERE column4 = 'value2_1';
UPDATE table2 SET column3 = 'value1_2' WHERE column4 = 'value2_2';
UPDATE table2 SET column3 = 'value1_3' WHERE column4 = 'value2_3';
....
```
# 動作環境
記事作成に利用した環境はPostgreSQLです。
gexecコマンドはPostgreSQL 9.6以上で利用可能です。

# どのように？
以下のようにSELECTリスト（SELECTとFROMの間にあるキーワード）で文字列連結を利用してUPDATE文を作成します。

```sql
SELECT 'UPDATE table2 SET column3 = ''' || value1 || ''' WHERE column4 = ''' || value2 || ''';' FROM table WHERE condition;
```

そのまま結果を実行したい場合は上記のSELECT文に\gexecを付けます。
UnityでGoogleAdmobを通すときにつまづいた事

新しくアプリをリリースするためにまずテスト広告を付けて実機で実装するために(ストアにリリースするために使うゲーム画面の画像を撮るために)手間取ってので書いておきます。

###・開発環境
・Unity2019.1.5F1
・Windows8.1
・Android
・Mobile Ads Unity

###・やったこと
まずunityで作ったプロジェクトに広告を入れるためにMobile Ads Unity **6.0.0**を入れてビルドしてみましたが、エラーが出ました。
コンソールに大量のエラーが出て色んなのが出て自分ではわかりませんでした、がSO-DATAという事を書かれてたのでももしかしたらUnityバージョンがAdsに合ってないのかな？と思いAdsのバージョンを5.4.0を入れなおして再度ビルドしたら成功しました。


###・まとめ
~~Adsを提供してるgithubにそういう事を書かれてるんだろうけど英語で理解できませんでした。
今後GoogleAdMobを入れる時はUnityバージョンとAdsバージョンを確認して合うのを入れるという感じが良いと思いました。~~
結果的にビルドできたのは
unity2019とMobileAdsUnity5.x.x(5.4.0確認済み)
~~Unity2020とMobileAdsUnity6.x.x？(未検証)~~
~~だとエラーなくビルドが通るみたいです。~~
こういう組み合わせでした。

###追伸
後々色々聞いたりした結果WindowsのOSが原因かもというコメントを見たのでもしかしたらそれが原因かもしれませんが原因追及することはできませんでした。
Unity設計入門：第3章「出力の手法1・監視型View」・理論編

[Unity設計入門の目次はこちら](https://qiita.com/wolfmagnate/items/cf7081a0352667b12d6a)

---

# はじめに

今回は、MVPの実現方法として、ViewがModelを監視して、毎フレーム自分を書き換えていくという監視型Viewの考え方について、Unityでの有効性を検討していきます。

# 監視型Viewとは
ViewはModelを読み出す権限を持っています。そして毎フレームにModelの状況を監視します。
そして、Modelに変更が生まれた時点でViewを書き換えます。

# 監視型Viewの実装
Modelが内部状況をpublicかつ読み取り専用な変数として提供します。ViewはModelへの参照を持ちます。Viewは直前のModelの値を常にキャッシュしておき、```Update()```で変更を検知します。

# 監視型Viewが不適切だといえる理由
## ModelにもViewにも属さないデータの行き先が用意されていない
これは、第2章その1で挙げた問題点です。詳しくはそちらの記事をご覧ください。
監視Viewはデータ出力における演出関係の変数の行き場がないという問題を完全に無視しています。
それだけでも監視型Viewがゲームでは使いづらい概念であることが分かると思います。

## ゲームではModelの変化以外の要因でも見た目が変わることがある
監視型Viewは根本的に「ViewはModelを映す存在である」という発想に立っています。
しかし、ゲームではこの発想が常に正しいとは限りません。例をいくつか挙げてみましょう。

* キャラの着せ替え画面で閲覧しているときに、時間経過で勝手にキャラが回転する。Modelで保持しているキャラの服装は変化しない
* レースゲームにおいて、離脱した後に、元の場所に復帰するときにアニメーション演出が発生するが、Modelで保持しているゲーム上での車の位置は変わらない(マリ〇カートで崖から落下した後、カートがジュゲムに戻してもらえるなどを想像してください)

などと言った場合、Modelとは無関係に見た目が変わります。
しかし、監視型Viewはこれらを感知する手段がありません。
なぜなら、プレイヤーの入力は全部Presenterに投げていて、ViewからPresenterに問い合わせをすることは禁止だからです。
監視型ViewはModelだけを見る存在です。
これを解決するためには「ModelにView変更用のフラグを用意する」などModelの純粋性を破壊するようなことをせざるを得なくなります。監視型ViewはModelが変更されないのにViewが変更されるような処理に弱いのです。

## 毎フレーム監視するコードはパフォーマンス・可読性ともに良くない
毎フレーム監視している場合

* 直前フレームで値が何だったかをViewに覚えさせる(Viewのコードが単純に複雑化する)
* 毎フレームModelの情報に従ってViewを更新をする(パフォーマンス的に劣る)

のうちどちらかをしないといけません。
また、UIの仕様がややこしくなっていくにつれて、2フレーム前のキャッシュだったり、3秒前のキャッシュだったりを管理する必要が生まれてきます。(典型的にはキーの長押しなど)この手のデータは、「単純なView」という原則を著しく破壊します。なぜなら、フレームという低レベルの仕組みを強く意識したコードになるからです。
なお、どうしても監視型Viewを使いたい場合には、UIの規模が大規模にならないうちはパフォーマンスへの影響は微々たるものなので、どちらかと言うと毎フレーム機械的に再生成してViewを薄く保つことを勧めます。

## Viewの検証にModelを使いたくなるので、独立したテストが難しい
監視型Viewをテストするには、毎フレーム値を提供しなければなりません。
こういうプログラムをModelとは別にテスト用で提供するのはそれなりに手間がかかってしまいます。
結果、ModelとViewの独立性が下がってしまうことを許容してでも、動作確認にModelを使ってしまい、保守性を下げてしまいます。

## ModelがViewを意識してしまう
Viewを小さくしようとすると、どうしてもModelはViewで加工の手間が小さくなるようにView寄りのデータを提供したくなります。結果的に、Modelとは関係ない「カードの表示アイコンの色(RGB)」とか「設定画面のチェックボックスの成否」とかをModelに定義していしまうことが起こりやすいです。
Modelの純粋性が下がることのデメリットはここまで強調してきた通り「Viewを意識した項目のテストはViewを起動しないとできない」という点で現れます。

## ViewがModelを監視するロジックが複雑化する
Modelの変数を監視する、とひとくちにいっても、かなり複雑化します。ゲームならなおさらです。
例えば、ボードゲームを作る状況を考えてみましょう。この手のゲームでは、Modelは「各マスに存在する駒」を二次元配列として提供していたと考えるのが自然だと思います。
ここで「駒が1マス進む」というイベントが発生したとします。すると、ViewはModelの変更を検知するわけですが、「二次元配列のどのマスのインスタンスがどのマスに移動したか」を調べるのは、結構ややこしいことになります。二重forや大量のキャッシュなど、容易に複雑化を生みます。そして、Viewにややこしいロジックが存在すること自体のデメリットもあるので、非常に悪い設計を生みやすいです。

# どういう場合に監視型Viewが適しているのか
「絶対に演出などを目的とした変数・条件分岐を追加しないと決めているシーン」に利用する分には全く問題は発生しません。
メリットは以下の2つです。

* Presenterはデータの流れが1方向になり、理解が容易になります。
* Presenterのデータ加工コストをViewに持たせることができるのでPresenterが楽になるでしょう。(なおこの加工が複雑だった場合、Presenterで書いた方がマシですので、監視型Viewによる実装はやめましょう)

具体的に役に役に立つ場面としては

* 3D機能などを目当てに業務用ツールをUnityで作成する場合
* プロトタイプとして演出以外を先に作ってしまって、そのあと改めて演出を含むシーンを新規作成する場合

では有用な実装方法になる可能性があります。
特に3D機能を持つ業務用アプリに関してはOpenGLやDirectXを触って作成するよりUnityの方が開発コストが低くなることも多いように思います。

# おわりに
Unityにおける監視型Viewは不要に巨大なViewを招きやすいようです。
やはりゲーム開発は本質的に複雑であることを痛感させられました。
グローバル空間の汚染と即時関数


#  グローバル空間の汚染
グローバル空間の汚染とは、グローバルスコープの変数や関数が存在すること。
グローバルスコープは、プログラムのどこからでもアクセス可能なため、他のプログラムなどの変数名の衝突が発生し、予期せぬバグが発生してしまう。
グローバル空間を汚染しないために、グローバル空間には変数及び関数を宣言すべきではない。
それを防ぐ手段の1つが即時関数を使用すること。即時関数で囲むことでスコープをつくり、アクセスを制限することができる。


#即時関数とは
即時関数とは、関数定義と関数の実行が同時に行われる無名関数のこと。
これを使うとグローバル空間の汚染を避けることができる。
即時関数の書き方は以下となる。

```javascript:書き方
(function() {
    // 処理内容
})();

// ラムダ式を使った書き方
(() => {
    // 処理内容
})();
```
これにより、即時関数内で宣言された変数は関数スコープとなり、関数の外から変数にアクセルすることができない。
TwitterいいねBOTを作る

#目標
GASを使ってサーバーレスいいねBOTを作成する

#必要データ
・authToken
・ct0
・bearerToken

これらはデベロッパーツールから取得できます
詳しい取得方法は下記リンクに詳しく記載されてます

https://belltree.life/tweet-camouflage-by-cookie/

#ソースコード
```
var headers = {
  "authorization":"Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
  "cookie":"auth_token=ここに自身のauth_token; ct0=ここに自身のct0;",
  "x-csrf-token":"ここに自身のct0"
};

function SELECT_TAG() {
  try {
    #いいねしたいワードリスト
    var tags = [
      "%22Swift%22+-filter%3Areplies",
      "SwiftUI+-filter%3Areplies",
      "Python+-filter%3Areplies",
      "Unity+-filter%3Areplies",
      "GoogleAppsScript+-filter%3Areplies",
      "JavaScript+-filter%3Areplies",
      "Qiita+-filter%3Areplies",
      "%23%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84",
      "%23%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0",
      "%23%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85",
      "%23%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84",
      "%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA",
      "%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA",
      "iOS%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2+-filter%3Areplies"
    ];
    var tag = tags[Math.floor(Math.random()*tags.length)];
    console.log(tag)
    return tag;
  } catch(error) {
    console.log("SELECT_TAGでエラー発生")
    console.log(error)
  };
};

function GET_ID_LIST() {
  try {
    var ID_LIST = []
    var tag = SELECT_TAG()
    var url = "https://api.twitter.com/1.1/search/universal.json?q=" + tag + "&result_type=recent&count=10&include_entities=false&locale=ja";
    var options = {
      "method" : "get",
      "headers" : headers
    };
    var reply = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(reply);
    var data = json["modules"];
    for (var i in data) {
      try {
        var id = data[i]["status"]["data"]["id_str"]
        ID_LIST.push(id);
      } catch {
      };
    };
    return ID_LIST
  } catch(error) {
    console.log("GET_ID_LISTでエラー発生")
    console.log(error)
  };
};

function Create_Favorite() {
  try {
    var ID_LIST = GET_ID_LIST()
    for (var i in ID_LIST) {
      var url = "https://api.twitter.com/1.1/favorites/create.json?id=" + ID_LIST[i];
      var options = {
        "method" : "post",
        "headers" : headers
      };
      var reply = UrlFetchApp.fetch(url, options).getResponseCode();
      console.log(reply)
    };
  } catch(error) {
    console.log("Create_Favoriteでエラー発生")
    console.log(error)
  };
};

```

#定期実行
時計マークのトリガーを選択
↓
トリガーを追加
↓
トリガーの設定をして保存

![スクリーンショット 2021-10-26 13.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/146d927c-8c05-a399-ecd2-8fafd96c19df.png)
【React】React×TypeScriptで天気アプリ作成記録

#1.はじめに
初めまして。未経験からプログラミングを始めて4ヶ月目に突入したので、アウトプットも兼ねてはじめて記事を投稿してみました。
お世話になった記事がたくさんあるので、備忘録として残しておきます。

#2.天気APIを使用したアプリケーション作成
【アプリの概要】１日の天気が確認でき、気象情報に応じて服装を教えてくれる

![tenkiapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2160385/1bf6cc03-3588-4ea3-3b85-c1b0e7f7a1a2.png)


【作成した経緯】
TypeScriptを学習し始めて、慣れるためにも3大フレームワークの中で１番相性がいいとされているReactと併用したアプリケーション制作を行おうと考えました。
またデザインも個人的に使い勝手がいいなと感じたTailwindCSSを用いました。


【使用した技術・API】
・React
・TypeScript
・OpenWeatherMapAPI
→Call 5 day / 3 hour forecast dataを使用
https://openweathermap.org/forecast5
・TailwindCSS


【実装した機能】
・検索欄に入力した地名、もしくはドロップダウンメニューから選択した地名の気象情報を検索
・検索した地域のその日の天気、気温が3時間ごとに表示される
・気温をもとにおすすめの服装を表示


#3.実現したかったこと
・現在地を取得して、現在地をもとに気象情報を表示する機能
・5日間の予報（最高気温、最低気温は算出できたものの曇り晴れなどの気象情報の表示を実現できなかった）

**改善点**
・時間の表示
・検索した地名にヒットしなかった時の処理


技術力と時間の都合で実現できなかった点が多いので、今後も機能の追加など
ブラッシュアップしていきたいと思います。

#4.参考サイト
https://zenn.dev/ogakuzuko/articles/react-typescript-for-beginner

https://qiita.com/Ryo9597/items/4c05b8b972ad7efc0c66#%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%9F%E3%82%89%E7%B7%AF%E5%BA%A6%E3%81%A8%E7%B5%8C%E5%BA%A6%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%A4%A9%E6%B0%97%E4%BA%88%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

https://qiita.com/mikan3rd/items/a5bc87a2242e67cf17a4

https://qiita.com/himorishige/items/7ac157f143be622790b0
【Swift】UIAlertViewControllerの実装

#はじめに
ユーザーに確認を求めたりエラー表示をしたりとよくアラートを出したい場面があると思います。
そんな時に毎回アラートを出すコードを書くのは効率が悪いので、どこでもすぐ呼び出せるようにアラート処理用のファイルを作成しておきます。
コピーして使用できるので特に初学者の方のお役に立てればと思います。

#アラートを実装

```swift
import UIKit

final class Alert {
    
    // OKアラート
    static func okAlert(vc: UIViewController, title: String, message: String, handler: ((UIAlertAction) -> Void)? = nil) {
        let okAlertVC = UIAlertController(title: title, message: message, preferredStyle: .alert)
        okAlertVC.addAction(UIAlertAction(title: "OK", style: .default, handler: handler))
        vc.present(okAlertVC, animated: true, completion: nil)
    }
    
    // OK&キャンセルアラート
    static func cancelAlert(vc: UIViewController, title: String, message: String, handler: ((UIAlertAction) -> Void)? = nil) {
        let cancelAlertVC = UIAlertController(title: title, message: message, preferredStyle: .alert)
        cancelAlertVC.addAction(UIAlertAction(title: "OK", style: .default, handler: handler))
        cancelAlertVC.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil))
        vc.present(cancelAlertVC, animated: true, completion: nil)
    }
    
    // TextField付きアラート
    static func textFieldAlert(vc: UIViewController, title: String, message: String, placeholder: String, securyText: Bool, handler: ((String?) -> Void)? = nil) {
        let textFieldAlertVC = UIAlertController(title: title, message: message, preferredStyle: .alert)
        textFieldAlertVC.addTextField { (textField) in
            textField.placeholder = placeholder
            textField.isSecureTextEntry = securyText
        }
        textFieldAlertVC.addAction(UIAlertAction(title: "OK", style: .default, handler: { (_) in
            handler?(textFieldAlertVC.textFields?.first?.text)
        }))
        textFieldAlertVC.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil))
        vc.present(textFieldAlertVC, animated: true, completion: nil)
    }
    
    // 自動で消えるアラート
    static func autoCloseAlert(vc: UIViewController, title: String, message: String) {
        let autoCloseAlertVC = UIAlertController(title: title, message: message, preferredStyle: .alert)
        vc.present(autoCloseAlertVC, animated: true) {
            // 2秒後に消える
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                autoCloseAlertVC.dismiss(animated: true, completion: nil)
            }
        }
    }
}
```

#呼び出しコード

```swift
   // OKアラートを表示
   Alert.okAlert(vc: self, title: "タイトル", message: "任意のメッセージ", handler: { (_) in
     // OKボタンを押した後の処理を書いて下さい。
   })

   // OK&キャンセルアラートを表示
   Alert.cancelAlert(vc: self, title: "タイトル", message: "任意のメッセージ", handler: { (_) in
     // OKボタンを押した後の処理を書いて下さい。
   })

   // TextField付きアラートを表示
   Alert.textFieldAlert(vc: self, title: "タイトル", message: "任意のメッセージ", placeholder: "任意の文字", securyText: false, handler: { (text) in
     // TextFieldに入力した文字の処理を書いて下さい。
   })

  // 自動で消えるアラートを表示
  Alert.autoCloseAlert(vc: self, title: "タイトル", message: "任意のメッセージ")
```
sudoコマンドのパスワード入力の省略

linuxでよく使用する`sudo`コマンドには`-A`オプションがあり,これを使用するとパスワード入力をスクリプトファイルの出力から行うことができ,予め用意しておくことで省略できます.

例えばパスワードが`aaaaa`の場合,以下のようなファイルを`/tmp/askpass`という名前で作成し,`chmod +x`をします.

```bash:/tmp/askpass
#!/bin/bash

echo "aaaaa"
```

そして,以下のようなコマンドを`~/.bashrc`に追加し,環境変数`SUDO_ASKPASS`のパスを毎回設定してくれるようにします.

```bash:~/.bashrc
export SUDO_ASKPASS=/tmp/askpsass
```

設定ができると,以下のように`sudo`に`-A`オプションをつけることで,パスワードを環境変数`SUDO_ASKPASS`で設定したスクリプトから取得するようになり,パスワード入力を省略できます.

```bash:パスワード入力省略実行
sudo -A bbbbb
```

# エイリアスの作成

以下のようなエイリアスを`.bashrc`などに作成すれば`-A`オプションを自動でつけてくれるようになります.

```shell:sudo alias
sudoa ()
{
    \sudo -A "$@"
}
alias sudo="sudoa"
```

## 参考

askpassについて

https://t-cyrill.hatenablog.jp/entry/2018/02/09/205930
【物体検出】YOLOv5のオプションまとめ

# はじめに
YOLOv5のtrain.pyとdetect.pyのオプションをまとめてみました。
※【引用】YOLOv5のコードは[こちら](https://github.com/ultralytics/yolov5)。

一つの表中でオプションは五十音順にソートしております。

引数がなしとなっているオプションはそのオプションを記述することでflagが立つ(Trueとなる)オプションです。

いくつかは私の理解不足で説明を省いていたりするものもありますがご容赦ください。
(順次アップデートしていければと考えております。)

# train.pyのオプション
### よく使うオプション
|option|引数|説明|default|
|----|----|----|----|
|batch|int|バッチサイズ指定|16|
|data|str|学習データの情報を記載したyamlファイルのpath|サンプルデータのcoco128が読み込まれる|
|cfg|str|使用するYOLOのバージョン指定|' '|
|epochs|int|エポック数指定|300|
|exist-ok|なし|学習結果を上書き保存する|False|
|img<br>(imgsz, img-sizeでもよい)|int|学習画像のサイズを指定|640|
|name|str|学習結果を保存するディレクトリ名を指定|'exp' (注*2)|
|patience|int|EarlyStopの設定<br>指定したepoch数中でモデル精度が向上しなければ学習を打ち切る|100|
|project|str|学習結果を保存するディレクトリを指定|ROOT / 'runs/train' (注*1)|
|single-cls|なし|多クラスにラベル付けされていても単一クラスとして扱う<br>(物体の検出のみ行う)|False|
|weights|str|学習済み重みを指定<br>(用意された重みを使用する場合は、例えば'yolov5x.pt'のようにファイルのパスを指定しなくてもOK)|ROOT / 'yolov5s.pt' (注*1)|


<br>
### その他オプション
|option|引数|説明|default|
|----|----|----|----|
|adam|なし|Adam optimizerを使用する|Fasle(SGDが指定される)|
|bucket|str|-|' '|
|cache|str|cashの保存先指定(ram or disk)|'ram'|
|device||使用プロセッサの指定(0 or 0,1,2,3 or cpu)|' ' (cudaが指定される)|
|evolve|int|ハイパーパラメータのバージョン指定<br>いじったことない|None|
|freeze|int|学習しない層を指定|0|
|hyp|str|ハイパーパラメータの指定<br>いじったことない|
|image-weights|なし|-|False|
|label-smoothing|float|-|0.0|
|linear-lr|なし|-|False|
|multi-scale|なし|画像サイズを±50%変化させる|False|
|noautoanchor|なし|自動アンカーチェックの無効化|False|
|nosave|なし|最終checkpointのみ保存|False|
|quad|なし|-|False|
|rect|なし|-|-|
|resume|なし|-|False|
|sync-bn|なし|SyncBatchNormを使用する<br>DDPモードでのみ使用可能|False|
|save_period|int|指定epoch毎にチェックポイントを保存する|-1 (無効)\
|workers|int|データローダーワーカーの最大数|8|

# detect.pyのオプション

### よく使うオプション
|option|引数|説明|default|
|----|----|----|----|
|conf|float|クラス判定の閾値指定|0.25|
|exist-ok|なし|推論結果を上書き保存する|False|
|img<br>(imgsz, img-sizeでもよい)|int|推論対象の画像のサイズを指定|640|
|name|str|推論結果を保存するディレクトリ名を指定|'exp' (注*2)|
|project|str|推論結果を保存するディレクトリを指定|ROOT / 'runs/train' (注*1)|
|save-txt|なし|推論結果(検出座標と予測クラス)をtxtファイルに出力する|False|
|save-conf|なし|推論結果(クラスの確率)をtxtファイルに出力する|False|
|sorce|str|推論対象の画像が格納されたディレクトリまでのパス|ROOT / 'data/images' (注*1)|
|weights|str|学習済み重みを指定|ROOT / 'yolov5s.pt'|

<br>
### その他オプション
|option|引数|説明|default|
|----|----|----|----|
|agnostic-nms|なし||False|
|augment|なし|拡張推論|False|
|classes|int|クラスフィルタ||
|device||使用プロセッサの指定(0 or 0,1,2,3 or cpu)|' ' (cudaが指定される)|
|iou-thres|folat|IoU値の閾値設定|0.45|
|max-det|int|1枚の画像で検出する物体数の最大|1000|
|nosave|なし|画像を保存しない|False|
|save-crop|なし|予測画像を検出座標でトリミングしたものを保存|False|
|update|なし|モデルをアップデートする|False|
|view-img|なし|結果を表示|False|
|visualize|なし|可視化|False|








## 注釈
*1: ROOTはtrain.py、detect.pyが存在する階層
*2: exsit_okがFalseの場合、学習を行う度にexpの後に連番が振られる
Aruba gemでfizz buzzテストを書いてみた

# Aruba gemでRSpec fizz buzzテストを書いてみた

## 参考資料

[Aruba gemでCLIテストを支援する](https://qiita.com/tbpgr/items/41730edcdb07bb5b59ad)

この参考資料は初めてテストを書くような人でも理解しやすいものです．
この資料通りに進めるとほとんどエラーなく通るのですが，一つ苦戦したエラーの克服手順を紹介します．

## エラー

参考資料通りに進めていき，実行してみると...

```bash
$bundle exec rspec spec/cli_spec.rb  

An error occurred while loading spec_helper. - Did you mean?
                    rspec ./spec/spec_helper.rb

Failure/Error: require 'aruba/rspec'

LoadError:
  cannot load such file -- aruba/rspec
# ./spec/support/aruba.rb:1:in `require'
# ./spec/support/aruba.rb:1:in `<top (required)>'
# ./spec/spec_helper.rb:18:in `require_relative'
# ./spec/spec_helper.rb:18:in `block in <top (required)>'
# ./spec/spec_helper.rb:18:in `each'
# ./spec/spec_helper.rb:18:in `<top (required)>'
No examples found.
No examples found.


Finished in 0.00001 seconds (files took 0.06403 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

Finished in 0.00001 seconds (files took 0.06403 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

```

このようなエラーが出てしまう．

そこで,

```bash
$ bundle install
```

で確認してみると,

```bash
Using rake 13.0.6
Using bundler 2.2.23
Using thor 1.1.0
Using fizzbuzz 0.1.0 from source at `.` and installing its executables
Bundle complete! 2 Gemfile dependencies, 4 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```

入れたはずのArubaがなくなっている!!

## 解決法

[aruba-rspecのセットアップ](https://qiita.com/tbpgr/items/41730edcdb07bb5b59ad#-aruba-rspecのセットアップ)のところで下記を実行.

```bash
$ bundle exec aruba init --test-framework rspec
```

実行後自動的にGemfileが下記のように書き加えられる.

```ruby:Gemfile
source 'https://rubygems.org'

gemspec
gem 'aruba', '~> 0.14.2'
```

これを次のように書き換える.

```ruby:Gemfile
source 'https://rubygems.org/'

# Specify your gem's dependencies in fizzbuzz.gemspec
gemspec
```

あとは参考資料通りすると,

```bash
 $ bundle exec rspec spec/cli_spec.rb                                       21.36h  火 10/26 12:21:07 2021

fizzbuzz command
  version option
    is expected to be successfully executed
    is expected to have output: "0.1.0"
  help option
    is expected to be successfully executed
    is expected to have output: "Commands:\n  fizzbuzz fizzbuzz        # Get fizzbuzz result from limit number\n  fizzbuzz help [COMM...e.\n      [--version], [--no-version]  # version\n  -d, [--debug], [--no-debug]      # debug mode\n"
  fizzbuzz subcommand
    is expected to be successfully executed
    is expected to have output: "FizzBuzz,1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz"
  fizzbuzz subcommand invalid args
    is expected not to be successfully executed

Finished in 1.54 seconds (files took 0.13908 seconds to load)
7 examples, 0 failures
```

テストが無事通る.
【PHP】日出、日没、薄明の時間を取得してみた

# 初めに
ダッシュボード作成のために、各種情報を取得する
コメントより、[date_sun_info](https://www.php.net/manual/ja/function.date-sun-info.php)関数にて取得できることが判明
⇒PHPを用い、HP等で表示させる用途を想定

※[Sunset and sunrise times API](https://sunrise-sunset.org/api)を使用予定でした、、

## 環境
- Windows10
- PHP 8.0.6

## パラメータ
lat (float): 取得したい場所の緯度、必須
lng (float): 取得したい場所の経度、必須
date (string): YYYY-MM-DDフォーマットにて入力/相対・絶対日時の指定も可能。入力しない場合は現在の時刻を取得する。オプション。
callback (string): Callback function name for JSONP response. Optional.
formatted (integer): 0 か 1 (1 がデフォルト). 0の場合はISO 8601にて出力される。オプション

本コードでは$sunset_configにてパラメータをセットしてください。

# コード
```php:sunset_time_api.php
<?php
//sunset_apiより日没、薄明時間を取得する
date_default_timezone_set('Asia/Tokyo');
$sunset_config = array(
    'lat' => '35.00000',
    'lon' => '135.0000000',
    'date' => 'today',
    'formatted' => '0',
);
$sunset_json = file_get_contents("https://api.sunrise-sunset.org/json?lat=" . $sunset_config["lat"] . "&lng=" . $sunset_config["lon"] . "&date=" . $sunset_config["date"] . "&formatted=" . $sunset_config["formatted"]);
$sunset_array = json_decode($sunset_json, true);

//UTC => Timestamp
$utc_sunrise = strtotime($sunset_array["results"]["sunrise"]);
$utc_sunset = strtotime($sunset_array["results"]["sunset"]);
$utc_civil_twilight_end = strtotime($sunset_array["results"]["civil_twilight_end"]);
$utc_nautical_twilight_end = strtotime($sunset_array["results"]["nautical_twilight_end"]);
$utc_astronomical_twilight_end = strtotime($sunset_array["results"]["astronomical_twilight_end"]);

//UTC => JST
$sunrise = date("m/d H:i", $utc_sunrise);
$sunset = date("m/d H:i", $utc_sunset);
$civil_twilight_end = date("m/d H:i", $utc_civil_twilight_end);
$nautical_twilight_end = date("m/d H:i", $utc_nautical_twilight_end);
$astronomical_twilight_end = date("m/d H:i", $utc_astronomical_twilight_end);

echo "日の出" . $sunrise . "\n";
echo "日の入り" . $sunset . "\n";
echo "市民薄明の終わり" . $civil_twilight_end . "\n";
echo "航海薄明の終わり" . $nautical_twilight_end . "\n";
echo "天文薄明の終わり" . $astronomical_twilight_end . "\n";
```
# 参考サイト
https://www.php.net/manual/ja/function.date-sun-info.php

https://sunrise-sunset.org/api
pull requestでTipsDivergenceExceededExceptionが発生して差分が表示されなかった時の対応

###問題
ソースツリーのgit pushでリモートにあげた作業ブランチをreleaseブランチへpull requestしたところ
下記メッセージが表示されてしまい、差分が表示されませんでした。

**TipsDivergenceExceededException**
The merge cannot be completed because the divergence between the branches is too great. If you want to merge these branches, use a Git client.

###対応内容
作業ブランチにreleaseを取り込みgit push
その後再度pull requestしたところ差分表示されました。
便利なタスク管理アプリNotion

# はじめに
先日また自称意識高い系の先輩からタスク管理に使える便利ツールの紹介をされたので、まあ使ってみるかなんて軽い気持ちで使ってみると使いやすいのなんの。

紹介しますその名も「Notion」（ノーション）バカ使いやすい。
![notino.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/5276943b-1d6a-26f4-0bca-128cab6e7163.png)


#１．Notionとは
タスク、Wiki、およびデータベースを統合するマークダウンサポートを備えたメモアプリケーション及びサービス。
>[Wikipedia](https://ja.wikipedia.org/wiki/Notion_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))

要は自由度の高いタスク管理サービス。

#２．何に使えるか
マジでなんにでも使える！
**１．タスク管理**
<img width="400" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/e8edc72a-3ab8-2d2d-e837-4f3153ef4ad9.png">
ログインするとデフォルトで作られる機能。
タスク項目をドラッグ＆ドロップ、ipadならスワイプで移動可能。

**２．まとめてみたり**
これはこの間投稿した記事
<img width="400" alt="hei.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/e3632b0e-d736-2a65-a247-00304af5b4f8.png">
私はQiitaの下書きをNotionでやっています！

**３．ページの中にページを作ってみたり**
<img width="400" alt="de.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/6eabe5db-0405-aa01-d143-a99a77126ae9.png">
関連項目なんかをまとめておくことが出来るので便利です！

**４．こんなこともできる**
ページ内の項目をサイドに移動させることもできる
<img width="400" alt="pagetoside.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/029bda0c-5e60-15cd-e23b-f2a60dbbcd21.gif">


サイドの項目をページ内に移動することもできる
<img width="400" alt="sidetopage.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605371/a8225b89-13a4-f401-9d43-9f267faa8ff8.gif">

#３．まとめ
こんな人におすすめします！
・整理整頓が好き
・１つのアプリで色々なことが出来る
・PCでもスマホでも確認したい！（iphoneならストアにアプリ有）
・スマート感が欲しい！
Docker Desktop for Windwos 4.1.1へのアップグレードで起動しなくなった

# 環境
- ホスト
OS: Windows 10 Pro 
CPU：Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz 
RAM：32GB 

- Docker
Version: 更新前 4.0.1 → 更新後 4.1.1
Backend: WSL2

# Docker Desktop for Windows を更新してみた
更新通知が来ていたので、更新した。バカだった。。。

4.1.1だったから大丈夫かと思った。4.1.0だと怖かったけど。。。

# 二度と立ち上がってこなくなった
「Docker Engine starting...」の表示のまま、二度と立ち上がることは無かった。。。
10分以上待って、エラー画面が出る。できることは、そのまま終了するか、継続させて「Factory Reset」くらい。

そして、Docker Backend プロセスのメモリ使用量は13GBを超えてた。欲張りめ！

# 試したこと
1. ホストPC再起動
1. Docker Desktop for Windows のFactory Reset実行
1. Docker Desktop for Windows のアンインストール・インストール（Ver 4.1.1）

上記すべて効果なし。

# 結果
GitHubに結構な数のIssueが上がってた。面倒だから同じ現象の人は探さなかったけど、間違いなくバグだと思うので、対応策を探すよりも 4.0.1に戻すことに。

Issueの中にも「俺は4.0.1で快適だぜ！」という回答をしてる人も居るので、4.1.1を使うことが間違いだったな。ということで、さっさと戻した。あー、2時間無駄にした。

全然解決に至ってなくてごめんなさい。
自分用の備忘録ですので、悪しからず。
openapi-generator-cli (go-server)

こちらで行ったことと同じことを go-server で行いました。
[openapi-generator-cli (python-flask)](https://qiita.com/ekzemplaro/items/457ce1c8b93aed53b4b7)

>hello.yaml は同じです。

#Go のサーバーを作成#

```bash
npx @openapitools/openapi-generator-cli generate \
	-g go-server \
	-i ./hello.yaml \
	-o ./src \
	--api-package=api \
	--model-package=model \
	--additional-properties=withSeparateModelsAndApi=true
```

コードの修正

```go:go/api_hello_service.go
/*
 * Hello
 *
 * ユーザ名を与えると挨拶を返してくれるAPI
 *
 * API version: 1.0.0
 * Generated by: OpenAPI Generator (https://openapi-generator.tech)
 */

package openapi

import (
	"context"
//	"net/http"
//	"errors"
)

// HelloApiService is a service that implements the logic for the HelloApiServicer
// This service should implement the business logic for every endpoint for the HelloApi API.
// Include any external packages or services that will be required by this service.
type HelloApiService struct {
}

// NewHelloApiService creates a default api service
func NewHelloApiService() HelloApiServicer {
	return &HelloApiService{}
}

// GetHello - 
func (s *HelloApiService) GetHello(ctx context.Context, userName string) (ImplResponse, error) {
	// TODO - update GetHello with the required logic for this service method.
	// Add api_hello_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.

	//TODO: Uncomment the next line to return response Response(200, InlineResponse200{}) or use other options such as http.Ok ...
//	return Response(200, InlineResponse200{}), nil
	return Response(200, InlineResponse200{"Hello, " + userName + "!" }), nil
//	return Response(200, InlineResponse200{}), userName

	//TODO: Uncomment the next line to return response Response(400, {}) or use other options such as http.Ok ...
	//return Response(400, nil),nil

	//TODO: Uncomment the next line to return response Response(500, {}) or use other options such as http.Ok ...
	//return Response(500, nil),nil

	// return Response(http.StatusNotImplemented, nil), errors.New("GetHello method not implemented")
}
```

サーバーの実行

```bash
go run main.go
```

クライアントでアクセス

```text
$ http http://0.0.0.0:8080/hello?userName=Scott
HTTP/1.1 200 OK
Content-Length: 30
Content-Type: application/json; charset=UTF-8
Date: Tue, 26 Oct 2021 02:53:45 GMT

{
    "HelloUser": "Hello, Scott!"
}
```
crontabを使ったbackup設定


###用意する情報
サーバー情報
・rootユーザーのパスワード（crontabを作成するために、rootで入っておく）

DB情報
・DB名[DB_name]
・Mysqlユーザー名[DB_user]
・Mysqlパスワード[DB_password]


```.bash
#rootユーザーとして、サーバーにログインする。

#バックアップをとりたいフォルダを作成する。
cd [your_project]
mkdir daily_backup
cd daily_backup

#バックアップを実行するシェルスクリプトを作成する
vi backup.sh

```


```backup.sh
#!/bin/sh

# バックアップの保存期間（days）
period=7

# バックアップ保存用ディレクトリの指定
dirpath='/home/[your_project]/daily_backup'

# ファイル名を指定する(※ファイル名で日付がわかるようにしておきます)
filename="[your_project]_"`date +%y%m%d`

# 指定したDBのスキーマおよびデータをすべて吐き出す
mysqldump -u[DB_user] -p[DB_password] -hlocalhost [DB_name] > $dirpath/$filename.sql

# パーミッション変更
chmod 700 $dirpath/$filename.sql

gzip $dirpath/$filename.sql

# 保存期間を過ぎたバックアップを削除
appname="[your_project]_"
oldfile=`date +%y%m%d --date "$period days ago"`

```

###ここで、テストとして


```.bash
mysqldump -u[DB_user] -p[DB_password] -hlocalhost [DB_name] > backup_test.sql

ls -a
```

backup_test.sqlが作成されていれば、いよいよcrontabに追加する。

```.bash

crontab -e

#深夜1:50にバックアップを設定する。
50 01 * * * /home/[your_project]/daily_backup/backup.sh

```
各種v-bindの書き方メモ

触り始めたばかりで、propsを渡す時しょっちゅう書き方が忘れちゃっうから、ちょっとまとめてみようと思います

### 数字

```html
<my-component :size="{{ 50 }}"><my-component>
<my-component :size={{ 50 }}><my-component>
<my-component :size=50><my-component>
```

### 数字(Number)タイプの変数

```html
<my-component :size="{{ $size }}"><my-component>
```

### 文字列(String)

```html
<my-component first-name="{{ $firstName }}"><my-component>
```

### laravelのroute

```html
<my-component path="{{ route('admin.login') }}"><my-component>
```

### Boolean値

```html
<my-component :disabled="false"><my-component>
```

### Boolean変数

```html
<my-component :disabled="{{ $disabled ? 'true' : 'false'}}"><my-component>
```

### 配列

```html
<my-component :order-list='@json($orderList)'><my-compoent>
```

### 三項演算子

```html
<my-component :label="{{ $total>100 ? 'green' : 'red'}}"><my-component>
```

### null

```html
<my-component :value="null"><my-component>
```
【厳選】最低限のpandasテクニックを習得できるpandas64本ノック

# はじめに
機械学習を勉強しようと思ったらまずpandasの基礎を固めるのが機械学習エンジニアへの近道！
そこでpandasを勉強しようと思い調べるとpandas100本ノックなるものがたくさん出てきますね。

私もいくつか利用してpandasを学んできましたが、問題数を100本に満たすために同じような問題やpandasではないライブラリの問題が混ざったりしていたので今回は純粋なpandasノックを作成してみました。

全部で64問。
問題はipynbファイルにて作成しております。
各問いには見出しがついているので辞書のようにpandasでわからないことを調べることもできるように作りました。

問題はgithub上(以下URL)に公開しています。
URL: https://github.com/gotty21/basic_pandas-64-knocks

自分の学習環境上にcolneして利用していただければと思います。



# 使い方
cloneしてきたフォルダ内には以下が入っています。

|名前|説明|
|----|----|
|question.ipynb|問題のみが記載されているファイル|
|answer.ipynb|question.ipynbに追記する形で答えが記載されているファイル|
|data|問題で使用するテーブルデータが格納されているフォルダ|


問題を解く際にはquestion.ipynbを使用してください。
どこから解いてもエラーがでないように設問の下にすでにコードが書かれていることがあります。
消さずに回答のコードと一緒に実行してください。

答え合わせや辞書として使う場合はanswer.ipynbを使用してください。
Jupyter NotebookやGoogle Colaboratoryの左に目次タブを開いて、見たいセルに飛ぶことができます。