OmniAICreator/Qiita-1.07M huggingface dataset:
C#でカノジョをつくる（16日目）

お疲れ様です。たなしょです。
今日は前日作成したテキストエディタに印刷機能を追加しました。
## 印刷ダイアログを出力する
画像のように印刷ダイアログを出力させました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/5f69428f-fcde-9c21-0ca7-dcf50d1be0c4.png)

```c#
using System.Drawing.Printing;
/* 省略 */
try
{
    printDocument1.DefaultPageSettings = _pageSetting;
    _strPrint = textBox1.Text;
    printDialog1.Document = printDocument1;

    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
        printDocument1.Print();
    }
    else
    {
        return;
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "エラー");
}
```
`printDialog1.ShowDialog() `で印刷ダイアログを表示させている。
キャンセルや×を押すと処理を抜ける。

## 印刷処理を実装する
PrintDocument,PrintDialogツールを使用します。
ちょっと作りが複雑なので軽く説明します。
1.文字フォントや文字サイズを設定します

```c#
Font font = new("MS UI Gothic", 11);
int numberChars;
int numberLines;
string printString;
StringFormat format = new();
```
2.ページ上で描画可能な領域を指定

```c#
RectangleF rectSquare = new(
      e.MarginBounds.Left,
      e.MarginBounds.Top,
      e.MarginBounds.Width,
      e.MarginBounds.Height
      );
```

3.印刷する領域のサイズを指定

```c#
SizeF SquareSize = new(
      e.MarginBounds.Width,
      e.MarginBounds.Height - font.GetHeight(e.Graphics)
      );
```

4.印刷可能な1ページ当たりの文字数と行数の計算

```c#
e.Graphics.MeasureString(
      _strPrint,
      font,
      SquareSize,
      format,
      out numberChars,
      out numberLines
      );
```

5.印刷可能な領域に1ページ分の文字列を描画する。

```c#
e.Graphics.DrawString(
      printString,
      font,
      Brushes.Black,
      rectSquare,
      format
      );
```

6.1ページに収まらなかった場合はさらに印刷する

```c#
if (numberChars < _strPrint.Length)
{
    _strPrint = _strPrint.Substring(numberChars);
    e.HasMorePages = true;
}
else
{
    e.HasMorePages = false;
    _strPrint = textBox1.Text;
}
```

## 印刷プレビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/ef881bec-961b-220c-cf57-a29ed9f8bff7.png)

PrintPreviewDialogパーツを使用する。
1.PrintPreviewDialogオブジェクトにPrintDocumentオブジェクトを登録。

```c#
printPreviewDialog1.Document = printDocument1;
```
2.「印刷プレビュー」ダイアログボックスを表示する

```c#
printPreviewDialog1.ShowDialog();
```

## ページ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/587b53ea-2903-008e-5b46-ebb30137ee14.png)
PageSetupDialogパーツを使用する。
1.「ページ設定」ダイアログボックスを表示する

```c#
pageSetupDialog1.ShowDialog();
```
## 最後に
今日はテキストエディタに印刷機能を追加しました。
「印刷」する挙動を書くのはなかなか難しく一回書いただけでは覚えられませんが、
おそらく印刷機能は書いたものを流用すれば実装できると思うので、
今回書いたソース部分はテンプレートに使おうと思います。
JetBrains 製 IDE のツールウィンドウの配置を初期化する

## はじめに

IntelliJ IDEA を使用していて、ツールウィンドウの配置を最初にインストールしたときの状態に戻したいことがありました。
メニューバーの `ウィンドウ > デフォルトレイアウトを復元` でそれができそうに思いますが、一度でも `現在のレイアウトをデフォルトに設定` をしたことがあるとそのときの状態にしか戻せません。
また、メニューバーの `ファイル > IDE 設定の管理 > デフォルト設定の復元...` で配置が初期化されるのは知っていましたが、それだと IDE の全ての設定が初期化されてしまいます。
というわけで、ツールウィンドウの配置だけを初期化する方法を調べました。
なお、macOS と IntelliJ IDEA を例にしていますが、他の環境でも手順は同じです。

## 環境

macOS Big Sur
IntelliJ IDEA 2021.3 (Ultimate Edition)

## 手順

IntelliJ IDEA を起動している場合は終了する。
IDE の構成ディレクトリにある `options/window.state.xml` ファイルと `workspace` ディレクトリを削除する。

```zsh:terminal
% cd ~/Library/Application\ Support/JetBrains/IntelliJIdea2021.3
% rm options/window.state.xml
% rm -r workspace
```

おしまい。

### 他の IDE を使用している場合

`IntelliJIdea2021.3` をお使いの IDE に置き換えてください。

```zsh:example
% cd ~/Library/Application\ Support/JetBrains/WebStorm2021.3
```

### 他の バージョン を使用している場合

`IntelliJIdea2021.3` の `2021.3` をお使いのバージョンに置き換えてください。

```zsh:example
% cd ~/Library/Application\ Support/JetBrains/IntelliJIdea2020.2
```

バージョン 2019.3 以前をお使いの場合、構成ディレクトリの場所が異なるので以下のリンク先の "Config files location for IntelliJ IDEA 2019.3 and earlier" から確認してください。

https://blog.jetbrains.com/idea/2020/03/intellij-idea-2020-1-eap7/#auto_import_of_settings

```zsh:example
% cd ~/Library/Preferences/IntelliJIdea2019.3
```

### Windows や Linux を使用している場合

構成ディレクトリの場所が異なるので以下のリンク先の "Config files location for IntelliJ IDEA 2020.1 and later" から確認してください。

https://blog.jetbrains.com/idea/2020/03/intellij-idea-2020-1-eap7/#auto_import_of_settings

```zsh:example
% cd ~/.config/JetBrains/IntelliJIdea2021.3
```

## おわりに

ツールウィンドウの配置だけ初期化することができました。

## 参考文献

1. [デフォルトのレイアウトに戻る - エディターの基本 | IntelliJ IDEA](https://pleiades.io/help/idea/using-code-editor.html#fa06ebbf)
1. [設定をバックアップしてデフォルトに戻す - IDE の構成 | IntelliJ IDEA](https://pleiades.io/help/idea/configuring-project-and-ide-settings.html#back-up-restore)
1. [Auto-import of settings - IntelliJ IDEA 2020.1 EAP7: Improvements for Git, New Java Inspections](https://blog.jetbrains.com/idea/2020/03/intellij-idea-2020-1-eap7/#auto_import_of_settings)
1. [Default IDE directories - Help | IntelliJ IDEA](https://www.jetbrains.com/help/idea/2020.1/tuning-the-ide.html#default-dirs)
Githubリポジトリの最新版のダウンロードファイルリンクの一覧を取得する

# linux系

```shell
curl -sSL ※GitHUBリポジトリのURL/releases/latest | grep -E ".*/(releases|archive)/.*nofollow.*" | sed -E "s;.*<a href=\"(.+)\" rel=.nofollow.>;https://github.com/\1;g"

# 例
$ curl -sSL https://github.com/git-for-windows/git/releases/latest | grep -E ".*/(releases|archive)/.*nofollow.*" | sed -E "s;.*<a href=\"(.+)\" rel=.nofollow.>;https://github.com/\1;g"

```

# windows系(powershell)

```powershell
((wget -UseBasicParsing ※GitHUBリポジトリのURL/releases/latest).Links | Where-Object {$_ -match ".*/(releases|archive)/.*nofollow.*"}) | ForEach-Object {"https://github.com/" +$_.href}

# 例
PS C:> ((wget -UseBasicParsing https://github.com/git-for-windows/git/releases/latest).Links | Where-Object {$_ -match ".*/(releases|archive)/.*nofollow.*"}) | ForEach-Object {"https://github.com/" +$_.href}

```

# 出力例
```
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/Git-2.34.1-32-bit.exe
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/Git-2.34.1-32-bit.tar.bz2
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/Git-2.34.1-64-bit.exe
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/Git-2.34.1-64-bit.tar.bz2
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/MinGit-2.34.1-32-bit.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/MinGit-2.34.1-64-bit.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/MinGit-2.34.1-busybox-32-bit.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/MinGit-2.34.1-busybox-64-bit.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/pdbs-for-git-32-bit-2.34.1.1.2ca94ab318-1.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/pdbs-for-git-64-bit-2.34.1.1.2ca94ab318-1.zip
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/PortableGit-2.34.1-32-bit.7z.exe
https://github.com//git-for-windows/git/releases/download/v2.34.1.windows.1/PortableGit-2.34.1-64-bit.7z.exe
https://github.com//git-for-windows/git/archive/refs/tags/v2.34.1.windows.1.zip
https://github.com//git-for-windows/git/archive/refs/tags/v2.34.1.windows.1.tar.gz
```
ieserverからDDNSnowに移行

ルーターのおまけのDDNSを使っていたのでずっと気づかなかったのですが、ieserverは半年以上も前から止まっていたのですね・・・。
というわけで、DDNSnowに移行したのでそのメモ。

DDNSnowは以下

https://ddns.kuku.lu/index.php


#DDNSnow更新用スクリプト
更新はwgetだけでいいみたいですが、
何故かうまく動かないのでieserverのスクリプトから変換してみたら動いた。
何が違うんだろう？

IPチェックは以下からパクりました。

http://capm-network.com/?tag=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88-IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B


IP取得はieserverのスクリプトで指定していた以下で。

http://ai-line.com/

```./tekitou.sh
#!/bin/bash

echo "現在のIPを確認"
NOWIP=`curl -s "http://ai-line.com//linux/ip_view.cgi"`
echo "NOWIP:" ${NOWIP}
ret=$(echo ${NOWIP} | egrep "^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
if [ ! "${ret}" ] ; then
    echo "現在のIP取得失敗 : ${NOWIP} ."
    return 1
fi

echo "記録のIPを確認"
OLDIP=`cat /tmp/DDNSNow_Iplog.dat`
ret=$(echo ${OLDIP} | egrep "^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
if [ ! "${ret}" ] ; then

    echo "記録のIPが無い場合は受信して登録"
    echo "[Err] Invalid IP address : ${OLDIP} ."
    echo ${NOWIP} > /tmp/DDNSNow_Iplog.dat

    echo "登録して終了"
    wget -O /tmp/DDNSNow_update.log "https://f5.si/update.php?domain=ドメイン名&password=パスワード"

else
    echo "記録のIPがある場合は現在のIPと比較"
    echo "OLDIP " ${OLDIP}

    if [ "${NOWIP}" = "${OLDIP}" ] ; then
        echo "一致したので終了"
    else
        echo "不一致なのでアップデート"
        echo ${NOWIP} > /tmp/DDNSNow_Iplog.dat
        wget -O /tmp/DDNSNow_update.log "https://f5.si/update.php?domain=ドメイン名&password=パスワード"
    fi
fi

exit 0
```

動作確認したらcronに登録して終わり。
fitbitでざっくり理解するOAuth2

# はじめに

OAuth2ってなにそれおいしいの？から、「完全に理解した」（つまり、なんとなくわかる程度）になるための手助けのひとつとなるのは、やっぱり使ってみること。
そんなときちょうどいい題材としてfitbitを使ってみましょう、ということでさっと使うところまで。なので、OAuth2についての詳しい解説はほかにさんざん良い記事や[rfcの解説](http://openid-foundation-japan.github.io/rfc6749.ja.html#grant-code)がありますので、ここでは行いません。
またあくまで使う側（クライアント側）としての内容なので、認可サーバーやリソースオーナー側については言及しません。

# なぜfitbit？（だって資料が豊富だから）

なんだかんだで、公式ドキュメント。

https://dev.fitbit.com/build/reference/web-api/

あとはサンプルコード[^1]があるので、大抵の内容はこのあたりでカバーできます。

[^1]: たいへん残念なことにRubyのサンプルへのリンクがなかったのが、[みつけたもの](https://github.com/zokioki/fitbit_api)にリンクしておきます。

https://dev.fitbit.com/build/reference/web-api/developer-guide/libraries-and-sample-code/

またOAuth2.0のチュートリアルなんてページまで用意してくれています。

https://dev.fitbit.com/apps/oauthinteractivetutorial

データの取得については、公式が用意してくれているSwagger(OpenAPI)ですべて試せます。
ここでどんなjsonが落ちてくるか眺めながらなにを使うか考えていきます。

https://dev.fitbit.com/build/reference/web-api/explore/

このあたりまでで目的が達成できる方は、以下を読む必要ありません。

# 準備

ここから下が、この記事の本題です。

まず登場人物は、[ここ](http://openid-foundation-japan.github.io/rfc6749.ja.html)で定義される、リソースオーナー、リソースサーバー、クライアント、認可サーバーです。

fitbitのデータを持っているエンドユーザ（つまりあなた）は、リソースオーナーです。
fitbitのサーバーは、データを管理するリソースサーバーと、データへのアクセスを許可する認可サーバーの役割を果たします。
クライアントは、リソースオーナーの許可を得てリソースにリクエストするアプリケーションです。

事前準備として、[Register an application](https://dev.fitbit.com/apps/new)から、データを取得するアプリケーションを追加、つまりクライアントを登録して、一意となるCLIENT_IDを発行しておく必要があります。

# データに対するアクセス許可

ここの操作は、すべてクライアントがリソースにアクセスするための手続きです。
よく使われている（んじゃないかと思う）[Pythonのサンプル](https://github.com/orcasgit/python-fitbit)をベースに、なにをやっているかを説明します。


### 1. 認可サーバーへのリクエスト発行

クライアント識別子を使って一意に指定されるクライアントは、authorize_token_urlメソッドを使用して、認可サーバーの/oauth2/authorizeに対してリクエストを発行します。

```
# サンプル
https://www.fitbit.com/oauth2/authorize?client_id=ABC123&response_type=code
&scope=weight%20location%20settings%20profile%20nutrition%20activity%20sleep
%20heartrate%20social
```

未ログインの場合はログインを挟んで、認可サーバーではリソースオーナーがクライアントにアクセス許可を与えるページに遷移します。

### 2. 認可サーバーからクライアントへのリダイレクト

画面で許可操作を行うと、クライアントのアプリケーションが用意している画面にリダイレクトされます。リダイレクト先は、authorizeのパラメータとしての送るredirect_urlと、準備で登録したurlが一致している必要があります。
リダイレクトをうけとったクライアントは、リダイレクトURLに含まれる認可コードを使用してトークンをリクエストします。

### 3. アクセストークンのリフレッシュ

アクセストークンは有効期限が定められているので、定期的にリフレッシュトークンを利用して、再発行が必要です。

```
{
    "access_token": "<access_token>",
    "expires_in": 28800,
    "refresh_token": "<refresh_token>",
    "scope": "social settings heartrate nutrition sleep activity profile location weight",
    "token_type": "Bearer",
    "user_id": "<user_id>"
}
```

# おわりに

なお実はPythonのサンプルの中ではPKCEを使用していません。セキュリティを強化するためには、PKCEに対応した処理を追加することが望ましいかと思います。
[初心者向け]windowsでsourcetreeを使ってgithubとSSH接続したい.その１(備忘録)



[概要]
・windowsでsourcetreeを使用したいが、ターミナルとかコマンドとか全くわからない人用。
（デザイナーさん、新卒、駆け出しエンジニア、Macしか触ったことない人　etc）
・自分用
[参考URL]https://yu-report.com/entry/sourcetreessh/
[やりたいこと]windowsでsourcetreeを使ってGitHubと接続したい。


:::note warn
その１とその２に分かれています。
:::
※GitBashとGitHubの接続が終わってる場合↓

https://qiita.com/nonohohonda-develop/items/9169015ecc7e00b05881


---------------------------------------------------------------
#1.sourcetreeをダウンロードする前に,GitBashでSSH接続の設定をする。



#2.GitBashをダウンロードする
[参考URL]https://yu-report.com/entry/GitInstall/

https://gitforwindows.org/


#3.GitHubにSSH接続をする
[参考URL] https://yu-report.com/entry/githubSSH/

:::note warn
(※[Git]はGitBashダウンロード時、一緒にインストール済み[GitHub]は事前にアカウントを持っている前提)
:::

##(1)GitBashを起動

##(2)ユーザー情報を確認する

```
[GitBash]
$ git config --list
```
```
//表示
user.name=[先ほど設定したユーザ名]
user.email=[先ほど設定したメールアドレス]
```

##(3)間違っている場合は再度登録し直す

```
[GitBash]
$ git config --global user.name [ユーザ名]
$ git config --global user.email [メールアドレス]
```

##(4)鍵があるか確認する

```
$ ls -al ~/.ssh
```

##(5)身に覚えがないのでリセットする

```
$ rm -rf ~/.ssh
```

##(6)再度リセットされているか確認
```
$ ls -al ~/.ssh
```

##(7)新しく鍵を作る

```
$ ssh-keygen -t rsa
```

##(8)質問にEnterで答える

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/{ユーザー名}/.ssh/id_rsa): 
```
"訳)公開/秘密rsaキーペアを生成します。
キーを保存するファイルを入力してください"

`Enterキー`を押す

####2個目の質問をされる

```
Created directory '/Users/{ユーザー名}/.ssh'.
Enter passphrase (empty for no passphrase): 
```
"訳) ディレクトリ '/Users/{ユーザー名}/.ssh'を作成しました。
     パスフレーズを入力します（パスフレーズがない場合は空）："

`Enterキー`を押す

####3個目の質問をされる

```
Enter same passphrase again:
```
"訳) 同じパスフレーズをもう一度入力します。"

`Enterキー`を押す

##(9)作った鍵の内容をコピーする

```
$ clip < ~/.ssh/id_rsa.pub
```

##(10)GitHubのサイトへ移動する

アイコンを押下しタブメニュー内の**[setting]**を選択
![git -１_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388076/37ce2d54-3448-7e30-de15-3cb0f1439a7a.jpeg)

**[SSH and GPG Keys]**を選択
![git .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388076/6da81e21-f20c-f640-c8a7-576796e26308.png)


##(11)SSH接続をする

![git3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388076/3486a092-0a22-ddf3-d088-d4d0ea51b7c7.png)

`[New SSH key]ボタン`を選択

作った鍵をGitHubに登録する

![git4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388076/83200163-24a1-e95a-1a9b-5fd498dfc34e.png)


:::note info
・Titleに自分がわかりやすい名前を記入
・keyのところへさっきコピペした内容を貼り付ける
:::

`[add SSH Key]` を押す

####鍵がGitHubと接続できた！

![スクリーンショット 2021-12-14 14.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388076/d7bf761d-17d2-a6ab-b53b-835546dd9fe6.png)

##(12)GitBashで作った鍵と、GitHubが接続されているか確認する

**[GitBash]**へ移動

```
[GitBash]
$ ssh -T git@github.com
```

```
Hi{ユーザー名}! You've successfully authenticated, but GitHub does not provide shell access.
```
訳)こんにちは{ユーザー名}！認証に成功しましたが、GitHubはシェルアクセスを提供していません。

"接続完了"



#4.GitBashでのSSH接続が終わったので、sourctreeとGitHubの接続へ


その2へ続く

https://qiita.com/nonohohonda-develop/items/9169015ecc7e00b05881
lwc中使用loadscript的案例

放在静态resource里面的js文件的内容

~~~
window.listenerForLSP = function(win,t,f){
    let iv = setInterval(function(){
        // let skey = sessionStorage.getItem('キー');
        // if(skey==null){
            if(!win || win.closed){
                f();
                clearInterval(iv);
                iv = 0;
                win = null;
            }
        // }
       
        if (typeof history.pushState === "function") {
            //history.pushState("jibberish", null, null);
            window.onpopstate = function () {
                // history.pushState('newjibberish', null, null);
                // console.log('tian123----'+performance.getEntriesByType("navigation")[0].type);
                // if (performance.getEntriesByType("navigation")[0].type === 'back_forward') {
                   
                // }
                
                var result = confirm('遷移しますか？');
 
                if( result ) {
                    win.close();
                    f();
                    //sessionStorage.setItem('キー', '値');
                    history.go();
                    clearInterval(iv);
                }else{
                    //sessionStorage.removeItem('キー');
                }
                
            };
        }
    },t);
}
~~~


lwc中的使用

import anythingOK  from "@salesforce/resourceUrl/js文件名";
import { loadScript } from 'lightning/platformResourceLoader';
 Promise.all([
      loadScript(this, anythingOK)
    ]).then(()=>{
linuxにおいてその日の午前0時の時間情報の取得方法

# linuxにおいてその日の午前0時の時間情報の取得方法
linuxの勉強をしていて、日付を名前にしたファイル・ディレクトリを作成したり、その日作成したファイルの一覧を所得したりするのにコマンド実行時の日付の午前0時時点の情報が欲しいのでその取得方法をまとめてみる。

## dateコマンド
dateコマンドはオプションなしでは次のように出力される。(次の例は私の実行環境での出力例)

```
$ date
Wed Dec 15 10:21:22 JST 2021
```

これに一重または二重引用符で囲んだフォーマットで出力する書式を指定できる
 
- 書式の先頭には+を置くこと。
    - +を引用符の中においても外においても機能する場合がある
- 年: %Y
- 月: %m
- 日: %d
- 時間: %H ％I
    - 24時間制なら前者、12時間制なら後者
- 分: %M
- 秒: %S
    - 閏秒への対応により挙動が異なる場合がある。

時間に関しては今回は午前0時時点の時間が欲しいので具体的な値を書き込む。  
また、必要に応じてスラッシュやハイフンといった区切り文字も挿入できる。

よって次のように打ち込むことで実行日時の午前0時時点の時間情報を取得できる

```
$ date "+%Y%m%d 00-00-00"
20211215 00-00-00
```

変数に入れる場合でスペースを入れるときは異なる引用符をスペースを空けずに書く。この辺は他にいい方法があるのかもしれない。

```
$ today=`date +%Y%m%d`" 00-00-00"
$ echo $today
20211215 00-00-00
$
```

日付を名前にしたディレクトリやファイルを作成する場合も利用できる

```
$ mkdir `date +%m`
$ ls
12
$ touch 12/`date +%d`.txt
$ ls 12
15.txt
```

## 参考文献・サイト
- manコマンド
- [dateコマンド（システムの日付と時刻を表示する） : JP1/Advanced Shell](http://itdoc.hitachi.co.jp/manuals/3021/3021313330/JPAS0330.HTM)
[Unity] AndroidでGoogle Adsの広告が実装されない

こんにちは。
Unity上では、広告が表示されるのに、実機でやると広告が表示されない！
↑そのような方向けに今回記事を書いています。

私の場合は、IOSは広告が表示されたのに、Androidだけが広告表示されませんでした。


まず、Google Adsの広告を実装にあたって、しまずさんの動画の手順で実装しました。
<参考URL>
https://www.youtube.com/watch?v=N1uD_eEZK7o&t=633


# 手順
### その１
ARM64にチャックを入れる
PlayerSettings　→ PlatformをAndroidに変更する → Other Settings → Arm64にチェックを入れる
(全てにチェックしないように注意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349017/65da8ca0-3c5a-7a60-bfe8-a761f4bf01be.png)
#### チェックが出来ない場合
http://kuromikangames.com/article/475381551.html


##### これでリワード広告とインタースティシャル広告は表示されるはず

### その２
AAB形式でビルドする
``Build App Bundleにチェックを入れる。ここにチェックが入っているとapkではなくaab形式で出力される。``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349017/c3f91a76-c86c-cab6-0618-9412fac5f31c.png)

<参考URL>
https://zenn.dev/trpla226/articles/85c134606f6b2bda962a



<追記>
これをしても、バナー広告が表示されない場合は、Debelopment Buildにチェックをつけてください。

以上で今回の記事を終わらせていただきます。
誰かの役に立ったら嬉しいです。
【Rails】ブロック引数yieldとプロック引数&block

##ブロック引数

###yield
自分で定義したブロック付きメソッドでブロックを呼び出すときに使う。 yield に渡された値は```| ```と```|```の間にはさまれた変数(ブロックパラメータ)に代入される。

```ruby
# ブロック付きメソッドの定義の働きは与えられたブロック(手続き)に引数1, 2を渡して実行すること
def foo
  yield(1, 2)
end

# 「2引数手続き、その働きは足し算をして印字する」というものを渡して実行させる
foo { |a, b| a + b }
#=> 3
```

- ```yield```の部分にメソッド```hoge1``` ```hoge2```のそれぞれのブロックの中身をそのまま置き換えたイメージ。

```ruby
# users_info = {
# "kato" => {
#   :id=>1,
#   :age=>30,
#   :birthday=>'1990-01-01'},
# "yamada" => {},
# "suzuki" => {}
# }

def foo
  users_info.values.filter do |values|
    values.present? && yield(values)
  end
end

def hoge1
  foo do |v|
    (v[:id].present? && v[:age].present?) || v[:birthday].present?
  end
end

def hoge2
  foo do |v|
    v[:id].present? && v[:birthday].present?
  end
end
```


https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#yield

##Proc引数（プロック引数）
###&block

&blockという引数を宣言すると、ブロックがblock変数に代入される。
block.callメソッドを呼ぶとブロックの処理が実行される。


```ruby
def hoge(&block)
  block.call(1, 2)
end

hoge { |a, b| a + b }
#=> 3
```

https://qiita.com/genya0407/items/1a34244cba6c3089a317

https://techracho.bpsinc.jp/hachi8833/2017_03_30/32954
株式会社ゆめみ Android技術ロードマップを作成しました！！

# はじめに
こんにちは！株式会社ゆめみでAndroidエンジニアをしています
清水 亮です

株式会社ゆめみでは委員会という単位を作り
採用や育成、勉強会などへの課題を解決するワーキンググループを稼働させています。

そこで、私の所属する育成WGでは社内外のAndroidエンジニアに向けて
現在主流であるAndroid技術の概念をロードマップとして作成して共有しようという試みを行い、
この度そちらを公開させて頂くことになりました！

このロードマップがあればAndroidアプリの全貌が分かるかも・・・

初学者の方や既に業務でAndroidアプリに携わっている方にも
ぜひ、ご活用頂ければと思います！
↓↓↓↓↓↓↓↓

https://notion.yumemi.co.jp/c107a4281e824f8ea3d10094e25581aa

一緒にロードマップを作成してくれた[門田さん](https://twitter.com/tmk815)のフォローもぜひ、お願いします！笑

# ロードマップ全体の構成
こちらのロードマップ・・・

非常に巨大です！！！！
ほんの一部だけでこんな感じ
![スクリーンショット 2021-12-16 18.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491513/9b865669-4b5d-dc3f-cf4e-c66d29dcb4f6.png)


ですので、まずは全体の構成を説明します。

### 色の説明
![スクリーンショット 2021-12-16 14.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491513/c86222c6-ed35-c630-0613-245dda7ec4d5.png)



* オレンジ色はカテゴリーとなっており開発内容、ライブラリのカテゴリなどを指します
* 黄色で書かれているものは各カテゴリーにおける、ゆめみが推奨するライブラリや技術名称です
* 灰色で書かれているものはゆめみではあまり推奨されない非推奨なものです

### 上から見ていくと・・・
このロードマップは初学者の方も対象としているので、
難しい概念であるアーキテクチャなどは中段に置かれています。
上から下部に進むほど、より堅牢に開発を進めるための手法を知ることができ、
リリースまでをカバーしています。

# 疑問点や改善点は
もし、疑問点や改善点があればこちらの記事にコメント頂けると大変助かります！
引き続き社内で更新していくつもりです。

# ゆめみにご興味があれば
実は、ゆめみのAndroidエンジニア採用試験は公開されています！
こちらは、同じゆめみAndroidエンジニアである岡山さんの記事です。
採用はもちろん、Androidアプリを学習されたい方の手助けになれば幸いです。

https://qiita.com/blendthink/items/aa70b8b3106fb4e3555f

また、ゆめみでは積極的にカジュアル面談など会社について知って頂く機会を設けています。
ご興味があれば是非、ご応募ください！🙆‍♂️
[Nginxエラー]server-nameをDNS名にしたら起動できなかった。

# エラー発生状況

```
$ sudo service nginx start
```
をしたら、

```
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
```
とエラーが発生。失敗したから、詳細は自分で見てね？　とのこと。

`$ nginx -t`で状況を確認。

```
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
nginx: configuration file /etc/nginx/nginx.conf test failed
/etc/nginx/nginx.conf
```

サーバー名が長過ぎるので64以下に収めて。ということらしい。

`/etc/nginx/conf.d/ `以下の設定ファイルの`sever-name`に、ELBのDNS名を記述していたため、長過ぎると怒られてしまったようだ。64以上って、確かに大きい。

Elastic IPを取得するなど、サーバー名を短くするという手もあるが、
今回はserver-nameを変えずに対処してみる。

# 解決方法

ハッシュサイズが64よりも大きいため発生したエラーなので、設定ファイルの方で上限を変える。

```
$ sudo vim /etc/nginx/nginx.conf
```

で開き、


``` /etc/nginx/nginx.conf
keepalive_timeout  65;
# この下に以下を書き込む。
server_names_hash_bucket_size 128
```

仮に、サーバー名の長さを32以下に収めて、と言われた場合は、
`128`ではなく`64`を指定する。

今度は`$ sudo service nginx start`も成功した。

# おわりに

「名前の長さ」というものも、今後考慮していこうと思います。

当然と言えば当然かもしれませんが、DNS名をそのまま使うのは控えめにしておいた方がいいのかもしれません。

>参考
>[【Nginxエラー解決】Job for nginx.service failed because the control process exited with error code.](https://qiita.com/naota7118/items/4fe2578fec561795a960)
>[nginxでサーバ名が長いって怒られた](https://qiita.com/madaran0805/items/8a32b123fa94018284fa)
>[Nginxが起動しないエラーを解決したいです。](https://teratail.com/questions/303712)
Sudachi 辞書にコメントを埋め込む

## はじめに

形態素解析器 [Sudachi](https://github.com/WorksApplications/Sudachi) の辞書バイナリには任意のコメントを埋め込むことができます。ユーザー辞書をつくる際に元ソースの情報や作成に利用したシステム辞書のバージョンなどをいれておくと便利です。


## コメントの埋め込み方

Java 版でのユーザー辞書の作成を例に埋め込み方をしめします。

```
$ java -Dfile.encoding=UTF-8 -cp sudachi-0.5.3.jar com.worksap.nlp.sudachi.dictionary.UserDictionaryBuilder -o test_user.dic -s system_core.dic -d 'テスト用のユーザー辞書' input.csv
```

このように `-d` オプションで埋め込みたいコメントを指定します。長さは256バイトまでです。

## 埋め込んだコメントを表示する

コメントの埋め込み方はしれっと[ドキュメント](https://github.com/WorksApplications/Sudachi/blob/develop/docs/user_dict.md)にもかかれていますが、コメントを表示する方法は言及されていません。
じつはちゃんと用意してあります。

```
$ java -cp sudachi-0.5.3.jar com.worksap.nlp.sudachi.dictionary.DictionaryHeaderPrinter test_user.dic
filename: test_user.dic
type: user dictionary
createTime: 2021-12-09T18:15:20+09:00[Asia/Tokyo]
description: テスト用のユーザー辞書
```

さっき埋め込んだコメントが description 欄に表示されました。辞書を作成した日時も記録されています。

ちなみに公開されているシステム辞書の場合はバージョンが埋め込まれています。

```
$ java -cp sudachi-0.5.3.jar com.worksap.nlp.sudachi.dictionary.DictionaryHeaderPrinter system_core.dic
filename: system_core.dic
type: system dictionary
createTime: 2021-08-05T17:26:58+09:00[Asia/Tokyo]
description: 20210802
```

どのバージョンの辞書なのかわからなくなったときに便利です。

ではよい Sudachi life を。
最近のFreeBSDコンテナ事情

この記事は[Craft Egg Advent Calendar 2021](https://qiita.com/advent-calendar/2021/craftegg)の21日目の記事です。
昨日は@arumaniさんの「iPhoneで3D空間に入って撮影できる『Unity Virtual Camera』」でした。


# はじめに
注意) 捉え方によっては過激に見える発言があるかもしれませんが、OS論争するつもりは全くありませんので、ご了承ください…

最近、FreeBSDコミュニティのメーリングリストで気になるメールを発見しました。
FreeBSDでコンテナを簡単に扱えるようにした**Focker**というツールが登場したみたいです。

私の学生時代はFreeBSDと共にあったと言っても過言ではないくらい、FreeBSDと戯れることが多く、懐かしみを感じたので、
その時に得たFreeBSDのコンテナ周りの知見を軽くまとめていきたいと思います。
当時、情報を集めるのにも苦労したので、これからFreeBSDと遊んでいく方の役に立てば良いなと思います！

# FreeBSDとコンテナ
そもそも、皆さんはFreeBSDというOSをご存知でしょうか？
近年はLinuxが主流で有名ですが、一昔前はUnix系統OSの代表格の一つとしてFreeBSDが名を馳せていました。
Linuxのコンテナよりも前にFreeBSDのコンテナが登場していたりもします。

コンテナは、仮想的にリソースを分割し、仮想マシンを使わなくとも、複数の環境を扱えるようにするもので、アプリケーション開発に欠かせない技術です。
最近のコンテナの代表的なものとして、DockerやHaconiwaなどが挙げられます。
コンテナのコア部分は、runCやgVisorなどの**コンテナランタイム**から成り立っています。

特にLinux上でコンテナを実現しているrunCは、Linuxの機能であるcgroupsやNamespace、OverlayFSなどの機能を組み合わせて、仮想的にリソースを分割することを実現しています。

FreeBSDにおけるコンテナランタイムは、**FreeBSD jail**と呼ばれます。

FreeBSD jailを簡単に構築できるようなツールは多く存在していますが、あまり浸透していないというのが現状かと思います。
実現したいことは似たようなことですが、細かい部分の思惑によって、カスタマイズされた実装になり、外から見ると何十人もが何年もかけて車輪の再発明を何度もしているようにも見えてしまいます。

私が把握しているFreeBSDにおけるコンテナ実装について軽く紹介していきます。

- Docker on FreeBSD
- VPS for FreeBSD
- runc for FreeBSD
- Focker
- runj

# Docker on FreeBSD
https://wiki.freebsd.org/Docker

FreeBSD向けのDockerです。今はメンテされていません。
内部ではFreeBSD jailが使われています。

FreeBSD向けのDockerではLinuxに向けてコンパイルしたバイナリも実行することができます。
（これはFreeBSDのLinuxバイナリ互換機能のおかげなのですが、長くなるので割愛。気になる方は[こちら](https://docs.freebsd.org/ja/books/handbook/linuxemu/#linuxemu-lbc-install)から）


# VPS for FreeBSD
http://www.7he.at/freebsd/vps/

今はメンテされていません。

VPSと聞くとVirtual Private Server(仮想マシンのレンタルサーバー)が思い浮かびますが、
ここでは、Virtual Private Systemの略で、仮想的な分離されたシステム＝コンテナを表しています。
FreeBSDカーネルをいじくり回して、FreeBSD jailを根本から拡張している感じになります。
FreeBSD jailではプロセステーブルは同じでリソースだけを分離するのに対し、VPS for FreeBSDではプロセステーブルから分離しています。
実行している最中のプロセスを停止せずに別のマシンに移動させるプロセスマイグレーションも実現しています。

# runC for FreeBSD
https://github.com/clovertrail/runc/tree/1501-SupportOnFreeBSD

名前の通りFreeBSDに向けたrunCです。これもメンテナンスされてないです。
動作はするものの、コマンドが実行できなかったり、作成したコンテナの状態が変わらなかったりするバグがあった気がします。
[こんな感じの変更](https://github.com/YuheiTakagawa/runc/commit/2e62c1fd6828306fb986787faa09944f73cfff73)を加えれば、修正できると思います。
これも内部ではFreeBSD jailを利用しています。

# Focker
https://github.com/sadaszewski/focker

FreeBSD+DockerでFockerですね(笑)

FreeBSD jailのイメージを`Fockerfile`で定義したり、`focker-compose.yml`でオーケストレーションしたりと、
まさに、Dockerと同じような使い勝手でFreeBSD jailを扱うことができるらしいです。（手元にFreeBSD環境がないので試せてません…）

昨年登場して、今もメンテナンスは続けられているようなですので、今後の期待大です。

# runj
https://samuel.karp.dev/blog/2021/03/runj-a-new-oci-runtime-for-freebsd-jails/

ここ最近一番の驚きでした。
OCI(Open Container Initiative)と呼ばれる、コンテナの標準仕様を策定する組織があり、DockerやrunCはこれに則ったツールです。
そして、runCを移植するわけではなく、OCIに沿ったものをFreeBSDに向けて1から実装しようという動きです。

# まとめ
ここまで紹介してきたように、FreeBSDのコンテナ周りの歴史は意外と長く、そして各プロジェクトは続いてこなかった印象です。
Linuxのコンテナに対する開発速度に追い付けていないのも事実あると思います。
しかし、ここに来て、FreeBSDでもコンテナに対する動きが活発になってきており、非常に嬉しく思うばかりです。

FreeBSDは組み込み系でよく使われるようになってきましたが、サーバ側のOSとしてはやはりLinuxがメインです。
FreeBSDでのコンテナの開発が盛んになってくれば、LinuxとFreeBSDが共存する世界が訪れたりするのかなと思います。
OSの設計思想の違いから来る特徴の違いを活かして、適材適所にOSを選択して運用するという未来を少しだけ期待しています。

Craft Egg Advent Calendar 2021 明日は @kai_yamamotoさんの記事になります！
GASでSlack APIを利用する場合

GASでSlack　APIを利用する際に感じた事をメモがわりに記事として残しておこうと思います。
あくまで個人的な見解なので、絶対ではありません。

Slack APIは、以下のサイトで登録やスコープの設定を行って下さい。
また、各APIの説明なども下記で得られます。
[Slack API](https://api.slack.com/)

## Slack APIライブラリを使用しない方が良いかも

GASでSlack　APIを使用する際に、[【2021年版】GASとSlack APIでボットを作成しチャンネルにメッセージを自動投稿する方法](https://auto-worker.com/blog/?p=2904)で紹介しているライブラリや[soundTricker/SlackApp](https://github.com/soundTricker/SlackApp)などがあります。
ですが、2021/12/16現在最新のAPIに対応されて無かったり、廃止されたAPIが残っていたりという状態です。
最初はライブラリがあるならと使用しましたが、上記の理由により断念しました。
個人的に、ライブラリで使えないAPIを、自前で`Url Fetch`を利用して実装するなら統一して、`Url Fetch`を使用した方が精神衛生上良いと感じました。

以下はユーザー情報を取得するAPIを`Url Fetch`を使って取得するコードです。
GAS及びJSは勉強中などで、コーティング規約は守れてないかもです...

```JavaScript
// SlackUserToken
const userToken = 'ユーザトークン'
// ユーザー情報
const usersInfo = 'https://slack.com/api/users.info'
// slack_idでメンバー情報を取得
// slackId = ユーザーのSlackのID
function getUsersInfo(slackId) {
    let payload = {
        token: userToken,
        user: slackId
    };
    let options = {
        method: 'get',
        payload: payload
    };
    Logger.log(options);
    const respones = UrlFetchApp.fetch(usersInfo, options).getContentText();
    Logger.log(respones);
    let json = null
    // レスポンスをJSONに変換する
    try {
        json = JSON.parse(respones);
    }
    catch (e) {
        Logger.error(e)
        json = null
    }
    return json
}
```

## 実際に構築してみて

上記で、`Url Fetch`を使ってやった方が良いとは書きましたが、やはりオプションやHTTPメソッドなどを細かく書くのはしんどいです。
なので、今後は学習を兼ねて自作でライブラリを作成してみたいと思いました。
使い勝手が良いものが出来たら公開も考えても良いかもです。
Herokuのフリー版で常時起動をGASを用いて行う方法【エラーメールあり】

#はじめに
前に書いた[「Herokuのフリー版で常時起動をGASを用いて行う方法」](https://qiita.com/ymbyuki0104/items/ba07811095b78ae2e7dc)では、シンプルにアクセスを行うだけでした。今回の項目では、万が一エラーが発生した際に、指定したメールアドレスにメールを送信するプログラムを作成します。
#準備
[「Herokuのフリー版で常時起動をGASを用いて行う方法」](https://qiita.com/ymbyuki0104/items/ba07811095b78ae2e7dc)
こちらを元に、トリガーの設定などを行なってください。
以下に概要と流れのみ記載しておきます。
##準備の概要
1. GASの新規作成
1. コードの記載
1. トリガーの設定

#メールの送信方法
メールはGASのAPIをつかいGmailを使用して送信します。
##1. 前回のコードの改変
```javascript
function main() {
  var url ='ここにURLを入力';
  try{
    var data = UrlFetchApp.fetch(url).getContentText();
  } catch(e){
    email(e);
  }
}
```
###前回との違い
tryとcatchを使用して、例外処理を取得しています。（簡単に申し上げると、tryの処理を行なった際に、エラーが生じたらcatchの処理に移行します)
catchでは、次に記載するemail処理にエラーの内容を送る処理をしています。

##2. メール処理の作成
```javascript
function email(e) {
  let recipient = "送信したいメールアドレス";
  let subject = "件名";
  let body = "エラーが発生しています\n"　
            +"エラー内容は以下の通りです\n"
            +"\n"
            +"-------------------------\n"
            + e
            +"-------------------------\n";
  GmailApp.sendEmail(recipient, subject, body);
}
```
##3. 完成
1のURLと2の送信先メールアドレス、件名を入力し完成です。
2のbody変数の中が送信する本文のため、必要に応じ変更してください。
改行は`\n`でできます。

#やっていること
1は前回とほとんど同じで、tryとcatchで例外処理を行なっています。
2では、catchで取得したエラーコードをe変数に代入し、email関数に送り、それをメールで送信しています。
bodyの中の`+ e`がその部分です。

#次回
アクセスしたログは実行数から確認することができますが、もっと気軽に確認できるよう、次回はスプレッドシートにログを記載していくプログラムを作成して終了にしたいと思います。
![スクリーンショット 2021-12-16 12.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1826491/dd56e445-917e-5515-29f6-b5529606c6f2.png)
Linux パッチ

### パッチとは

一部の変更を行うためのデータ,「修正プログラム」

### パッチファイルの生成

```a.txt
aaaa
```

```b.txt
bbbb
```

diffで出てくるのがパッチ(いろんな形式があります)

- normal

```
$ diff a.txt b.txt
< aaaa
---
> bbbb
```

- context

```
$ diff -c a.txt b.txt
*** a.txt	2021-12-16 12:38:15.343481201 +0900
--- b.txt	2021-12-16 12:38:19.691502761 +0900
***************
*** 1 ****
! aaaa
--- 1 ----
! bbbb
```

- unified

```
--- a.txt	2021-12-16 12:38:15.343481201 +0900
+++ b.txt	2021-12-16 12:38:19.691502761 +0900
@@ -1 +1 @@
-aaaa
+bbbb
```

### patch適用

パッチファイルはさっきdiff -uで作成したものを用意

```a_to_b.patch
--- a.txt	2021-12-16 12:38:15.343481201 +0900
+++ b.txt	2021-12-16 12:38:19.691502761 +0900
@@ -1 +1 @@
-aaaa
+bbbb
```

```
$ ls
a_to_b.patch  a.txt

$ cat a.txt
aaaa

$ patch < a_to_b.patch

$ cat a.txt
bbbb
```



### 参考

https://linuxcommand.net/patch/
Visual Studioでのgetter/setter一括追加のJavaショートカット


変数を右クリックして`ソース アクション`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31063/f374a201-84c7-80a7-eb9e-8d1c52cf9a39.png)

`Generate Getters and Setters`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31063/0a94364e-9c70-d194-901a-60a36169bff0.png)

Getter/Setterを追加したいフィールドを選択して `OK`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31063/98abb5bc-3ae8-e0ab-e510-4c3674c55adc.png)

別のIDEを使っているけど、最近というか今日他の言語の開発では使っているVisual StudioでJavaってどんなんかなと思って触って見始めました。

不足しているimport分を一気に追加する方法がわからない。
今はちまちま `⌘+.` で一つずつ追加して行っているので分かる方いたら教えて下さい。

その他はこちらを参考にさせていただいています。

https://qiita.com/Kyon0810/items/e5ee88e589ed68ab10ff
adb logcat を色付きで参照するコマンドのスクリプト

## 参考

[Terminalで色付きadb logcat \- Qiita](https://qiita.com/fezrestia/items/bfd48decebe024bc9ba2)

## 使い方

[tknr/adb\_logcat](https://github.com/tknr/adb_logcat)

からクローンしてインストールするだけで使えるようにしました。

### インストール

```
git clone https://github.com/tknr/adb_logcat.git
cd adb_logcat
./install.sh
```

### 実行

```
adb_logcat
```

## その他

適宜forkしてカスタマイズするといいと思います。
振り返り⑤(インスタンスを作ってみた)

![FireShot Capture 136 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/6af07131-46b4-e205-8564-7af9aec5c068.png)
今日は、AWSにある弊社のdev環境に入れたので、
とりあえずインスタンスを作ってみました！

インスタンスを作るには、
AWSのAmazon EC2（Amazon Elastic Compute Cloud）という
LinuxやWindowsなどの仮想サーバを作成できるサービスを使用して、
容易にサーバーが作成できます。

ちなみにインスタンスとは、調べたところ、
「クラスをひな型にしてメモリ上に実体化したモノのこと」と書いてあり、
例えで、クラスがたい焼き器でインスタンスが出来上がったたい焼きみたいなのを
見かけました。
インスタンスは個性を持ち区別できる実体でたい焼きでいうと、
中身のあんこやクリームに変えられるという個性があり、区別ができますとのことでした。

上記を踏まえると、クラスがAmazon EC2ってことなのかなという解釈です。


#Let's try！！！



いっぱいインスタンスある〜〜〜
![FireShot Capture 134 - インスタンス - EC2 Management Console - ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/8bc429c4-f82d-1d70-e7f8-b80b91ee63af.png)


右上のオレンジ色のインスタンスを起動するボタンを押下します。


![FireShot Capture 135 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/e69c6a81-a5f1-0082-cc77-35810f010591.png)

Amazonのマシンイメージの選択画面に遷移します。
無料利用枠のみに一応チェック入れました。

以前別の仕事でインスタンスタイプを調べたときにインスタンスタイプが最新のものの方が
費用が抑えられるということを知ったので、同じ感じかなと思い、一番上を選択しました。

![FireShot Capture 136 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/c82396f3-8588-25a0-fd17-40d165ee9345.png)

インスタンスタイプの選択をします。
このタイプというのは、得意な処理があるので、用途に合わせて選びます。

tシリーズは安価でCPU、メモリ、ネットワークのリソースバランスが取れた基本的なタイプ。
r系はメモリ最適化でメモリ内の大きいデータセットを処理することが得意。
c系はCPU の高パフォーマンスが特徴、高速処理が必須な場合やバッチ処理、動画エンコーディングが得意。

今回は、とりあえずバランス型のt2の無料利用枠のt2.microを選択しました。
確認と作成ボタンを押下します。

![FireShot Capture 137 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/6ab55e02-c64b-7362-c8cf-b6e7dc79cf99.png)

セキュリティを強化してくださいと出てますが、今はいいかなと思い、
起動ボタンを押下して作成しました。

![FireShot Capture 138 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/6425742c-342e-141b-0444-981d0a18e9ff.png)

キーペア？？？
調べると、AWSではパブリックキーとプライベートキーは、キーペアと呼ぶそうです。

このキーペアをインスタンス作成時に割り当てて、割り当てたキーペアを暗号化しておくと、
インスタンスにログインする際にログイン認証が行えるそうです。

ちなみにキーペアの作成の仕方は、
1: EC2 > ネットワーク＆セキュリティ > キーペア
2: キーペアの作成ボタン
3: キーペア名を適当に入れる

です。とても簡単。
この時、pem ファイル(プライベートキー)のダウンロードが始まるので、ダウンロードしておく。
そうしないと、もうこのキーペアのプライベートキーは入手できなくなります。

キーペアを作成して、もう一度この画面を開くと、
既存のキーペアの選択に先程作成したキーペアが選択肢に表示されます。

選択して、インスタンスの作成ボタンを押下すると、、、
インスタンスを作成してくれます。


![FireShot Capture 139 - インスタンス - EC2 Management Console - ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2224485/672d42ad-f8b1-b3b9-785e-cc80852e8a47.png)
Nameが-になっているものが、今作成したインスタンスです。
ステータスチェックを見ると「初期化しています」とありますが、作成中です。

わかりにくいので、Nameを変更しておけば、インスタンスの作成は完了です。
とても便利だな〜〜〜

おいしいパン食べたいな〜〜〜

written by 大森
AVX/AVX2によるキャスト

# はじめに
型に関するcastについて説明します．

## Cast
この命令は，C++での`reinterpret_cast`相当であり，データの示す型だけキャストするもので，中の値を返還するものではありません．
演算を含まなく，コンパイル時にすべて解決するため，レイテンシ0の計算になります．

一方で`static_cast`に相当する，格納する値も変更するようなその場合の命令はConvertにまとめられています．

つまり下記に示す例のように，(1)のように値を型に合わせて変換するものがconvertに相当し，後者の(2)のデータをそのままに保持する型をへ関するのがcastに相当します．

```cpp
float val = 1.5;
int a = int(val);//(1)
int b = *(int*)(&val);//(2)
```


このキャストは，主に算術命令ではなくデータの並びを操作するような命令時に，その命令に適切な型がないときにキャストすることでコンパイルを可能にします．
算術演算とは違い，1番目の要素と2番目の要素を入れ替えるなどの操作などは型に依存しません．
例えば，`__m256`と`__m256i`は整数と浮動小数点と入っている値は違いますが，`__m256i`に入っているものが`int`であれば，32ビットのビット列が8つづつ収まっている配列であるという概念は同じです．
そのため，データを入れ替える命令は，浮動小数点であっても整数であっても実行可能です．
AVX命令は，概ねその型にあった命令が用意されていますが，いくつかは用意されていません．
例えば，レジスタに1つの要素を代入するinsert命令は，整数命令しか十分な命令が用意されていません．
しかしながら，その命令はただキャストすれば同じように使うことができます．

下記に，全てのキャスト命令の一覧表を示します．
-は，自分自身へのキャストであるため意味がありません．xはその命令が存在しないことを示しています．
同サイズの型はすべて相互変換可能であり，また，サイズが異なるものに対しては，同種（__m128と__m256など）の変換だけ用意されています．つまり，同種にキャストしたのちに任意の型に更にキャストすれば，全ての場合に対応しています．
コンパイラへの指示であるため，どれだけネストしても速度が増えるということはありません．
また，mm128(d/i)から，mm256(d/i)への変換はYMMの値が未定義であるため，`zext`を付けた命令を呼ぶと0エクステンションした値としてキャスト可能です．

|        |                       mm128                      |                      mm128d                      |                      mm128i                      |          mm256         |         mm256d         |         mm256i         |
|:------:|:------------------------------------------------:|:------------------------------------------------:|:------------------------------------------------:|:----------------------:|:----------------------:|:----------------------:|
|  mm128 |                         -                        |                   _mm_castpd_ps                  |                 _mm_castsi128_ps                 | _mm256_castps256_ps128 |            x           |            x           |
| mm128d |                   _mm_castps_pd                  |                         -                        |                 _mm_castsi128_pd                 |            x           | _mm256_castpd256_pd128 |            x           |
| mm128i |                 _mm_castps_si128                 |                 _mm_castpd_si128                 |                         -                        |            x           |            x           | _mm256_castsi256_si128 |
|  mm256 | _mm256_castps128_ps256<BR>_mm256_zextps128_ps256 |                         x                        |                         x                        |            -           |    _mm256_castpd_ps    |   _mm256_castsi256_ps  |
| mm256d |                         x                        | _mm256_castpd128_pd256<BR>_mm256_zextpd128_pd256 |                         x                        |    _mm256_castps_pd    |            -           |   _mm256_castsi256_pd  |
| mm256i |                         x                        |                         x                        | _mm256_castsi128_si256<BR>_mm256_zextsi128_si256 |   _mm256_castps_si256  |   _mm256_castpd_si256  |            -           |
Vue.js(Nuxt.js)のslotとは

## slotとは
`slot`とは親コンポーネントから子コンポーネントにコンテンツを受け渡す際に使用される。
`<slot>`を使用することで実装できる。

## 使用例

子コンポーネント　Child.vue

```vue
<template>
  <slot />
</template>
```

親コンポーネント　index.vue

```vue
<template>
  <Child>
    <h1>Hello Vue.js!</h1>
  </Child>
</template>
```
子コンポーネント上の`<slot />`が`<h1>Hello Vue.js!</h1>`に置換される。

#### 説明
1. 子コンポーネント上でコンテンツを表示したい場所に`<slot>`を記載。
2. 親コンポーネント上に子コンポーネントタグ(ここでは`<Child>`)を用意する。
3. 用意した子コンポーネント内に受け渡したいコンテンツを記載する。

## おまけ（名前付きスロット）
コンテンツを複数渡したい場合は`名前付きスロット`を使用すると良い。
`<slot>`にname属性を記載することで親コンポーネントで指定したコンテンツを渡すことができる。

##使用例
子コンポーネント　Child.vue

```vue
<template>
  <slot name='primary' />
  </hr>
  <slot name='secondary' />
</template>
```

親コンポーネント index.vue

```vue
<template>
  <Child>
   <template v-slot:primary> <!-- v-slot:は#に省略可 -->
     <h1>Hello</h1>
   </template>
　　　　　　<template #secondary>
     <h2>World</h2>
   </template>
  </Child>
</template>
```

＊注意点: 公式ドキュメントに下記記載がされている。
>名前付きスロットにコンテンツを渡すには、`<template>` に対して `v-slot` ディレクティブを使い、
>スロット名をその引数として与える必要があります:
[Vue.js公式ドキュメント](https://v3.ja.vuejs.org/guide/component-slots.html#%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88)


レンダリングされるHTML

```html
<h1>Hello</h1>
</hr>
<h2>World</h2>
```

####　説明
1. 子コンポーネントの`<slot>`にname属性を指定。
2. 親コンポーネントにて子コンポーネントタグ（ここでは`<Child>`）を用意
3. `<Child>`内で`<template>`を用いて`v-slot:`で子コンポーネントで指定したname属性を指定。
3. 記載した`<template>`内に受け渡すコンテンツを記載する。
[Flutter]moorを使用したテーブルの作り方

Flutterにおいて、moorを使用したDBの作成方法を簡単に記載します。
手順にフォーカスするので、細かい解説などは省いてます。

##　インストール
pubspec.yamlに追加します(バージョンは確認してください)

```dart:pubspec.yaml
dependencies:
  moor: ^3.3.1

dev_dependencies:
  moor_generator: ^3.3.1
```

## テーブルを追加
```dart:db.dart
@DataClassName('Book')
class Books extends Table {
  IntColumn get id => integer().autoIncrement()(); //idの自動採番

  TextColumn get title => text()();

  TextColumn get content => text().nullable()(); //nullの許可
}
```

## usemoorに追記
```dart:db.dart
@UseMoor(tables: [
  Books,])
```

## コマンドを実行
下記コマンドをターミナルで実行し、アプリを再起動します。

```dart:terminal
flutter packages pub run build_runner build --delete-conflicting-outputs
```

## マイグレーションの追加(追加で作成する場合)

```dart:db.dart
  @override
  int get schemaVersion => 2;

  @override
  MigrationStrategy get migration => MigrationStrategy(onCreate: (Migrator m) {
        return m.createAll();
      }, onUpgrade: (Migrator m, int from, int to) async {
        if (from < 2) {
          // we added the dueDate property in the change from version 2
          await m.createTable(books);
      }
  });
```

# 最後に
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
現在、エンジニアを募集していて、カジュアル面談も実施しているのでお気軽にご連絡ください！

https://www.wantedly.com/companies/company_3244501/projects
FFMPEGでとりあえず圧縮する方法

## ダウンロード方法

[FFMPEGの本家DLページ](https://ffmpeg.org/download.html)
![000001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402886/4448ade7-5b31-c84b-589b-e0a6d387f96a.png)
![000002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402886/214b8a88-f5ee-3b48-caba-93d0816aebe7.png)

## インストール方法
DLしてきて任意のフォルダ（デスクトップとかでも可）に置いておく

## 操作方法
フォルダを開いて「bin」フォルダを開く

同じフォルダ内に変換元となる動画を「input.mov」で置いておく
（コマンドと合わせるためなので、コマンド側を変えればなんでもおｋ）

アドレスバーに「cmd」と打ち込んでコマンドプロンプトを起動

![000003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402886/d98f0923-d826-d9ad-e468-5e9b1ca4559e.png)

以下のコマンドを打ち込む
> ffmpeg.exe -i input.mov -f webm -y out.webm

![000004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402886/bf8d690a-8591-dd58-06cc-f7c4cfab6a6e.png)

## 確認
プロンプトに色々出力出た後に入力可能になってればおｋ

out.webmを確認して容量下がってて無事再生できればおｋ

## 余裕があったらやること
環境PATHを通す：[参考リンク]()
GUIツールを使う：[参考リンク](https://softmania.hateblo.jp/entry/2018/10/09/153653)
パラメータの変更：[参考リンク](https://jbjbgame.com/post-5623/)
正規表現にマッチする文字列を渡してもRegExp.testがtrueにならない

基本的なことですが、少しはまったので備忘のため記します。

##やりたかったこと

文字列がURLかどうかを正規表現で判定したい

##試したこと 起きたこと
```
const str = 'https://google.com';
const reg = new RegExp('https?://[\w/:%#\$&\?\(\)~\.=\+\-]+');
reg.test(str); //結果:false
```
正規表現は合っているはずなのに、マッチする文字列を渡してもfalseが返ってくる…。:thinking_face::thinking_face::thinking_face:

##解決方法
コンストラクター構文では正規表現を文字列として指定しているため「\」のエスケープが必要でした。

```
const reg = new RegExp('https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+');
```

正規表現リテラルを使用する場合

```
const reg = /https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+/;
```

## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [JavaScript 正規表現まとめ](https://qiita.com/iLLviA/items/b6bf680cd2408edd050f)
顕著物検出で、iOSでアニメキャラを華麗に切り抜く

#概要

画像からアニメキャラを細かいところまできれいに切り抜きたい。
顕著なオブジェクト検出を使って、iOSオンデバイスでそれを実現する方法を書きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/562b18cd-476c-d587-2a10-ffd4a058b29b.jpeg", width=300> 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b4a6984b-255d-857e-a0df-7908482ec68e.jpeg", width=308> 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ebd707fa-85c4-aa81-b2af-d9846ecf90fe.jpeg", width=308> 


#この記事で伝えたいこと

アニメキャラのような「非人物」も、きれいに背景から分離することができるということ
**既存の機械学習モデルを使って、画像内の顕著なオブジェクトの背景分離を綺麗に爆速で行う方法**

#解決したい課題

オブジェクト（アニメキャラ）を切り抜くことができれば、さまざまな用途に使えます。
たとえば、背景差し替えなど。

しかし、いちいち手動で切り抜いていては、いくら時間があっても足りない。

そこで、機械学習でオブジェクトを認識し、一発で切り抜くというセマンティック・セグメンテーションの技術が近年使われてきました。

ただし、アニメキャラに適用できる高精度の機械学習モデルはなかなか出てきませんでした。
なんとか、アニメキャラを綺麗に切り抜く方法はないのでしょうか。

#課題の原因

たとえば、DeepLabなどのセグメンテーションで学習されるオブジェクトは、人物や車などのオブジェクトが多く、
それらのモデルでは事前に学習したオブジェクトしか切り抜けません。
そして、アニメに適合した高精度の事前学習済みモデルはなかなか見つからず、
自分で学習するにしても、大量のアニメ画像について、キャラと背景と塗り分けでデータセットを作る必要があります。

AppleのVisionでは、２０２１年から人間のセマンティック・セグメンテーションができるようになりましたが、これではアニメキャラは切り抜けません。

https://qiita.com/john-rocky/items/dc1b736791dccbaf5c66


#課題を解決する技術、手法

###技術、手法の概要
そこで、U2Netという機械学習モデルをiOSで使うことで、アニメキャラをiOSで切り抜きます。
U2Netは、画像内の顕著なオブジェクト分離することのできる機械学習モデルで、対象のオブジェクトを限定しません。

https://github.com/xuebinqin/U-2-Net

###技術、手法の効果
U2Netを使うことで、アニメキャラを綺麗に切り抜けます。
しかも、オンデバイスで、通信なしで実行できます。
切り抜く速度は1枚0.1秒弱というつばめがえし。

###課題がどう解決されるか
これまで実現できなかったアニメキャラの切り抜きが細部まで高精度で実現でき、
背景差し替えをはじめとする様々なアプリケーションに適用できます。

###事例

実は、[remove.bg](https://www.remove.bg/ja)というWebサービスで、すでにアニメキャラを切り抜くことができます。

https://www.remove.bg/ja

https://togetter.com/li/1431898

このサービスの内部で使われているのが、U2Netです。
このモデルを直接使うことで、あなたのサービスでも顕著なオブジェクト検出技術が使えるのです。

###留意点
モデルはiPhoneなどのモバイルデバイス上で実行できます。
ただし、モデルの初期化に２０〜３０秒程度かかりますので、あらかじめバックグラウンドで初期化しておくなどの対応が必要になります。

#具体的手法

[**CoreML-Models**](https://github.com/john-rocky/CoreML-Models) のGoogleDriveリンクからU2NetのCoreMLファイルをダウンロードします。

https://github.com/john-rocky/CoreML-Models

Xcodeプロジェクトにバンドルします。

あとは、画像をモデルに渡すだけです。

```swift
guard let model = try? u2net.init() else {fatalError("model initialize error")}
guard let result = try? model.prediction(input: pixelBuffer) else {fatalError("inference error")}
let resultPixelBuffer = result.out_p1
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/600791b2-c543-a57e-069b-8cf10792d6b9.jpeg" width=300> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9ce2c27a-d142-f165-43ef-e279fdc78c38.png" width=300>


フリーランスエンジニアです。
お仕事のご相談こちらまで
簡単な開発内容をお書き添えの上、お気軽にご連絡ください。
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium（英語）](https://medium.com/@rockyshikoku)
ラズパイにUSB接続されたArduinoにコードを書き込む

# 目的
Arduinoに遠隔でコーディングするのは面倒なので搭載されているRaspberry経由でコーディングする
機体の開閉なしでArduinoにコーディングできる
また、プロキシの関係でaptなどのコマンドを使用してArduinoIDEをインストールできないためすべて手動で行う。

# 事前準備
VNCviewのインストール
VNCviewで対象のraspiに接続

まだ、住んでいない操作があれば以下を参照してください。

https://qiita.com/opckaiyo/items/99f9ced118791523cee5

# 目次
①ArduinoIDEダウンロード
②RaspberryにArduinoIDEインストール
③コーディング・書き込み

# 手順
## ①ArduinoIDEダウンロード
以下のURLからraspbianにあったIDEをダウンロードしてくる

https://www.arduino.cc/en/software


![キャプチャ80.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/d86bfe76-de5c-a3f4-f1d0-b795cc177f7d.png)

## ②RaspberryにArduinoIDEインストール
WindowsでダウンロードしたArduinoIDEをraspiに転送し
インストールを実行します。

### windowsからraspiにファイル転送
VNCviewで接続し以下のアイコンをクリック
![キャプチャ81.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/cf7324fd-a66e-c036-b63f-7d84b960d772.png)

赤枠をクリック
![キャプチャ82.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/167f5d26-1f99-f8e7-43b8-41bb47f95efb.png)

①前の手順でダウンロードしたファイルを選択
②をクリック
![キャプチャ83.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/92f0276a-98b1-b696-e74a-e2b39839c147.png)

完了画面になるまで待機する。
![キャプチャ85.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/e1866589-f4ae-561c-147d-43a4c7f9c62e.png)

### ファイルの解凍
前の手順でファイルを転送するとデフォルトではraspiのデスクトップに保存される
以下のコマンドで転送されたデスクトップのファイルを解凍する。
解凍には時間がかかる

```:コピー用
tar -Jxvf Desktop/arduino-1.8.15-linuxarm.tar.xz
```

![キャプチャ86.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/67f8e424-59a6-1f69-b577-f64e7b50432a.png)

### インストール実行
①解凍したフォルダに移動し。
②以下のコマンドを実行してArduinoIDEのインストールを始める。

```:コピー用
./install
```

![キャプチャ89.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/c8bdce77-b28b-0a8c-f12e-93fd791bc2de.png)

実行してしばらくするとインストールが完了する。
![キャプチャ90.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/864478f9-420f-f0ec-e022-fb6695194787.png)

## ③コーディング・書き込み
前の手順を完了するとデスクトップにArduinoのアイコンが表示される。
されない場合は再起動などが必要かも
①アイコンをダブルクリック
②をクリック
![キャプチャ92.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/c0f5cd9a-bc7f-62c1-5d78-1fff1f6fcc82.png)

プログラムを書き込む際はツールタブの①ボードと②シリアルポートが以下のようになっているか確認し
③でプログラムを書き込む
![キャプチャ93.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298098/73775ac3-1a0c-10a5-91f1-dacec8a6582b.png)


#最後に
CUIでもArduinoに書き込めるがGUIのほうが使いなれているかと思いGUIで説明しました。
また、raspbianではデフォルトでtarコマンドが使えると思っていますが勘違いかもしれません。
もし、使えなかったらinstallよろしく

# 参考資料

https://uepon.hatenadiary.com/entry/2020/02/27/195429
PG::DuplicateTable: ERROR:を改善

# 状況

マイグレーション時に下記のエラー表示がありました。

```irb
PG::DuplicateTable: ERROR:  relation "tasks" already exists/Users/****/task_app/db/migrate/20211216010101_create_tasks
```

# 環境

+ Rails 6.0.3
+ PostgreSQL 14.0



# 改善

冒頭のエラー文の通り、Tableが重複しているようなので下記の手順で重複分を削除しました。

DB内を確認

```irb
$ rails db
```

\dを入力して一覧表示

```irb
# \d

List of relations
Schema |         Name         |   Type   | Owner
--------+----------------------+----------+-------
public | ar_internal_metadata | table    | ****
public | schema_migrations    | table    | ****
public | tasks                | table    | ****
public | tasks_id_seq         | sequence | ****
(4 rows)
```

今回は"tasks"を削除すれば改善されるので、下記の通りdrop tableの後にtasks;を指定し実行。

```irb
# drop table tasks;

DROP TABLE
```

\dで再度確認してみます。

```irb
# \d

List of relations
Schema |         Name         | Type  | Owner
--------+----------------------+-------+-------
public | ar_internal_metadata | table | ****
public | schema_migrations    | table | ****
(2 rows)
```

今回の"tasks"が上手く削除されていました。

その後は通常どおりマイグレーションを実行すると改善されています。

```irb
$ rails db:migrate
```


# 参考
https://stackoverflow.com/questions/27558540/pgduplicatetable-error-relation-posts-already-exists