OmniAICreator/Qiita-1.07M huggingface dataset:
Heroku Connect の設定方法

# Heroku Connect とは？
Salesforceで管理するデータと、運用するアプリの
DB（Heroku Postgres）のデータを双方向に同期できるHerokuのアドオン。

# ２つの前提条件
（１）Herokuで運用するアプリで、Heroku Postgresを使用している。
（２）APIアクセス権を持つSalesforceエディションを持っている。

自分の持つSalesforceエディションが、APIアクセス権を持っているかわからない場合は、
以下のリンクで確認できます。
https://help.salesforce.com/articleView?id=000326486&language=ja&type=1&mode=1


# 手順

## 1　アドオンを追加する

他のアドオンと追加方法は同じです。
![スクリーンショット 2020-10-30 23.06 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/642caf93-fcf7-db6e-0a73-6c3d45a9ea9e.png)

3種類のアドオンのプランについての説明は、下記のリンクを参照してもらえればと思います。
実用的には、enterprise以上を選択するとは思いますが、お金との相談になります。。
（demo版以外のHeroku Connectを利用するには、Heroku Enterpriseを契約して、
オプションとしてHeroku Connectを選択する必要があります。）

https://devcenter.heroku.com/articles/heroku-connect#available-plans
https://devcenter.heroku.com/articles/heroku-enterprise#heroku-connect


## 2　Heroku Postgresとの接続を行う

追加したアドオンをクリックして開くと、次の画像の画面が表示されます。
「Setup Connection」と書かれたボタンをクリックします。
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/5acd3156-fb1d-c838-8dd1-17c00007e183.png)

一つしか選択できない場合でも、使用するDATABASE_URLクリックしてから、
右上のNextボタンをクリックします。
![スクリーンショット 2020-08-20 12.36 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/7375198e-9880-2c8f-0d0a-0d871d55bfa5.png)


## 3　Salesforce側との連携の設定を行う

利用しているSalesforceの環境に合わせたものを選択します。
API Versionは、特に理由がなければ変更しなくて大丈夫です。
![スクリーンショット 2020-08-20 12.36 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/5db7a926-c2cb-76b5-43af-8478c85ad9d6.png)

利用しているSalesforceエディションのユーザで、ログインして認証します。
![スクリーンショット 2020-10-30 21.54 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/e2a6e21e-ab42-f7d5-da0b-75a110a6ae63.png)

認証したら、どのSalesforceのオブジェクトとマッピングするかを選択します。
右下の「Create Mapping」ボタンをクリックします。
![スクリーンショット 2020-08-20 12.43 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/37f180bd-676b-0a2b-5029-4bdffe4289ec.png)

同期するオブジェクトをクリックします。
![スクリーンショット 2020-10-30 21.58 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/e599150b-cdef-fa72-d426-a6fdec8a2311.png)

下記の画面は、同期の設定で一番重要で、３つのことを設定できます。
（１）SalesforceからDatabaseへの同期間隔の設定
（２）DatabaseからSalesforceに同期するかの設定
（３）同期するオベジェクトの項目の選択
設定したら、忘れずに右上のSaveボタンをクリックします。
（もちろん後から変更もできます。）
![スクリーンショット 2020-08-20 12.44 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/85e83a45-200e-d63b-0ac5-1712b4357416.png)

そうすると、全てのマッピング一覧の画面に移ります。これでデータの同期は完了です。

下記マッピング一覧を見ると、Accountオブジェクトの１０項目を同期していて、
SalesforceにあるAccountオブジェクトと、HerokuのDBにあるAccountオブジェクトの数は、
58,000件ということがわかります。
![スクリーンショット 2020-10-30 21.57 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/f1153c8a-e2cb-a362-b7be-9503abd1ba4a.png)

# まとめ
設定自体は難しくないのですが、初期設定は最初しかやらないので、
忘れないように残しておきました。


# 参考

https://devcenter.heroku.com/articles/heroku-connect
Note Book : OpenCV v4.5.0 with Alphamat Install On Windows10 But it need Eigen


OpencvでAlphamatを使うのに必要。

environment
・windows 10
・cpu ryzen 3700x
・gpu ncvidia-rtx3900

software
・anaconda
・ninja
・cmake
・git
・opencv-4.5.0
・ant 1.8.2
・open-jdk-15
・cuda 11
・cudnn 8.4
・visual studio 2019

```text:cmd

mkdir eigen
cd eigen
git clone https://gitlab.com/libeigen/eigen.git

cd eigen
mkdir build
cd build

cmake -G "Visual Studio 16 2019" -T host=x64 -DCMAKE_INSTALL_PREFIX=/tools/opt/eigen -DEIGEN_INCLUDE_PATH=/tools/opt/eigen build64 -DEIGEN_TEST_CUDA=ON -DBLAS_DIR=/tools/opt/openblas ..
cmake --build . --config Release --target install -j 8

```

capture

cmake -G "Visual Studio 16 2019" -T host=x64 -DCMAKE_INSTALL_PREFIX=/tools/opt/eigen -DEIGEN_INCLUDE_PATH=/tools/opt/eigen build64 -DEIGEN_TEST_CUDA=ON -DBLAS_DIR=/tools/opt/openblas ..
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/4a5f6346-71c4-1c10-717e-1a0b4bbfda08.png)

cmake --build . --config Release --target install -j 8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/bd2d7026-4897-6c9e-120c-0d68699a6a88.png)
MySQLのテーブル操作

### はじめに
MySQLの学習を始めたので、備忘録として操作方法をまとめています
MySQLの学習が初めての方は以下のリンクに最初の導入方法を記しました。併せてご覧ください
[MySQLのインストール〜DBの操作まで](https://qiita.com/smileyuichi/items/e4b5bf47f01ff3814854)

### 使用しているデータベースを確認・選択
使用しているデータベースを確認するには、database関数を使う
`select database();`

使用するデータベースを選択するには、SQLのUSE文を使う
`USE データベース名;`

### テーブル一覧の表示
データベースに存在するテーブルの一覧を表示するには、SQLのSHOW文を使う
`SHOW TABLES FROM データベース名`

### テーブル作成・削除
テーブル作成はSQLのCREATE文を使う
`CREATE TABLE テーブル名 ( 列名１ データ型１, 列名２ データ型２・・・ );`
※テーブル名は一意でなければならないため、既に存在しているテーブルの名前を指定するとエラーとなります
データ型については情報量が膨大なので下記の公式ドキュメントを参照してください↓
https://dev.mysql.com/doc/refman/8.0/en/data-types.html

テーブル削除はSQLのDROP文を使う
`DROP TABLE テーブル名;`
※存在しないテーブル名を指定するとエラーとなる

### テーブルのカラム（列）の情報を一覧表示する
テーブルに設定されているカラム情報を調べるには、SHOW COLUMNSを使う
`SHOW COLUMNS FROM テーブル名`
音声合成で しゃべらせる声を .wav に保存するバッチファイル

しゃべらせる声を .wav に保存。
上書きするので いくつかしゃべらせても最後１つだけ。

以下のファイルをダブルクリックで実行。
文字化けするときは UTF-8 じゃなく Shift-JIS (ANSI) で保存。
(実行環境： Windows10, Window7 等)

ちなみに .wav を .mp3 に無料で一括変換できる投稿記事はこれ。
https://qiita.com/tootwotoh/items/6e972c190a99e24530dd

(無料 フリーウェア スクリプト アプリ プログラム Haruka Zira 、SEO 目的でキーワードを入れてみたw)

talk_wav.bat

```dosbatch



@echo off

call :_sp "いろは にほへと ちりぬるを わかよ たれそ つねならむ うゐの おくやま けふこえて あさき ゆめみし ゑひも せすん"
call :_sp2 "The quick brown fox jumps over the lazy dog."

pause
goto :eof


:_sp
echo %~1
PowerShell "Add-Type -AssemblyName System.Speech; $h = (New-Object System.Speech.Synthesis.SpeechSynthesizer); $h.SelectVoice('Microsoft Haruka Desktop'); $h.rate = -3; $h.SetOutputToWaveFile('.\haruka.wav'); $h.Speak('%~1');"
goto :eof


:_sp2
echo %~1
PowerShell "Add-Type -AssemblyName System.Speech; $z = (New-Object System.Speech.Synthesis.SpeechSynthesizer); $z.SelectVoice('Microsoft Zira Desktop'); $z.rate = -3; $z.SetOutputToWaveFile('.\zira.wav'); $z.Speak('%~1');"
goto :eof

```

しゃべらない？　なら、
マイクロソフトスピーチプラットフォームをインストール。

http://www.microsoft.com/en-us/download/details.aspx?id=27225

　x86_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi
　　または
　x64_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi

日本語を追加

http://www.microsoft.com/en-us/download/details.aspx?id=27224

　MSSpeech_SR_ja-JP_TELE.msi
　MSSpeech_TTS_ja-JP_Haruka.msi
高位合成言語アセンブラを作る。 その5

#概要

高位合成言語アセンブラを作る。
ソースから、verilogを生成するコンパイラを作った。
生成したverilogをiverilogで実行した。

#実行結果

```

a b c d
0 0 0 0
0 1 1 1
1 0 1 1
1 1 0 1


```

以上。
Microsoft TeamsのチャットログのテキストをクリップボードにコピーしてHTML Format形式の文字列として読み取ろうとしたら文字化けした件

おそらくTeamsに限った現象ではなさげ。

# まえがき

Teamsのチャット内容とかを他の管理台帳とかに手軽にコピーしたいと思い、色々調べ始めてみたところ、いきなりつまづいた。

# チャットログに貼られたテキストをコピーすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/42254b9a-c65f-d6e1-8e2b-2973723ca472.png)
のテキスト「ほげ」をコピーして、[以前作ったツール](https://qiita.com/kob58im/items/46ec6f74e3396ba558f1)を使ってクリップボードの保存形式を調べると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/88e58946-effc-eb91-2367-982007e205e6.png)
ここまでは、まともです。

で、HTML Formatを選んで保存します。すると、、、（下記に抜粋）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/4cdbaa28-112a-e32e-89ad-56a4abbfd192.png)

文字化けしてますね。。

# 原因は謎だが対処法はあるようで・・・

[参考サイト](https://qiita.com/kob58im/items/7570e94ec399e4ae0874#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88)の１と２に、対処法が記載されています。
`"Html Format"`を指定して、`GetData`すると大丈夫なようです。
`"HTML Format"`では文字化けします。謎すぎ・・・。

# サンプルソースコード

```csharp

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

class SampleForm : Form
{
    SampleForm()
    {
        ClientSize = new Size(300, 200);

        var btn = new Button(){
            Text = "Copy and save clipborad data as HTML Format.",
            Dock = DockStyle.Fill,
        };
        btn.Click += (s,e)=>{CopyAndSaveHtmlFromClipboard();};
        Controls.Add(btn);
    }
    
    void CopyAndSaveHtmlFromClipboard()
    {
        var ms = Clipboard.GetData("Html Format") as MemoryStream;

        if ( ms != null ) {
            using ( var fs = new FileStream("clipboard_tmpout_html.txt", FileMode.Create) ) {
                ms.WriteTo(fs);
            }

            Console.WriteLine("saved.");
        }
        else {
            Console.WriteLine("no data.");
        }
    }

    [STAThread]
    static void Main(string[] args)
    {
        Application.Run(new SampleForm());
    }
}
```

# 結果

上記のサンプルコードで保存したファイルを開くと、文字化けが解消することを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/1b31c537-5fed-a0ec-a65a-8a87210feb85.png)


# 参考サイト

1. [Clipboard.GetData(DataFormats.Html)で文字化け：Gushwell's Dev Notes](http://gushwell.ldblog.jp/archives/51974858.html)
2. [のぶろぐ クリップボードのHTMLをテキストにしてみる。](http://shen7113.blog.fc2.com/blog-entry-7.html)
3. [UTF-8からSJISに文字化けすると糸偏の漢字がよく出てくる - Qiita](https://qiita.com/kaityo256/items/878cbe35d4c8444b045a)
modelを作成できないときの対策

Ruby on railsでアプリケーションを作成しており、``rails g model hoge(モデル名) ``をした時になぜかモデルが作れなかったので原因と解決策を書いていきます。


### エラー内容
以下のような結果になりました。
![7e84474b2d5d2417dee0acf7d8e8569d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/bdfe3755-a3ed-b741-aa64-e1280446ae6c.png)

``Diary``という名前は、既に使われているから使えないよという内容です。
アプリケーション名をdiaryにしていたためそこをかえればいいのかと思い、フォルダ名を変更しました。
変更した後に再度``rails g model diary``をしたところ・・・

全く同じエラーが表示されました:sweat:

## 結論
``config``ファイル内のアプリーション名を変える必要がある。

before

```ruby:app/config/application.rb
module Diary  ←ここにアプリケーション名が表示される
  class Application < Rails::Application
    config.load_defaults 6.0
  end
end
```
after

```ruby:app/config/application.rb
module EveryDiary ←変更する
  class Application < Rails::Application
    config.load_defaults 6.0
  end
end
```

名前を変更したことで無事モデルの作成ができました！
configファイルも確認する必要があると感じました。
【Rails】真偽判定を行う方法

#nil?メソッド
変数.nil?
このメソッドでtrueが返ってくる時はレシーバーである変数そのものが存在しない時ということになります。

 

#empty?メソッド
変数.empty?
このメソッドでtrueが返ってくる時はレシーバーである変数に値が入っていない時ということになります。

例えばその変数がインスタンス変数であればそのインスタンス変数自体は存在するが、そのインスタンス変数に値が何も入っていない時などは、empty?メソッド使って検索することとなります。

 

#blank?メソッド
変数.blank?
このメソッドでtrueが返ってくる時はレシーバである変数そのものが存在しないか、変数に値が入っていない時とということになります。

つまり、上記のnil?メソッドとempty?メソッドの両方の機能を足したメソッドとなります。

 

#present?メソッド
変数.present?
present?メソッドはレシーバーである変数に値が入っていればtrueを返し値が入ってなくまたレシーバーである変数そのものが存在しない時は、falseを返します。

上記のメソッドのblank?メソッドの逆となります。

#注意事項
itemが親、orderが子の1対1のリレーションの場合、`item.orde.user.idとしてしまうとエラーを吐く`。
あくまでも、親にたいして小がいるかどうかで判断しなければならない。

```
<% if item.order.present? %>
 <div class='sold-out'>
  <span>Sold Out!!</span>
 </div>
<% end %>
```
React Hooks useRefでマウント時の処理を使い分ける


React Hooksの有名な機能にuseEffectがあるが、これは第二引数に変数を指定した場合、`componentDidmount`時と`componentDidUpdate`時の両方に実行されることになる。


ここで、`componentDidMount`時と`componentDidUpdate`時で処理を使い分けたいときに便利なのが`useRef`。



```jsx:useRefExample.jsx
import React, {
  useState, useEffect, useRef,
} from 'react';

export const useRefExample = () => {
const [stateA, setStateA] = useState(null);
const inputRef = useRef(false);

useEffect(() => {
  if(inputRef.current) { // inputRefの初期値はfalseなので初回レンダリング時には実行されない
    console.log('componentDidUpdate!');
  } else {
    console.log('componentDidMount!'); //初回レンダリング時のみこのelseブロックの中が実行される
    inputRef.current = true //inputRefの値がtrueに切り替わるため、2回目以降useEffectが実行されるとき(componentUpdate)はif文のブロックの中が実行される
  }
}, [stateA]) // 副作用はstateAに依存する

return (
  <input
    ref={inputRef}
    value={stateA}
    onChange={e => setStateA(e.target.stateA)}
  />
 );
}
```

useRefで宣言した変数`inputRef`を、useEffectのelseブロック内でfalseからtrueに書き換える。そうすることで初回レンダリング後と`stateA`の値が変更した時の処理を使い分けることができる。


## 参考サイト
[useRef 公式ドキュメント](https://ja.reactjs.org/docs/hooks-reference.html#useref)
[useEffectフックのしくみ](https://qiita.com/ossan-engineer/items/740425a0df937a47e093)
[useRef は何をやっているのか](https://qiita.com/seya/items/6bbfa3f9d489809ccb2c)
【Rails】DMしたことがある人をマイページに表示して、チャットページにリンクできるようにする！【備忘録】

https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03

を用いてDM機能を実装した際、チャットページに飛ぶリンクをユーザーの一覧表示ページ以外に実装したい！と思ったことがある方も多いと思います。

そこで、一度DMのやりとりをしたことがある人に関しては、以下の画像のようにユーザーのマイページからチャットを再び再開できるようにしようと思います。（LINEのマイページみたいなイメージですかね）


解説は気が向いたら書きます！


#view/users/show.html.erb

```
<% if current_user.id == @user.id %>
  <h3>チャット一覧</h3>
  <% @rooms.each do |r| %>
    <% r.users.each do |u| %>
     <% if u.id == current_user.id %>
     <% else %>
        <p><a href="/rooms/<%= r.id %>"><%= u.name %>さんとのチャット</a></p>
     <% end %>
    <% end %> 
  <% end %>
<% else %>
      
<% end %>

```

#models/user.rb
```
#追記
has_many :rooms, through: :entries, source: :room
```

#models/room.rb
```
#追記
has_many :users, through: :entries, source: :user
```

#UsersController#show

```
#追記
@user = User.find(params[:id])
@rooms = @user.rooms
```
Windowsのファイル操作

Windows環境プログラムからファイルの作成に失敗していて、プロセスモニタで調査した結果、ファイル作成時にDELETE PENDINGが発生していた。

https://docs.microsoft.com/ja-jp/archive/blogs/japan_platform_sdkwindows_sdk_support_team_blog/153

Visual Studio 2019でコンパイルしたらCreateFileの第一引数で「"char *" の引数は型 "LPCWSTR" のパラメーターと互換性がありません」とエラーになった。

ソリューションエクスプローラからプロジェクトのプロパティを表示し、[構成プロパティ]-[詳細]を選択し、「文字セット」の値を【Unicode文字セットを使用する】から【マルチバイト文字セットを使用する】に変更した。

ただ、思った通りの動きにならない。原因調査中に以下のサイトを見つけた。
https://mattn.kaoriya.net/software/lang/go/20170817113831.htm

Windows Server2016では想定通りに動いたので、やはりWindows10で挙動が変わったようだ。（確認したWindows10はバージョン2004）
Pythonで簡単なGUIアプリを作成する



最近AIや分析等の分野で活躍しているPythonですが、普通のデスクトップアプリケーションの作成にも利用可能です。

今回はPythonに標準で付属しているGUIライブラリ「Tkinter(ティーキンター、ティケーインター)」を利用して、入力した値をターミナルに書き出す簡単なGUIアプリを作成します。


## 使うもの

私が動作を確認した構成は以下の通りです

- Python 3.7.3
  
IDEはVisual Studio Codeを利用しています。

## Python のインストール

公式サイトに行ってダウンロード＆インストールを行ってください。

## とりあえずTkinterを使う

Visual Studio Codeにて「新しいファイル」をクリックして、「form.py」と名前を付けて保存してください。

プログラムの先頭にtkinterを利用しますよという宣言を記述します。

```python
from tkinter import *
from tkinter import ttk
```

次にメインとなるフォームを以下の様に定義します。

```python
mainform = Tk()
mainform.title('GUIアプリのテスト')
```

このmainform.title('GUIアプリのテスト')がフォームのタイトルになります。


## ウィジェットの配置

次にウィジェットを配置します。

tkinterではラベルやテキストボックス等をウィジェットと呼び、それぞれ動作内容等を定義する事が出来ます。

今回はフレームを作成し、ラベルとテキスト入力ボックス、ボタンを作成します。

以下の様に入力を行います。

```python
frame1 = ttk.Frame(mainform, padding=16)
label1 = ttk.Label(frame1, text='テキストを入力してください。')
t = StringVar()
entry1 = ttk.Entry(frame1, textvariable=t)
button1 = ttk.Button(
    frame1,
    text='OK',
    command=lambda: print('入力値は, %s.' % t.get()))
```

- ttk.Frameがフレームの設定
- ttkLabelがラベルの設定
- ttk.Entryがテキストボックスの設定
- ttk.Buttonがボタンの設定となります。

なおボタンには別の場所で定義したモジュールを呼び出す設定も可能です。

## レイアウトの設定

作成したウィジェットを配置します。

今回はシンプルに横一列に並べてみます。

```python
frame1.pack()
label1.pack(side=LEFT)
entry1.pack(side=LEFT)
button1.pack(side=LEFT)
```

左から順に並んで配置されます。

## ウインドウの表示

ここまで来たら後はウインドウの表示コマンドを記述するのみです。

```python
mainform.mainloop()
```

## 実行してみる

Visual Studio Codeのターミナルより以下のコマンドを実行します

```python
python form.py
```

以下のようなGUIが表示されれば成功です。

![gui001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620300/65b917aa-a8bd-2c98-ff4f-b90054d606d6.jpeg)


試しに好きな言葉を入力します

![gui002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620300/89650529-1628-ca17-7cfa-d24dc52956d5.jpeg)


ターミナルに以下の様に表示されればOKです

```python
入力値は, 秋の味覚.
```

## 感想

GUIアプリケーションとしては行数も少なく、簡単に作る事が出来ます。

なんとなくVBチックな（フォームにロジックが紐づいた）作り方が出来るところも気に入りました。

現在VBやExcelで作られているシステムをPythonに書き換えてみてはいかがでしょうか？

PythonだとLinuxでもMacでも動作するのでとても便利ですよ。
[PyTorch]CPU vs. GPU vs. TPU [ファインチューニング]

## 背景
[つくりながら学ぶ！PyTorchによる発展ディープラーニング](https://www.amazon.co.jp/%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6%EF%BC%81PyTorch%E3%81%AB%E3%82%88%E3%82%8B%E7%99%BA%E5%B1%95%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E5%B0%8F%E5%B7%9D-%E9%9B%84%E5%A4%AA%E9%83%8E-ebook/dp/B07VPDVNKW)という本の1-5のファインチューニングをGoogle Colaboratoryでやってみました。([筆者GitHub](https://github.com/YutaroOgawa/pytorch_advanced/blob/master/1_image_classification/)で全てのコードが見られます)

### 注意点
- make_folders_and_data_downloads.ipynbの中身を1-5のipynb内で実行する必要があります。
- ipynbのフォルダにutilsフォルダを作成して中にGitHub内のutilsフォルダ内のファイルをコピペする必要があります。

## 実行結果
### CPU
![cpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592103/e9926867-8232-3ff0-d3ab-aa26db6e5661.png)
約10分かかりました。

### GPU
![gpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592103/70c30c8e-bca2-1df6-41e0-63d01a00f156.png)
20秒かかってないです。

### TPU
![tpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592103/e14ff273-8108-103d-0b44-89e98aa76427.png)
こちらも約10分かかりました。

## コメント
- GPUがものすごく速かったですね。ただ、CPUも思っていたよりは時間は必要ありませんでした。TPUはCPUとして扱われてしまってたことが敗因ですね。後で調べるとPyTorchでTPUを使いたい場合はそれが可能になるようにコードを書く必要があるということがわかりました。今度やってみます。
- [本](https://www.amazon.co.jp/%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6%EF%BC%81PyTorch%E3%81%AB%E3%82%88%E3%82%8B%E7%99%BA%E5%B1%95%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E5%B0%8F%E5%B7%9D-%E9%9B%84%E5%A4%AA%E9%83%8E-ebook/dp/B07VPDVNKW)では、AWS EC2のGPUを使わせようとしていましたが、この程度の処理なら無課金のGoogle Colaboratoryでも実際に動かせそうです。
全てのDockerイメージを削除するワンライナー

全てのコンテナを破棄してしまいたい……。
そういう衝動にかられたときに使うワンライナーです

```shell
docker images --format "{{.Repository}}:{{.Tag}}" | xargs docker rmi
```

`docker images`の`--format`オプションはGoのフォーマットの通りにイメージ一覧を出力します。

タグ付きのリポジトリ名をパイプで`xargs`に渡してイメージの削除を行うだけです。
音声合成の外人さんと会話するバッチファイル

とりあえず音声合成の会話する。
アポストロフィ ' が入れられないのが残念。
無理せず PowerShell スクリプト .ps1 で作るほうがいいかも。

以下のファイルをダブルクリックで実行。
文字化けするときは UTF-8 じゃなく Shift-JIS (ANSI) で保存。
(Windows10, Window7 等)

zira.bat

```dosbatch

@echo off

call :_sp "こんにちは"
call :_sp2 "Kon  nyee  chih  waah."
call :_sp "お元気ですか？"
call :_sp2  "I am fine, and you too?"

pause
goto :eof


:_sp
echo %~1
PowerShell "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('%~1');"
goto :eof


:_sp2
echo %~1
PowerShell "Add-Type -AssemblyName System.Speech; $z = (New-Object System.Speech.Synthesis.SpeechSynthesizer); $z.SelectVoice('Microsoft Zira Desktop'); $z.Speak('%~1');"
goto :eof


```
しゃべらない？　なら、
マイクロソフトスピーチプラットフォームをインストール。

http://www.microsoft.com/en-us/download/details.aspx?id=27225

　x86_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi
　　または
　x64_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi

日本語を追加

http://www.microsoft.com/en-us/download/details.aspx?id=27224

　MSSpeech_SR_ja-JP_TELE.msi
　MSSpeech_TTS_ja-JP_Haruka.msi
【Golang】テスト実行時に "package exec is not in GOROOT"

> Go 言語（Golang）の `testing` を使ってテストを実行すると「`exec` パッケージがない」と言われます。

```shell-session
$ go test .
# github.com/KEINOS/Hello-World
main_test.go:5:2: package exec is not in GOROOT (/usr/local/go/src/exec)
FAIL    github.com/KEINOS/Hello-World [setup failed]
FAIL
```

意外なことに[「"golang" package exec is not in GOROOT」とググって](https://www.google.com/search?q=%22golang%22+package+exec+is+not+in+GOROOT)も、当然すぎるのか、すぐに見つからなかったので自分のググラビリティとして。

- go version go1.15.3

## TL; DR

> `exec` は `os` パッケージの一部です。`exec` → `os/exec` と指定します。

```diff
import(
-    "exec"
+    "os/exec"
)
```

## TS; DR（所感）

外部コマンドの実行結果を取得するために、コード中に `exec.Command()` を使ったところ、VSCode の自動補完で `import` に `exec` が追加されました。

テストを実行すると "`package exec is not in GOROOT`" と叱られます。

金曜の夕方だからなのか、公式ドキュメントも調べず、いきなり検索猿人で闇雲に[「"golang" package exec is not in GOROOT」とググって](https://www.google.com/search?q=%22golang%22+package+exec+is+not+in+GOROOT)もすぐに出てきませんでした。

[公式の `package` ドキュメント](https://golang.org/pkg/)を見たら、一発で出てきました。

> **Package exec**
> import "os/exec"
>
> <sup>（[Package exec](https://golang.org/pkg/os/exec/) @ The Go Programming Language より）</sup>

公式 package を[ブラウザの検索エンジンに登録](https://qiita.com/KEINOS/items/63c5f9b1c1f70f1ff531)したいと思います。とほほ。

## 参考文献

- [Package exec](https://golang.org/pkg/os/exec/) @ The Go Programming Language
- [golangで便利ツール作ろうと思ったらos/execでハマった話](https://qiita.com/tng527/items/c44b943da93041a8355b) @ Qiita
meshlabをソースコードから使ってみる (環境構築編)

# はじめに
[MeshLab](https://www.meshlab.net/)はメッシュ・点群データをGUIで編集できるOSSのソフトです．
ソースコードが[github](https://github.com/cnr-isti-vclab/meshlab)上でGPL-3.0ライセンスにて提供されています．
[VCGlib](http://www.vcglib.net/)というメッシュ処理用ライブラリがコアになっています．

# 目的
- MeshLabでやっているデータ処理をGUIなしでやりたい
- MeshLabだけではできない細かいカスタマイズをしたい

MeshLabにもコマンドラインベースで使うことができるmeshlabserverというソフトが付属しています．
しかし，MeshLabの機能を順番に呼び出すマクロファイルを作成できるだけなので，FreeCADのマクロのような自由度がありません．
マクロベースではなくコードベースで作成することで，自由に処理プロセスを構築できるようにします．

# 開発環境

- Windows10 64bit
- [CMake](https://cmake.org/) version 3.15.0
- Visual Studio 2017

コンパイルはCMakeを使って行うので，他のOS環境・コンパイラでも動くと思います．
詳しくはCMakeの使い方を調べてください．

# サンプルプログラムの作成

本稿では最小限のコードだけ作成して，動作確認できるところまで実装します．

## ソースコードをgithubからクローン
### vcglibをクローン
develブランチを使用します

```shell
$ git clone -b devel https://github.com/cnr-isti-vclab/vcglib.git
```

### meshlabをクローン

```shell
$ git clone https://github.com/cnr-isti-vclab/meshlab.git
```

## ソースファイル
フォルダ構成は以下のようにします．

```text
--- project folder
 |- CMakeLists.txt
 |- main.cpp
```


### CMake用ファイル

```cmake:CMakeLists.txt
cmake_minimum_required( VERSION 3.6 )
project(sample CXX) # 実行ファイル名

# Visual Studioを使う場合は，ファイルの文字コードをUTF-8にする設定を追加
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

# デバッグモードで出力したときに末尾にdの文字を追加する設定
if(NOT CMAKE_DEBUG_POSTFIX)
  set(CMAKE_DEBUG_POSTFIX d)
endif()

# 出力ディレクトリを変更
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/bin)

# ライブラリのパスを環境変数から取得
file(TO_CMAKE_PATH $ENV{VCGLIB_DIR} VCGLIB_DIR)
file(TO_CMAKE_PATH $ENV{MESHLAB_DIR} MESHLAB_DIR)
file(TO_CMAKE_PATH ${VCGLIB_DIR}/eigenlib EIGEN3_INCLUDE_DIR)

# MeshLabのMESHLAB_SCALAR型をfloatとして定義
add_definitions(-DMESHLAB_SCALAR=float)

# 実行ファイルを作成
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME}
  PRIVATE
    main.cpp
    ${VCGLIB_DIR}/wrap/ply/plylib.cpp # PLYファイル扱うために追加
)
target_include_directories(${PROJECT_NAME}
  PUBLIC
  ${EIGEN3_INCLUDE_DIR}
  ${VCGLIB_DIR}
  ${MESHLAB_DIR}
)

# デバッグモードで出力したときに末尾にdの文字を追加する設定
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
```

### C++ファイル作成

```cpp:main.cpp
#include <vcg/complex/algorithms/create/platonic.h>
#include <vcg/complex/complex.h>
#include <common/ml_mesh_type.h>

using namespace vcg;
using namespace std;

int main(){
	CMeshO mesh;
	tri::Tetrahedron(mesh); // 正四面体を作成

	for(CMeshO::VertexType &vt : mesh.vert){ // 各頂点にアクセス
		cout << vt.Index() << endl;
	}
	
	return 1;
}
```

## コンパイル

あらかじめ以下の環境変数を定義しておきます．

- VCGLIB_DIR : path/to/vcglib (e.g. C:/Users/Public/Documents/GitHub/vcglib)
- MESHLAB_DIR : path/to/MeshLab/source (e.g. C:/Users/Public/Documents/GitHub/meshlab/src)

project folder内で以下のコマンドを実行します．
違うコンパイラを使用する場合は，`-G"Visual Studio 15 2017 Win64"`の箇所を適切なコンパイラに変えてください．

```shell
$ md build
$ cd build
$ cmake .. -G"Visual Studio 15 2017 Win64"
$ cmake --build . --config release
```

コンパイルが成功すると，project folder/binフォルダにsample.exeが生成されます．

## 動作テスト

project folder内で以下のコマンドを実行します．

```
$ bin\sample.exe
```

以下の出力が出てくれば成功です！

```
0
1
2
3
```

# まとめ

これでMeshLabの各種関数を使うための準備が整いました．
今後の記事で各種機能の使い方を説明します．
wireshark-3.4.0でパケットダイアグラムを表示する

# 概要
wiresharkのstableであるv3.4.0が公開されましたが、このバージョンの目玉機能としてパケットをASCIIアート風に表示してくるパケットダイアグラムという機能があります。この機能を使ってみたので簡単に紹介したいと思います。

# 表示方法
Wireshark -> 「Preference」 -> AppearanceのLayoutタブを選択して３つのペインのうちのどれか1つに「Packet Diagram」を割り当てます。以下の例ではpane3に割り当てています。

![スクリーンショット 2020-10-31 9.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145493/0ab4085b-ec15-9166-5fb9-c075fae10bd8.png)

あとはパケットをキャプチャーすれば指定したPaneにダイアグラムが表示されます。
![スクリーンショット 2020-10-31 9.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145493/64926fc8-f4e8-5a93-ca01-39f2e5f7f579.png)

ASCIIアート風に表記されたパケットのフィールドをクリックすると、「Packet Detail」のPaneも該当のパケット部分を指し示すようになります。
以下の例では「TCP Options」をクリックすることで、詳細画面もOptionsに当たっていることが確認できます。
![スクリーンショット 2020-10-31 9.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145493/92ecbbb3-40e6-9410-3259-da4200d14170.png)
高位合成言語アセンブラを作る。 その4

# 概要

高位合成言語アセンブラを作る。
ソースから、verilogを生成するコンパイラを作る。

# 生成したverilog


```
module x(input a, input b, output c, output d);
    assign c = a ^ b;
    assign d = a | b;
endmodule

module testbench;
    reg a, b;
    x u(.a(a), .b(b), .c(c), .d(d));
    initial
    begin
        $display("a b c d ");
        $monitor("%b %b %b %b ", a, b, c, d);
        a = 0; b = 0; #10;
        a = 0; b = 1; #10;
        a = 1; b = 0; #10;
        a = 1; b = 1; #10;
        $finish;
    end
endmodule

```

# 成果物

https://embed.plnkr.co/plunk/AWDM6rMoHJCn0fEX

以上。
ソケット通信での書き込み時に突然終了してしまう場合の対処法


# 問題
ソケットプログラムを試していた際に何の前触れもなくSSL_writeの行で急に終了してしまいました。


終了コードを眺めてみると「141」という自分では定義したことがないコードでした。

```
$ echo $?
141
```

# 原因
wiresharkを眺めているとpeerからのTCP RSTを受けていて、コネクション切断されたあとにSSL_writeをしていると思われることがわかりました。

調べてみるとどうやら、コネクションが切れたソケットに書き込みを行うとSIGPIPEシグナルが発生しているとのことです。
SSL_writeのマニュアルには特に記載されていないが、write(2)のmanpageにはちゃんと記載されていました。

- https://linuxjm.osdn.jp/html/LDP_man-pages/man2/write.2.html

```
EPIPE
fd がパイプ (pipe) かソケット (socket) に接続されており、 その反対側 (読み込み側) がクローズ (close) されている。 これが発生した場合には、書き込みを行なうプロセスは SIGPIPE シグナル (signal)も受ける。 (したがって、プログラムがこのシグナルを捕獲 (catch)、停止 (block)、無視 (ignore) した場合のみ、write の返り値を参照できる。)
```

# 対処法

SIGPIPE時にhandler関数を追加することで、ハンドリングし突然終了しないようにしました。

```
#include <signal.h>

void handler(int signal) {
    fprintf(stderr, "Client reveived %d signal\n", signal);
}
```

```
        struct sigaction action;
        sigset_t sigset;

        sigemptyset(&sigset);
        action.sa_handler = handler;
        action.sa_flags = 0;
        action.sa_mask = sigset;
        sigaction(SIGPIPE, &action, NULL);
```

試せていませんが、この他にも以下の記事で紹介されているようにSIGPIPEを無視する方法も存在するようです。

- https://stackoverflow.com/questions/18935446/program-received-signal-sigpipe-broken-pipe
【Laravel】Collectionのimplodeメソッド

##はじめに
今回もLaravelのCollectionのメソッドについてまとめたいと思います。

##implodeメソッドでデータを結合した文字列を取得する

値を結合し、文字列としてデータ取得するメソッドです。
例えば、名前を「＆」で繋いで結合する場合です。

```php
$collection = collect([
    ['id' => 1, 'name' => '太郎', 'age' => 40],
    ['id' => 2, 'name' => '花子', 'age' => 38],
    ['id' => 3, 'name' => '一郎', 'age' => 55]
]);
echo $collection->implode('name', ', '); // 太郎, 花子, 一郎
```

もし、１次元配列の場合はキーは必要なく、以下のように結合文字だけを指定すれば実装できます。

```php
$collection = collect(['太郎', '花子', '一郎']);
echo $collection->implode(', '); // 太郎, 花子, 一郎
```

##おわりに
いかがでしたでしょうか。
値を結合して文字列としてデータ取得したい時に試してみてください。
Python Webアプリケーション自作入門

# はじめに
本記事は、Zennのオンラインブック

[「伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門」](https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python)

の一部抜粋になります。

こちら
https://qiita.com/bigen1925/items/dde5575da6c45a91808d
も併せてお読みください。

# PythonでWebサーバーを書いてみる

いきなりですが、Pythonでブラウザからリクエストを受け取り、ブラウザへレスポンスを返すサーバーを作成してみましょう。
以下のプログラムは、自分のPCのポート8080(`localhost:8080`)ででサーバーとして起動し、ブラウザからリクエストを受け付けるとその内容を`server_recv.txt`というファイルに書き出し、その後`server_send.txt`というファイルの内容を読み込んでレスポンスとしてブラウザへ返却します。

**`TCPServer.py`**

```python
import socket


class TCPServer:
    """
    TCP通信を行うサーバーを表すクラス
    """
    def serve(self):
        """
        サーバーを起動する
        """

        print("=== サーバーを起動します ===")

        try:
            # socketを生成
            server_socket = socket.socket()
            server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            # socketをlocalhostのポート8080番に割り当てる
            server_socket.bind(("localhost", 8080))
            server_socket.listen(10)

            # 外部からの接続を待ち、接続があったらコネクションを確立する
            print("=== クライアントからの接続を待ちます ===")
            (client_socket, address) = server_socket.accept()
            print(f"=== クライアントとの接続が完了しました remote_address: {address} ===")

            # クライアントから送られてきたデータを取得する
            request = client_socket.recv(4096)

            # クライアントから送られてきたデータをファイルに書き出す
            with open("server_recv.txt", "wb") as f:
                f.write(request)

            # クライアントへ送信するレスポンスデータをファイルから取得する
            with open("server_send.txt", "rb") as f:
                response = f.read()

            # クライアントへレスポンスを送信する
            client_socket.send(response)

            # 通信を終了させる
            client_socket.close()

        finally:
            print("=== サーバーを停止します。 ===")


if __name__ == '__main__':
    server = TCPServer()
    server.serve()
```

返却用の`server_send.txt`も作成しておきましょう。

**`server_send.txt`**

```http
HTTP/1.1 200 OK
Date: Wed, 28 Oct 2020 07:57:45 GMT
Server: Apache/2.4.41 (Unix)
Content-Location: index.html.en
Vary: negotiate
TCN: choice
Last-Modified: Thu, 29 Aug 2019 05:05:59 GMT
ETag: "2d-5913a76187bc0"
Accept-Ranges: bytes
Content-Length: 45
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>
```

# プログラムを動かしてみる
コンソールでソースコードを配置したディレクトリまで移動し、下記コマンドでプログラムを実行します。

```bash
$ python TCPServer.py
=== サーバーを起動します ===
=== クライアントからの接続を待ちます ===
```

コンソールのタブは開いたままにして、ブラウザで`http://localhost:8080`へアクセスしてみましょう。

![スクリーンショット 2020-10-26 18.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232671/9496f842-358b-4d5f-edb2-623121f4f959.png)

無事にWebページとして表示されましたね！

# Webサーバーの仕組みを理解する
コメント等を除けば、たった十数行で、かなり原始的なWebサーバーを動かすことができました。
（現時点ではWebサーバーと呼べるようなシロモノではなく、TCPサーバーと呼ぶのが正確ですが・・・）

何事も、仕組みを理解するには自分で作ってみるのが一番の近道です。

WebサーバーやWebフレームワークの仕組みを理解したい方は、是非オンラインブック
https://zenn.dev/bigen1925/books/e6c9492a82f5e2e10fca/viewer/504d96
を読んでみてください！

本記事のソースコードの解説もあります。
プロゲート【JavaScript Ⅱ 学習コース】While文,for文,配列,オブジェクト

# prorate:JavaScript 学習コース II
## while文

```javascript
while (条件)  {
	処理;
} // セミコロン不要
```

```javascript

// 変数numberを定義
let number= 1;

// while文
while(number <= 100){
  console.log(number);
  number += 1; //1を足して繰り返し101にfalseになったところでストップ
}

```

## for文
```javascript

for (変数の定義;条件式;変数の更新)  {
	処理;
} // セミコロン不要

number ++ //number += 1を省略
number -- // number -= 1を省略

```

```javascript

for (let number = 1; number <= 100; number ++){
  console.log(number);
}

```

### 3の倍数のときは「3の倍数です」と出力する

```javascript

// for文を完成させてください
for (let number = 1; number <= 100;number ++) {
  
  // if文を用いて、numberが3の倍数の時に「3の倍数です」、そうでないときは数字を出力してください
  if(number % 3 === 0){ //3で割った時にあまりが0になる=3の倍数
    console.log("3の倍数です");
  }else{
    console.log(number);
  }
    
  
}
```

## 配列を定数に代入する

```javascript

const fruits = ["apple","banana","orange"];
// 文字列の配列を代入
//　インデックス番号　0→1→2

const fruits = [1,2,3];
// 数値の配列を代入

console.log(fruits[0]); //appleが表示される

```

### 要素の更新

```javascript

// 配列animalsの3つ目の要素を「rabbit」に更新
animals[2] = "rabbit";
console.log(animals[2]); //出力

```

## 配列とfor文

```javascript
const fruits = ["apple","banana","orange"];　//定義

for (let i = 0; i < 3; i ++){
		// 変数の定義;条件式;変数の更新
  console.log(fruits[i]);
}

```

### length

配列.lengthとすることで、配列の要素数を取得できる。

```javascript

console.log(配列.length)

const fruits = ["apple","banana","orange"];　//定義

for (let i = 0; i < fruits.length; i ++){
		// 変数の定義;条件式;変数の更新
  console.log(fruits[i]);
}

```


## オブジェクト
```javascript

　// 配列
[ 値; 値; 値 ]

// オブジェクト
{プロパティ1:値1,プロパティ2:値2,プロパティ3:値3 }

// オブジェクトのアイテムを取り出す
console.log(オブジェクト名.プロパティ名);

　// オブジェクトの値を更新
オブジェクト.プロパティ名 = 新しい値;
```

### オブジェクトを要素に持つ配列

```javascript

const items =[

{プロパティ1:値1,プロパティ2:値2,プロパティ3:値3}, // インデックス0
{プロパティ1:値1,プロパティ2:値2,プロパティ3:値3}, // インデックス1
{プロパティ1:値1,プロパティ2:値2,プロパティ3:値3}  // インデックス2

];

//オブジェクトを取り出したい時
console.log(items[0])

// プロパティを取り出したいとき
配列[インデックス番号].プロパティ名
console.log(items[0].プロパティ)


```

## undefined
> 配列の存在しないインデックス番号の要素や、オブジェクトの存在しないプロパティの要素を取得しようとすると、undefined と出力されます。
> undefined は特別な値で、値が定義されていないことを意味します。[-progate-](https://prog-8.com)

```javascript

if( items.個数 === undefined){ // itemsの個数が定義されていない時
    console.log("個数不明");
	}else{
 個数が定義されているときの処理
 }

```

### 応用

```javascript

const cafe = {
  name: "Progateカフェ",
  businessHours: {
    // businessHoursの値に指定されたオブジェクトを代入してください
    opening:"10:00(AM)",
    closing:"8:00(PM)"
  },
};

// オブジェクト名.プロパティ.プロパティで呼び出せる
```


```javascript

const cafe = {
  name: "Progateカフェ",
  businessHours: { 
    opening: "10:00(AM)",
    closing: "8:00(PM)"
  },
  menus: ["コーヒー","紅茶","チョコレートケーキ"]
  
};

console.log(`店名: ${cafe.name}`);
console.log(`営業時間:${cafe.businessHours.opening}から${cafe.businessHours.closing}`);
console.log(`----------------------------`);
console.log("おすすめメニューはこちら");

for (let i = 0; i < cafe.menus.length; i ++){
  console.log(cafe.menus[i]);
}

```
バッチファイルで PowerShell を使って曜日を得る

曜日を取得する DOS コマンドは無いので PowerShell の機能を使う。
文字化けするときは UTF-8 じゃなく Shift-JIS (ANSI) で保存。
(Windows 10, Windows 7 等)

dayofweek.bat

```dosbatch

@echo off
echo.

powershell "exit ((Get-Date).adddays(-1).dayofweek.value__)"
echo 昨日: %errorlevel%

powershell "exit ((Get-Date).dayofweek.value__)"
echo 今日: %errorlevel%

powershell "exit ((Get-Date).adddays(1).dayofweek.value__)"
echo 明日: %errorlevel%

set tm=2021/1/1
powershell "exit (([DateTime]'%tm%').dayofweek.value__)"
echo 指定日 %tm% : %errorlevel%

echo.
pause
goto :eof


 %errorlevel%
 0 ... 日曜日
 1 ... 月曜日
 2 ... 火曜日
 3 ... 水曜日
 4 ... 木曜日
 5 ... 金曜日
 6 ... 土曜日

```

実行例

```
昨日: 5
今日: 6
明日: 0
指定日 2021/1/1 : 5

続行するには何かキーを押してください . . .
```
@sentry/serverlessでServerless Functionをらくらくエラー監視

## @sentry/serverless

Serverless Functionのデバッグはやりづらい印象があります。
私は、GCP Functionのエラー監視を@sentry/nodeでやっていたのですが、2020年9月に@sentry/serverlessというパッケージが公開されていたようです。

最初はLambdaだけでしたが、10月中旬ごろからGCP Functionにも対応しています。

まだこれに関するナレッジがあまり見つからなかったので、軽く調べてわかったことをまとめてみます。
ユースケースはGCP, Nodeの前提で書きますが、他の環境もほぼ同じだと思います。

# 要約

* すべてのイベントを自動的にレポート可能
* PythonやJS(TS)で利用可能
* @sentry/nodeをラップしているため、@sentry/nodeで利用できるメソッドは全て@sentry/serverlessからインポート可能。nodeを使っている場合は置き換えよう
* exportされるFunction全体をラップして使う
* 当然、キャッチしたエラーを`captureException`もできる
* ラップできるFunctionは、`HttpFunction`, `EventFunction`, `CloudEventFunction`。つまり、HTTP関数と、バックグランド関数と、CloudEvents

# 使い方

GitHubのREADMEにあるように普通にinitしてラップします。

```js
import * as Sentry from '@sentry/serverless';

Sentry.GCPFunction.init({
  dsn: '__DSN__',
  tracesSampleRate: 1.0,
  // ...
});

// For HTTP Functions:

exports.helloHttp = Sentry.GCPFunction.wrapHttpFunction((req, res) => {
  throw new Error('oh, hello there!');
});

// For Background Functions:

exports.helloEvents = Sentry.GCPFunction.wrapEventFunction((data, context, callback) => {
  throw new Error('oh, hello there!');
});

// For CloudEvents:

exports.helloEvents = Sentry.GCPFunction.wrapCloudEventFunction((context, callback) => {
  throw new Error('oh, hello there!');
});
```


これでレポートされるログには、スタックドライバーへのリンクや関数の実行時間などが自動的に含まれます。
コンパスに勉強会を登録してみた

## 経緯
* フリーランスSEとして生き残るためにはスキルアップ、キャッチアップが
必要不可欠だと考えていたので朝活を継続するためにコンパスに登録しました。

https://connpass.com/event/193835/

---
## ポイント①
<dl>
<dt>時間を制限（１時間）</dt>
<dd>継続させるため、時間を制限<dd>
</dl>

---
## ポイント②
<dl>
<dt>毎日、目標を設定</dt>
<dd>何もない日常に達成感を与える<dd>
</dl>

---
## ポイント③
<dl>
<dt>作業報告をつける</dt>
<dd>振り返りの習慣化<dd>
</dl>

---
## ポイント④
<dl>
<dt>Tools - Slack</dt>
<dd>作業報告を管理<dd>
</dl>

---
## ポイント④
<dl>
<dt>Tools - Discord</dt>
<dd>メンバーと会話のしやすい環境を構築<dd>
</dl>

---
### 常にメンバーを募集してますので興味のある方は参加をお願いします

---
## コンパスのイベント検索
* 募集期間を２日ほど過ぎるとイベント検索から消えるので、開始日時を変更することで再検索可能になる
【Laravel】jQueryで同フォーム内に複数あるsubmitボタンを判別して処理を分ける

##はじめに
片方のsubmitではバリデーションをかけて確認画面へ遷移、もう片方はセッションを保持して戻るボタンにする。
セッションを保持するため同ルートを経由したい。

セッション保持のControllerのコードは省略します。

##フォーム

```php


<form method="POST" action={{ route('hoge.post') }}>
    <input type="checkbox" value="1">1
    <input type="checkbox" value="2">2
    <input type="checkbox" value="3">3
    <button type="submit" value="confirm">確認画面へ</button>
    <button type="submit" value="back">前に戻る</button>
</form>

```

##jQuery
フォームにtype="hidden"のinput要素を挿入してクリックされたボタンのvalue属性で判別します。

```javascript

// フォームにtype="hidden"のinput要素を挿入
$('form').append('<input name="key" type="hidden" value="" />');

// 戻るボタンが押された場合、挿入した要素のname属性を変更
var key =$('input[name=key]');
$('button[value="back"]').click(function() {
    $(key).val($(this).val());
});

$('form').submit(function() {
    // name属性がbackだったらそのままrouteにとばす
    if($(key).val() == "back"){
        return true;
    }
    // backじゃなかったらチェックを確認してrouteへ
    var checkboxList = $('input[type='checkbox']');
    for (var i = 0; i < checkboxList.length; i++) {
        if ($(checkboxList[i]).prop('checked') == true) {
            return true;
        }
    }
    // チェックがなかったらフォームを送信しない
    return false;
});

```

これで問題ないはず。。

##終わりに

稚拙な文章、コードですがここまで読んでくれてありかとうございました！
jQueryむずかちいと思ってたけど実装できてうれしかった

##参考
[複数のsubmitボタンをonsubmitで判定する方法: 小粋空間](http://www.koikikukan.com/archives/2018/11/29-000300.php)
高位合成言語アセンブラを作る。 その3

# 概要

高位合成言語アセンブラを作る。
ソースから、真理値表を生成するインタープリターを作る。

# 写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ac8d8b7-e072-8017-72ae-0acc3fc9bca2.jpeg)


# 成果物

https://embed.plnkr.co/plunk/Mn4hhEiae2Ixu6ME

以上。
高位合成言語アセンブラを作る。 その2

#概要

高位合成言語アセンブラを作る。
命令セットを作る。

#make 4

回路を作る。
inputが２つで、outputが２つ、なら４。


#in 0 2

inputを作る。
０，１，２がinputならば、in 0  2

#out 3 5

outputを作る。
３，４，５がoutputならば、out 3 5

#wire 2 4

中間wireを作る。
２，３，４がwireならば、wire 2 4

#xor 0 1 2

xorを作る。
０，１が入力で、３が出力ならば、xor 0 1 2


#and 0 1 2

andを作る。
０，１が入力で、３が出力ならば、and 0 1 2

#nand 0 1 2

nandを作る。
０，１が入力で、３が出力ならば、nand 0 1 2

#or 0 1 2

orを作る。
０，１が入力で、３が出力ならば、or 0 1 2

#nor 0 1 2

norを作る。
０，１が入力で、３が出力ならば、nor 0 1 2

#not 0 1

notを作る。
０が入力で、1が出力ならば、not 0 1 


以上。
git のコマンド小技集

# rebase

例）develop ブランチを feature/xxxxxxx ブランチ にリベースする時

```bash
# 目的のブランチにチェックアウト
$ git checkout feature/xxxxxxx

# rebase
$ git rebase origin/develop

# コンフリクトしなければここで終了

# コンフリクトしたら以下の手順

##############################################

# コンフリクトの解消

# 修正が完了したら add
$ git add --all

# 再 rebase
$ git rebase --continue

# force push
$ git push --force-with-lease origin HEAD

##############################################

# rebase に前に戻りたい場合
$ git rebase --abort
```

# 特定の文字列の入ったソースの修正を探す

```bash
$ git log -G"検索ワード"
```

# 自動コミットしない cherry-pick

`-n` をつけると自動コミットしないので、コミットメッセージなどを変えたりするときに便利です。

```
$ git cherry-pick -n <対象のコミット番号>
```

# リモートの hogehoge ブランチをクローンしながらチェックアウトする

```
$ git checkout -b hogehoge origin/hogehoge
```

# あとから .gitignore した hogehoge.txt ファイルをリモートリポジトリから削除する

```
$ git rm --cached hogehoge.txt
```

# ローカルの hogehoge ブランチをリモートの hogehoge ブランチで強制上書きする

```
$ git fetch origin hogehoge
$ git reset --hard origin/hogehoge
```

これでも可

```
$ git checkout hogehoge
$ git reset --hard HEAD
```

※ ~~正直これをするぐらいなら、ローカルブランチを削除してもう一度クローンすればいいと思います。~~ そういう観点ではなく、チェックアウトできなくて困ったときにするコマンドとして使えます。

# リモートの hogehoge.txt ファイルを残したままコミット時にローカルの変更を無視する

```
# 無視するようにする
$ git update-index --skip-worktree hogehoge.txt

# 確認
$ git ls-files -v | grep ^S

# 解除する場合
$ git update-index --no-skip-worktree hogehoge.txt
```

チーム開発での `--skip-worktree` での運用は事故が起きやすいので、可能であればこの運用は避けることをお勧めします。

# 削除したファイルを探す

```
$ git log --diff-filter=D --summary <削除したファイルがあったパス>
```

# あとから追加された .gitignore の設定を反映させて対象のファイルを削除する

```
$ git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`
```

【参考】
・[あとからまとめて.gitignoreする方法](https://qiita.com/yuuAn/items/b1d1df2e810fd6b92574)

# develop ブランチにマージされたローカルブランチを削除する（master ブランチ除く）

```
$ git branch --merged develop | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %
```

参考：[マージ済みのローカルブランチを全て削除](https://gist.github.com/miukoba/fc3c10a25c1c675c1e97)

# 誤って push した1つのコミットをなかったことにする

```
# 該当のブランチに移動

# ローカルを元にもどす
$ git reset --hard HEAD^

# 強制上書き
$ git push --force-with-lease origin HEAD
```

# stash をすべて消去する

```
$ git stash clear
```

# レポジトリを複製する方法

```
$ cd 複製したいレポジトリのディレクトリ名
$ git worktree add ../複製される新たなディレクトリ名 適当なブランチ名（feature/hogehogeなど）
```

これをやると .gitignore の設定がうまいことされていれば、旧バージョンのライブラリをインストールしたリポジトリの状態を残しておくことができます。

バージョンを遡って検証するために毎回ライブラリをインストールしなおさないといけない、というときにこのコマンドでレポジトリを複製しておくとめちゃくちゃ便利です。

別ディレクトリを作って git clone すればほぼ同じことが実現できますが、このコマンドで複数すれば stash なども維持することができるので、私はこちらをお勧めします。

参考：[git worktreeを使ってみる](https://qiita.com/yoichi22/items/8f92110f24690ca8966f)
git rebase のやり方

# 前提
sourcetree を使っています。


# 登場ブランチ

・根元にしたいブランチ（今回はリモートの hogeDevelop ブランチと想定）
・作業中のブランチ（今回はローカルの feature/hogehoge ブランチと想定）

※ hogeDevelop と feature/hogehoge は適宜置き換えてください。

# 手順
 
1. 作業ブランチに checkout する （`git checkout feature/hogehoge`）
2. `git rebase origin/hogeDevelop` コマンドの実行し rebase を行う。このときにコンフリクトがなければそのままリベースされて終了なので以降の手順はしなくても大丈夫です。コンフリクトしている場合はその旨がコンソールに表示されるので、以降の手順を実施する。
3. sourcetree 上でコンフリクトしているファイルが三角の注意マークで表示されるので、ファイルを選択して右クリックから「Finderを表示」から、VSCode など適当なエディターで開いてコンフリクトを解消する。この際、どのように修正して良いかわからなけれなば関係者と相談する。
4. 修正が終了したら `git add --all` コマンドを実行する。
5. エラーがなければ `git rebase --continue` コマンドを実行する。成功すると、rebase コマンドでエラーで詰まっていたコミットが反映される。
6. rebase 後の作業ブランチを普通に push するとエラーになるので `git push --force-with-lease origin HEAD` コマンドで強制的に push する。


備考1：sourcetree での操作はコンフリクトとしているファイルを探す作業のため、他の方法でも構いません。
備考2：コンフリクトの解消作業で `git rebase --abort` コマンドを実行すると rebase コマンドを実行する前に戻すことができます。
Note Book : VTK Install On Windows10

OpencvでCUDAを有効にする場合に必要になる。

environment
・windows 10
・cpu ryzen 3700x
・gpu ncvidia-rtx3900

software
・anaconda
・ninja
・cmake
・git
・opencv-4.5.0
・ant 1.8.2
・open-jdk-15
・cuda 11
・visual studio 2019

```text:cmd.exe
mkdir vtk
git clone --recursive https://github.com/Kitware/VTK
cd  VTK
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -T host=x64 -DCMAKE_INSTALL_PREFIX="/tools/opt/tools/vtk" ..
cmake --build . --config RELEASE --target install
```


#####capture
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/d316b4eb-6f4f-44cc-2629-751d7ce91932.png)
Note Book : LAPACK Install On Windows10

OpencvでCUDAを有効にする場合に必要になる。

It isn't work anaconda ninja and fortran.exe, clang-cl.exe.
This lapack is ver 3.9.

looks like this setting.
cmake .. ^
-G "Ninja" ^
-DCMAKE_C_COMPILER=C:/Users/admin/anaconda3/Library/bin/clang.exe ^
-DCMAKE_Fortran_COMPILER=C:/Users/admin/anaconda3/Library/bin/flang.exe  ^

If use msys64 is OK.
cmake .. -G "MSYS Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_Fortran_COMPILER=gfortran 

environment
・windows 10
・cpu ryzen 3700x
・gpu ncvidia-rtx3900

software
・msys64
・cmake
・git
・opencv-4.5.0
・ant 1.8.2
・open-jdk-15
・cuda 11
・visual studio 2019

```text:cmd.exe
cd C:/tools/src/lapack
git clone https://github.com/Reference-LAPACK/lapack.git
cd lapack
mkdir build
cd build
cmake .. -G "MSYS Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_Fortran_COMPILER=gfortran -DUSE_OPTIMIZED_BLAS=ON -DUSE_OPTIMIZED_LAPACK=ON -DCMAKE_INSTALL_LIBDIR=/tools/opt/lapack .. 
cmake --build . --config Release  --target install
```

cmake .. -G "MSYS Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_Fortran_COMPILER=gfortran -DUSE_OPTIMIZED_BLAS=ON -DUSE_OPTIMIZED_LAPACK=ON -DCMAKE_INSTALL_LIBDIR=/tools/opt/lapack .. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/4e71676a-304e-a131-0bd8-ddf320648bba.png)


cmake --build . --config Release --target install -j 8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/46fc2a9e-d59f-46bb-c6a4-d386edb50029.png)
Note Book : OpenBLAS Install On Windows10

OpencvでCUDAを有効にする場合に必要になる。

reference
https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio

environment
・windows 10
・cpu ryzen 3700x
・gpu ncvidia-rtx3900

software
・anaconda
・ninja
・cmake
・git
・opencv-4.5.0
・ant 1.8.2
・open-jdk-15
・cuda 11
・visual studio 2019

```text:cmd.exe
conda config --add channels conda-forge
conda install -y -c isuruf kitware-ninja
conda install -y cmake flang clangdev perl libflang
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"

conda config --add channels conda-forge
conda install -y -c isuruf kitware-ninja
conda install -y cmake flang clangdev perl libflang
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
cd C:/tools/openblas
git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS
mkdir build
cd build
@rem 環境に合わせて
set CONDA_PREFIX=C:\Users\admin\anaconda3
set LIB=%CONDA_PREFIX%\Library\lib;%LIB%
set CPATH=%CONDA_PREFIX%\Library\include;%CPATH%
cmake .. -G "Ninja" -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_Fortran_COMPILER=flang -DBUILD_WITHOUT_LAPACK=no -DNOFORTRAN=0 -DDYNAMIC_ARCH=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/tools/opt/openblas ..
cmake --build . --config RELEASE --target intall
```

capture
git clone https://github.com/xianyi/OpenBLAS.git
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/09fd1647-6925-f0f5-90a1-c08d7c735ee0.png)

conda update -n base conda

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/cb9a77fd-e20f-02c6-c816-25106c304d10.png)

conda config --add channels conda-forge

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/58c0c547-aed3-cb64-c71e-ea979ed2e0ff.png)

conda install -y cmake flang clangdev perl libflang

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/1782b39f-d6fb-bf29-2cd4-cd4a2e9fd2c6.png)

conda install -y -c isuruf kitware-ninja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/973a05d5-4284-74da-6cd2-604cb69b71e3.png)

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/e201a801-2984-fda5-f082-b5c13db9021f.png)

set CONDA_INSTALL_LOCN=C:\Users\admin\anaconda3
set LIB=%CONDA_INSTALL_LOCN%\Library\lib;%LIB%
set CPATH=%CONDA_INSTALL_LOCN%\Library\include;%CPATH%

cmake .. -G "Ninja" -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_Fortran_COMPILER=flang -DBUILD_WITHOUT_LAPACK=no -DNOFORTRAN=0 -DDYNAMIC_ARCH=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/tools/opt/openblas ..

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732297/361df5e9-541d-92e6-4b80-38904563366b.png)
これだけわかれば大丈夫な tar コマンド


# これがすべて

```shell-session
# 圧縮
tar -cvzfp xxxxx.tar.gz ディレクトリ名

# 解凍
tar -xvzfp xxxxx.tar.gz
```

# オプションの説明
| オプション | オプションの意味                       | 
| :----------:| :-------------------------------------- | 
| -c       | 新しくアーカイブファイルを作成する     | 
| -x       | アーカイブファイルを展開する           | 
| -v       | 処理の進行しているファイル名を表示する | 
| -z       | gzipでの圧縮または展開を同時に行う     | 
| -f       | ファイル名の指定                       | 
| -p       | パーミッションを維持する               | 

# 参考

【 tar 】コマンド――アーカイブファイルを作成する／展開する
https://www.atmarkit.co.jp/ait/articles/1608/15/news015.html
Swiftの日時(Date)をISO8601を使って国際標準化にしてみよう。

##ISO8601は、日時と時刻を表すための国際標準化で決まられています
早速使ってみよう！
ISO8601DateFormatter

```swift
extension Date {
    // Date -> 2018-09-18T11:00:00+0900のフォーマットに変更
    func convertToISO8601DateTime(timeZone: TimeZone = .current) -> String {
        let formatter = ISO8601DateFormatter()
        var option: ISO8601DateFormatter.Options = [.withFullDate, .withFullTime]
        option.remove([.withColonSeparatorInTimeZone])
        formatter.formatOptions = option
        formatter.timeZone = TimeZone(abbreviation: "JST")

        return formatter.string(from: self)
    }
}
```

##ISO8601DateFormatterのOptionについて知る
###ISO8601DateFormatterでは以下の４つのOptionが指定されています。
- .withInternetDateTime
- .withDashSeparatorInDate
- .withColonSeparatorInTime
- .withColonSeparatorInTimeZone

今回のコードでは、デフォルトを使わずに設定していきます。利用するOptionは、以下の３つになります。

|利用or削除|Option|意味|
|:-:|:-:|:-:|
|利用|.withFullDate|年月日を指定|
|利用|.withFullTime|時刻を指定|
|削除|.withColonSeparatorInTimeZone|タイムゾーン(+0900)の:|

###.remove()を使っていらないOptionを排除
もしデフォルトでいらないOptionがある場合は、removeを使って削除しましょう！！
今回は、上記を利用してDate -> 2018-09-18T11:00:00+0900のフォーマットに変更しています。

年のみ利用や月のみ指定したい場合は、以下のサイトを参考にしてください。
[ISO8601DateFormatter：iOS（Swift）で日付・時刻を ISO 8601 形式にして扱う](https://qiita.com/jpmartha/items/4edf5ca2e40f3a4c18ce)
[Apple developerサイト](https://developer.apple.com/documentation/foundation/iso8601dateformatter/options)

##タイムゾーン(時刻を自分の国にあった時間にする)
日本のサービスの場合は、日本の時間に合わせる必要があるため、「JST」を使います。
協定世界時を利用する場合は、「UTC」を利用します。
formatter.timeZone = TimeZone(abbreviation: "JST")
海外向けにアプリを開発する場合は、以下のURLよりタイムゾーンの略称を探してみてください。
[タイムゾーンの略語一覧](https://24timezones.com/jo_sekai3.php#gref)
たった4行でExcelマクロを劇的に早くする方法

# はじめに
まったく本業ではありませんが、Excelのマクロを書く機会がありました。
とりあえず以下の4行を入れると処理に影響なく早くできたので共有します。

# 再描画を止める

```
Application.ScreenUpdating = False
```

# イベントを止める

```
Application.EnableEvents = False
```

# カーソルを砂時計にする

```
Application.Cursor = xlWait 
```

# アラートを止める

```
Application.DisplayAlerts = False
```

# サンプル

```
Sub sampleSub()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Cursor = xlWait
MsgBox "処理を開始します"
Application.DisplayAlerts = False
Call 呼びたい関数
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Cursor = xlDefault
MsgBox "処理を終了します"
End Sub
```

# その他

基本的にカラム（セル）の挿入や削除は処理が重いので、セルのコピーや貼り付けなどで頑張った方がいいです。