OmniAICreator/Qiita-1.07M huggingface dataset:
DAXをAWScalaのDynamoDBラッパーから扱う

aws-sdk-javaをscalaからscala wayで利用するためのラッパーライブラリAWScalaのDynamoDBラッパーからDAXを操作するという話です。

[AWScala](https://github.com/seratch/AWScala)

## ClusterDaxClientを継承し、AWScalaのDynamoDBトレイトを継承した独自クラスを定義する

AWScalaのDynamoDBラッパーは、DynamoDBトレイトをクライアントとして、putやgetといった操作のimplicit引数にとるので、DynamoDBトレイトを継承することができれば、DynamoDBラッパーからDAXを操作することができます。

詳細はDynamoDBラッパーのテストケースを参照
[テストケース](https://github.com/seratch/AWScala/blob/0.8.2/dynamodb/src/test/scala/awscala/DynamoDBV2Spec.scala)

なので、以下のようなクラスを用意します。

``` scala
import awscala.dynamodbv2.DynamoDB
import com.amazon.dax.client.dynamodbv2.{ClientConfig, ClusterDaxClient}

/**
  * AWS公式のDAXクライアントにawscalaのDynamoDBトレイトをかぶせることで、
  * awscalaのDynamoDBクライアントと同じように扱えるようにした
  */
class DaxClient(cfg: ClientConfig) extends ClusterDaxClient(cfg) with DynamoDB{

}
```

## 上記のクラス定義が可能な理由

DynamoDBトレイトは、以下のようにaws-sdk-javaのAmazonDynamoDBインターフェイスを継承しています

``` scala
trait DynamoDB extends aws.AmazonDynamoDB
```

**AmazonDynamoDBインターフェイスを実装しているクラスであれば、DynamoDBトレイトを継承できそうです。**


一方、ClusterDaxClientは以下のように、AbstractAmazonDynamoDBという抽象クラスを継承しています。

``` java
public class ClusterDaxClient extends AbstractAmazonDynamoDB implements AmazonDaxClient
```

そして、AbstractAmazonDynamoDB抽象クラスは、以下のようにAmazonDynamoDBインターフェイスを実装しています。

``` java
public class AbstractAmazonDynamoDB implements AmazonDynamoDB
```

ClusterDaxClientはAmazonDynamoDBインターフェイスを実装しているため、結果的に上記の独自クラスのような定義が可能となっています。
【Xamarin.Forms】Rg.Plugins.PopupでYoutubeのフルスクリーンがうまく表示されない

# 背景
`Xamarin.Forms`のAndroidでYoutubeの全画面再生がやりたかった。

# 実装
下記を参考にして全画面表示対応のWebViewを作り、`Rg.Plugins.Popup`のページに表示させた。
[mhaggag/XFAndroidFullScreenWebView: A sample for Xamarin Forms Android FullScreen WebView](https://github.com/mhaggag/XFAndroidFullScreenWebView)

# 現象

Rg.Plugins.Popupのページで全画面再生すると真っ黒の画面しか表示されない。

![Screenshot_1569032669.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46612/524f3a8f-f5ab-dfc0-3cc2-6b87286b1dc4.png)

# 回避方法

Rg.Plugins.Popupではなく`NavigationPage`で`Navigation.PushAsync`を使う。


```csharp:App.xaml.cs

public App()
{
    InitializeComponent();

    MainPage = new NavigationPage(new MainPage());
}
```

```csharp
private async Task PushAsyncYoutubeWebViewPage()
{
    await Navigation.PushAsync(new YoutubeWebViewPage());
}
```

### タイトルバーが不要な場合
対象のページのXamlに`NavigationPage.HasNavigationBar="False"`を追加。

```xml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             ...
             NavigationPage.HasNavigationBar="False">
</ContentPage>
```
Autodesk Inventor API Hacking (SelectEventsと事前選択)

# 0. はじめに
`InteractionEvents`を使ってユーザーに操作を促す際に、Command実行前に事前選択されていたObjectを処理する方法(場所)について、説明します。

# 1. 処理の種類 ～ SelectedEntitiesに残るかどうか
ユーザーがInteractionEvents実行中に、主にMouseでオブジェクトを選択ときのAddInの動作は大きく分けて2通りあると思います。

* 選択されたObjectは`InteractionEvents.SelectEvents.SelectedEntities`から除外する。
* 選択されたObjectは`InteractionEvents.SelectEvents.SelectedEntities`に残る。

さて、Command実行前に事前選択されたObjectがあり、それを入力として扱う場合を考えます。
前者のパターンで`SelectedEntities`にObjectを残さないのであれば話しは簡単です。
問題なのは後者の場合で、どのタイミングで`SelectedEntities.AddToSelectedEntities()`すれば良いのでしょうか。

# 2. AddToSelectedEntities()のタイミング

まず、前提として、`SelectedEntities`が有効でなければならないので、`SelectEvents`、そして`InteractionEvents`が既に存在しています。
つまり、`InteractionEvents.Start()`が呼出された後ということです。
そこでまずは、`InteractionEvents.OnActivate()`をhookして、そこで追加を試みたのですが、例外が送出されました。どうやらこの時点では、まだ`InteractionEvents`が起動完了しておらず、エラーになるようです。
ですので、次のようなフローが良いでしょう。

```
ControlEvents.OnExecute
  ↓
  起動条件が整っていない場合は、早期returnする
  ↓
  Inventor.CommandManager.CreateInteractionEvents()
  ↓
  InterationEvents.Start()
    ↓
    InteractionEvents.OnActivate()
  ↓
  内部変数の初期化
  ↓
  Inventor.ActiveDocument.SelectSetに追加したいものが無ければ、終了する
  ↓
  InteractionEVents.SelectEvents.AddToSelectedEntities()
    ↓
    InteractionEVents.SelectEvents.OnPreSelect()
    ↓
    InteractionEVents.SelectEvents.Select()
  ↓
終了
↓
Inventorに主導権が渡り、InteractionEventsで操作できるようになる
```
注意しなくてはいけないのは、`AddToSelectedEntities()`を実行すると、`OnPreSelect()`と`Select()`も呼び出されることです。
特に内部処理をせずに純粋に`SelectedEntities`に追加したいだけ(≒ハイライト表示したいだけ)ならば、その意思を示す内部フラグを作るなどして処理をスキップさせる必要があります。

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
git addしていない変更を取り消す方法

```
定のファイルの変更を取り消す
$ git checkout <ファイル名>

#特定のディレクトリ以下の変更を再起的に取り消す
$git checkout <ディレクトリ名>

# 全てを元に戻す
$ git checkout .
```

参考にさせていただいたサイト
(https://www.yoheim.net/blog.php?q=20140201)
M5StickCでI2C機器を使ってみる

#やりたいこと
+ UIFlowを使って簡単プログラミングしたい
+ ちょっとしたところで躓いて先に進まないので基本から
+ I2Cを使ってちょっとしたものを動かしたい

前回のメモ、[M5StickCのUIFlowは秀逸だけどI2Cの実装がよくわからない件](https://qiita.com/t_kumazawa/items/927a1164f9b6ee0b1b38)で、深いところにはタッチできなかったので、手抜きをやめて順番にやってみることにします。

色々調べながらやってみると、このページが参考になりそうです。
まずは、色々環境を整えます。
[arduinoやesp32でDCモーターとかサーボーモーターを制御してみる(PCA9685,L298N)](https://qiita.com/ikegam1/items/5fea169d6b7d2bc084d7)

#環境整備
基本に返ってスイッチサイエンスのページから環境整備をしていきます。

[M5StickC](https://www.switch-science.com/catalog/5517/)

ここを起点に開発ツールとして紹介されているのが、
 [UIFlow](http://flow.m5stack.com/)
 [MicroPython](http://micropython.org/)
 [M5StickCの小ネタ](https://tech.144lab.com/entry/M5StickC_Tips)

UIFlowを一通り使ってみましたが、深いところをやろうとすると、トラブルが続出。
micropythonで書いて、呼び出す形が良いようです。

http://docs.micropython.org/en/latest/pyboard/quickref.html


M5StickCは２個購入したので、片方をUIFlowで、もう片方をIDEで開発するようにします。

[M5StickCクイックスタート](https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows)

基本的にマニュアルに沿って進めればよいのですが、ボードマネージャにESP32が出てこなくて難儀しました。
ボードマネージャのリンクをリンクのコピーで行わずに、テキストのコピーで行ったため、パスが間違っていました。（スペースが挟まってました）

正 https://dl.espressif.com/dl/package_esp32_index.json
誤 https : //dl.espressif.com/dl/package_esp32_index.json

みなさんもお気を付けください。

これで環境が整いました。
サンプルのFactoryTestも動きました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/e5d4c90f-f382-e4ff-e655-a94954e7bed1.png)

#I2Cをつないでみる

I2C_Testerなるものがあります。
ちょっとつないで、PCA9865がつながっているのか確認してみます。
適当な部品をかき集めました。

![25999342-ABBE-4481-B0B7-61D7D5F6C415.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/dde2f8e0-6da7-8e85-b510-95a3f712e768.jpeg)

#デバッグ用のシリアル通信
PWMが全く動かないのですが、中身を確認するすべがない。
・・・シリアル通信する手段を確保しなければ・・・

```:シリアル通信
  Serial.begin(9600);
  Serial.println("GPIO test!");
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/349645e5-67a9-2de2-d9f9-987ea55ca675.png)

#IMUのほうが検証は楽そうだ
出力して動きを確認しないとわからないモータドライバよりも、値が入ってくるだけのIMUのほうが検証は楽そうなので、MPC-6050をgroveコネクタ経由で接続しました。

ラベルに加速度X,Y,Z、温度、ジャイロX,Y,Zを表示します。
普通にデータを読み出すとテキストが化けますので、shortをbigエンディアンで読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/c218c310-5cb5-f824-bd2a-ead3553cc91c.png)

試行錯誤の末、この体裁に収まりました。
I2Cでアクセスできてます。

この要領でPCA9685にもアクセスしていきます。

（続く）
【BOPF】ドラフト機能

##はじめに
モバイル端末からWebアプリにアクセスするとき、電波の関係で一時的にオフラインになる場合があります。そんなとき、編集しかけのデータが消えてしまうと困りますね。
BOPFには、ドラフトを自動的に保存してくれる機能があります。

##ドラフト機能の仕組み
ドラフト機能を有効にすると、ドラフトデータを保存するためのテーブルが別に登録されます。保存前のデータはドラフト用のテーブルに保存され、保存したデータだけが正式なデータ用のテーブルに格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/fae23cea-abf0-8680-6e47-4ab1af5b9881.png)

##ドラフト機能を有効化
CDSビューに以下2つのアノテーションを追加します。
`draftEnabled: true`
`writeDraftPersistence: 'ドラフト用テーブル名'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9f7f067e-bb90-0ead-ee8c-61956d565db6.png)
CDSビューを有効化すると、ドラフト用のテーブルが自動で登録されます。
赤枠で囲った項目が、元のテーブルと比べて追加された項目です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/cff4d3a9-aa19-fd86-750e-07315329df28.png)

##ドラフト機能を確認
###ドラフト作成時
####フロントエンド
アプリを実行すると、2つの項目が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/02f8fee4-56b3-eb71-d112-a3497f946e70.png)
一つの行を選択して編集してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f73bb89e-2fa5-b20b-d6e1-69135eb21f3b.png)
すると、Draft savedというステータスが表示されました。
保存せずに前の画面に戻ると、ドラフト状態のレコードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c97edd8f-8547-b674-bffa-a1ced49dca0a.png)
Show Active Items Onlyを押すと、編集前のレコードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f9bb6710-23ca-122e-2791-3c0828242267.png)

####バックエンド
ドラフト用のテーブルにデータが格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8a1f1deb-eaf4-8c42-82ce-7191710c537d.png)
Keyという項目で正式なテーブルとひもづいていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/088ddf2f-2a5c-ea2b-dc93-a2b9609ec951.png)
正式なテーブルのデータはまだ変更されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4114be74-7c49-505e-227b-398a7adb317a.png)

###保存時
####フロントエンド
ドラフトデータを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b6eed43f-8501-e962-26ea-b9c9df8ac70c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/107019ab-6374-9fc1-3748-83c37fe213ab.png)
####バックエンド
ドラフトテーブルのレコードが消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/42532037-2160-1ee0-544e-864203ee187a.png)
正式なテーブルに変更が反映されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/352e2ecd-ae37-0d3f-2f3f-d1ba593b2b76.png)
Eclipe上でPythonを使う時のメモ

#開発環境
anaconda 3
Eclipse
JDK
PyDev

##概要
基本的には最新バージョンで、実施。
anaconda 3で開発環境一括で行えるが、Eclipseが得意な人向け。

DBにつなぎこむのはまた後日に・・


##順番リスト
1. anacondaをインストール
2. JDKをダウンロード後、展開
3. Eclipse起動して、JDKを読み込む
4. IDEを選択して、起動
5. PyDev（pythonを使うためのプラグイン）導入


##【Step 1】anaconda 3 について
IDE、ライブラリ管理、他との連携
一括で行える優れもの。

開発環境を構築する際、ライブラリ同士の競合や依存関係を管理するのは、めんどくさい・・
さらに新しいライブラリを使っていきたいが、競合や依存を考えたくない・・

→anaconda 3を使いましょう。という流れです。
https://www.python.jp/install/anaconda/index.html


##【Step 2】Eclipseについて
JavaをメインとしたIDE
もちろん、他の言語をつかえます。
Java言語で開発しているユーザーが多いと思うので、こちらの方が良いという方もいらっしゃるかと・・
（Jupyternotebookで、動作確認をおこないつつ、Eclipseで実行すると良いかも）

https://www.eclipse.org/downloads/

##【Step 3】JDKについて
開発キット
Eclipseが起動させるためのもの
JDKが開発環境そのもの
両方あわせて二個一
（デスクトップに展開すると、移動できなくなるのであまり移動しない場所へ、展開してください。）

https://www.oracle.com/technetwork/jp/java/javase/downloads/index.html

##【Step 4】PyDevについて
Eclipse-JDKを起動後に選択します。
プラグインの一つ。


##手順
1. まずは1~3のStepにあるURLに飛んで、それぞれDLし解凍。（JDKはDesktop以外に展開することをおすすめします。）
2. Eclipseを起動すると、「起動するものがないよエラー」がでると思うのでJDKのフォルダ内にあるjavaw.exeを選択。
3. Eclipse IDE for java **** Developperを選択、説明部分が（Tools for java developer creating java EE and web applications, including a java IDE, tools for java EE, JPA, JSF, Mylyn, EGit and others）
4. しばらくたつと、起動（Launch）されるので、PyDevプラグインを取り込む
5.  print("hello world")で実行できれば、一通り完了！
6.  importでライブラリを呼び出すと、エラーになる場合はPATHを通します。


>PyDev解説はこちらの方がよいかと思います。→https://qiita.com/takeyamajp/items/03cb19ee24a0ec580d64
>importできない方はPC側で、anacondaまでのPATHを通しましょう→https://teratail.com/questions/211968


#まとめ
キッティングに慣れている方であれば、30分前後。最初は調べながらだったので90~120分あたりかかった記憶あり。

なにか、追記等あればコメントをください！
#Rails の ActiveJob retry_on で リトライ時の処理、リトライを諦めた時の処理をそれぞれに書く ( when surrender retry in block )

# リトライを諦めた時の処理をブロックで書ける

ブロックの中に書く。これってリトライ時の処理じゃないのか！諦めた時の処理なのか！ 意外すぎた。


```rb
  retry_on SomeError, wait: 3.seconds, attempts: 3 do |job, exception|
    puts "JOB SURRENDERD!"
  end
```

>retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)Link
Catch the exception and reschedule job for re-execution after so many seconds, for a specific number of attempts. If the exception keeps getting raised beyond the specified number of attempts, the exception is allowed to bubble up to the underlying queuing system, which may have its own retry mechanism or place it in a holding queue for inspection.
>
>You can also pass a block that'll be invoked if the retry attempts fail for custom logic rather than letting the exception bubble up. This block is yielded with the job instance as the first and the error instance as the second parameter.

https://api.rubyonrails.org/v6.0.0/classes/ActiveJob/Exceptions/ClassMethods.html

# リトライ時にも好きな処理をさせたい

retry_on メソッドを無理やり上書きしてみると、とりあえず動いた。

```rb
# https://api.rubyonrails.org/v6.0.0/classes/ActiveJob/Exceptions/ClassMethods.html
# https://github.com/rails/rails/blob/66cabeda2c46c582d19738e1318be8d59584cc5b/activejob/lib/active_job/exceptions.rb#L50

class SomeJob < ApplicationJob
  queue_as :default

  class SomeError < StandardError; end

  def self.retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
    rescue_from(*exceptions) do |error|
      executions = executions_for(exceptions)

      if executions < attempts
        # https://github.com/rails/rails/blob/66cabeda2c46c582d19738e1318be8d59584cc5b/activejob/lib/active_job/exceptions.rb#L50
       # ここに puts を挟んだだけ
        puts "RETRY!"
        retry_job wait: determine_delay(seconds_or_duration_or_algorithm: wait, executions: executions), queue: queue, priority: priority, error: error
      else
        if block_given?
          instrument :retry_stopped, error: error do
            yield self, error
          end
        else
          instrument :retry_stopped, error: error
          raise error
        end
      end
    end
  end

  retry_on SomeError, wait: 3.seconds, attempts: 3 do |job, exception|
    puts "JOB SURRENDERD!"
  end

  def perform(message)
    raise SomeError.new('Watch out!')
  end
end

```

# Worker の標準出力の例

![image](https://user-images.githubusercontent.com/13635059/65364939-3703c880-dc50-11e9-8770-f4f55454bad5.png)
![image](https://user-images.githubusercontent.com/13635059/65364941-379c5f00-dc50-11e9-89a0-3c85d8fc11e3.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2491








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
railsのsessionについて

railsチュートリアルで、以下の部分の理解が甘かったので、自分なりに解釈してみました。

```
user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
```


```
user = User.find_by(email: params[:session][:email].downcase) 
```

では、downcaseメソッドを使って、大文字を小文字にすべて変換させて、大文字小文字関係なく、メールアドレス自体が合っていたらokとしている（？）
入力されたメールアドレスから、Userモデルから該当するメールアドレスを持っているユーザーを検索して、見つけたらuserに代入する。

```
if user && user.authenticate(params[:session][:password])
```

は、もし該当するメールアドレスを持っているユーザーがいて、かつ入力されたパスワードが合っていたら、、、という意味ではないかと解釈しました。

独学の身なので、もし間違った解釈をしている、もっとこう考えた方がいい、という方がいらっしゃいましたら、、教えていただけると幸いです。
Automation Anywhere (v11)でのBot作成時にオススメのテンプレート

#概要
Botを社内で活用する際に、運用時を意識したBot設計をしたいけど、どんな風にしたら？と思う人にオススメのテンプレートです。
このまま使うも良し、これをベースにカスタムするも良し。
Bot Storeから無償でダウンロードできます。
なお、日本語化したものを[ここ](https://drive.google.com/file/d/1gEMuoPvmAav_5perhbGclHiY7BZHSqbD/view?usp=sharing)<-にUpしておきました。

[Framework to build task bots – Bot Store](https://botstore.automationanywhere.com/bot/taskbot-template-with-best-practices/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/17f067f2-6b55-2985-f038-ee0f3ce28209.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/f4f49394-18d1-1b0c-c6fb-ab1b866961e4.png)


#テンプレートに含まれるもの
含まれるものは以下の通り。

- フォルダ構造
    - エラーフォルダ
        - ログ
        - スナップショット
- テンプレートのatmxファイル（Botの中身）
- ドキュメンテーション （Readme)

#テンプレートの構造
- ヘッダー部（タスク名、概要、最終更新日、最終更新者）
- エラー処理（初期設定部）
- 初期設定
    - 各用途のフォルダパス設定
    - 必要なフォルダが存在するかどうかのチェック
    - 設定ファイル読み込み
    - 一時ファイルのクリーンナップ
    - Windows上の不要なアプリケーションのクリーンナップ
- エラー処理（メイン処理～終了処理）
- メイン処理部分
- 終了処理

#使い方
1. Bot Storeからダウンロードし、インストール。
2. 下記フォルダにインストールされます。

`Automation Anywhere Files\Automation Anywhere\My Tasks\Bot Store\Taskbot-Template-With-Best-Practices-AA\`
3. Readmeを読む
4. 上記フォルダの下のMy Tasksフォルダにあるテンプレートファイル`TaskbotTemplateWithBestPractices.atmx`を任意の場所にコピーし、任意の名前に変更して使う。

#Readmeファイルの和訳
## ベストプラクティスを盛り込んだタスクBotテンプレートのReadme

## Bot概要
このBotは以下のような役割を果たします：
- このBotはBot開発のベストプラクティスが組み込まれたもので、テンプレートや、開発の出発点として利用することが出来ます。

- 要件
Automation Anywhere Enterprise v10.7 sp2以降のバージョン


## インストール

- BotをBot Storeからダウンロードする。
- <ボット名>.msiをダブルクリックし、指示に従ってインストールする。
※初めてのユーザ向け： “Bot Store”というフォルダがローカルディスクの`<AA Directory>/My Tasks` の下に作成されます。

- インストーラーが以下のフォルダ構造を<AA Directory>以下に作成します。

```
        - <AA Directory>
                - My Tasks
			- Bot Store
			- Taskbot Template With Best Practices
		- My Tasks
			- TaskbotTemplateWithBestPractices.atmx
		- Error Folder
			- Logs (Folder)
				- Error Logs Month-Day-Year.txt
			- Snapshots (Folder)
				- Error Snap Month-Day-Year.png
```

## Botの使い方

1.`TaskbotTemplateWithBestPractices.atmx`ファイルのコピーを作成する。
2.コピーした同ファイルを任意の名前に変更する。
3.Botに記載されているアクション/コードを確認する。
4.必要に応じてコメントやアクションを書き換える。
5.`$vMainFolder$`といった変数の値を用途に応じた値に変更する。
6.Config File(設定ファイル)を設けるのは必須ではないですが、変化する値などを記載しておけるようにするため、使用を強く推奨しています。例えば、開発環境から実行環境へ移行する際に変化する値など。

このテンプレートはメイン/親 タスク向けに作らており、サブ/子タスク向けではありません。必要に応じて改変してください。

## エラー処理 (Error Handling)
- 各Botのフォルダには以下の階層があります。

```
	-Error Folder
		-Logs
			•Error Logs Month-Day-Year.txt: 何かエラーが発生した際にはこのファイルにタイムスタンプ付きのログが記録されます。
		-Snapshots
			•Error Snap Month-Day-Year.png: 何かエラーが発生した際にはこのファイルにスナップショットが記録されます。
```

- Botのタスクステータスは`failed`に設定されます。


 
#参考ページ
Bot Storeの使い方については、以下のページが分かりやすいです。
[【Automation Anywhere】Bot Storeで新しい機能を追加しよう！ - Qiita](https://qiita.com/Okura_/items/b926368524ade6e94dda)
電磁波の角運動量

# 問題

## (1)

電荷$q$, 質量$m$の粒子が、角振動数$\omega$の$z$軸の正の方向に進行する右回り円偏光単色電磁波

```math
E_x = E_0 \cos (\omega t- kz) \\
E_y = -E_0 \sin (\omega t- kz)
```

の下で定常的な運動しているとします。粒子には速度に比例する抵抗力$-\gamma {\bf v}$が働いているとします。抵抗力が慣性力より圧倒的に強く、抵抗力と電磁波によるローレンツ力の釣り合いで定常運動が実現しているとするとき速度${\bf v}$, 位置${\bf x}$を求めなさい。ただし粒子の運動は非相対論的で、磁場の力は無視できるとしなさい。

## (2)

電磁波が粒子に、単位時間あたりに与えるエネルギー$\dot{U}$を求めなさい。

## (3)

電磁波が粒子に与える単位時間あたりに与える角運動量$\dot{\bf L}$を求めなさい。

## (4)

単位時間あたりに与えられる角運動量とエネルギーの大きさの比から、電磁波の角運動量が以下で与えられることを示しなさい。

```math
\boldsymbol{\ell}
= \mp\frac{1}{4\pi \omega} {\bf E} \times {\bf B}
```

複合は、右回りの円偏光のとき$-$、左回りの円偏光のとき$+$をとります。

# 解答例

## (1)

問題文の条件より、荷電粒子の運動は$z=0$平面内しか運動しません。よって運動方程式は以下のようになります。

```math
{\bf 0} 
= - \gamma {\bf v} + q{\bf E} 
\ \Longrightarrow \ {\bf v} 
= \frac{qE_0}{\gamma} 
\left( \begin{array}{c} 
\cos \omega t \\
- \sin \omega t \\
0
\end{array}\right)
```

速度${\bf v}$を時間積分することで位置${\bf x}$を求めましょう。

```math
{\bf v} 
= \frac{qE_0}{\gamma \omega} 
\left( \begin{array}{c} 
\sin \omega t \\
\cos \omega t \\
0
\end{array}\right) + {\bf C}
```

粒子の軌道は円運動であることがわかります。円運動の中心が原点になるように座標を選ぶと${\bf C}= {\bf 0}$より

```math
{\bf v} 
= \frac{qE_0}{\gamma \omega} 
\left( \begin{array}{c} 
\sin \omega t \\
\cos \omega t \\
0
\end{array}\right)
```

となります。

## (2)

電磁波が粒子に、単位時間あたりに与えるエネルギーは、仕事を意味するので${\bf v} \cdot {\bf F}$を計算すればよいことがわかります。

```math
\therefore \ \dot{U} 
= {\bf v} \cdot q{\bf E}
=\frac{q^2E^2}{\gamma}
```

## (3)

電磁波が粒子に、単位時間あたりに与える角運動量は、トルクを意味するので$\dot{\bf L} = {\bf x} \times {\bf F}$を計算すればよいことがわかります。

```math
\therefore \ \dot{\bf L} 
= {\bf x} \times q{\bf E} 
= \left( \begin{array}{c}
0 \\
0 \\
-\frac{q^2E^2}{\gamma \omega}
\end{array} \right)
```

## (4)

(2), (3)より、電磁波から粒子には、電磁波の進行方向負の方向の角運動量が受け渡され、単位時間あたりに与えられる角運動量とエネルギーの大きさの比は

```math
\frac{|\dot{\bf L}|}{\dot{U}} 
= \frac{1}{\omega}
```

であることがわかります。

```math
\dot{U} 
= |{\bf S}| 
= c U |{\bf n}| 
= \frac{c}{4\pi} |{\bf E} \times {\bf B}|
```

より

```math
U 
= \frac{1}{4\pi} |{\bf E} \times {\bf B}|
```

よって、電磁波の角運動量は

```math
\boldsymbol{\ell} 
= \mp \frac{1}{4\pi \omega} {\bf E \times \bf B}
```

と書けることがわかります。
Google TestをCMakeでビルドしテストする

## はじめに
CI環境を個人で構築してみようと考えていて、CIのログに「helloworld」とだけ表示されるのも実益には遠いと思い、CIで実行するためのテストモジュールを作成する環境を先に構築した話です。

## やったこと
* `git submodule`でGoogle Testをリポジトリに追加した
* CMakeLists.txtでGoogle Testを`add_subdirectory`した
* ソースコード用ディレクトリにテスト対象関数として「足し算を行うCの関数」を作成した
* テストコード用ディレクトリに、テストコードを作成した
* CMakeLists.txtでテストモジュールをビルドするようにした

### 構築後の構成
```sh
$ tree
.
└── helloworld
    ├── CMakeLists.txt
    ├── Dockerfile
    ├── include
    │   └── calc.h
    ├── src
    │   ├── calc.cpp
    │   └── main.cpp
    ├── test
    │   ├── test_calc.cpp
    │   └── test_main.cpp
    └── third_party
        └── gtest
            ├── （略）
```
### Google Testをリポジトリに追加

```sh
cd helloworld
mkdir third_party
cd third_party/
git submodule add git@github.com:google/googletest.git gtest
cd gtest
git checkout release-1.8.1
git add ../../../.gitmodules
git commit 
```
「gtest」という名前をつけた理由を思い出せない。リポジトリ名の「googletest」でいいと思う。`release-1.8.1`は2019/09/21地点の最新リリースタグです。

### CMakeLists.txtでGoogle Testを`add_subdirectory`
```CMakeLists.txt
add_subdirectory(third_party/gtest/googletest)
```
これでgoogletestをcmakeで自プロジェクトとともにビルドできるようになる。

### 足し算を行うCの関数
```include/calc.h
int add(const int a, const int b);
```
```src/calc.cpp
#include "calc.h"
  
int add(const int a, const int b) {
    return a + b;
}
```
変数名a, bは関数名から自明だったのでいいかなって・・。

### テストコード
```test/test_main.cpp
#include <gtest/gtest.h>
  
int main(int argc, char *argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
```

```test/test_calc.cpp
#include <gtest/gtest.h>
  
#include "calc.h"

class TestCalc : public ::testing::Test {
};

TEST_F(TestCalc, add) {
    EXPECT_EQ(3,  add(1, 2));
    EXPECT_EQ(-2, add(1, -3));
}
```
評価用マクロの`EXPECT_EQ`などの使い方や類似マクロは、公式の[入門ガイド](http://opencv.jp/googletestdocs/primer.html)のお世話に良くなります。公式によると`EXPECT_EQ(expected, actual);`なので、第一引数に期待値を入れるように統一すると良いかと思います。

### テストモジュール
```
add_executable(test_calc
  test/test_main.cpp
  test/test_calc.cpp
  src/calc.cpp)
target_link_libraries(test_calc
  gtest_main
  pthread)
target_include_directories(test_calc PUBLIC
  include
  third_party/gtest/googletest/include)
```
`pthread`が必要であることがハマリポイントかもしれません。テストに必要なコードとライブラリのみの最小構成ではないかと思います。

### 実行結果
```
./test_calc 
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestCalc
[ RUN      ] TestCalc.add
[       OK ] TestCalc.add (0 ms)
[----------] 1 test from TestCalc (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.
```

## 所感
業務で使用したことがあるので簡単に作れると考えていたところ、細かい記述法を忘れていたりでソラでは書けなかった。知っていることでも、書いてミスして修正しておいて損はないと思った。また、Webからコピペしてきたコードがマイコーディングルールに沿っていなかったことに気づかなかった事案もあったので、lintツールも自分の環境に入れておきたいなと思った。コードも提示するような記事はとても時間がかかることを身を持って知った。
英語(18) 英語文献を入手したら

英語の文献を入手し、翻訳を発行するまでの作業を記録する。
 
 <この項は書きかけです。順次追記します。>
# 単語帳
英語の文献をtextファイルに変換する。
文献によっては数字、記号に意味があることがあり、数字、記号を除外するかどうかは場合による。
大文字を小文字に変換し、単語出現頻度帳を作る。

プログラムちょい替え（10）英語(14) 単語帳作成 dockerで（文字コード対応）量子計算機　arXiv掲載　西森 秀稔　論文(shell, awk)
https://qiita.com/kaizen_nagoya/items/319672853519990cee42

英語の略号はfull spellingを調べる。

## 単語英訳
英単語を
http://translate.google.com
にかける。

量が多いときは何度かに分ける。

英単語のままの用語、あれ？っと思う用語は、
http://alc.com
で日本語を調べる。

## 語源
どちらでも納得いかない時は、例えばwordという単語であれば、

「word 語源」で検索する。

語源を調べ、語源に沿った日本語にする。

なるべくカタカナ語は使わない。日本語訳にする価値が下がってわかりにくくなるから。


英語(1) プログラマが知っているとよい英単語の語源
https://qiita.com/kaizen_nagoya/items/9de6d47c47e2c211222b

# 文章英訳

文章をそのまま
http://translate.google.com
にかける。

量が多いときは何度かに分ける。

単語を調べた時とは違う訳にしていることもあり、文章の訳の方がよい場合もある。
日本語を読んで違和感があれば、単語を当たり、論理展開が壊れないように配慮する。

# 逆翻訳
手を加えた文章を、再度英語に訳してみる。

日本語の論理のわかりにくいところが、英訳してみるとみごとに違訳（ちがうやく）になっていることがある。

最近、googleでは逆翻訳すると、そのままに戻す技術がかなり入っている。
そこで、もう一つ得意な言語があれば、その言語に訳してみる。

韓国と日本のIT業界で協力できるかもしれないこと
https://qiita.com/kaizen_nagoya/items/52501f8ee4dc23f595eb

# 参考資料(reference)
日本語（14）日本における多言語対応
https://qiita.com/kaizen_nagoya/items/75d417dba9cebf551421


英語(3) 仮説・検証(88)用語の衝突(用語・用例募集中)
https://qiita.com/kaizen_nagoya/items/6a8eb7ffaa45eeb16624#_reference-1f44237ceba853da14c3

まぎらわしい、間違えやすい、行き違いの多い略号worst 10(候補24)
https://qiita.com/kaizen_nagoya/items/0bff5dbb72208053489b

単語集計 awk, ruby
https://qiita.com/kaizen_nagoya/items/8837d94ae7b5ef05be86

文書分析　出現頻度
https://qiita.com/kaizen_nagoya/items/b8685f770ce355bc588c

自然言語処理で陥る罠
https://qiita.com/kaizen_nagoya/items/71093310ffc5324f15ff

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿
ver. 0.02 加筆 20191217
ver. 0.03 ありがとう追記 　 20230529
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
#VSCode でプラグイン拡張のサイドバーをショートカットで開くようにする設定 ( Code > Preference > KeyboardShotrcuts )



# Code > Preference > KeyboardShotrcuts

![image](https://user-images.githubusercontent.com/13635059/65362997-a96eab80-dc44-11e9-8bf0-8216979b24d1.png)

# プラグインでのサイドバーを開くコマンドを選ぶ

- どれがサイドバーを開くコマンドかは、試しておく。
- プラグイン名で検索絞り込むすると、見つかりやすいはず。

![image](https://user-images.githubusercontent.com/13635059/65363000-ac699c00-dc44-11e9-9773-1b2b5244b1ef.png)

# 好きなショートカットを入力してエンターを押す

Command K -> Command N のような組み合わせも可能

![image](https://user-images.githubusercontent.com/13635059/65363001-aecbf600-dc44-11e9-87cb-cffe2bf47f16.png)


# いつでも手軽に開けるようになりました

![image](https://user-images.githubusercontent.com/13635059/65363075-0c604280-dc45-11e9-8dde-54409b7218e6.png)

# 設定を削除するときは右クリック > Remove Keybinding

![image](https://user-images.githubusercontent.com/13635059/65363002-affd2300-dc44-11e9-9a64-db00a9c80ea5.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2489








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
macにphp7.3をインストール

# 環境

```
macOS Mojave 10.14.6
```

# PHP7.3インストール
## 現状確認
```
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )

$ brew search php@7
==> Formulae
php@7.1 php@7.2 php@7.3

```
## インストール
```
brew install php@7.3
```
## 後処理

インストール時にパスを通してね、環境変数入れてね、みたいなワーニングが出ます。
以下、一例

```
If you need to have libpq first in your PATH run:
  echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile

For compilers to find libpq you may need to set:
  export LDFLAGS="-L/usr/local/opt/libpq/lib"
  export CPPFLAGS="-I/usr/local/opt/libpq/include"

For pkg-config to find libpq you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
```

その指定に従って以下を実行。

```
$ echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile
$ vim ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile
$ export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
$ export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
$ export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
$ echo 'export PATH="/usr/local/opt/apr-util/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/openldap/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/openldap/sbin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/curl-openssl/bin:$PATH"' >> ~/.bash_profile
$ export PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig"
$ echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
$ export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
$ echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile
$ export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
$ echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile
$ export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
$ brew services start php
```

# 結果

あれ！！バージョン変わってない！！

```
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

ターミナルの再起動したら解決

```
$ php -v
PHP 7.3.9 (cli) (built: Sep 14 2019 18:07:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.9, Copyright (c) 1999-2018, by Zend Technologies
```

# 文献
https://koukitips.net/i-raised-my-macs-php-version-to-7-3/
kubectxが便利だった

[ahmetb/kubectx](https://github.com/ahmetb/kubectx)に記載の通り。

## 背景

kubernetesのコンテキスト・ネームスペースの切り替えが面倒だった

## Install

MacOS利用のため、brewを使った。

```bash
$ brew install kubectx
```

## Usage

kubectl との比較

### context

```bash

# kubectl
$ kubectl config use-context <insert-context-name-here>

# kubectx
$ kubectx <insert-context-name-here>
```

### namespace

```bash

# kubectl
$ kubectl config set-context --current --namespace=<insert-namespace-name-here>
$ kubectl config view | grep namespace:

# kubens
$ kubens <insert-namespace-name-here>
$ kubens -c
```

## 参考

* [ahmetb/kubectx](https://github.com/ahmetb/kubectx)
* [Namespaces - Kubernetes](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)
* [Kubernetesの基礎](https://thinkit.co.jp/article/13542)
PHP でマルチバイト文字列のレーベンシュタイン距離を計算する

PHP でレーベンシュタイン距離を計算する必要があった。PHP にはレーベンシュタイン距離を計算する関数 `levenshtein()` があるけれど、バイト単位で計算するので、日本語などのマルチバイト文字列には使えない。そこで、マルチバイト文字列のレーベンシュタイン距離を測る関数を作った。5.4.8 以降で動くはず。

```php
function levenshtein_mb($str1, $str2, $encoding = 'UTF-8') {
  $len1 = mb_strlen($str1, $encoding);
  $len2 = mb_strlen($str2, $encoding);
  $matrix = array(array(0));
  $x = array('');
  $y = array('');
  for ( $i = 1; $i <= $len1; $i ++ ) {
    $matrix[$i] = array($i);
    $x[$i] = mb_substr($str1, 0, 1, $encoding);
    $str1 = mb_substr($str1, 1, null, $encoding);
  }
  for ( $j = 1; $j <= $len2; $j ++ ) {
    $matrix[0][$j] = $j;
    $y[$j] = mb_substr($str2, 0, 1, $encoding);
    $str2 = mb_substr($str2, 1, null, $encoding);
  }
  for ( $i = 1; $i <= $len1; $i ++ ) {
    for ( $j = 1; $j <= $len2; $j ++ ) {
      $matrix[$i][$j] = min(
        $matrix[$i][$j - 1] + 1,
        $matrix[$i - 1][$j] + 1,
        $matrix[$i - 1][$j - 1] + ($x[$i] === $y[$j] ? 0 : 1)
      );
    }
  }
  return $matrix[$len1][$len2];
}
```
【Julia】 開発環境設定〜HelloWorldまで(for Mac)

先日、QiitaでJuliaについての記事を見かけて、その後で買った「WEB+DB PRESS」でもJuliaについての記事が組まれていたので、流行に乗って「まぁ、少しだけなら触ったコトありますけど」って言えるようになっておこうかなぁ、と。

###Juliaを動かしてみる
####1.環境
端末：MacBook Pro(Retina, 15-inch, Mid 2015)
ＯＳ：macOS Mojave ver.10.14.6

####2.導入手順
こちらの記事(<a href="https://murabitoleg.com/mac-julia/">リンク</a>)を参考に、HomeblewでJuliaのインストールと、IDE(というか、エディタ)としてVS codeをインストールしました。
#####(1)Juliaインストール(by Homeblew)

```terminal
$ brew tap caskroom/cask
...
$ brew cask install julia
...
🍺  julia was successfully installed!
```

#####(2)VScodeダウンロード＆インストール
こちらのページ(<a href="https://code.visualstudio.com/">リンク</a>)からアプリケーションをダウンロード。
ダウンロードしたappファイルをApplicationsフォルダに配置。

<font color="red">※リンクのページの記事の通りであれば、この後の設定を行った後、ソースの実行を行うボタンが表示されるハズなんですが、なぜかその通りにならないので、その部分は確認でき次第更新します。</font>

####3.稼働確認(Hello World)
Hello Worldを出力するプログラムを書いて<font color="gray">とりあえずターミナルで</font>実行してみます。
Juliaのソースファイルの拡張子は"JL"(小文字だとパッと見で識別しづらい)。

```julia:helloworld.jl
println("Hello World by Julia!")
```

```terminal
$ julia helloworld.jl
Hello World by Julia!
```

###まとめ
さらっとですが、とりあえずJuliaの実行環境準備まで。
Python3にRubyにJuliaに、、、って色々触れて来てるので、WEB+DB PRESSを参考に、Juliaを使うメリットを感じられるような処理を書いて、またQiitaにアウトプットできればいいな、と思います。

Qiitaで見かけた記事は「Juliaは競プロ向き(少ないコードで色々できる)」というような内容で、色々落ち着いたら競プロ（的な)方面にも手を出してコーディング能力鍛えたいと思ってるので、ちゃんと習得すればそれなりに実益もあるかなぁ（あればいいなぁ）と期待してます。
スポーツとプログラミング：蓄積の大切さ

# スポーツは１日サボるだけで腕が落ちる

　スポーツしてる人だと当たり前かもしれませんが、１日でもさぼると筋力がおちたり観がにぶったりします。
長時間する必要はないですが、短い時間で継続的にするのが、スキルを維持するのに必要だと思います。

　翻って、プログラミングも同じで、ブランクの期間があると観が鈍ってしまいます。

# コーディングが速い人、遅い人

　コーディングが速い人は、経験年数が長かったり、案件が変わっても使える汎用的な設計思考を持っています。たとえば、命名規則、モジュールの分割方法とか。こうした細かいところで悩む時間が少ないです。

　また、エディタなどPCの操作も重要です。コーディングが早い人は、VimやEmacsなどのショートカットキーだけで、操作ができるエディタで作業をしていることが多いです。
　EclipseなどのIDEを使うにしても、Vimのプラグインをいれたり、IDEのいろんなショートカットを覚えて、
マウスを使わず、手元だけで作業を完結させます。

　そして、それらのショートカットは「暗記」しています。それも、自転車を乗りこなすように、自然と指が動くのです。

　遅い人は、上記の真逆をしているといっていいでしょう。
　コーディングも、１行１行すごく悩むか、後先見ずに安易な設計をして、最後に大きなバグに引っかかるとか、マウスをつかってちまちま作業をしている。とにかく、至るところで時間を掛けています。

# 設計思考の蓄積、エディタなどの操作の記憶

　プログラミングは「論理的な設計 + コーディング」です。
　論理的な設計については、なれがあればだいぶショートカットできます。毎日欠かさずして、いろいろその都度考えていくと自分のスタイルが生まれてきます。

　顕著なのはおそらく、命名規則とかモジュールの分割でしょう。なれていたら、どんな言語でも案件でも共通した処理があるので、それらの命名やモジュール分割は時間をあまりかけずにできます。

　コーディングについては、手の速さが要求されますが、Vimなどのエディタを毎日つかって、ショートカットをつかいこなせば、かなり時間の短縮ができます。

　コーディングのステップ数をみればわかりますが、数万や数十万とかは普通にします。そして、その１ステップ１ステップにそれなりに時間がかかっています。仮に、10秒で１ステップ書いても、100,000秒、すなわち、27.8時間です。実際は、もっと時間がかかるでしょう。
　つまり、簡単にできることはできるだけ速く済ませるにこしたことはありません。

# コピペすれば誰でもできるけど、速度や信頼性が大切

　プログラミングは、ネットや本からコードをコピーして貼り付ければ動きます。
　でも、実際にものをつくるとなると、それだけでは完成しません。
　やはり、ユーザーさんの要求に即したように組み直さないといけないし、あとあとメンテしやすいようにわかりやすく、無駄がないように設計していかないといけません。

　コピペだけではできません。そうしたとき、やはり個々の作業ですごく時間がかかります。それを短縮するためには、日々、スポーツのような「練習」、そして、「蓄積」が大切です。

　やはり速くコーディングができる人の方が生産性は高く、組織としてもお客さんとしてもそういう人を求めます。もちろん、そうした人のほうがより多くの報酬とやりがいのある仕事につける可能性は広がります。

　ただし、毎日すればいいというわけでもなく、どうしたらよりよい設計ができるだろうか、無駄を省けるだろうかという観点が大切です。それをもった上で、日々、蓄積していくことがプログラミングのスキルを上げるには必要だと思います。

　好きな人は、休みの日でも強制ではなく、趣味とか当たり前の動作としてしているんだと思います。スポーツ選手も練習が日課であるように、プロのプログラマーもまた、それが日課なのだと思います。
UTCでtimestampを管理しているMySQLを日本時間で操作する

# はじめに
MySQLでデータのtimestampをUTCで管理しているけど、
データをSELECTするときに日本時間の範囲で抽出したいなと思ったので、その時の記録です。

# コード
UTCと日本時間は日本時間の方が9時間早いので、日本時間の入力を9時間マイナスしてあげればUTCになります。
時間の加減算は以下の記事を参考にしました。
https://qiita.com/azusanakano/items/f33bce0664d851a88666

で、例えば「日本時間の2019年8月22日から2019年9月9日までのデータが欲しい！」という場合は以下のようにすれば抽出できます。

```sql:MySQL
SELECT hogehogecolumn
FROM HogehogeTable
WHERE date BETWEEN ('2019-08-22 00:00:00' - INTERVAL 9 HOUR) AND ('2019-09-09 00:00:00' - INTERVAL 9 HOUR);
```

# おわりに
終わりです。
マイコンで自由にprintfしたい(要するに_openとか)

マイコンで、シリアルポートとは別に、キャラLCDとかにprintf経由で文字列を出したかった。

## _open

システムコールの_open_rからLCDのファイルディスクリプタを返す。

```c
int _open_r(struct _reent *r, const char *file, int flags, int mode)
{
    if (!strcmp(file, "CLCD"))
    {
        return (3);
    }

    return (-1);
}

```

## _write

CLCDのディスクリプタが来た場合はCLCDにputcする。

```c
if (file == 3)
{
    int i;

    for (i = 0; i < len; ++i)
    {
        lcd_putc(p[i]);
    }

    return (i);
}
```

## _lseek

カーソルの移動くらいはやりたい。
printfからエスケープシーケンスを出すと、write側でうまく処理しなきゃいけないので面倒。fseekで対応する。

```c
if (file == 3)
{
    lcd_locate(ptr >> 8 & 0xFF, ptr & 0xFF);
    return (0);
}
```

## 使い方

こんな感じ。

```c++
FILE *clcd = fopen("CLCD", "w");
fprintf(clcd, "Hello World!!\n"
                "ABCdef123");

fseek(clcd, 0x00'0E, SEEK_SET);
fprintf(clcd, "*");
fseek(clcd, 0x01'0D, SEEK_SET);
fprintf(clcd, "#");
```

今回はマイコンリセットするまで(つまり半永久的に)clcdを使うのでfcloseはしてないけど、普通はそのあたりをしっかり対応する必要がある(今回は面倒なのでやらなかった)。

## その他

strcmp使うの久しぶりすぎて`if (strcmp(file, "CLCD"))`ってやっててハングアップするのにかなり時間食われた。。。_openで-1が帰るのでFILE*がヌルポになってた。

最初、FILE構造体の`int _file`だけテキトーに設定すればいいや、と思っていろいろ試したけど、うまく動かなかった。

今回はファイルディスクリプタの数値をベタ書きしてるけど、いわずもがな定数とか使うべき。
FirestoreにJSONを取り込む


JSON形式で準備されたテストデータ等をFirestoreに取り込む方法。

## 準備

### 必要なモジュールのインストール

ローカルでバッチ実行を想定しているのでfirebase-adminと、本命コンポーネントのfirestore-export-importをインストール。

```bash
npm install --save firebase-admin
npm install --save firestore-export-import
```

### 秘密鍵の取得

firebase-adminの実行には秘密鍵が必要なので準備する。

```
ユーザーと権限 -> サービスアカウント -> 新しい秘密鍵の生成
```

### jsonの準備

今回は下記のjsonを取り込む（[参考](https://medium.com/@jeffrey.allen.lewis/react-native-firebase-cloud-firestore-implementing-infinite-scroll-lazy-loading-with-flatlist-a9e942cf66c6)ページよりそのまま拝借しました）。

firestore-export-importで取り込むことを想定する場合は、このような形式を意識しておく必要がある。

```json:users.json
{
  "users": [
    {
      "id": 1,
      "first_name": "Kristin",
      "last_name": "Smith"
    },
    {
      "id": 2,
      "first_name": "Olivia",
      "last_name": "Parker"
    },
    {
      "id": 3,
      "first_name": "Jimmy",
      "last_name": "Robinson"
    },
    {
      "id": 4,
      "first_name": "Zack",
      "last_name": "Carter"
    },
    {
      "id": 5,
      "first_name": "Brad",
      "last_name": "Rayburn"
    }
  ]
}
```

>最後の,はとったほうがいいみたい。

## 実装

いろいろ書いていますが、殆どはコンフィグ関連で、取り込み関連はほぼ1行。

```js:index.js
var admin = require("firebase-admin");
var serviceAccount = require("path/to/config.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://{project}.firebaseio.com"
});

var db = admin.firestore();

var fireStoreService = require('firestore-export-import');

//値を追加
// var docRef = db.collection('users').doc('0001').set({ name: 'hoge', age: 33 });

const jsonToFirestore = async () => {
    try {
        await fireStoreService.restore('./users.json');
    } catch (e) {
        console.log(e);
    }
}
jsonToFirestore();
```

## 実行

実行すると取り込まれる。doc名称として、0,1,2,3とかが使われるみたい。

```bash
node index.js

0 was successfully added to firestore!
1 was successfully added to firestore!
2 was successfully added to firestore!
3 was successfully added to firestore!
4 was successfully added to firestore!
```

## 参考

* https://medium.com/@jeffrey.allen.lewis/react-native-firebase-cloud-firestore-implementing-infinite-scroll-lazy-loading-with-flatlist-a9e942cf66c6
メモ用


EC2のインスタンスの作成
apach, nginx, phpのインストール
RDS(postres) 
route

## docker
###### コンテナに入る
docker exec -it コンテナ名など bash
###### コンテナの再開
docker start コンテナ名

docker-compose exec app php artisan migrate:refresh
docker-compose exec app php artisan migrate:refresh --seed

#git
リモートレポジトリの確認
git remote -v

【ファイル名】をインデックスに追加
git add 【ファイル名】

インデックスに追加した内容の差分確認
git diff --cached

コミットする
git commit -v

コミットされているかどうかの確認
git log

コミットのプッシュ
git push origin master

ブランチの作成
git checkout -b DATE200106

ブランチ一覧の表示
git branch -a

作成したブランチをリモートに登録
git push -u origin DATE200106

# 現在、チェックアウトしているブランチのコミットIDを調べる
git show -s --format=%H
git log -n 1 --format=%H

# コミットログを表示する
git log -n 10 --date=short --no-merges --pretty=format:"%cd %s %h (@%cn) "

# コミットの差分を確認する
git diff 【コミットID】 【コミットID】

#インデックスをHEADの状態へ戻す
git reset .

gitコマンドの簡略化

## cron
### crontab -e
(minutes) (hour) (day) (month) (week)
0 9 * * * bash 【パス】/today_task.bash

## mkdir
mkdir /Users/work/Documents/work/\`date '+%y%m%d'\`

## laravelの git clone 後の実行コマンド
git clone 【git laravel レポジトリ】 【ディレクトリを指定する】
composer install
cp .env.example .env
php artisan key:generate

php artisan migrate:fresh
php artisan migrate:refresh
php artisan migrate:rollback
php artisan migrate:rollback --step=1
php artisan migrate

## chatwork api
curl -X POST -H "X-ChatWorkToken: 【トークン】" \
    -d "body=本日の日付は"\`date '+%y%m%d'\`"&self_unread=0" \
    "https://api.chatwork.com/v2/rooms/【room_id】/messages"

## linux コマンド
https://parashuto.com/rriver/tools/mac-command-line-basics
ls -l
cd
cp
mv
rm
cat
pwd
touch
mkdir -p
find . -name "*.【ファイル拡張子】" -exec grep -H -i 【調べる文字列】 {} \;
find . -type f -mtime +30 | xargs tar zcvf 

// Jupyter Notebookの実行
jupyter notebook







~ = shift + Pn
Railsでpostする時、controllerを指定するには？

ApplicationHelperで以下のようなコードを書いており、これをUserControllerから呼び出しても、SessionControllerのcreateを呼ぶようにしたいのですが、Controllerの指定の仕方が分かりません。

```
def log_in_as(user, password: 'password', remember_me: '1')
    post :create, params: { session: {解りづらくなるので引数は省略} }
end
```
こちらはRails5.1を使っております

よろしくお願いします。
SQL データベース基礎中の基礎②


①NULL..何のデータも保存されていない場合のことを指す。

②NULLのデータを取得する場合

```
WHERE カラム名　IS NULL;
```
IS NULLは~がNULLである場合という意味。


③NULLではないデータを取得する場合

```
WHERE カラム名　IS NOT NULL
```



④AND演算子、OR演算子..WHEREを使って複数の条件を指定することができる。

```
WHERE 第一条件式 AND(OR) 第二条件式;
```

⑤ORDER BY..データを並び替える時に用いる。

```
ORDER BY 並び変えたいカラム名　並び方;
```
並び方に関しては昇順の場合は"ASC"、降順は"DESC"を指定する。何も指定がない場合は昇順で表示される。

⑥LIMIT..SELECT文で取得する上限を指定する。LIMITはクエリの末尾にデータの数を記述する。

```
SELECT * FROM テーブル名　WHERE 条件式　LIMIT 取得するデータの件数
消費税計算 税込み金額からの逆算だと丸め方法（切捨、四捨五入、切上）は統一できない

# 背景

「消費税の計算方法を切捨てで統一してください！」と頼まれて、「はい、お安い御用！今は切上になってるんならその反対にすればいいんだよね。」とチャチャッと修正して動作確認。

なんか変な数字が、税込金額が7,270円で、消費税率が10％の時に税抜金額が6610円で税額が610円になっている。なぜ？？？

# 結論

以下の会計士さんのブログにも記載されていますが、税込金額からの逆算だと丸め方法は統一できません。

[設定できない税込価格がある?! | かきしちカンパニー](http://www.webmagazine.kakisiti.co.jp/?p=533)

税率によって違うのですが、10％の場合だと、たとえば税込7,270円から逆算して税額、税抜を求めると税額は「切上」にするしかありません。（下表の例3、それ以外は全てNG）

| # | 税抜 | 税額 | 合計 | 税込金額<br>は正しい? | 税額<br>は正しい？ | 税率の<br>丸め方法 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 例1 | 6610 | 661 | 7271 | NO | YES| ー |
| 例2 | 6610 | 660 | 7270 | YES | NO | ー |
| 例3 | 6609 | 661 | 7270 | YES | YES | 切上 |
| 例4 | 6609 | 660 | 7269 | NO | YES | 切捨 |

# 税込金額から税額を算出するアルゴリズム（できる限り切捨てる版）

```javascript
/**
 * 消費税計算（税込料金から税抜料金と税額を算出する)
 * taxIncludePrice 税込料金
 * taxRate 税率(10%なら10)
 */
function calc( taxIncludedPrice , taxRate ) {
	// 税額計算（切捨て）
	var tax = Math.floor(taxIncludedPrice * taxRate / (100 + taxRate));
	var taxExcludedPrice = taxIncludedPrice - tax;

	// 税額が正しいか検証(税抜から税額を求める）
	var tax_for_check = Math.floor(taxExcludedPrice * taxRate / 100);
	// 不一致なら補正(切上）
	if(tax_for_check > tax){
	    taxExcludedPrice--;
	    tax++;
	}
}
```

# 消費税10%の場合の規則性

テストしたら面白いことがわかりました。

切上が必要になるのは、`10円 + (11円 x n)`でした。（nは整数）
逆に言うと、税込金額から10円を引いて11で割り切れる場合は、切上が必要です。

![](https://i.gyazo.com/3b60eb4a9da090ebb747d9390b35d7c5.png)
第１回 意味がわかる統計的仮説検定 

# 統計的仮説検定は何に使うの？

ある問題が正しいか正しくないかを確かめたいときに使います。
例えば植物の発芽率のデータから、植物の種は正常か異常かどうかを判定したりしたいケースがあると思います。
植物じゃなくともサーバのログのあるキーワードからマルウェアかマルウェアじゃないかを判定したりしたいケースもあるでしょう。
そのような問題に統計的仮説検定を使います。

# 機械学習モデルの検定
あなたは今、ある機械学習モデルが異常なのか(正しく学習されていない)、正常なのか（正しく学習されている）確かめたいとしましょう。

例えば、海鮮丼の写真から海鮮丼らしさを推定する機械学習モデルが存在するとします。
このとき、海鮮丼の写真を入力として９９.９９％くらいで海鮮丼と推定すれば十分に学習できていると考えることができるでしょう。
逆に海鮮丼の写真を入力しているのに１０％くらいの海鮮丼らしさならばそのモデルは異常だといえるでしょう。

この問題は以下のように考えます。
![kaisendon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/3721260a-de13-87c0-01df-e81f70dca36b.png)

この時、この問題は次のように場合分けできます。
- 機械学習モデルは正常である。
- 機械学習モデルは異常である。

例えば、海鮮丼らしさが**１０％以下の異常率の場合に機械学習モデルは異常**であると定義します。
逆に**10%よりも大きい海鮮丼らしさの時は機械学習モデルは正常**であるとします。

**※この異常率10%以下というのは、人が妥当だと判断して決めています。**この記事の場合私が大体１０％以下だと明らかに異常だよねと判断しております。人によっては50%以下だったり４０%以下だったりするでしょう。

これを数式を用いて書くと次のようになります。

異常率を$p$とおきます。
「機械学習モデルは正常である。」は
$p_0=0.10$となるので
$H_0 : p > p_0$
「機械学習モデルは異常である。」は
$p_0=0.10$となるので
$H_1 : p\leq p_0$

このとき、$H_0$を帰無仮説、$H_1$を対立仮説といいます。

![kimutai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/c712b0ad-00e0-263f-2224-aa1c02d5faf1.png)

このとき$H_0$を正しいと判断することを帰無仮説を採択または受容するといいます。
逆に$H_1$を正しいと判断することを帰無仮説を棄却するといいます。

第２回は有意水準（P値)を用いた統計的仮説検定を紹介します。
[Rails]Bootstrapを使用した確認ダイアログについて

#はじめに
今回確認ダイアログを表示させる際、bootstrap3を使用していたので、このように確認ダイアログをBootstrap仕様にしました。なのでその導入方法などについて説明します。
バージョンは`Rails 5.2.3`を使用してます。
<img width="800" alt="スクリーンショット 2019-09-21 0.51.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/a6319516-59ba-ec44-1843-6b97c40dc8f2.png">


##導入方法
先ずはGemから、今回はBootstrap3なので`'jquery-rails'`と`'bootstrap-sass'`を使用します。(Railsのバージョンが5.0以降は`'jquery-rails'`が必要になります。)
確認ダイアログの表示は`gem'data-confirm-modal'`を使用します。

```ruby:Gemfile
gem 'bootstrap-sass'
gem 'data-confirm-modal'
gem 'jquery-rails'
```

次に`application.js`ファイルに以下の記述をします。

```ruby:application.js
//= require bootstrap-sprockets
//= require data-confirm-modal
```

最後に`application.scss`に`@import`を使用して記述します。

```ruby:application.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

注：Railsのバージョンによっては記述が変わります。なので必要に応じて、Gemなど導入して下さい。

##使用方法
Viewファイルの`link_to`の中に`data: { confirm: "記述名", cancel: '記述名', commit: '記述名'}, title: '記述名'}`を記述します。`title:`だけは`{}`内から外して記述して下さい。

記述例は以下の通り

```ruby:test.html.haml
.btnstyle__syosai
 = link_to "削除", "/videos/#{video.id}", method: :delete, data: { confirm: "本当に削除してもよろしいですか？", cancel: 'やめる', commit: '削除する'}, title: '削除確認画面',class: "btn btn-default btn-block"
```
表示はこのようになります。
![44dbd7f70365624f807cac820ee642dc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/d44e038f-0801-4c86-22ec-455cee9fe87a.gif)


##最後に
限定的ではありますが、Bootstrapを使用してるならデフォルトよりこっちの方が見た目がいいのでいいかと思います。
以下も参考にして下さい。
https://fuchiaz.com/rails-gem-data-confirm-modal/
CSSで文字を上下左右中央寄せにする方法

#cssで文字(p)を中央寄せしたいときに便利な方法

- 子要素に`text-align:center;` **横方向の中央揃え**
- 親要素に`display:table;`
    - 子要素に`display:table-cell;`
    - 子要素に`vertical-align:middle;` **縦方向の中央揃え**


<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="haruk" data-slug-hash="LYPXvpL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LYPXvpL">
  <span>See the Pen <a href="https://codepen.io/haruk/pen/LYPXvpL/">
  LYPXvpL</a> by HarukaGoto (<a href="https://codepen.io/haruk">@haruk</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
react-native run-ios 実行時にiOSシミュレータのバージョンが古いと怒られたときの対処法

```
react-native run-ios
```
react-native による iOSアプリ開発時に、上記コマンドで simulator を立ち上げようとすると、以下のように simulator の機体の version で怒られることがある。

```
Cound't find iPhone 6 simulator
```

このとき以下を実行したところ、現状(2019年9月)で最新版の iPhone X で simulator が立ち上がった。
package.json の package をアップデートすることにより、 react-native 側のバグが修正された version を使用できるようだ(参考記事回答#10を参照)。

```
npm install -g npm-check-updates
ncu -u react-native
npm install
```

ncu は npm-check-updates という Node.js のモジュールで、 package.json の npm のバージョンを書き換えてくれるコマンド。 個別の npm を更新するためにはその名前を引数に指定するだけでよい。-u オプションを指定することで、実際に書き換えを行なっている。
筆者の場合 package.json は  "react-native": "0.60.5"　に更新された。

###ちなみに
react-native では以下コマンドで simulator の機体の version を指定できる（例：iPhone 6s の場合）。

```
react-native run-ios --simulator 'iPhone 6s'
```


###参考記事
https://stackoverflow.com/questions/52783369/could-not-find-iphone-6-simulator-after-upgrade-to-xcode-10
http://tacamy.hatenablog.com/entry/2016/08/10/193603
2次元配列中の重複削除

Google Spreadsheet使ってると2次元配列中の複数の要素にまたがった重複削除とかやりたくなると思いますが，こうすると行数短く書けるなぁと思いついたのでメモ．

```remove_duplicated.js
const A = [["田中", "裕也"], ["田中", "智史"], ["吉田", "智史"], ["田中", "智史"]];

const unique_A = A.filter(function(e, index){
  return !A.some(function(e2, index2){
    return index > index2 && e[0] == e2[0] && e[1] == e2[1];
  });
});

Logger.log(unique_A); // 田中,裕也,田中,智史,吉田,智史
```

配列から重複削除するには他に[Setやreduce使う方法がある](https://medium.com/dailyjs/how-to-remove-array-duplicates-in-es6-5daa8789641c)らしいけど，そっちはまだ試してない．
ElmでTodoアプリを作る

# Elm0.19でTodoリストを作りました

ソースとデモはこちら。

 [https://ellie-app.com/6D8hKZwjy5ja1]

## 簡単に解説します

Addで追加されて、Deleteで削除します。 
ということは一応CRUDが実現できているのかな。

## データベース

データベースにFirebase(Firestore)を使っていて変更は自動保存されて、次回開いた時(他の人でも)反映されます。
使ってみて下さい。

データベースとのやりとりはHtml経由でFlagsとPortを使っています。

起動時にFlagsを経由して全件読み込み、変更はAddやDeleteがあるたびに全件updateしています。
なのでデータベースとは完全同期なハズ。

Html(Javascript)で起動時にデータベースを読み込むことと、ElmにFlagsでデータを渡すことのタイミングをとるのが思いつくまで試行錯誤しました。

読み込みも書き込みも両方ともPortsで、というのは無限ループになってしまうと思う。  
けど、チャットとかを作るには考えなければいけませんね。これからの課題。

HtmlとElmのソースをコピペしてローカルで運用することもできます。  
Firebaseは自分で設定してHtmlに反映してください。

## ellie-app.comについて
今回ソースとデモをのせた、Ellieという環境は左側にElmとHtmlのソース、右側で実行結果がでますので、学習環境として最高だと思います。

実際に動くプログラムほど説得力のある教材はないと思う。  動いてナンボだよねー。

壊しても再読込すれば元に戻りますので、

### 壊して学ぶプログラミング！！

ができます。