OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで簡単な玉転がしをしてみる(2:玉転がし編)

前回の続き！

https://qiita.com/yuuk201/items/1fb9790828c06c0b50ba#%E5%AE%8C%E6%88%90

前回の玉転がしゲームの続きを作っていくよー。今回は玉を実際に転がしてみよう！編です。

![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/41b142f2-6e38-5fd5-6894-122d47d284a1.gif)

物理演算を適用するために、重力を適用する方に「Rigidbody」、重力は適用しないが衝突対象になるものに「Colider」を適用させます。
ちなみに「Collider」はオブジェクトを追加した際に自動的に追加されます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/12dfc75d-75ef-a797-ddcb-524d613c9862.png)

「Rigidbody」は「Add Component」から追加してあげる必要があります。
![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/629b0b75-2c2b-4c41-0d9b-cd702fecf2e1.gif)

適用すれば板の上をボールが転がるように動かすことができます。迷路のステージに関してはCubeを組み合わせて頑張って作りました...
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/f3bbaa69-bfb2-4db1-c2d0-d6fb5fada60e.png)
こんな感じで一個のオブジェクトの中に入れてあげれば同じ物体として扱われるため、物体を傾けても大丈夫です。

これで玉を転がす部分は完成なのですが、ちょっと今でも解決できていないバグ(？)があるので共有します。
#問題点
フツーに何も考えずに実行すると以下のようになってしまいます...
![ezgif.com-gif-maker (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/33064a5e-e14a-454b-259f-06691581a42f.gif)

おいおい当たり判定全然できてないじゃないか！と言いたいところなのですが、下図のように少し板を動かすとできるようになるんですね

![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/85b3ac5b-63e2-ea3f-9041-8a5f5bb996ed.gif)

とても謎ですが、もしできた場合は追記などで情報を追加しようと思います...

[2021年6月9日追記]
コメントいただきありがとうございます！colliderがスリープ状態になっていたことが原因だったようですね...
こちらのサイトを参考に実装させていただきます。ここのサイトにあるコードを参考にさせていただきます。
https://ftvoid.com/blog/post/728

追加で以下のコードをボールに適用します。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class wakeupball : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        var body = GameObject.Find ("Sphere").GetComponent<Rigidbody> ();
		if (Input.GetKey(KeyCode.UpArrow )) {
			body.WakeUp();
		}else if (Input.GetKey(KeyCode.DownArrow)){
            body.WakeUp();
        }else if (Input.GetKey(KeyCode.RightArrow)){
            body.WakeUp();
        }else if(Input.GetKey(KeyCode.LeftArrow)){
            body.WakeUp();
        }
        
    }
}

```

上下左右のキーを押すことでRigidBodyがWakeupし、物理演算を動かせるということですね...

![ezgif.com-gif-maker (6).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/e6c198b8-1ce6-faa7-648b-04d9ecbe5906.gif)


情報をいただいた方ありがとうございました。
Java DecimalFormat NumberFormat を簡単にまとめました。

|0|数値１桁を表します。数値が無い場合は「0」を表示させます。|
| ---- | ---- |
|#|数値１桁を表します。数値が無い場合は何も表示させないです。|
|,|カンマ区切りを表します。|
|%|パーセントで表示します。|
|–|マイナスを表します。|
|.|小数点を表します。|

```java
    // NumberFormatクラスを利用したパターン (表示形式が既定のフォーマットでOKな場合)
    NumberFormat perFormat = NumberFormat.getPercentInstance(); //パーセント
    NumberFormat comFormat = NumberFormat.getNumberInstance(); //カンマ区切り
    NumberFormat curFormat = NumberFormat.getCurrencyInstance(); //通貨

    System.out.println(perFormat.format(1.234));
    System.out.println(comFormat.format(123456789));
    System.out.println(curFormat.format(123.45));

    //123%
    //123,456,789
    //￥123

    // DecimalFormatクラスを利用したパターン (独自にフォーマット形式を作成したい場合)
    DecimalFormat format01 = new DecimalFormat("00,00.##");
    DecimalFormat format02 = new DecimalFormat("-00,00.0");
    DecimalFormat format03 = new DecimalFormat("###.00%");

    System.out.println(format01.format(1234567.89));
    System.out.println(format02.format(123456.7890));
    System.out.println(format03.format(12.34567));

    //1,23,45,67.89
    //-12,34,56.8
    //1234.57%
```
他、参考にしたサイト

https://www.techscore.com/tech/Java/JavaSE/Utility/7-4/
macOSのアクセシビリティ環境設定にアプリケーションの挙動を合わせる

# はじめに

macOSのシステム環境設定「アクセシビリティ」で設定した項目を自アプリケーションに反映させる方法です。
今回は図中でいう赤枠で示した範囲に関係する事柄のみ言及します。

![macOSシステム環境設定「アクセシビリティ」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3603/3005f960-4b48-779c-4e4d-97b8031b925a.png)
*添付図 – システム環境設定「アクセシビリティ」*


# APIのヒント

macOSネイティブ環境では基本的に`NSAccessibility`を相手にプログラミングを行なってゆきますが、今回は`NSWorkspace`に頼ります。

NSWorkspaceには以下のようなプロパティが備わっており、それぞれが添付図にあるチェックボックスの設定項目に対応しています。

```swift:NSWorkspace
// 「コントラストを上げる」
@available(macOS 10.10, *)
open var accessibilityDisplayShouldIncreaseContrast: Bool { get }

// 「カラー以外で区別」
@available(macOS 10.10, *)
open var accessibilityDisplayShouldDifferentiateWithoutColor: Bool { get }

// 「透明度を下げる」※インターフェイス全体から透過表現を減らす設定
@available(macOS 10.10, *)
open var accessibilityDisplayShouldReduceTransparency: Bool { get }

// 「視差効果を減らす」
@available(macOS 10.12, *)
open var accessibilityDisplayShouldReduceMotion: Bool { get }

// 「カラーを反転」
@available(macOS 10.12, *)
open var accessibilityDisplayShouldInvertColors: Bool { get }
```


## 環境設定の確認方法

NSWorkspaceオブジェクトには `NSWorkspace.shared` で常にアクセスできるので、例えば以下のようにして設定のオンオフをいつでも確認できます。

```swift
if NSWorkspace.shared.accessibilityDisplayShouldReduceTransparency {
    // 視差効果を減らす設定が有効な場合
    ...
}
else {
    ...
}
```

## 環境設定の変更通知

環境設定変更の通知を受け取るには `NSWorkspaceAccessibilityDisplayOptionsDidChangeNotification` を利用します。先ほど挙げたプロパティには対応しています。

この Notification の受信設定は一般的な方法ではなく、指定の通知センター [`notificationCenter`](https://developer.apple.com/documentation/appkit/nsworkspace/1525071-notificationcenter) を使わなければなりません。

```swift
// アクセシビリティ設定の変更を受信する。`NSWorkspace.shared.notificationCenter` に受信登録する必要がある。
NSWorkspace.shared.notificationCenter.addObserver(self,
												  selector: #selector(accessibilityDisplayOptionsDidChangeNotification(_:)),
												  name: NSWorkspace.accessibilityDisplayOptionsDidChangeNotification,
												  object: nil)
```

# 使いどころ

独自に設計したユーザーインターフェイスの振る舞いのアクセシビリティを高めるために使用します。アプリケーションはOSが備える環境設定に可能な限り準拠することが好ましいです。

- **「視差効果を減らす」が有効**
    - リサイズ等のアニメーションを無効化する、必要最小限に減らす。
- **「透明度を下げる」が有効**
    - 透過しているビューの背景色アルファ値を1.0にする（不透明にする）。
- **「コントラストを上げる」が有効**
    - 独自に着色した枠線の色を濃くする、周囲とのコントラストを上げる調整を行う。

…などなど。

細かいことですがさほど難しくもないので、対応することで高品質なネイティブアプリケーションに仕上がります。できる範囲から手をつけてみましょう。
Delphi: TImage などの画像のちらつきを抑える

## 現象概要

### Before
![delphi1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3a6912ab-dcca-a08d-b606-cf00d1745267.gif)


### After

![delphi3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/deedcbb8-1e46-1ac4-6aa7-656d81faae89.gif)


## 対策

以下、いずれかがあります。

### DoubleBuffered := True;

``` 
Form1.DoubleBuffered:=True;
```


### WMEraseBkgnd, WMPaint

```pascal
type
  TForm1 = class(TForm)
  private
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd);
                               message WM_ERASEBKGND;
    procedure WMPaint(var Message: TWMPaint);
                               message WM_PAINT;
  end;

procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
// do nothing
end;

procedure TForm1.WMPaint(var Message: TWMPaint);
var
  PS: TPaintStruct;
  w, h: Integer;
  DC: HDC;
  bmp, bmpOld: HBITMAP;
  i, Count, SaveDCIndex: Integer;
begin
  if Message.DC <> 0 then
    inherited
  else
  begin
    BeginPaint(Handle, PS);
    try
      w := PS.rcPaint.Right - PS.rcPaint.Left;
      h := PS.rcPaint.Bottom - PS.rcPaint.Top;
      DC := GetDC(HWND(0));
      bmp := CreateCompatibleBitmap(DC, w, h);
      ReleaseDC(HWND(0), DC);
      try
        Message.DC := CreateCompatibleDC(HDC(0));
        with PS do
        try
          bmpOld := SelectObject(Message.DC, bmp);

          with rcPaint do
            SetWindowOrgEx(Message.DC, Left, Top, nil);
          FillRect(Message.DC, rcPaint, Brush.Handle);

          Count := ControlCount;
          for i := 0 to Count - 1 do
          begin
            if Controls[i] is TWinControl then break;
            with Controls[i] do
            begin
              if Visible and RectVisible(hdc, BoundsRect) then
              begin
                SaveDCIndex := SaveDC(Message.DC);
                OffsetWindowOrgEx(Message.DC, -Left, -Top, 
PPoint(0)^);
                IntersectClipRect(Message.DC, 0, 0, Width, Height);
                Perform(WM_PAINT, Message.DC, 0);
                RestoreDC(Message.DC, SaveDCIndex);
              end;
            end;
          end;

          BitBlt(hdc, rcPaint.Left, rcPaint.Top, w, h,
              Message.DC, rcPaint.Left, rcPaint.Top, SRCCOPY);

          SelectObject(Message.DC, bmpOld);
        finally
          DeleteDC(Message.DC);
          Message.DC := 0;
        end;
      finally
        DeleteObject(bmp);
      end;
    finally
      EndPaint(Handle, PS);
    end;
  end;
end;

```


## 参考にしたサイト

https://e-words.jp/w/%E3%83%80%E3%83%96%E3%83%AB%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0.html

https://www.petitmonte.com/bbs/answers?question_id=2685

DoubleBuffered によりメモリ使用量は増えるという話。

http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00932.html

https://base64.work/so/delphi/196620


以上です。
Microsoft Build OpenJDK の正式リリースを発表


この記事は ”[Announcing General Availability of Microsoft Build of OpenJDK, May 25th, 2021](https://devblogs.microsoft.com/java/announcing-general-availability-of-microsoft-build-of-openjdk/?WT.mc_id=java-0000-yoterada) ”の翻訳記事です

## Microsoft Build の OpenJDK の一般提供開始を発表

マイクロソフトは Microsoft Build の OpenJDK の一般提供開始を発表できることを嬉しく思います。
Microsoft Build の OpenJDK は、オープンソースで、どこにでも、どなたでも無料でご利用いただける OpenJDK の新しいディストリビューションです。 
マイクロソフト社内でも Java は数多く利用されており、50万を超える Java VM が社内で実行されています。Java Engineering Group は、Java エコシステムに貢献できることを非常に誇りに思っています。そして LinkedIn、Minecraft、Azure などのワークロードを強化にサポートできる事を誇りに思っています。

今回の発表では OpenJDK 11.0.11+9 x64 をベースとした、MacOS, Linux, Windows のサーバ用およびデスクトップ用の Java11 バイナリを提供します。また、最新の OpenJDK 16.0.1+9 をベースとした ARM チップセット用の Windows 版、Linux 版の Java 16 のアーリーアクセス版バイナリも提供します。

この新しい Java 16 のバイナリは、最新の Java 版 Minecraft ([Snapshot version 21W19A](https://www.minecraft.net/article/minecraft-snapshot-21w19a?WT.mc_id=java-0000-yoterada)) において既に利用可能です、そこで数百万の Minecraft プレーヤーは、 Microsoft Build の Java 16 の OpenJDK を今すぐ利用できます。

詳細情報の入手とバイナリの入手は、[microsoft.com/openjdk](https://microsoft.com/openjdk?WT.mc_id=java-0000-yoterada) にアクセスしてください。


## コンテナイメージ
今回の一般提供開始に伴い、Microsoft Build の OpenJDK を含む Docker イメージと、イメージ作成に使用した Dockerfile も提供します。
このコンテナ・イメージは Java アプリケーションや Java コンポーネントが Microsoft Azure を含む任意の場所で利用できるように設計しています。


特定のタグ付けをした最新イメージを取得するためには、下記のコマンドを使用します。

```bash
 $ docker pull mcr.microsoft.com/openjdk/jdk:<tag>
```

詳細については、[コンテナイメージガイド](https://docs.microsoft.com/java/openjdk/containers?WT.mc_id=java-0000-yoterada)をご参照ください。

## サポートについて
Microsoft Build の OpenJDK 11 は長期サポート(LTS)バージョンで、四半期ごとに無料でアップデートを入手できます。 [microsoft.com/openjdk](https://microsoft.com/openjdk?WT.mc_id=java-0000-yoterada)

Microsoft Build の OpenJDK バイナリは、バグ修正と拡張機能、またはバックポートされたバグ修正とバックポートされた拡張機能が含まれている場合があります。これはマイクロソフトが、お客様と社内の利用者にとって重要と考え実施していますが、Microsoft の意思決定とは別に、本家 OpenJDK プロジェクトの意思決定基準があるため、本家のプロジェクトに取り込まれていないか、取り込まれていない可能性があります。

本家の OpenJDK に正式に取り込まれていないバグ修正や機能拡張は、利用可能なソースコードとともにリリースノートに明記しています。

詳細については、[完全なサポートポリシー](https://docs.microsoft.com/java/openjdk/support?WT.mc_id=java-0000-yoterada)をご覧ください。

## 新しい Microsoft の Java 用のドキュメントサイト

マイクロソフトは新規 Java 開発者用の Microsoft のドキュメントハブ ([docs.microsoft.com/java](https://docs.microsoft.com/java?WT.mc_id=java-0000-yoterada)) の提供開始を発表できることを嬉しく思います。

このドキュメント・ハブは、Microsoft テクノロジを利用して Java アプリケーションやサービスを開発を行う方法を学ぶために必要な全リソースをまとめたものです。

![](https://devblogs.microsoft.com/java/wp-content/uploads/sites/51/2021/05/Screenshot-2021-05-24-at-12.47.45.png)

## ご参考

2021/05/23 日に Japan Java Users Group で発表した、[YouTube: Introduction of Microsoft Build OpenJDK](https://www.youtube.com/watch?v=pcJGdtaFV-U) の内容も併せてご覧ください。発表直前で、日程やサポート内容に関する詳細について説明ができませんでしたが、Microsoft が OpenJDK を提供するに至った背景などをご紹介しています。こちらも併せてご参照いただければ誠に幸いです。


https://www.youtube.com/watch?v=pcJGdtaFV-U&t=390s
macOS Safariの広告をブロックする方法。 

#はじめに
広告ブロックといえば**hosts**ファイルにブロックしたいドメインを追加するだけでしたが、**macOS Big Sur**ではすんなり行かなかったので、調べた事のメモです。


#hostsファイルとは
[hosts](https://ja.wikipedia.org/wiki/Hosts)とは[IPアドレス](https://ja.wikipedia.org/wiki/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)と[ホスト名](https://ja.wikipedia.org/wiki/%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D#%E6%9C%89%E5%8A%B9%E3%81%AA%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D%E3%81%AE%E5%88%B6%E9%99%90)の対応を記述したテキストファイルで、ここに**ブロックしたいホスト名**と[localhost](https://ja.wikipedia.org/wiki/Localhost)を対応するように記述しておいて**サーバーがみつからない**という状態にします。




#####-参考にさせていただいた記事-
[hostsファイルとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word16969.html)
[ローカルホスト (localhost)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1102.html)

#hostsの編集
hostsはアクセス権限により通常のテキストのようには編集できません。
ターミナルから編集する方法もありますが、僕は以下の手順で編集しました。

```:
google.com をブロックしたい場合

127.0.0.1        google.com
::1              google.com
```

1. **Finder**で[Shift＋⌘＋G]を押して`/etc/hosts`を入力します。
2. `etc`が開くので、中の**hosts**をデスクトップにコピーします。
3. デスクトップにコピーした方をダブルクリックで開きます。
4. 編集したら保存して、`etc`にドラッグ&ドロップで上書きします。
5. Touch IDかパスワードを求められて編集作業は終了です。

**🐰お疲れさまでした。**


#####-参考にさせていただいた記事-
[macでhostsファイルを書き換える3つの方法【保存版】 | oku-log](https://oku-log.com/blog/mac-hosts/)


#DNSキャッシュのクリア
hostsに追記された**ホスト名**は**localhost**を参照するようになりましたが、既にDNSサーバーから取得したIPアドレスは**キャッシュ**されているので、これをクリアしないと反映されません。
ターミナルから次のコマンドでキャッシュをクリアします。

```:ターミナル
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
```

#####-参考にさせていただいた記事-
[How to Flush DNS Cache in MacOS Catalina & Big Sur](https://osxdaily.com/2020/08/27/how-flush-dns-cache-macos-catalina-macos-big-sur/)
[Flush DNS cache locally in macOS, OSX, Linux and Windows](https://wpbeaches.com/flush-dns-cache-locally-in-macos-big-sur-catalina-osx-linux-and-windows/)


#Safariの設定
この記事を書きはじめたきっかけなのですが、自信がなくなってしまいました。
と言うのも、Safariの設定を変更しただけで広告はブロックされたのですが、設定を戻しても広告はブロックされたままなので、「設定の変更は関係あったのか？」という状況です。
とは言え、設定変更した内容だけメモしておきます。

1. Safariで[⌘＋,]で**環境設定**を開きます。
2. 検索タブを選択します。
3. 全てのチェックボックスを外します。


#####-参考にさせていただいた記事-
[macos - Why is adding adding sites to /etc/hosts not blocking them on BigSur? - Ask Different](https://apple.stackexchange.com/questions/414160/why-is-adding-adding-sites-to-etc-hosts-not-blocking-them-on-bigsur)
【macOS】Safariでページ全体を翻訳したい。

#はじめに
Mac版の**Safari**でもGoogleChromeみたいに**ページ翻訳**がしたい。
Translateという機能拡張をインストールすれば出来るらしいが、現在は不明なので今後に期待しつつ、別な方法でも翻訳できたのでメモしておきます。


#ブックマークレット
ブラウザの**ブックマーク**にはURLが入ってますが、**JavaScript**のコードを入れて動作させることもできます。

つまり、ブックマークに登録して使うプログラムを**ブックマークレット**と言うみたいです。

###Google翻訳
今回、使用する**ブックマークレット**はページ全体をGoogle翻訳させると言うものです。

1. [⌘＋D]でこのページを[お気に入り]にブックマークします。
2. [option＋⌘＋B]でブックマークを開きます。
3. 以下のコードを追加したブックマークのURL(アドレス)の部分にコピペします。
4. 名前を好きな名前に変えます。(例 : 📝)
5. [shift＋⌘＋B]でブックマークバーを表示します。 


```js:ページ翻訳
javascript:location.href='https://translate.google.com/translate?sl=auto&tl=ja&u='+location.href
```


以下はサンプルです。
[原文](https://omz-software.com/pythonista/docs/)　[翻訳](https://translate.google.com/translate?sl=auto&tl=ja&u=https://omz-software.com/pythonista/docs/)

＊この方法で翻訳できないページも**結構**あります。

**🐰 お疲れさまでした。**
Material-uiの使い方(設定変更) とらゼミ メモ

## INSTALL
- material-ui/core, material-ui/icons, material-ui/systemの三つをインストールする。

## 使い方
### Hook API 
- @material-ui/stylesをインストールしておく。
- createStylesとmakeStylesをimportして使う。
- josm形式で記述していく、キャメルケースを使用する。

例)

```react
const useStyles = makeStyles(() => (
    createStyles({
        "button": {
            borderColor:"#FFB549",
            color:"#FFB549",
            fontWeight: 600,
            marginBottom: "8px",
            "&:hover": {
                backgroundColor: "#FFB549",
                color: "#FFF"
            }
        }
    })
));
```
#### 適用方法
- コンポーネント内で宣言。
- オブジェクト型として使える。

例) ※記述はクラス型。

```react
const Answer = (props) => {

    const classes = useStyles();

    return(
        <Button 
            className={classes.button}
            variant="outlined" onClick={() => props.select(props.content,props.nextId)} 
        >
            {props.content}
        </Button>
    )
}
```
### Styled-component API
- あらかじめ用意されたコンポーネントにstyleを設定してあげることで設定が可能。

### HIgher-order component API
- コンポーネントを返すコンポーネント。
- コンポーネントをを操作して返すやり方。

##
PHPで日付を扱うには

#Carbonクラス
Javaなどの言語を使っているとCalenderクラスやDateクラスなど、使う用途によって色々使い分けが必要で日付を扱うことに苦手意識がありました。
ですが、PHPでは日付に関してCarbonクラスさえ理解していれば、問題ありません！

> 参考にしたサイト：https://blog.capilano-fw.com/?p=867

色々なサイトを確認しましたが、こちらのサイトが紹介している種類が一番多く、索引としてページ内検索をかけて利用するのに重宝しています。

筆者が実際に使用したメソッドは下記になります

## 日付の取得

```php:日時の取得
$today = new Carbon('today');
$today = Carbon::today();
$today = Carbon::today('Asia/Tokyo') //タイムゾーン付きの取得
```

同様に`yesterday`と`tomorrow`も使うことができます。

```php:日付のみ取得したいとき
$today = (new Carbon('today'))->toDateString();
$today = Carbon::today()->toDateString();
$today = Carbon::today('Asia/Tokyo')->toDateString(); //タイムゾーン付きの取得
```

どれも`→toDateString()`をメソッドチェーンの形で繋げるだけですが、一番上の例は個人的に少し見づらく感じるのであまりお勧めしません。


## 日付の比較

```php:日時の比較
$first = new Carbon('2021-01-01 13:00:00');
$second = new Carbon('2021-01-01 14:00:00');

//より前(条件に=を含まない)
if($first->lessThan($second)){
  echo '$first が前の時間です。';
}

//以前(条件に=を含む)
if($first->lessThanOrEqualTo($second)) {
  echo '$first が同じか前の時間です。';
}

```

参考サイトで表示されている、ItやIteはなぜかエラーになってしまって使えませんでしたので、lessThanを使用しました。(利用環境:Laravel8.x)

## レスポンスの時の形式を変更する

データベースから値を取得し、そのままの`created_at`や`updated_at`をレスポンスしようとすると`00000Z`のような形式になり、なんだかうまく日付が反映されません。
そんなときには、取得している日付情報を**ISO8601形式の日付**にフォーマットしましょう

```php:ISO8601形式の日付に変換する
 $datetime->toIso8601String();
```
VScodeのリポジトリの初期化を元に戻したい

#経緯について
MAMPでリポジトリを作成し全てGithubにあげようとした際、変更が多すぎてエラー発生。
MAMPディレクトリ内のhtdocs以降のみにしようとhtdocsからVScodeで開いたが、MAMP全体の変更が表示された。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696940/1cab2a65-717a-f1d5-800d-1b99d42b3cf8.png">　<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696940/8a56b0eb-a706-5456-0da3-ac93350eea05.png">

##動作環境
・MacOS big Sur
・Visual Studio Code バージョン: 1.56.2
・git version 2.31.0


##試したこと
・そのままhtdocsだけプッシュ　　　 →　変更が残っているのが気持ち悪かった
・htdocsのみ別ディレクトリにコピペ　→　今後の二度手間はなるべく避けたい

リポジトリの初期化をやり直したい。


##リポジトリの初期化について
ローカルリポジトリを作成する際の基準となるディレクトリの指定？

##リポジトリの初期化を元に戻す方法
1.ソース管理の・・・でソース管理リポジトリをチェック
2.出てきたソース管理リポジトリの中にあるリポジトリを右クリック、リポジトリを閉じる。
3.リポジトリの初期化が出るので指定したいディレクトリに移動しリポジトリを初期化。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696940/d942b0d4-9a7b-fbfd-b8cf-e0d568a6831a.png">


とりあえず個人的にやり直す分にはこれでいいのかも。
Emacsに辞書を導入する(備忘録)

Emacs上で辞書を開きたい場面が多かったので導入した.
参考にしたのは[このサイト](https://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToUseEpwingDict.html).

#実装
##1. EPWING形式のフリー辞書をダウンロードする
有料の辞書を使いたかったが2021年現在, EPWING形式の辞書データを付属している辞書は古書店でもほとんど売ってなかったので, 配布されているフリー辞書をダウンロードして使った.

お借りしたのは以下の辞書
-[EPWING for the classics](https://classicalepwing.osdn.jp/)(羅英)
-[WordNet EPWING](https://wordnetepwing.osdn.jp/)(英英&英和, 国語)

##2. Dictディレクトリを作成しEPWING形式の辞書を移動させる
```
$ sudo mkdir /home/Dict
$ mv eld /home/Dict/
$ mv wordnet-enjp /home/Dict/
```

##3.lookup.elのインストールと.emacsの編集
####lookup.elのインストール
```
$ sudo apt-get install lookup-el
```
####eblookのインストール
```
$ sudo apt-get install eblook
```
####.emacsの編集(ほぼ丸パクリ)
```
;;Lookup
(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-pattern "lookup" nil t)
(define-key ctl-x-map "l" 'lookup)
(define-key ctl-x-map "y" 'lookup-region)
(define-key ctl-x-map "\C-y" 'lookup-pattern)
(setq lookup-search-agents
      '(
	(ndeb "/home/Dict/eld")
	(ndeb "/home/Dict/wordnet-enjp")
        ))
(setq lookup-default-dictionary-options
      '((:stemmer .  stem-english)))
(setq lookup-use-kakasi nil)
```

#使用方法
C-x ＋ y : 選択したリージョン内の単語を検索
C-x ＋ C-y : ミニバッファに入力した単語を検索
C-x ＋ l : 検索に用いる辞書を設定する
q : 検索画面を閉じる
[Vivus Instant] SVGの手書き風テキストアニメーションを超簡単に作成する。

<img src="https://raw.githubusercontent.com/UDAZ/vivus-instant/3e13efc7ece0fc5f2766a656e2cabf24c117c09c/completeplane_animated.svg">
### はじめに
プログラミングスクールの課題のECサイトを作っています。SVGの手書き風テキストアニメーションに憧れがありましたが、課題納期等の関係で学習時間をあまり確保できない状況でした。[vivus.jsを利用したテキストアニメーション](http://maxwellito.github.io/vivus/)というところまでは辿りつきましたが、使っているドローソフトの設定がいけないのかvivus.jsがなかなか思ったような動作をしてくれない！諦めか！と思っていたところvivusが超簡単なものを用意してくれていました！これならすぐ作成可能ですし、デモということであれば100点な動きをしてくれると思います。

### 使用したもの
Vivus instant　https://maxwellito.github.io/vivus-instant/
Inkscape

### ①Inkscapeで.svgを作成する。

<img src="https://raw.githubusercontent.com/UDAZ/vivus-instant/3e13efc7ece0fc5f2766a656e2cabf24c117c09c/completeplane.svg">

今回はECサイトで会計後のサンクスページに表示されるものをテーマに作成していきます。表示されているファイルはテキストで記述したレイヤーをなぞるように新しいレイヤーでペンツールを使ってパスを1角ずつ、順番に書いていきます。ストロークの設定で文字を太くしています。

### ②Vivus instantで作成したファイルを読み込んで調整・保存
.svgを読み込んだら以下のオプションに設定しUpdateします。

**Animation type - One By One**

**Download** で保存して終了

___


手書き風テキストアニメーション完成です！ロゴなどで作ってみると映えそうです！
民法における未成年のメモ

## 背景

未成年の場合, 基本的には契約の取り消しが可能となっている
(e.g. EC サイトなどで物を買ったとしても, 未成年(民法)を事由に返品ができる)

https://www.pref.aichi.jp/kenmin/shohiseikatsu/information/law_basis/detail02.html

## 未成年の定義

満 20 歳で成年. 20 歳未満(20 歳の誕生日がくるまで)は未成年.

つまり `age < 20`

例外としては未成年で婚姻している場合. この場合, 私法上は成年とみなされる(成年擬制).
(未成年で婚姻し, 未成年で離婚している場合は成年とみなされるっぽい)

http://www.ivy-g.com/e-rikon/melmaga/melma20160706.html


## 民法改正

2022 年 4 月からは, 満 18 歳から成年.

https://www.gov-online.go.jp/useful/article/201808/2.html

## 親権者の同意を eKYC したい.

個々の本人であればマイナンバーカードの電子署名なりでできるが, 親権者の同意を確認したいときはどうするか?

本当に親権者(法定代理人)が親権者(法定代理人)であるかどうか(なりすましをしていないか)確認する術はあるだろうか?

https://www.iwanagaoffice.com/blog/2393
https://www.soumu.go.jp/main_content/000582387.pdf

親権者の場合は戸籍謄本であるが, その書類をもらうのが躊躇われる. 電子署名されたことで親権者であることも証明できる仕組みがあると嬉しいところ.

電子公証という手もあるが... ちょっとめんどいよね.
CircleCIで通知処理をカスタマイズする

# はじめに
現在携わっているプロジェクトでは、1つのリポジトリで複数のモジュールのコードを管理しています(モノレポ構造)。
モジュールごとにlintや単体テストなどのジョブを実行しており、それぞれのジョブが成否を通知する設定となっていたため、大量の通知でチャットツールのタイムラインがすぐに流れてしまうことに悩まされていました。

そこで、ジョブが失敗した時、もしくは全ジョブが成功したのみ通知する形にしようとしたのですが、通常の設定だけでは対応することが出来ませんでした。
`Orb`(拡張機能のようなもの)を使うと、Slack向けの通知をカスタマイズすることは出来るようなのですが、現在使用しているチャットには対応していないため、コマンドを定義して自ら処理を作成しました。
(作成にあたっては、Slack用Orbの[ソースコード](https://circleci.com/developer/ja/orbs/orb/circleci/slack)を大いに参考にさせていただきました :pray: )

この設定は、コマンド定義が利用可能なCircleCI・バージョン2.1が必要です。

# 手順
## ステップ1: コマンドを定義する
通知を行う処理を、コマンドとして定義します。ここでは、シェルがbashの場合の例を挙げています。

最初の2つのステップ(steps)はジョブの成否で、どちらか一方の処理が実行されます。ジョブ成功ならば`Success`、失敗ならば`Failure`が、環境変数`CI_JOB_STATUS`に格納されます。
最後の3つ目のステップ(成否に関わらず実行される)では、前処理で格納された`CI_JOB_STATUS`を参照して、通知の要否を判断しています。

この例では省略していますが、`# ここで通知を実施`とコメントが書かれている箇所で、通知用APIを呼び出すなど、実際の通知処理を行います。
通知に必要な情報は、環境変数で取得することができます。詳細は[リファレンス](https://circleci.com/docs/ja/2.0/env-vars/?section=pipelines#%E5%AE%9A%E7%BE%A9%E6%B8%88%E3%81%BF%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)を参照してください。

```yml
commands:
  notify-result:
    description: ジョブの処理結果通知処理
    parameters:
      event:
        description: |
          通知条件("Always": 常に通知, "Success": 成功時のみ, "Failure": 失敗時のみ)
        enum:
          - Always
          - Success
          - Failure
        type: enum
    steps:
      - run:
          name: ジョブのステータス検知(失敗)
          command: |
            echo 'export CI_JOB_STATUS="Failure"' >> $BASH_ENV
          when: on_fail
      - run:
          name: ジョブのステータス検知(成功)
          command: |
            echo 'export CI_JOB_STATUS="Success"' >> $BASH_ENV
          when: on_success
      - run:
          name: 通知処理の呼び出し
          command: |
            if [ "${CI_JOB_STATUS}" = "${NOTIFY_PARAM_EVENT}" ] || [ "${NOTIFY_PARAM_EVENT}" = "Always" ]; then
              source $BASH_ENV
              # ここで通知を実施
            else
              echo "Notification skipped."
              echo "Job status: ${CI_JOB_STATUS}, Parameters(event: ${NOTIFY_PARAM_EVENT})"
              exit 0
            fi
          environment:
            NOTIFY_PARAM_EVENT: <<parameters.event>>
          when: always
```

## ステップ2: ジョブを定義する
ステップ1で作成したコマンドをジョブに組み込みます。
以下の例では、lintでエラーが検出されると通知が行われます。

```yml
jobs:
  exec-lint:
    description: lintの実行
    executor: sample-executor
    steps:
      - run:
          name: lintコマンドの実行
          command: yarn lint
      - notify-result:
          event: Failure
```

## ステップ3: ワークフローに組み込む
作成したジョブをワークフローに組み込みます。
以下の例では、`name`を指定してジョブに別名を付けています。

```yml
workflows:
  version: 2
  workflow-sample:
    jobs:
      - build
      - exec-lint:
          name: lint-backend
          requires:
            - build
      - exec-ut:
          name: ut-backend
          requires:
            - lint-backend
```

# おまけ
## 設定ファイルのバリデーション

CircleCIのCLIをインストールしていると、設定ファイルのバリデーションが出来ます。
macOS で Homebrewが使用可能な環境であれば、以下のコマンドでCLIをインストール出来ます。

```shell
brew install circleci
```

リポジトリのルートディレクトリ(`.circleci`ディレクトリが置いてある場所)にて、コマンドを実行します。結果が正常であれば、以下のように出力されます。

```shell
$ circleci config validate
Config file at .circleci/config.yml is valid.
```
error checking context: 'can't stat '/home/user/myapp/tmp/db''.

# 環境

EC2上でdockerにてimageをbuild中に起きた。

```
$ docker-compose build
```

エラー文

```
Building myapp
error checking context: 'can't stat '/home/user/myapp/tmp/db''.
ERROR: Service 'minnano_asobi' failed to build
```

# 原因
権限の問題みたい。

# 対処
権限を変更すると良い。
※対象のフォルダは適宜変更してください。

```
#対象のフォルダは自分の環境に合わせてください
$ sudo chown -R $USER /home/user/myapp/tmp/db
```

# 結果

```
$ docker-compose build
```

```
Building myapp
Sending build context to Docker daemon    288MB

...

Successfully built ********
Successfully tagged myapp:latest
```
[slick][MySQL]insertOrUpdateのupdateが動作しなくてハマった

slickの[insertOrUpdate](https://scala-slick.org/doc/3.3.3/queries.html)は、upsert（primary keyのカラムの値を比較し、レコードがすでに存在するならinsert、存在しないならupdateする）を可能にする便利な機能です。
このupdateがうまく動かずハマってしまいましたが、わかってしまえばすごく単純でした。

コード上のスキーマ定義では`O.PrimaryKey`を指定していたのですが…

```scala
class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") {
  def name = column[String]("COF_NAME", O.PrimaryKey)
  def supID = column[Int]("SUP_ID")
  def price = column[Double]("PRICE")
  def sales = column[Int]("SALES", O.Default(0))
  def total = column[Int]("TOTAL", O.Default(0))
  def * = (name, supID, price, sales, total)
}
```

凡ミスで、実際のMySQLのテーブルではprimary key指定を忘れていました。。。

コードで書いているだけでは正常に動かないみたいですね。
slickから実際のMySQLのスキーマもで確認する処理が走っているようですね
SwiftUI .onMoveの実装について ~CoreData~

## 環境
【Xcode】 12.4
【Swift】 5.3.2
【iOS】 14.5

## ソースコード
Todoアプリ作成の過程で少々面倒だったため記録用。
.onMoveを実装するにあたりCoreDataを使用。

まずはCoreDataを使えるようにします。

```swift
struct ContentView: View {
   @Environment(\.managedObjectContext) private var viewContext
   @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \todoList.data,ascending:true)],animation:.default)
   
   private var todoList: FetchedResults<TodoEntity>
}

```

####move関数の実装


```swift
    private func move(from source: IndexSet, to destination: Int) {
        //下から上に並べ替え時の挙動
        if source.first! > destination {
            todoList[source.first!].data = todoList[destination].data - 1
            for i in destination...todoList.count - 1 {
                todoList[i].data = todoList[i].data + 1
            }
        }

        //上から下に並べ替え時の挙動
        if source.first! < destination {
            todoList[source.first!].data = todoList[destination - 1].data + 1
            for i in 0...destination - 1 {
                todoList[i].data = todoList[i].data - 1
            }
        }
      saveData()
    }
        
    private func saveData() {
        try? self.viewContext.save()
    }
```

####.onMoveの実装

```swift
    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(todoList, id: \.id) { todo in
                        if todo.category == self.category.rawValue {
                            NavigationLink(destination: EditTask(todo: todo))
                        } //一部抜粋
                      }
                    }
                    .onDelete(perform: deleteTodo)
                    .onMove(perform: move)
                }
                .toolbar {
                    EditButton()
                }
            }
        }
    }
```

####参考資料
https://capibara1969.com/2281/
PHPUnitでAWS SDKのクラスをモックする

AWS SDK for PHPのクラスをPHPUnitでモックしようとした所次のようなエラーが発生しました。

```php
public function testExample()
{
        $s3Client = $this->createMock(S3Client::class);
        $s3Client->method('GetObject');
}
```

エラー内容

```
PHPUnit 9.5.4 by Sebastian Bergmann and contributors.


Trying to configure method "GetObject" which cannot be configured because it does not exist, has not been specified, is final, or is static
 /path/to/test/ExampleTest.php:18
 


Time: 00:00.017, Memory: 14.00 MB


ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
```

実装を見るとわかるのですが、`GetObject()`は`Aws\S3\S3Client`クラスのdocコメントに書いてあるだけで実際には存在しません。内部の処理がどうなっているのかはわかりませんが、どうやら実行時によしなに解決されているようです。
しかし、メソッドがクラスに存在しないということは、PHPUnitの`createMock()`でモックすることができません。困った。

## どうする

`createMock()`ではなく`createPartialMock()`メソッドを使います。このメソッドは第二引数にメソッド名の配列を受け取り、モックオブジェクトを作る時にこれらのメソッドをモック対象として追加してくれます。

```php
public function testExample()
{
        $s3Client = $this->createPartialMock(S3Client::class, ['GetObject']);
        $s3Client->method('GetObject');
}
```

エラーが消えた！しかし、警告が出ています。存在しないメソッドのモックは良くないらしく、将来的にはサポートされなくなるそうです。ぐぬぬ。

```
createPartialMock() called with method(s) GetObject that do not exist in Aws\S3\S3Client. This will not be allowed in future versions of PHPUnit.


Time: 00:00.017, Memory: 12.00 MB


WARNINGS!
Tests: 1, Assertions: 0, Warnings: 1.
```

## その他の方法

AWS SDK for PHPには各サービスをモックする方法が提供されています。PHPUnitのモックを使うよりも冗長になりますが、基本はこちらを使うのが今のところベストかと思います。
しかし、こちらの方法では「どのメソッドが」「どの引数で」「何回呼び出された」というようなことは確かめられないので、それらをテストする必要がある場合は非推奨ですが、PHPUnitでのモックをすることになると思います。

https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_handlers-and-middleware.html#mock-handler
try-catch-finallyのメモ

try-catch-finallyの学習メモです。

## finally中に、returnを利用する


```
例：

    public static void main(String[] args) {
        System.out.println("result: " + getValue());
    }
    private static int getValue() {
        int num = 0;
        try {
            num++;
            System.out.println("try句が実行されました。");
       　　 ...
            return num;
        } catch (Exception e) {
            // do something
        } finally {
            num++;
            System.out.println("finally句が実行されました。");
            return num;
        }
    }

```

```
実行結果：
try句が実行されました。
finally句が実行されました。
result: 2
```
もしtryとfinallyの中に、両方returnが利用している場合、tryのreturnを無視して、finallyのreturnの値を返却します。
なので、returnを利用する際、基本は、メソッドの最後に書きます。

```
例：

    public static void main(String[] args) {
        System.out.println("result: " + getValue());
    }
    private static int getValue() {
        int num = 0;
        try {
            num++;
            ...
        } catch (Exception e) {
            // do something
        } finally {
            // do something
        }
        return num;
    }
```

```
実行結果：
result: 1
```


## finally中にソースが実行されない


```
例：

    public static void main(String[] args) {
        System.out.println("result: " + getValue());
    }
    private static int getValue() {
        int num = 0;
        try {
            System.out.println("try句が実行されました。");
            return num;
        } finally {
            System.out.println("finally句が実行されました。");
            num++;
        }
    }
```

```
実行結果：
try句が実行されました。
finally句が実行されました。
result: 0
```

この例から、finallyのソースが実行されてないわけではないです。出力の順番で１ではなく、0が出力されるように見えます。
原因は、finallyのコンパイル仕組みに関わっているため、以下の資料を参照してください。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.13

ここも、returnを利用する際、メソッドの最後に書くことが大事です。


## finally中のソースが最後で実行する

```
例：

    public static void main(String[] args) {
        execErr();
    }
    private static void execErr() {
        try {
            System.out.println("try句が実行されました。");
            throw new RuntimeException();
        } catch (RuntimeException e) {
            System.out.println("catch句が実行されました。");
        } finally {
            System.out.println("finally句が実行されました。");
        }
    }

```


```
実行結果：
try句が実行されました。
catch句が実行されました。
finally句が実行されました。
```

ただ、catch文の中に、例外を出力する処理がある場合、finallyを実行した後、例外をスローします。

```
例：

    public static void main(String[] args) {
        execErr();
    }
    private static void execErr() {
        try {
            System.out.println("try句が実行されました。");
            throw new RuntimeException();
        } catch (RuntimeException e) {
            System.out.println("catch句が実行されました。");
　　　　　　 e.printStackTrace();
        } finally {
            System.out.println("finally句が実行されました。");
        }
    }

```


```
実行結果：
try句が実行されました。
catch句が実行されました。
finally句が実行されました。
java.lang.RuntimeException
	at com.sample.StudyTryCatch.execErr(StudyTryCatch.java:11)
	at com.sample.StudyTryCatch.main(StudyTryCatch.java:6)。
```
matplotlibでpng画像表示

# pythonで画像表示
恥ずかしながら今までプログラミング言語でプログラムして画像表示というものをしたことがなかった。
pythonのmatplotlibを用いると簡単にできたので、ある種感動したのでその記録。

```python:showpng.py
#!/usr/bin/env python3

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread("m2.png") # png形式の画像データをnumpyのndarray形式の配列に変換
plt.imshow(img) # imshowは配列を引数に取ることができる。
plt.show() # 読み込んだ配列形式のデータを画像形式として表示
```

# 実行結果
![m2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62130/50419731-97b6-c078-6843-f740b1d053ec.png)
C# DateTimeから日付のみを取得する　DateTime.Date とDateTime.Dayの違い

#DateTimeから日付のみを取得する

生年月日から年齢を取得する処理を書こうとする中でDateTime型のオブジェクトから日付を取得しようとしたところ、DateTime.DateとDateTime.Dayというふたつの取得方法がありました。
一度知れば大きく異なる2者ですが、両者について言及されている記事が見つからなかったので簡単にまとめます。

結論から言えば、今回の場合取得したいものが年月を無視した日付単独の値だったので、DateTime.Dayを用いました

DateTime.DateはDateTimeの時刻を00:00:00にしたものを返します。
対してDateTime.DayはDateTimeの日付部分をInt型で返します。


```C#:qiita&#x20;DateTime.date,DateTime.Day
DateTime today = DateTime.now;
DateTime dateToday = today.Date;
int dayToday = today.Day;
```

それぞれ2行目がDateTime.Dateプロパティ、3行目がDateTime.Dayを用いて言います。
出力すると以下のようになります。

```C#:qiita&#x20;WriteLineでの出力
Console.WriteLine( today );
Console.WriteLine( dateToday );
Console.WriteLine( dayToday );
```
```C#:qiita&#x20;出力
2021/05/25 23:56:25
2021/05/25 0:00:00
25
```

DateTime.Dateで獲ってくる値はDatTime型
DateTime.DayはInt型でかつ年月の情報はありません。

DateとDayでややこしさがありますが、全く別物ですね。

Dayで取得した場合はそのまま整数の値として使用できます。
Dateで取得した場合、同じくDateでの加算減産を行うとTimeSpan型で値を得ることになります。
それについてはまた今度

備忘録程度に
Pythonでテキストファイルを読み込む

## テキストファイル全体を読み込む

```python
file = open('test.txt', mode='r') # mode r:読込み w:書込み
text = file.read()
print(text) # テキストファイル全体が表示される
file.close()

# ファイルを閉じたか
print(file.closed) # True
```

## テキストファイルを一行ずつ読み込む

ファイルサイズが大きい場合、全体ではなく行単位の操作が望ましい場合があります。
また、context manager 「with」を使用すれば、ファイルが使用された後に閉じることが保証されます。

```python
with open('test.txt') as file:
    print(file.readline())

print(file.closed)  # True
```
PowerAutomateでWeb情報を入手しExcelへ記入する

#背景
鬼教官より、GWの課題をもらった。
社内ではOffice365が導入されている為、使いこなすのが当たり前だということで
今回はPowerAutomateの課題をクリアしていく。

#課題
Power Automate Desktopで下記を自動化
①エクセルファイル(宿題.xlsx)を開く
＜宿題.xlsx＞

|住所|緯度|経度|
|---|---|---|
|東京都|||
|鹿児島県|||

②ネットから、住所列の緯度経度を取得する
③緯度経度列に入力
④3秒待つ
⑤エクセルを保存せずに閉じる


#準備

###OS環境
PowerAutomate Desktopを使うには、Windows10の環境が必要。
わし）おいらのＰＣ、Windows10だよ。
鬼教官）じゃあ、Windows10にしてください。

ネットで検索したところ、2021年のGW時点では、まだアップグレードできるみたい。
参考：[Windows10アップグレード](https://pcmanabu.com/win8-to-windows10/)

###PowerAutomateDesktop
MicrosoftのHPからダウンロード。
最近できたみたいで、Windows10ユーザなら無料で使えるみたい。

#結果

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642378/dfe5b0ff-e819-788d-b923-6ef9e0741d98.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642378/d8ba4277-f971-1e83-13aa-ac18ca6cd06f.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642378/6d75097a-535e-c0cf-138e-80a59faa94ed.png)

#疑問
「Webページのボタンを押します」「Wibページのリンクをクリックします」を「GPS座標検索」に設定しているが、
右の「TOKYO97風」をクリックしてしまう動作になっているので、「ウィンドウのUI要素をクリックする」に変更し
無理やり動作させている。
思うように動かないのは疑問として残る。

#まとめ
PowerShellで書くなら、こんな感じにおさまる

```
Set-StrictMode -Version Latest;

# Excelを起動する
$excel = New-Object -ComObject Excel.Application;
# 通常モード、前面で表示させる
$excel.WindowState = [Microsoft.Office.Interop.Excel.XlWindowState]::xlMinimized;
$excel.WindowState = [Microsoft.Office.Interop.Excel.XlWindowState]::xlNormal;
$excel.Visible = $true;

# ファイルを開く(パス注意)
$book = $excel.Workbooks.Open('宿題.xlsx');
$ws = $book.Worksheets(1);
$tbl = $ws.ListObjects(1);

# テーブルの行をループする
foreach ($row in $tbl.ListRows) {
    # webから座標を取得
    $result = Invoke-RestMethod -Uri "https://www.geocoding.jp/api/?q=$($row.Range(1).Value2)";
    # 緯度を書き込み
    $row.Range(2).Value2 = $result.result.coordinate.lat;
    # 経度を書き込み
    $row.Range(3).Value2 = $result.result.coordinate.lng;
}

# 3秒待つ(カウントダウン付き)
cmd /c 'timeout 3';

# 保存せずに閉じる
$book.Saved = $true;
$excel.Quit();

```

PowerAutomateで作るにしても、用途次第では使い物にならないかもしれない。
今後はPowerApps、Power BIを勉強してみたい。
pyenvでmacにPythonを入れる

# TL;DR

macOS Big Sur 11.2.3(20D91)にpyenvでpython v3.9.5をインストールする。

# 手順
pyenvをインストールする。

```
$brew install pyenv
```

パスを通す。

```
$echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
$echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$source ~/.bash_profile
```

python 3.9.5をインストール

```
$pyenv install 3.9.5
```

# 参考資料
* pyenvでインストール
    * 「Pythonの開発環境を用意しよう！（Mac）」
    * https://prog-8.com/docs/python-env
* brewでインストール
    * 「macOS版Pythonのインストール」
    * https://www.python.jp/install/macos/install_python.html
STM32F767とGP2Y0A21YK(赤外線距離センサー)で6cmから80cmを求める。


目的
adcのテスト用

どうしてこうなったかは、6-10,10-20,20-80を参考


```c++

#include "mbed.h"

//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4
AnalogIn adc_vbat(A0); //767


//Serial pc(USBTX, USBRX); // tx, rx
Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010
//RawSerial pc(PA_2, PA_3); //010

//赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
//Voltage //電圧
float ir_len(float Voltage)
{

    float ir_length;   //長さ

    if (Voltage >= 0.0f  && Voltage <= 0.4f) {Voltage = 0.4f;}
    if (Voltage >= 3.12f && Voltage <= 5.0f) {Voltage = 3.12f;}

    if        (Voltage >= 0.4f && Voltage <= 1.3f ) { //80-20

        ir_length = 1.0f/ ( 0.0125f + ( ( Voltage - 0.4f) *  (0.0375f/0.9f) ) );

    } else if (Voltage >= 1.3f && Voltage <= 2.3f ) { //20-10

        ir_length = 1.0f/ ( 0.05f   + ( ( Voltage - 1.3f) * 0.05f ) );

    } else if (Voltage >= 2.3f && Voltage <= 2.75f)  { //10-8

        ir_length = 1.0f/ ( 0.1f + ( ( Voltage - 2.3f) * (0.025f/0.45f) ) );

    } else if (Voltage >= 2.75f && Voltage <= 2.98f) { //8-7

        ir_length = 1.0f/ ( 0.125f + ( ( Voltage - 2.75f) * (0.0179f/0.23f) ) );

    } else if (Voltage >= 2.98f && Voltage <= 3.12f) { //7-6

        ir_length = 1.0f/ ( 0.1429f + ( ( Voltage - 2.98f) * (0.0238f/0.14f) ) );

    }//end if

    //戻り値
    return(ir_length);

} //ir_len

//メイン関数
int main()
{
    
    float Voltage;     //電圧
    float ir_length;   //長さ

    //無限ループ
    while(1){
        
        //adcの読み込み 0から4096
        int s = (adc_vbat.read_u16()>>4);
//d        s = (4096/2)-1;
        
//d        pc.printf("  -S=%d",s); //767
        
        //電圧に変換 ex 3.300 -> 3300 mVを出力
        s=(s*6600)>>13;
        
        //s = 3300;
//d        pc.printf("\t c=%d",s); //767
        
        Voltage = (float)s / 1000.0f;
        
//d        pc.printf("\t v=%f",Voltage); //767
        
        //赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
        ir_length = ir_len(Voltage);
        
//d        pc.printf("\t l=%f",ir_length); //767
        
//d        pc.printf("\r\n"); //767 リターン
        
        //距離の出力
        pc.printf("%f\r\n",ir_length); //767
    
        wait_ms(1000);
    
    }//while
}//main



```

![com_1_d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0d43e0b-da2f-08c7-a47a-af5b2fdfbbf9.jpeg)
【YOLOv5】スナックエンドウの収穫用に物体検出モデルをつくってみる【Windows】

# はじめに
会社で機械学習で使える統計学をサラッと教えてくれと無理を言われて苦労して作ったものをせっかくなのでUPします:fearful:

仕事でつかえる機械学習について数式をできるだけ使わない形でブログ化しました。私の理解するところなので初心者向けです。ガチな人はお手柔らかに...
今回は、ブログの中で好評なyolov5についてご紹介します。

良かったら↓見てください:smiley:

https://farml1.com/


# YOLOv5を実装していく～前準備～
OSはWindows10でやっています。軽く検索したらWindowsでの実施例が無かったので人柱としてやっていきます。

+ OS : Windows 10
+ CPUA : AMD Ryzen 7 5800
+ メモリ : 16 GB
+ GPU : GeForce RTX3700

まずはGitからYOLOv5をダウンロードして環境設定していきます。
Pythonのバージョンは3.8でやりました。

```
conda create -n yolov5 python=3.8
conda activate yolov5
git clone https://github.com/ultralytics/yolov5.git
cd desktop\yolov5
pip install -U -r requirements.txt
```

これでyolov5環境ができますが、このままだと[PyTorch](https://pytorch.org/get-started/locally/)でGPUが使えなかったのでPyTorchを入れなおしていきます。PyTorchのバージョンv.1.7.1でうまくいきました。私の場合は↓のコードを入れましたが、環境に合わせて変更してください。

```
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
```


# YOLOv5を実装していく～データセット～

お手持ちのデータセット（今回はスナックエンドウの画像）のアノテーションをします。私の実施した方法の詳細は[ここ](https://farml1.com/snackpea_2/#toc1)を参照ください。データが準備できたら、ディレクトリは↓の通りにyolov5下へ新規作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/caa764c0-920a-478b-c093-4e7a4397dfa1.png)

Train、Validディレクトリへそれぞれ画像とラベル（アノテーションファイル）を入れてください。どの割合で入れるかはお任せですが、だいたい20％程度をValidディレクトリへ入れる感じがいいかと思います。

# YOLOv5を実装していく～.yamlファイル書換え～
dataディレクトリの中にcoco.yamlファイルというモノがあると思います。これをワードパッド等で開いてください。書いてあることを一度全部消します。↓を記入し、”data.yaml”というファイル名でYolov5フォルダ直下へ保存してください。

**train: data/train/images**
**val: data/valid/images**

**nc: 1**
**names: [‘snack pea’]**

# YOLOv5を実装していく～学習実行～
下記コードを実行しすると学習開始します。batch-size, epochsなどは引数で設定できますので、お好みで書き直してください。

```
python train.py --data data.yaml --cfg yolov5m.yaml --weights '' --batch-size 8 --epochs 1000
```

ここで、–cfgはyolov5学習モデルs、m、l、xのどの重みを使うか？を指定します。sは学習が軽いが精度は低い、xは重いが精度は高いです。今回はmで実施しています。

# 結果の確認
学習が完了するとruns/train/expディレクトリに結果が保存されます。Validディレクトリへ入れた画像の推定結果が保存されていると思います。確認してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/7c56a20f-ba5d-14a2-da3d-870d9193f550.png)

今回データ数が少なかったので、太い茎を検出したりしてますが、概ねいい感じだと思います。
YOLOv5は簡単に実装することができるように工夫されていますので是非やってみてください。

この内容はブログでより細かく説明してありますので、良かったら↓参考にしてください:smiley:

https://farml1.com/yolov5/
プログラムが書けなくてもできる！電子工作！

Grove Beginner Kit For Arduinoで誰でもなんちゃってプログラマーになれる！:grinning:

まずは本体の紹介：外観はこんな感じです。
![IMG_3669[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/92970c34-586a-f2d3-42e0-97208f9f9de6.jpeg)



中身は・・・ジャジャーん！
何やら色んなパーツが！！　:heart_eyes:
ワクワクと？？が混合・・・？！（詳細は後程・・）
![IMG_3670[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/c92ef354-54ec-c922-70aa-bcbbd106c455.jpeg)


右サイドポケットに、USBケーブル（本体とPCを接続）
![IMG_3671[2].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/9e373b5a-857f-ff09-8ce0-5bf1a596c1f6.jpeg)


逆サイドには・・・Groveケーブル（センサモジュールとArduinoボードを接続）
![IMG_3672[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/057b174a-ea13-a214-6d60-476dfaaf054c.jpeg)


それでは簡単に中身の紹介を・・・。

まずは中央に君臨するボードが：ArduinoUno互換ボード:clap:
（この子とPCを先ほど紹介したUSBケーブルで接続します）
![IMG_3673[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/963ff55a-97f2-9572-d5d3-591ec5368b5b.jpeg)


そして、左右にあるマニアックな器機たちが：センサモジュール
（彼等が色々な実験を実現させてくれます！）
左側：![IMG_3674[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/501e2c09-4e18-97fc-11da-c495709eb439.jpeg)

右側：![IMG_3675[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/2c02646b-f518-93af-5295-92d5957273f8.jpeg)


![Parts (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131431/ea06d368-01b7-ec81-1587-a9772c6654ea.jpeg)



センサモジュールの紹介
左側左上から・・
1.Grove - LED: Simple LED module（赤いLED、これで所謂Lチカできます）
2.Grove - Buzzer: Piezo Buzzer（ブザー・・て、そのまま・・）
3.Grove - OLED Display 0.96": 128×64 dot resolution High brightness,self-emission 　　　and high contrast ratio Big screen on a compact design Low power consumption.（OLEDディスプレイ、スマホとかの有機ELディスプレイ・・）
4.Grove - Button: Momentary Push Button（ボタン・・ん・・またそのままですね・・）
5.Grove - Rotary Potentiometer: Adjustable Potentiometer（可変抵抗モジュール、、昭和のテレビのボリュームなんかそうです）
右側左上・・
6.Grove - Light: Detects surrounding light intensity（明るさセンサーモジュール、、明るさを測定します）
7.Grove - Sound: Detects surrounding sound intensity（音センサーモジュール、、音の測定用）
8.Grove - Temperature & Humidity Sensor: Detects surrounding temperature and humidity values（温湿度センサーモジュール、、そのままですね）
9.Grove - Air Pressure Sensor: Detects surrounding atmospheric pressure（大気圧センサー、大気圧の測定、これから台風の時期には良いかも）
10.Grove - 3-Axis Accelerator: Detects object acceleration
Seeeduino Lotus: Arduino Compatible Board with Grove Ports（三軸加速度センサーモジュール、傾き等のセンサーです）

と、ザっと簡単な詳細でごめんなさい・・・。
↓もっと知りたい方はコチラ！↓
https://wiki.seeedstudio.com/Grove-Beginner-Kit-For-Arduino/

上記URL内に、1~10のセンサモジュールが紹介されており、緑字の"Grove-xxx"をクリックすれば、それぞれの操作方法が記載されている詳細へ飛びます:eyes:
ソースコードもコピペできるので、一切の手間は掛からない・・・！
本当に簡単なkitなので、興味あるけど、ハードルが高くて・・と思っている方は、試されてみるのも良いかもしれません。
お値段もお手頃価格かと・・・詳細は↓↓
https://akizukidenshi.com/catalog/g/gK-15515/
（価格は販売店によって違うので、、、調べてみてください）

と、お手頃入門kitのご紹介をさせて頂きました。
私もズブの素人なので、色々表現が不適切であったり、分かりにくかったりするかと思いますが、このkitホントに入門にはイイですよ！:grin:

興味のある方は是非お試しあれ！

次は取り扱いなんかも紹介できたらと思っています。
DataFrameでマージしたらindexが0からに振りなおされるのを回避したかったんだ

# はじめに
最近データ分析をやっと実践で勉強するようになり、`Pandas`をまったく使いこなせないなと実感するようになりました。

今回はそんなPandasでよく使う`merge`にまつわ問題とその解決策をまとめました。

今後DataFrameの操作について記事をたくさん載せていく予定です。

# 問題

まず以下の二つのDataFrameを用意します。

`df_a`

| index | No    | 
| ----- | ----- | 
| 11     | one   | 
| 12     | two   | 
| 13     | three | 

`df_b` 

| index | No    | Value |
| ----- | ----- | ----- |
| 0     | one   | 1     |
| 1     | two   | 2     | 
| 2     | three | 3     |


そして、この二つを`No`でマージします。

```merge.py
a = ["one", "two", "three"]
a_df = pd.DataFrame(a, index=['11','12', '13'], columns=["No"])

b = ["one", "two", "three"]
value = ["1", "2", "3"]
b_df = pd.DataFrame(b, index=['1', '2', '3'], columns=["No"])

b_df["value"] = value

result = pd.merge(a_df, b_df, on="No")
print(result)
```

すると以下のDataFrameが作成されます。

`result`



| index | No    | Value |
| ----- | ----- | ----- |
| 0     | one   | 1     |
| 1     | two   | 2     | 
| 2     | three | 3     |

しかし本来は、このようなDataFrameが作りたいと考えていました。

| index | No    | Value |
| ----- | ----- | ----- |
| 11     | one   | 1     |
| 12     | two   | 2     | 
| 13     | three | 3     |

indexが`11-13`にしたいのですが、`0-2`と振りなおされています。

# 解決方法

1行でうまく解決できないかと`teratail`で質問したところ以下の方法で可能とわかりました。

```merge.py
result = pd.merge(a_df.reset_index(), b_df, on="No").set_index('index')
```

まず、`a_df`を`reset_index`で`0-2`を振りなおします。

index | index | No    | 
-----| ----- | ----- | 
0 | 11     | one   | 
1 | 12     | two   | 
2 | 13     | three | 

すると`index`カラムが追加されます。

そして、`merge`します。

index | index | No    | Value |
-----| ----- | ----- | ----- |
0 | 11     | one   | 1     |
1 | 12     | two   | 2     | 
2 | 13     | three | 3     |

そのあと、`11-13`の`indexカラム`を`set_index()`でindexにします。

| index | No    | Value |
| ----- | ----- | ----- |
| 11     | one   | 1     |
| 12     | two   | 2     | 
| 13     | three | 3     |

# おわりに
全然技術がないことを実感しました。
毎日努力して少しでも早くなれるようがんばります。
DataFrameの操作は詰まったら記事に上げるようにします。

# 参考記事
[Pandasのマージでインデックスが振りなおされてしまう](https://teratail.com/questions/340319)
SQLインジェクションについて

# SQLインジェクション
外部からの入力により、アプリケーションが想定しないSQL文を実行することによって、認証を突破したり情報を盗んだりする攻撃手法のこと
テキスト入力欄やURLとかに断片を埋め込む

#SQLインジェクションを防ぐには
SQL文中で意味をもつ特殊文字のエスケープをしたり、プレースホルダーを用いたりすること
Railsアプリケーションでfind_by_sqlを用いる際は正しい対策を講じることが重要であること