OmniAICreator/Qiita-1.07M huggingface dataset:
Lubuntuこまごまとした設定

# はじめに

Lubuntuの設定をしてるので備忘録としてここに残します。
ちょいちょい、追加していこうと思います。

# 日本語関連

**日本語入力**と**日本語フォント**については、[LubuntuをVirtualBoxにインストール（その３）](https://qiita.com/marbas666/items/35f8a5e39b29269a0450)に書きましたが、こちらにも書いておきます。

### 日本語入力

`sudo apt install fcitx-mozc`

ログアウト、ログインで利用可能となります。

### 日本語フォント

` sudo apt install fonts-ipafont fonts-ipaexfont fonts-takao fonts-vlgothic`

# スクリーンセーバー設定

仮想マシンで動かしているので、スクリーンセーバーを無効にします。

左下◎　⇒　設定　⇒　Screensaver

![2021-02-17_09h20_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/e17ee6b6-0f94-11ab-2a2d-d7a7bcd0d166.png)

![2021-02-17_09h20_41 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/45f63df8-ff62-9494-6fc1-439442c32e2a.png)


# ソフトウェア更新

QTerminalから、`sudo apt update`してから、`sudo apt upgrade`を実行していましたが以下の手順でできるみたいです。

左下◎　⇒　設定　⇒　Apply Full Upgrade

![2021-02-17_08h22_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/a9980209-8224-eb2b-9ae2-c40aa8fddbd3.png)

# PS1（primary prompt string）の変更

QTerminalなどで"＄"の前の文字列長すぎない？

```sh
marbas666@marbas666-virtualbox:~$
```

`marbas666@marbas666-virtualbox:~`
↑この部分

これは、環境変数`PS1`で定義されているようです。

```sh
$ echo "$PS1"
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 
```

パスは欲しいので以下のように設定しなおします。

```sh
marbas666@marbas666-virtualbox:~$ export PS1="\[\033[01;34m\]\w\[\033[00m\]\$ "
~$ 
```

`\w`は、現在のディレクトリを表示します。
この前後にある`\[\033[01;34m\]`と`\[\033[00m\]`は、色を指定しています。

ちょっと古いサイトですが・・・
詳しい説明は以下がわかりやすかったです。
[プロンプトの確認や設定 - Pocketstudio.jp Linux Wiki](http://pocketstudio.jp/linux/?%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8%A4%CE%B3%CE%C7%A7%A4%E4%C0%DF%C4%EA)

QTerminalを立ち上げなおすと元に戻ってしまいますので、`~/.bashrc`ファイルの最後に`export PS1="\[\033[01;34m\]\w\[\033[00m\]\$ "`を追記する事で永続的に反映することができます。

# scrot (SCReenshOT)

Lubuntuにも"Print"コマンドでスクリーンショットが取得できます。
Windowsでは"alt+Print"コマンドで活性化しているウィンドウのスクリーンショットを取得できますが、Lubuntuではできませんでした。

ただ、以下のコマンドを使うとコマンド後に選択したウィンドウのスクリーンショットを取得する事ができます。
`scrot -s`

# ショートカットキーの設定

スクリーンショットをショートカットキーに登録してみたいと思います。

![2021-02-19_09h40_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/ed3d9b1b-dcf5-aee1-a0d2-cececf563be1.png)

左下の◎ ⇒ 設定 ⇒ LXQt settings ⇒ ショートカットキー
を選択します。

![2021-02-19-094236_750x400_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/bb2aa876-c559-6aea-d267-d6357475cad9.png)

ショートカットキーの一覧が出ます。
右の"追加"を押下します。

![2021-02-19-094329_400x340_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/f5660fbb-ebce-4c26-eecc-ddaad4429804.png)

"ショートカット(s)"の右にある□を押下して、"Alt+Print"を入力します。
"タイプ"は"コマンド(c)"を選択します。
"コマンド(M)"に`scrot -s`を設定します。
"OK"を押下します。

![2021-02-19-094342_750x400_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/ebaaa393-73e6-ee43-0de9-5f51e0fb6cfa.png)

登録されたので"閉じる"を押下します。

これで、"Alt+Print"を入力した後でウィンドウを選択するとその部分のスクリーンショットが取得でき、ユーザーフォルダ配下に保存されます。

# まとめ

いろいろ便利な機能を入れていると、何をいれたんだか思い出せない事が多々あるので備忘録を残すのは重要だと思います。
LearnDash イレギュラー対応集

# 前書き
#### 参考サイト集
・[LearnDash Code Reference](https://developers.learndash.com/)
・[WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)

#### ファイルの場所
WordPressルートディレクトリ/wp-content/plugins/sfwd-lms

# コードサンプル
## 特定ユーザーがコース・レッスンへアクセス可能になる日を更新
【前提】
コースの中に、
1. コース参加後すぐに閲覧可能なレッスン1
2. コース参加後30日経過してから閲覧可能となるレッスン2
3. コース参加後60日経過してから閲覧可能となるレッスン3
の3つのレッスンがある。
hogeさんがこのコースに参加した日付を2021/01/01とする。

また、プログラム内ではそれぞれのIDを下記の変数として表記する。
ユーザー ID = `$user_id`(9999)
レッスン1 ID =  `$lesson1_id`(1111)
レッスン2 ID =  `$lesson2_id`(2222)
レッスン3 ID =  `$lesson3_id`(3333)
コース ID =  `$course_id`(5555)
このコースが属するグループ ID `$group_id` (6666)


### コース参加日の変更
諸事情があり、hogeさんが2020/12/01(1か月前)からこのコースに入っていたことにしたい
-> [ld_course_access_from_update](https://developers.learndash.com/function/ld_course_access_from_update/)を使う

``` ld-myfunc-update-course_access_from.php
$course_id = 5555;
$user_id= 9999;
if(!ld_course_access_from_update($course_id, $user_id, '2020-12-01 00:00:00')){
    echo "\nUpdate Failed: course_id: ${course_id} user_id: ${user_id}\n";
} 
```

上記を実行すると
コース1・コース2 閲覧可能
コース3 あと30日後に閲覧可能
となる。

### レッスン閲覧可能日の変更
コース参加日は変更する事無く、レッスン3だけすぐに見せたい
-> functions.phpに [ld_lesson_access_from](https://developers.learndash.com/hook/ld_lesson_access_from/) フィルターを追加設定する

```functions.php
add_filter(
	'ld_lesson_access_from',
	function( $arg_timestamp, $arg_lesson_id, $arg_user_id ) {
		$user_id = 9999;
		$lesson3_id = 3333;
		if($arg_user_id === $user_id && $arg_lesson_id === $lesson3_id){
			$arg_timestamp = 0;
		}
		return $arg_timestamp;
	},
	10,
	3
);
 
```


## グループ参加日の取得
ユーザーAのコースグループ参加日を取得したい
→ [learndash_get_user_group_started_timestamp](https://developers.learndash.com/function/learndash_get_user_group_started_timestamp/) を使う

```ld-myfunc-get-user-group-started.php
$group_id = 6666;
$user_id = 9999;
$course_add_timestamp = learndash_get_user_group_started_timestamp($group_id, $user_id);
```
RxSwiftでPresenterで発生したエラーをViewで表示させる

RxSwiftでエラーをキャッチした後に、
PresenterからViewへエラーを流すパターン

LoginPresenterでログイン処理をした後、LoginViewControllerにErrorを流す。
SignalはDriverとだいたい同じものですが、Driverと違いsubscribeされるときにreplayしません。
ログイン処理などAPIを叩く処理ではreplayを意識する必要がないのでSignalにしています。

DriverとSignalについては以下の解説がわかりやすい

RxCocoa 4 の Signal と Relay のまとめ
https://engineering.mercari.com/blog/entry/2017-12-04-103247/

## LoginPresenter

``` swift
protocol LoginPresenter {
    var showAPIErrorPopupRelay: Signal<Error> { get }
}

```
``` swift
final class LoginPresenterImpl: LoginPresenter {
    private let _showAPIErrorPopupRelay = PublishRelay<Error>()
    var showAPIErrorPopupRelay: Signal<Error> {
        return _showAPIErrorPopupRelay.asSignal()
    }
}
```

## LoginViewController

error.localizedDescriptionで、エラーの内容を参照して表示させる。

``` swift
class LoginViewController: UIViewController {
        presenter.showAPIErrorPopupRelay
            .emit(onNext: { [weak self] error in
                self?.showErrorAlert(message: error.localizedDescription)
            })
            .disposed(by: bag)
}

```

## UIViewControllerのExtension

``` swift
extension UIViewController {
    func showErrorAlert(message: String, completion: (() -> Void)? = nil) {
        let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)
        let action = UIAlertAction(title: "OK", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true)
    }
}

```
［RPA,UiPath］UiPath Orchestratorへのジョブ登録・実行手順概要

UiPath Orchestrator に対してプログラムからジョブを登録するようなものを想定しています。

## 手順

### 1. 認証（ログイン）
クラウド版：
`POST /oauth/token` によりアクセストークンを取得する

オンプレミス版：
`POST /api/Account/Authenticate` によりアクセストークンを取得する

（注）2021/02現在は使用できるものの`@deprecated`されている
　
### 2. 対象のRPAのリリースキー（Release Key)を取得する

2-1: フォルダーID(OU ID)の取得

`GET /odata/Folders` によりフォルダーIDを取得する

（注）同種のAPIに `GET /odata/OrganizationUnits`が存在するがオーケストレータのバージョンにより取得できないケースがある模様。また本APIは`@deprecated`

2-2: リリースキーの取得

`GET /odata/Releases` を(2-1)で取得したフォルダーIDと、実行するロボットの名称を指定してリリースキーを取得する

### 3. ジョブの登録

`POST /odata/Jobs/UiPath.Server.Configuration.OData.StartJobs` を(2)で取得したリリースキー、ロボットが必要とするパラメータ情報、その他実行情報などとともに実行する
（登録されるとそのジョブを表すジョブID発行される）

### 4. ジョブの実行状況の監視

(3)で発行されたジョブIDを、`GET /odata/Jobs(ジョブID)"`で呼び出すことでジョブの処理状況を取得する

（注）ジョブIDはURLエンコードして設定する
Graphql-RubyでInterfaceTypeを使うpart2

前回、Graphql-RubyでActiveRecordのInterfaceを定義しました。([前回はこちら](https://qiita.com/Paul_Dirac/items/c565c126cc2a6925e3dc))
今回は、ポリフォーリズムとしてのInterfaceを利用してみたいと思います。

#設定
あるシステムのエンドユーザは、店員(staff)と社員(employee)の2つのオブジェクトによって利用されるとしましょう。この2つのオブジェクトは,nameとemailという共通するインスタンス変数を持っています。よって、この2つをInterfaceとして定義します。

#Interface Type
以下のようにstaffとemployeeのインターフェースとしてUserInterfaceを定義できます。

```interface_type.rb
module InterfaceTypes
  module UserInterface
    include InterfaceTypes::BaseInterface
    description 'user(staff and employee) interface'

    field :name, String, null: false
    field :email, String, null: false

    definition_methods do
      def resolve_type(object, _context)
        case object
        when ::Employee
          ObjectTypes::EmployeeType
        when ::Staff
          ObjectTypes::StaffType
        else
          raise "Unexpected UserType: #{object.inspect}"
        end
      end
    end
  end
end
```
まず、fieldで共通するプロパティ を定義します。その後resolve_typeでgraphqlでフロントにかえすオブジェクトによってEmployee Typeを返すかStaff Typeを分岐させています。

#クエリー定義
フロント側でのクエリー定義は以下のようになります。

```rb
query{
  user {
    id
    name
    email
    __typename ## employee or staffがstringで渡される
    ... on Employee { ##employeeのみに存在するフィールド
      role
    ... on Staff { ##staffのみに存在するフィールド
      shopName
    }
  }
}
```
上記のように共通するフィールド以外は個別に定義できます。
__typenameはgraphql-rubyが自動で付けてくれるフィールドで、どちらのオブジェクトなのかを判別することができます。

#なぜInterfaceTypeを定義するか
### 返すObjectを意識しなくて良い  
Interface TypeはGraphqlのクエリーの戻り値がstaffかemployeeかを意識したくない時に利用できます。例えば、Userのログインクエリーをフロントから叩きたい場合を考えてみましょう。
フロント側はユーザがemployeeかstaffかを意識せずにloginの同じクエリーを叩き、戻り値としてstaffかemployeeを返します。interface Typeを定義していないとログインユーザに返すオブジェクトによって別々にクエリーを定義する必要があります。しかし、Interface Typeを定義しておくと返り値としてUserInterfaceTypeと定義しておけば、どちらがログインしても対応することができます。

### フロント側でもInterfaceTypeを定義できる
フロント側でtypescriptを使っている場合、graphql-codegenなどの自動型生成のプラグインを使うとUserInterfaceTypeを定義してくれます。これによって、フロント側でもログインユーザがstaffかempolyeeかを意識せずにemailやnameにアクセスできます。
また、typenameプロパティ によってstaffかemployeeかを判別して表示するページを切り替えたりできます。
戻るボタンのタップ時のactionの制御

# 記事概要
「戻るボタンをタップした時に○○する」という戻る以外の処理を挟むという仕様を実現する際のアプローチの整理。

- やりがちNGパターン
- 一部対応パターン
- 一括対応パターン（UINavigationController単位)
- まとめ

# やりがちNGパターン
backBarButtonItemのactionは無視されるため動作しません。

```.swift
navigationItem.backBarButtonItem = UIBarButtonItem(title: "戻る", style: .plain, target: nil, action: #selector(doSomething))

@objc
func doSomething() {
    // 戻るボタンの動作処理
}
```

# 一部対応パターン
## navigationItemのleftBarButtonItemを利用する
この方法はかなりネット上に広がってる方法です。

```一部対応.swift
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "戻る", style: .plain, target: nil, action: #selector(doSomething))

@objc
func doSomething() {
    // 戻るボタンの動作処理
}
```
# 良い点
* UIViewControllerから指定もできるので、見通しが良い。

## 問題点

* backBarButtonItemとleftBarButtonItemで**ボタン位置が若干変わる**。
* (iOS7の時のような)HIGのガイドラインが変わるような変更があった場合、実装箇所において各画面で修正が必要。

# 一括対応パターン（UINavigationController単位)
## UINavigationControllerのサブクラスを実装し、UINavigationBarDelegateを採用する
`UINavigationController.navigationBar`の`UINavigationBarDelegate`を**直接手動で設定できません**。（実行時エラーになります）
また、`UINavigationController.navigationBar`は`get-only`なので以下に実装になります。

```.swift
final class OriginalNavigationController: UINavigationController, UINavigationBarDelegate {
    func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
        // 戻るボタンの動作処理
        return false
    }
}

```
## 良い点
* 一括で対応できるので、共通仕様として実装する場合はシンプルに実現できる。

## 問題点

* 特定の１画面に対してだと、少し大袈裟な実装。
* 特定の条件の画面に対してだと、画面特定が泥臭い感じになり、拡張時に考慮する必要がある。
* UIViewControllerから離れているので、どこで制御しているか分かりにくい。（半年後忘れているかも？）
* UIViewControllerに関連するロジックを実装する必要がある場合も設計上問題が出がち。

# まとめ
今回提示したアイデアとしては2つですが、一長一短なので状況に応じて対応かなと思います。
個人的にはiOS7の時にデザイン修正がちょっとした作業量になった経験から、前者を実装するのであれば特定の条件の画面のみ戻るボタンで実現するというアプローチ以外に機能実現する方法を検討し、回避するのも手だと考えています。
Qiita Daily Servay memo 2021.02.17

# Qiita Daily Servay memo 2021.02.17
Qiita の記事を可能な限り毎日読むために、読んだ memo を公開することでモチベーションを維持しようという試み。
いいねをいただいてテンションが上がりました…！私は3日坊主のスペシャリストですが、何日続くか楽しみです…。

5時と17時の更新のようですが、昨日と同じ記事は割愛して他の記事を読んでメモにまとめてみたいと思います。

## [閲覧者のユーザーエージェントを三角関数で判定できるか？](https://qiita.com/POPOPON/items/e193c07a3835c2f0a5dd)
しん（POPOPON）さんの記事。
sin, cos, tan でユーザーエージェントの識別なんてできるわけないでしょ…？通信と数学に何の関係があるの…？と思って開きましたが、できていました…すごい。

というのも、三角関数の値はブラウザによって実装が異なることがあるため、特定の式をブラウザに計算させることで、その値から識別ができる…らしいです…。
ハイパボリックコサインなんて、大学1年生の時ぶりに見ました…。
"実装によって異なる"話は、お仕事をしていてもたまに耳にするので、なるほどなーと思いました。


## [アンチパターンから考える Salesforce ゲストユーザ問題](https://qiita.com/tonnuts/items/212b4b3121c3d2915190)
tonnuts さんの記事。
Salseforce を使用していて、3つの条件が揃うと個人情報が漏洩してしまう可能性がある、という話を詳細にまとめられている記事です。
ものすごいサーベイ力で、本当に詳細にまとめられています。すごい。
私はこの話をそもそも知りませんでしたが、時系列順にまとめられていたり、参考先のサイトも非常にわかりやすかったりで、なんとなく概要がつかめました。

完ぺきなセキュリティは、なかなか難しいので仕方ないかな…と、個人的には思います。
しかし、そのあとのアナウンスが「ゲストユーザに対する共有に関する設定がお客様の用途に沿った設定になっているかどうかはお客様にご確認いただく必要がございます」は、どうなのかなと思いました。
わざわざ分かりにくく、複数の解釈を含むような言葉を使う理由はわかりますが、うーん…。
偉い人たちの政治の話は守備範囲外なので、気にしないことにします。


## [コーディングを始めたときに知っておきたかった65のこと](https://qiita.com/rana_kualu/items/63ad0f68d66c5f0a464b)
rana_kualu さんの記事。アイコンかわいい。
記事の冒頭にある通り『65 Things I wish I knew when I started to Code』という記事の日本語訳の記事でした。
分かるわー…という感想です。
知らない状態で始めると、「知っておけばよかった」になることですが、始める前に知っても「何の役に立つんだこれ…」ってなるやつですね。

今日の Daily Note の上の方には、下記の2つを書いておきたいと思います。
> 49.Achievements boost your motivation best.
> 成果がモチベーションを加速する。
> 65.Sports and proper sleep boost productivity.
> 適度な運動と睡眠が大事。

日本語訳記事、他にもいくつも読んでいますが、非常に助かります…。
ありがとうございます…！


## [通信の流れを参照サイトでまとめてみた](https://qiita.com/siberiannhasuki_iijima/items/b46ea7533b8a19343984)
siberiann tooru(siberiannhasuki_iijima) さんの記事。
OSI参照モデルの各レイヤの話を整理してくださった記事。
学生の頃全く理解できず、何回も先生に聞きに行った記憶があります。
現在は少しは理解しているつもりで、「その層がきちんと実装できていれば、他の層のことは気にしなくてよい」というのがすごく好きです。
お仕事で障害の調査を依頼されることが結構ありますが、問題の切り分けの時に活躍してくれるので知っておいて損は絶対ないと思います。


## [OpenCVで映（バ）える画像つくってみた](https://qiita.com/h_yuma/items/454855a8340962eaa05e)
h_yuma さんの記事。
OpenCV を使って画像にフィルタをかけて、映える画像を生成した…という記事です。
記事では5種類のフィルタが紹介されていて、中でも私は最後の pencilSketch が好みかもです。
フィルタ系でいうと「カメラで撮った画像が、白黒漫画風になる」を Twitter で初めて見たときは、本当に度肝を抜かれました。
DeepLearning っぽくてすごく好きです。（使われている技術がDeepLearningかはわからないですが！）
少しお絵かきをしたりするので、このような記事やAI彩色の記事などは、非常に興味深く読ませていただいてます。


## つれづれ
頑張っている人を見ると、やっぱりエネルギーもらえますね…！
Qiita の記事読むと「よし、俺もやるかー！！」って元気もらってます！
【Rails】保存前に加工する


# はじめに

オーバーライドをすることで、saveメソッドやupdateメソッドを実行時にDBへ保存前にカスタムの処理を実行することができます。
基本的なことかもしれませんが、便利で忘れたくないと思ったのでまとめました。

# サンプル

tel レコード（電話番号）をもつ User モデルを新規作成する時を例にしてソースコードを説明したいと思います。

Userの新規登録をするときなどに、フォームでは tel を 0312345678 といった0~から始まる番号で入力してもらい、DBで保存するときは+81~からはじまる国際電話番号（E.164形式）に加工したい場合を考えます。
また、表示時には 0312345678 といった0~から始まる番号で表示します。

# ソースコード


```ruby:user.rb
class User < ApplicationRecord
  # 表示用の電話番号メソッド
  # （ show.html.erb などでは @user.display_tel とすると0~から始まる番号で表示 ）
  def display_tel
    if tel.present? && tel.first == '+'
      return tel.sub('+81', '0')
    else
      return tel
    end
  end

  # DB保存前にE.164形式に加工する（オーバーライド）
  def tel=(param)
    data = register_tel(param)
    write_attribute(:tel, data)
  end

  # 加工するメソッド
  def register_tel(param)
    if param.first == '0'
      return param.sub('0', '+81')
    else
      return param
    end
  end
end
```

# まとめ
自分用のまとめとなってしまいましたが、どなたかの参考になればなと思います。


# 参考
* railsで保存前に加工したい
    * https://ja.stackoverflow.com/questions/9317/rails%E3%81%A7%E4%BF%9D%E5%AD%98%E5%89%8D%E3%81%AB%E5%8A%A0%E5%B7%A5%E3%81%97%E3%81%9F%E3%81%84

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
SwiftでUserDefaultを使うときのデザインパターン

UserDefaultを使用するとき


UserDefaultDataStore.swift

``` swift
import Foundation

struct UserDefaultsDataStoreProvider {
    private static var shared = UserDefaultsDataStoreImpl()
    static func provide() -> UserDefaultsDataStore {
        return UserDefaultsDataStoreProvider.shared
    }
}

protocol UserDefaultsDataStore {
    var timeStamp: Date? { get set }
}

private struct UserDefaultsDataStoreImpl: UserDefaultsDataStore {

    var timeStamp: Date? {
        get {
            return UserDefaults.standard.object(forKey: "timeStamp") as? Date
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "timeStamp")
            UserDefaults.standard.synchronize()
        }
    }
}

```

## 使用例

### 取り出し方
``` swift
var userDefault: UserDefaultsDataStore = UserDefaultsDataStoreProvider.provide()

userDefault.timeStamp
```

### 値のセット
``` swift
var userDefault: UserDefaultsDataStore = UserDefaultsDataStoreProvider.provide()

userDefault.timeStamp = Date()
```
MacでRraspberry Pi 4の初期セットアップ（SSH接続まで）


Raspberry Piにティスプレイ、キーボード、マウス、LANケーブル等を接続せず、０状態からSSHで制御したかったので方法を調べました。
[ほぼ同じ目的で記事を書いている方がいて](https://qiita.com/murs313/items/81757bf8bc74b6b76cdf)大変助かりましたが、自分の環境依存な箇所もあったのでメモがてら記録しておきます。

## 利用環境

* Mac(Big Sur)
* Raspberry Pi 4 Model B(4G)

## OSの準備

スターターキットを買ったので付属のmicroSDを刺すだけで動くはずでしたが、何かおかしいので結局０ベースでインストールしました。
めんどうそう・・・と思っていましが、なんと「[Raspberry Pi Imager](https://www.raspberrypi.org/software/)」なる専用ソフトがリリースされているではありませんか！

特に迷いもなく、インストール・利用できました。最初に一旦「Erase」するのがいいみたいです。
OSはRecommendedとなっているRaspberry Pi OS(32bit)を選択しました。

時間帯によってダウンロードに時間がかかる場合もあるようですが、私の環境だとインストール＋Writeに15分くらいでした。

![スクリーンショット 2021-02-17 8.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/d312354d-77e0-7b14-7baa-764d95979a0a.png "スクリーンショット 2021-02-17 8.01.28.png")


## OSの初期設定（SSH許可やWi-Fi設定）

OSにログインしない状態でどう設定するのだろう？と思っていましたが、普通にmicroSDカードをMacに挿して（アダプタ必要）直接ファイルをいじればいいとのことです。

### SSHの許可

```bash
touch /Volumes/boot/ssh
```


### Wi-Fiの設定

```bash
touch /Volumes/boot/wpa_supplicant.conf
```

```bash
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="ssid_name"
    psk="password"
}
```

## Raspberry PiのブートでSSHでのログイン

### 起動

電源ケーブル刺すだけです。緑のLEDのチカチカが止まればbootしてるっぽいです。1分弱くらいのイメージ。

### ログイン

Mac環境ではmDNSにより、IP知らずとも以下でログインできるみたいです。

```bash
ssh pi@raspberrypi.local
```

mDNSで名前が解決できない場合はIPアドレスを調べます。
arp -aとかで、それっぽいのを見つければいいのですが、Raspberry Pi 4ではdc:a6:32:xx:xx:xxからはじまるMacアドレスがRaspberry Piらしいです。

>3のときはb8:27:eb:xx.xx.xxだったらしいです。

```bash
arp -a

? (192.168.0.39) at 92:af:b5:40:a9:d0 on en1 ifscope [ethernet]
? (192.168.0.40) at 92:8d:40:6b:68:d4 on en1 ifscope [ethernet]
? (192.168.0.42) at 1e:71:39:26:b9:58 on en1 ifscope [ethernet]
? (192.168.0.46) at dc:a6:32:93:b7:c5 on en1 ifscope [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on en1 ifscope [ethernet]
```

ここでは192.168.0.46がRespberry Piみたい。
無事ログインできました。

```bash
pi@raspberrypi:~ $
```

あとはいじるだけ。
【Laravel】 Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

#はじめに
知識を整理するための個人的な備忘録です。

カラム型の変更をした際、

```
$ composer require doctrine/dbal
```
のコマンドで`doctrine/dbal`を入れてから`php artisan migrate`したのにエラーが出た。

```
Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
```
#解決方法
原因は
>・composer require doctrine/dbalだけでインストールすると、今は3.x系が入ってしまう
・3.x系はDriverディレクトリの構成が変わっているので、migrateする時に2.x系にあったPDOMySqlがnotfoundになる

らしい。

```
$ composer require "doctrine/dbal:2.*"
```
doctrine/dbal をバージョン指定で入れ直すことで解決。

#参考
* [[laravel] doctrine/dbalを入れたのに「Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found」と言われる](https://qiita.com/snbk/items/803aea10773052629a45#comments)
ESP32 で複数のロータリーエンコーダーを使う

### はじめに
Arduino ESP32 でロータリエンコーダーを使用する記事はいくつかあります。
ライブラリマネージャーからインストールして使用する記事はこちら
　https://qiita.com/nanbuwks/items/1a5f881b6a84a08eacc1
このライブラリでは、私の手持ちのエンコーダーではチャタリングのせいか、そのままではうまくカウントしませんでした。また、複数のエンコーダーの使用は設定できないようでした。
今回は、2個のエンコーダーを使用するため、本家 Arduino のライブラリ
　https://www.arduino.cc/reference/en/libraries/esp32encoder/
を使用してみました。Arduion IDE のバージョンは 1.8.8 です。
### 準備
ダウンロードして Arduino の Libraries フォルダに格納します。
ロータリエンコーダーを下の回路図のように接続します。ESP32 ボードはカラー LCD の ついている TTGO を使いました。
![ESP32-ENC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996993/c9001b06-2cfe-2b1a-4f70-7892adef3721.png)

### サンプルスケッチ
使用したライブラリの examples にあるサンプルをモディファイしたもので、
表示する方法が分からないのでリスト内の「＃」「＜　＞」は全角となってます。コピーして使うときには半角に直してください。
スケッチの動作はポート設定の後、カウンタの初期値を
　encoder1 = 100
　encoder2 = 0
に設定、エンコーダーを回転させ変化があったときにシリアルポートにカウント値を出力します。

```
＃include ＜ESP32Encoder.h＞

 ESP32Encoder encoder1;
 ESP32Encoder encoder2;

void setup(){
	
	Serial.begin(115200);
	
	// Enable the weak pull up resistors
	ESP32Encoder::useInternalWeakPullResistors=UP;

	// use pin 2 and 15 for encoder1
	encoder1.attachSingleEdge(2, 15);

	// use pin 13 and 12 for encoder2
	encoder2.attachSingleEdge(13, 12);
		
	// set starting count value after attaching
	encoder1.setCount(100);

	// clear the encoder's raw count and set the tracked count to zero
	encoder2.clearCount();

	Serial.println("Encoder Start = " + String((int32_t)encoder1.getCount()));

}

void loop(){
// Loop and read the count
  static int pos1 = 0;
  static int pos2 = 0;
  int newPos1 = encoder1.getCount();
  int newPos2 = encoder2.getCount();
  
  if ((pos1 != newPos1) | (pos2 != newPos2))
  {
   Serial.print("Encoder count = " + String((int32_t)encoder1.getCount())) ;
   Serial.println(" " + String((int32_t)encoder2.getCount()));

   pos1 = newPos1;
   pos2 = newPos2;
  } // if
  
	delay(100);
	}
```
#### エンコーダー入力の pullup について
一般的に秋月などで入手できるロータリーエンコーダーは 入力に10K 程度の抵抗を接続するなどして Pullup が必要になります。このライブラリでは

```
ESP32Encoder::useInternalWeakPullResistors=UP;
```
とすることで 内部で Pullup できます。Pulldown したいときは

```
ESP32Encoder::useInternalWeakPullResistors=DOWN;
```
となります。
#### エンコーダー入力モード
このライブラリではエンコーダーの入力モードを
　HalfQuad
　FullQuad
　SignalEdge
の中から選択することができます。GPIO の PIN 割り当てのときに

```
encoder1.attachSingleEdge(2, 15);
```
のように設定します。
exapmle では HalfQuad となっており、回転させると 2 個づつカウントし、時折ミスカウントしました。私の手持ちのエンコーダーでは SignalEdge に設定することにより安定してカウントできるようになりました。
#### ライブラリの設定、関数など
ソースなどを確認したところ以下の設定や関数が利用できるようです。

```
Encoder Function
   attachHalfQuad(PiNumberA, PinNumberB)
   attachFullQuad(PiNumberA, PinNumberB)
   attachSingleEdge(PiNumberA, PinNumberB)
   
   Encode.setCount()
   Encode.getCount()
   Encode.getCountRAW()
   Encode.clearCount()
   Encode.pauseCount()
   Encode.resumeCount()
```
### etc
ロータリーエンコーダーの使い道として回転させて数値を入力する、というのの他にメニューを選択するなどがあります。このときにはカウント値ではなく Up/Down の方向だけが欲しいことがあります。このライブラリではそれらの関数は無いようです。
【jquery,js】マウスオーバーで属性を取得する [attr,hover] [js03_20210217]

####  <font color='orange'>処理の概要</font>
リンクにマウスオーバーすると、リンクのタイトルをテキストボックスに表示する

##### 処理のフロー：
　(1)リンクにマウスポインターを乗せる
　(2)リンクのa要素からtitle属性の値を取得
　(3)取得したタイトル属性をテキストボックスに表示する

####  <font color='orange'>画面イメージ</font>


#####画像１
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/c32955ac-7637-9158-6095-a0a06c68268e.png" width="400px">

#####画像２
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/b2037df9-3ae6-bc4e-e205-fd6d079fe571.png" width="400px">


####  <font color='orange'>ソースコード</font>
```html:index.html
<body>
       <a href="" title="グーグルの検索サイトです。" class="link">
         グーグル
       </a>
       <br>
       <a href="" title="ヤフーの検索サイトです。" class="link">
         ヤフー
       </a>
       <br>

       <textarea style="height: 2em; width: 400px; color: blue;" id="output"></textarea>
    </body>
```

```javascript:main.js
$(function(){
    $("a.link").hover(function(){
        var ele = $(this);
        var title = ele.attr("title");
        $("#output").val(title);
    },function(){
        $("#output").val("");
    })
})
```

####  <font color='orange'>ポイント</font>
html：
(1) -
js：
(1)attrで属性を取得する（html系はattr。input系は<font color='blue'>prop</font>）
(2)hover()メソッドにイベントを登録する。このとき、第一引数は【乗った時用の処理】、第二引数は【外れた時用の処理】

####  <font color='orange'>参考資料</font>
JavaScript(仕事の現場でサッと使える！デザイン教科書)　p170
Lambdaから同一アカウントの異なるリージョンのLambdaを呼び出す

# 構成

![Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344711/27d13986-824f-ddbc-f33a-9422b8bcdf4a.png)

# 呼び出し先の設定

　コードは適当です。

```py:呼び出し先

def lambda_handler(event, context):
    test = "呼ばれたよ！"
    return test
```

　Lambdaからの呼び出しを許可するためのアクセス許可を付与します。
　同一アカウント同一リージョン間でのLambda呼び出しでは必要ありませんが、異なるリージョン間で呼び出す場合は必要になるようです。
　異なるアカウント間でLambdaを呼び出したことはありませんが、おそらく今回のようにアクセス許可を付与する必要があると思います。
　ただしこのポリシーは全てのアカウントからLambdaを使用できてしまうので、ソースアカウントを指定したポリシーを使用した方がいいでしょう。

```json:リソースベースのポリシー
{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "lambda",
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:${AWS::AccountId}:function:test-hia"
    }
  ]
}
```

　コンソールからは設定できないので、CLIで設定しました。
　言っていませんでしたが、東京リージョンからバージニア北部リージョンのLambdaを呼び出しています。

```
aws lambda add-permission --function-name ${FUNCTION_NAME}\
 --action lambda:InvokeFunction --principal lambda.amazonaws.com\
 --statement-id lambda --profile $PROFILE --region us-east-1
```

# 呼び出し元の設定

```py:呼び出し元
import json
import boto3
import os

def lambda_handler(event, context):
    
    payload = json.dumps(event).encode()
    
    client = boto3.client("lambda", "us-east-1")    
    
    response = client.invoke(
        FunctionName = os.environ.get("FUNCTION_ARN"),
        InvocationType = "RequestResponse",
        Payload = payload
    )
    return json.loads(response["Payload"].read())
```

　`Invoke`の`Payload`は `<class 'bytes'>, <class 'bytearray'>, file-like object`のいずれかである必要があるそうです。
　`json.dumps`でJSON形式の`srt`オブジェクトにして、`encode()`でバイト型に変換しています。
　`str`のままでもエラーは発生しませんが、バイト型が推奨されているようなのでバイト型を使用します。
　https://github.com/boto/boto3/issues/1543#issuecomment-384813230

　`response["Payload"]`は`<class 'botocore.response.StreamingBody'>
`であり、`read()`でバイナリ文字列を取得しています。
　`json.loads()`はそのバイナリ文字列（bytes型）をPythonオブジェクトにデシリアライズします。
　結果的に、呼び出し先の`呼ばれたよ！`が`return`で戻ってきます。

![スクリーンショット 2021-02-16 23.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344711/f5d0e01a-1e9c-4024-c50d-686d26e629eb.png)

　実行ロールにはデフォルトでアタッチされるポリシーの他に、Lambdaを呼び出すアクションを許可するポリシーを作成してアタッチします。

```json:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:${呼び出し先のLambdaアカウント}:function:*"
        }
    ]
}
```
Angular勉強会 #7 ディレクティブ③ -自作属性ディレクティブ-

## おさらい: ディレクティブとは
- ディレクティブとは、Angularのテンプレートの中で用いる特殊な指令である
- Componentと違い、HTMLの属性のように記述するという特徴がある
    - 実は正確に言うとComponentはDirectiveの一種
- ディレクティブを用いることで、効率的なViewの制御を行うことができる
- ディレクティブには、属性ディレクティブと構造ディレクティブがある

---
## 属性ディレクティブの自作
- Componentと同様にDirectiveも自作できる
- まずは実装がシンプルな属性ディレクティブから
    - 指定するとハイライトがあたったような変更を行うディレクティブを作成する


---
## 何もしない属性ディレクティブ
`app.module.ts` に追加するのを忘れないこと


```ts
@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
  constructor() { }
}
```

```html
<p>
  Start editing to see some <span appHighlight>magic</span> happen :)
</p>
```

```ts:app.module.ts
@NgModule({
  imports:      [ BrowserModule, FormsModule ],
  declarations: [ AppComponent, HelloComponent, HighlightDirective ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
```

---
## 属性ディレクティブに仕事をさせる
属性ディレクティブには、コンストラクタにその属性が割り付けられた要素の参照を取得できる。
これによって、要素への介入が可能となる。


```ts
import { Directive, ElementRef } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
    constructor(el: ElementRef) {
       el.nativeElement.style.backgroundColor = 'yellow';
    }
}
```

---
## 属性ディレクティブにもっと仕事をさせる
ディレクティブが設定された要素のイベントフックなども可能。マウスホバーで色が変わる実装にしてみる。

```ts
@Directive({
  selector: "[appHighlight]"
})
export class HighlightDirective {
  constructor(private el: ElementRef) {}

  @HostListener("mouseenter") onMouseEnter() {
    this.highlight("yellow");
  }

  @HostListener("mouseleave") onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}
```
---
## 属性ディレクティブに値を渡す
Componentと同様に、 `＠Input` で値を受け渡すことができる

```ts
@Directive({
  selector: "[appHighlight]"
})
export class HighlightDirective {
  @Input() highlightColor = "yellow"

  constructor(private el: ElementRef) {}

  @HostListener("mouseenter") onMouseEnter() {
    this.highlight(this.highlightColor);
  }

  @HostListener("mouseleave") onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}
```

```html
<p>
  Start editing to see some <span appHighlight highlightColor="red">magic</span> happen :)
</p>
```

---
## カスタム属性ディレクティブの使い所
- 1要素内で完結することなら、結構自由にできる
- class や style とできることはかぶるが、こちらのほうが柔軟性はあり、表現力も高い
Gulpを使用し始めて3日目（）

#Gulpを使用し始めて

CodeMafiaさんのGulpの動画見て、勉強し始めました。
以下がリンクです。
https://www.youtube.com/channel/UCQ8iiBr45MDWD7hDp3FDmQg

Gulpで基本的な画像の圧縮、サイズ変更、ScssからCSSに変換、babelを使用したりと
以外に面白かったです。

今回は動画には無かったCSSとJSの圧縮をやったので、アウトプット。
自分が分かるようにコードを乗せて置くだけですが（笑）

##下準備

CSSとJSの圧縮用のプラグインをインストール。(私はnpmでインストールしています。)


```
$ npm install -D gulp-clean-css
$ npm install -D gulp-uglify
```

次にgulpでプラグインをまとめて読み込みます [gulp-load-plugins]
ここはCodeMafiaさんの動画でも紹介されています。

```
const {src, dest} = require('gulp');
const loadPlugins = require('gulp-load-plugins');
const $ = loadPlugins();
```

##CSS圧縮

以下のコードを書いたら無事動きました。

```
// cssの圧縮
function clean() {
  return src('./src/css/*.css')
      .pipe($.cleanCss())
      .pipe(dest('./dist/css'));
}
exports.clean = clean;
```

##JS圧縮

```
//jsの圧縮
function uglify() {
  return src('./src/js/*.js')
      .pipe($.uglify())
      .pipe(dest('./dist/js'));
}
exports.uglify = uglify;
```


##出力結果

```
//CSSの圧縮
h1{color:#663399}h2{width:300px;height:200px;background-color:#bc8f8f}
```

```
//JSの圧縮
const init=()=>{console.log(hello("Bob","Tom"))};function hello(...e){return e.reduce((e,o)=>`Helo Helo! ${e} ${o}`)}document.addEventListener("DOMContentLoaded",e=>{init()});
```

こんな風に一列になるので、最高に面白かったです。
次はseries, parallelを使って、もっとまとめてやりたいですね。
頑張ります。

以上、ありがとうございました。
【Laravel7】アクセサについて調べてみた。

#アクセサとは
データベースからデータを取得する際に走る処理のこと。

##公式ドキュメント
https://readouble.com/laravel/7.x/ja/eloquent-mutators.html

##何が便利か

IDだけDBに保存し、アクセサでconfig内においたファイルから、都道府県名を自動で出す。という処理ができる。

文字より数字のほうがサイズが小さいので、少ないデータ量でやり取りができる。

##書き方

 - configディレクトリにファイルを作って、データをおく
 - アクセサをモデル内に定義する
 - コントローラにアクセサを書く

###DBに登録されているidから、都道府県名を取得するアクセサを作る場合。

#### configディレクトリにファイルを作って、データをおく。

連想配列に、idをキー、都道府県名を値として入れる。

config/pref.php

```
<?php

return array(
    '1' => '北海道',
    '2' => '青森県',
    '3' => '岩手県',
    '4' => '宮城県',
    '5' => '秋田県',
    '6' => '山形県',
    '7' => '福島県',
    '8' => '茨城県',
    '9' => '栃木県',
    '10' => '群馬県',
    '11' => '埼玉県',
    '12' => '千葉県',
    '13' => '東京都',
    '14' => '神奈川県',
    '15' => '新潟県',
    '16' => '富山県',
    '17' => '石川県',
    '18' => '福井県',
    '19' => '山梨県',
    '20' => '長野県',
    '21' => '岐阜県',
    '22' => '静岡県',
    '23' => '愛知県',
    '24' => '三重県',
    '25' => '滋賀県',
    '26' => '京都府',
    '27' => '大阪府',
    '28' => '兵庫県',
    '29' => '奈良県',
    '30' => '和歌山県',
    '31' => '鳥取県',
    '32' => '島根県',
    '33' => '岡山県',
    '34' => '広島県',
    '35' => '山口県',
    '36' => '徳島県',
    '37' => '香川県',
    '38' => '愛媛県',
    '39' => '高知県',
    '40' => '福岡県',
    '41' => '佐賀県',
    '42' => '長崎県',
    '43' => '熊本県',
    '44' => '大分県',
    '45' => '宮崎県',
    '46' => '鹿児島県',
    '47' => '沖縄県'
);
```
#### アクセサをモデル内に定義する

```
getHogeAttribute()
```
Hogeの部分を任意の文字にする。
キャメルケースで書くので、最初は大文字にする。

モデルのファイルに以下を記述。
prefecturesテーブルを作ったなら、app/Prefecture.phpに書く。

User.php

```
    public function getPrefNameAttribute()
    {
        return config('pref.' . $this->location);
    }
```

今回はUsersテーブルにlocationカラムを作ってそこにidを保存することにした。

#### コントローラにアクセサを書く

```
    public function index() {
        $user = User::find(2);
        dd($user->pref_name);
    }
```

（本来なら、viewで表示できるようにするが、すぐに結果が見たかったのでddで表示させるようにした。）

取り出したレコードを$userに代入。

```
$user->pref_name；
```
と書くことで、自動でアクセサがidから都道府県名を取得し返してくれる。

アクセサを呼び出す記述は、アンダースコアなしで、$user->prefnameと書いてもOK。
（アンダースコア付けてたほうが、アクセサっぽくて見やすいかもしれない。。。）

#### 結果

都道府県名が表示される

##まだわからないこと

 - アクセサはLaravelだけの機能ではない？
 - ミューテタっていうのもあるらしい。

調べれば調べるほど知らないことがでてくるぞ！
コツコツ調べよう。
CRC-15-CANを計算するプログラムを書いた

#はじめに
仕事でCAN通信のプログラムを書いているんだけど、CRCエラーの表示が出る。
デバッグのために、CRCの変換プログラムが必要になっった。
CANのCRCはCRC-15という特殊なフォーマットでネット上に資料が少ない。
ソースや調べたことをまとめておくことにした。

#実装例
言語はcを使用。
（追記）コメントでint_to_binstr()の終端処理等の記述が抜けていたという指摘があり、修正した。

```c

#include <stdio.h>
#include <stdint.h>

//  int to bin
char* int_to_binstr(char buff[], int bin, int len)
{
    int i;

    for (i = 0; i < len; i++) {
        if (bin & (1UL << (len - i - 1))) {
            buff[i] = '1';
        }
        else {
            buff[i] = '0';
        }
    }
    buff[len] = '\0';
    return buff;
}

uint16_t can_crc_next(uint16_t crc, uint8_t data)
{
    uint8_t i;
    crc ^= (uint16_t)data << 7;

    for (i = 0; i < 8; i++) {
        crc <<= 1;
        if (crc & 0x8000) {
            crc ^= 0xc599;
        }
    }
    return crc & 0x7fff;
}

void cal_crc15(unsigned char* buff, int len) {
    uint16_t crc;
    crc = 0;

    printf("crc15 0x");
    for (int i = 0; i < len; i++) {
        printf("%02X ", buff[i]);
    }

    printf("\n-> "); 

    for (int i = 0; i < len; i++) {
        crc = can_crc_next(crc, buff[i]);
    }
    char binstr[16];
    printf("0x%04X(%s)\n", crc, int_to_binstr(binstr, (int)crc, 15));
}

int main()
{
    uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    cal_crc15(data, 11);
}

```

#CRC元データについて

CRCの元データはSOFからデータまで。スタッフビットは除く。
バイナリはHEXにする。
SOF側が半端なビットになるようにする。

![CRC元データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601058/5d9a1427-ac65-0e57-825d-75b02f0231a2.png)

```c
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
```

#プログラムの動作

CRCの初期値は0。

```c

crc = 0;
```

データをHEXごとに取り出して7ビット左シフトしてCRCと排他的論理和をとる。

```c

crc ^= (uint16_t)data << 7;
```

CRCを1ビット左シフト

```c

crc <<= 1;
```

CRCの最上位ビットが1なら、CRC15の生成多項式x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1(=0xc599)との排他的論理和を取る。

```c

        if (crc & 0x8000) {
            crc ^= 0xc599;
        }
```

15ビットなので16ビットの最上位ビットを省く。

```c

return crc & 0x7fff;
```

#注意

CANコントローラ（MCP2515）の吐き出した値と一致することは確認できているが、CAN15の仕様と完全に一致しているかは確認できていない。
おそらく大丈夫だとは思うが。

#参考URL
http://forum.easyelectronics.ru/viewtopic.php?f=49&t=34508
https://qiita.com/niQSun/items/5bf1d8d9ceea16d83951
https://qiita.com/dearblue/items/669e2ce2fae57baf1e90
https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
https://reveng.sourceforge.io/crc-catalogue/1-15.htm#crc.cat-bits.15
【Ruby on Rails】active_model_serializersのキーをキャメルケースにする方法

active_model_serializersはデフォルトRuby風のスネークケースでレスポンスを返しますが、キャメルケースにするのは簡単で、イニシャライザフォルダの中で定義すればいいです。

```ruby:config/initializers/active_model_serializers.rb
ActiveModelSerializers.config.key_transform = :camel_lower
```

*サーバーの再起動が必要です*
GoogleAppsScriptを使って検索条件に当てはまるメールの情報をスプレッドシートに取得する

久々にスクリプト組んだのでメモ兼で残しときます。
マークダウン記法も久々

#やりたいこと
特定の送信者からの定形メールを過去に渡ってその日時を取得したいという監査的な仕事です。
メール1つ1つ開いて時間を転記するなんてやってられないのでGAS使って取得したかったです。

#コード全文
忘れないうちにコピペ

```javascript:コード.gs
function getMailInfo(){
/*---------------------------
　　1. 検索情報の設定
---------------------------*/

// 検索範囲を設定
  const configSheet =SpreadsheetApp.getActiveSpreadsheet().getSheetByName("条件設定");

  const start = 0;
  const max = 500; //検索数上限（デフォは500）

// 検索条件をセット
  const mFrom = "from:" + configSheet.getRange(1,2).getValue();　// from検索
  const mSubject = "subject:" + configSheet.getRange(2,2).getValue(); // 件名検索
  const query = mSubject + " " + mFrom;　// 検索条件をセット

/*---------------------------
　　2. 検索の実行
---------------------------*/
  // 検索メソッドを実行しスレッドを配列へ
  const threads = GmailApp.search(query,start,max);
  // スレッドの配列をメッセージの配列へ変換
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);

  const messageValues = [];

  // 各メッセージから情報を取得、recordへpush していく
  for(const messages of messagesForThreads){
    const message = messages[0];
    
    const record = [
      message.getDate(),
      message.getFrom(),
      message.getSubject()
    ];

    messageValues.push(record);
    
  }

/*---------------------------
　　3. スプレッドシートに転記する
---------------------------*/
// 転記するシート情報を設定
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("取得結果");
  const lastRow = sheet.getLastRow();

// 転記
  sheet.getRange(lastRow+1,1,messageValues.length, messageValues[0].length).setValues(messageValues);

}
```

## 1.検索情報の設定
一度きりじゃなくて、似た内容でまた検索する可能性も考慮して、設定（fromと件名）シートと情報を記入するシートは分けました。
B1セルにfrom(送信元メールアドレス)
B2セルにSubject(件名)
を入れるような仕組み

Gmailは仕様上、一度に`search`メソッドで取得出来るのは500件、一日で20,000件が上限らしい。
コードでは上限の500にしてるけど、そんなにヒットしないなら100とか200とかにしといたほうが良さそうです。

## 2.検索の実行
`search`で取得してくるのは個別のメールではなくて、まずはスレッド(`threads`)のようです。個別のメールは`messages`というものらしく、スレッドから取得してくる必要があるらしいです。
だから`search`してから`getMessagesForThreads`してます。

あとは`for~of~`で1つ1つ取り出しては配列にまとめています。

## 3.スプレッドシートに転記する
あとは簡単。毎度おなじみで`getRange`して`setValues`していきます。

# 補足など
Javascriptは`let`、`const`で学んだのでGoogleAppsScriptでも使えるのはなんだか嬉しいです！

アラートやエラー回避などなど全くなにもやってないので必要なときにまたやります。
MacでEPS形式の図を作成する


# はじめに
人は生まれながらにMacで**EPS**という保存形式で画像を保存したいはず！
特に論文用に図を作るときなどに参考になるかも。

一番簡単なのは、[Adobe Illustrator](https://www.adobe.com/jp/products/illustrator/beginner.html)というアプリケーションを購入しちゃうこと。
いわゆる「イラレ」というやつですね。
ただ、月々1980円と割と高額。。。

そこで無料でEPS画像を作成する方法をいくつか紹介します

# EPSとは?
- EPSとは「Encapsulated Post Script」の略。
- PostScript (PS)によって記述されたベクタ形式の画像データを保存するためのファイル形式の一つ。
- ベクタデータとビットマップデータを組み合わせた画像を保存することができる。

ざっっっっっくり言うと、拡大してもボケない綺麗な図。

# Epsの図の作り方①: PowerPoint + ターミナル

### (1) PowerPointでPS形式で書き出す
1. PowerPoint or Keynoteで図を作る．
2. [ファイル] -> [プリント] をクリック
3. [スライド数: 選択されたスライド] にチェック
4. 左下のプルダウンから [PostScriptsとして保存] を選択して、PS形式で保存

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582061/cf5aa7d6-6886-f1c9-4c0d-bcb9e67d4444.png">


### (2) PS形式をEPS形式にする

1. ターミナルに以下のコマンドを打つ

 ```ps2eps star.ps  -f  --rotate=+```

- ```-f```は上書き保存
- ```--rotate```は画像を回転させるオプション。
    - ```--rotate=-```で反時計回りに90度回転 
    - ``` --rotate=+```で時計回りに90度回転 
    - ``` --rotate=^```で180度回転

いちいちPS形式を介さないといけないのが面倒だけど、ちゃんとEPS形式で保存される。

# Epsの図の作り方②: TexShop
- TeXshopを使ってもできるらしい
- こちらのサイトを参考にどうぞ
    - [「[Mac]画像をepsに変換」](https://qiita.com/okateim/items/b1139e90f54633ac48d6)

# Epsの図の作り方③: ImageMagick
- ImageMagicというソフトを使う
- こちらのサイトを参考にどうぞ
    - [Mac で 論文のための eps を作成する](https://ultrabem-branch3.com/informatics/basics/image_mac_eps)
【SwiftUI】公式 Tutorials「 Animating Views and Transitions」の解説Part.4

#この記事は何？
Section1「Add Hiking Data to the App」で作成するビューのコードを読んでみました。

###環境
macOS 11.2.1
Xcode 12.4
Swift 5.3

#Hike型
長距離の移動（つまり、ハイキング）をモデル化する構造体。
主に5つの変数プロパティに加えて、型プロパティ`formatter`、計算プロパティ`distanceText`が定義されている。

````Swift:
struct Hike: Codable, Hashable, Identifiable {
    var id: Int
    var name: String
    var distance: Double
    var difficulty: Int
    var observations: [Observation]
    
    static var formatter = LengthFormatter()
    
    var distanceText: String {
        Hike.formatter.string(fromValue: distance, unit: .kilometer)
    }
    
    struct Observation: Codable, Hashable {
        var distanceFromStart: Double

        var elevation: Range<Double>
        var pace:      Range<Double>
        var heartRate: Range<Double>
    }
}
````

変数プロパティ

 - `id` - 識別番号
 * `name` - ハイキングの名称
 * `distance` - 移動した距離
 * `difficulty` - 難易度
 * `observations` - 各種観測値のコレクション

計算プロパティ

 * `distanceText` - そのハイイングで移動した距離を「km単位に換算した文字列」で返す

型プロパティ

 * `formatter` - `distanceText`のボディで使用される`LengthFormatter`型インスタンス

ネスト型の`Observation`構造体

* 一定間隔で観測されることを意図したハイキング情報だと思われる
* `distanceFromStart` - スタート地点からの距離
* `elevation` - 高低差
* `pace` - 移動ペース
* `heartRate` - 心拍



#HikeData.json
アプリのモデルデータであるHike型として読み込まれるJSON形式のデータ。
`observations`キーに含まれる値のうち、`elevation`, `pace`, `heartRate`が`HikeGraph`ビューにてグラフ表示される。

````JSON:Hikeデータ（サンプル数を省略）
[
    {
        "name":"Lonesome Ridge Trail",
        "id":1001,
        "distance":4.5,
        "difficulty":3,
        "observations":
       [
            {
                "elevation":[ 291.65263635636268,
                              309.26016677925196 ],
                "pace":[ 396.08716481908732,
                         403.68937873525232 ],
                "heartRate":[ 117.16351898665887,
                              121.95815455919609 ],
                "distanceFromStart":0 
            },
            {
                "elevation":[ 299.24001936628116,
                              317.44584350790012 ],
                "pace":[ 380.19020240756623,
                         395.3978319010256 ],
                "heartRate":[ 117.6410892152911,
                              124.82185220506081
                ],
                "distanceFromStart":0.375
            }
       ]
    },
    {
        "name":"Lonesome Ridge Trail",
        "id":1002,
        "distance":4.5,
        "difficulty":3,
        "observations":[
            {
                "elevation":[ 291.65263635636268,
                              309.26016677925196 ],
                "pace":[ 396.08716481908732,
                         403.68937873525232 ],
                "heartRate":[ 117.16351898665887,
                              121.95815455919609 ],
                "distanceFromStart":0
            }
        ]
    }
]
````
2020 Java advent calendar への苦情

序論
===

これは、技術的な話というよりは、コミュニティ運営に関するエントリーです。
ちなみにキータとかいう場所に文章を書くのは初めてです。

私は多くのインフルエンサーが口にする、「ノウハウとか知識をどんどん公表する人のもとに有用な情報が集まるという考え方に、その人が困っている情報があつまるという現象をよく見かけます。

例えば、 JavaEE に関する質の高い情報を発信し続けたキクタローさんに、様々な情報が集まっていたり、
私のような凡人では思いつかないような鋭いアイデアを検証・発表する YujiSoftware さんに
多くの情報が集まっているのをよく見ます。

このようにたくさんの情報を発信する方は、正しい情報を発信できてなくていいのです。
Java のコミュニティーには間違えた情報を正してくれる実力のあるエンジニアが大量にいます。
間違えた情報を発信しても正しい情報を教えてくれます。

そのような意味で情報を発信すること、これは非常にコミュニティにとって価値のある行為です。

本論
===

さて、今回の 2020(2021?)の Java アドベントカレンダーで唯一にして最大の汚点であると思うのは、
このアドベントカレンダーを企画した人間が、

- 聞きたいことを述べている割には自分でどのような挑戦をした結果、どのような結果が得られたかを公表していない
- 貢献されているのかいまいちわからない JJUG にサポートを丸投げしている
- 聞きたいことについて誰も書いてないから、感謝を述べるどころか消息不明になった

というところです。

このようなコミュニティーの努力に対して、フリーライドをしているという自覚があるのでしょうか？
これでは、 OSS の成果に対してフリーライドした挙げ句、利用している OSS の API 変更に対応できず、ビジネスを諦めるような企業と何ら変わりないと思われます。
つまり、エンジニアとして継続的に成長が期待できない人間にしか見えません。
Kubernetes が云々という質問していましたけど、この方は本当に Kubernetes を理解しているのかどうか怪しいとしか思えません。
すべての行動から、おっしゃってることがすべて不審にしか聞こえなくなります。

結論
===

今回 Java アドベントカレンダーを企画された方にはぜひともエントリーされた内容について深堀りした
ドキュメントを書くいてより大きな貢献を示すか、無理なら垢消せという感想しかありません。(まあ、私がこんなこと言ったら、私の垢が消されるだけですけど、別にキータのアカウントに対して何の思い入れもないので、別にどうということもありませんがね…)

以上、提案社、キータ？ JJUG が継続的に成長していくためのアイデアを書かせていただきました。
役に立つかはわかりませんが、心に留めておいていただければ幸いです。
タイピング初心者がタッチタイピングができるまで


・Before
	画面とキーボードを確認しながらタイピング
		１分間　２５文字
・after
	キーボードを一切見ずにタイピング
		１分間　１４０文字

・練習期間　４ヶ月　平均練習時間　１時間程度

▼やったこと
《練習初期》
キーボードの正しい打ち方を調べることからはじめる
ホームポジションに慣れる練習
指ごとに指定された範囲を体で覚えるための反復練習
ハンドタオルで手元を隠してのタイピング練習（物理的に見る癖を無くすため）

・ここまでに使ったツール
	TypingClub（英語のサイト）
	URL：https://www.typingclub.com/
	【特徴】
		・無料でできる（広告、一部ミニゲーム解除の場合月額課金）
		・WEBブラウザで気軽に出来る（ダウンロードなどしなくていい）
		・アカウント登録するため成長の記録が見える
		・ゲーム感覚で進められる
		・ホームポジションの講座から始まる
		・キーボードの種類の対応が豊富（JISキー対応）
		・画面上でキーボード画面が見える
	【選んだ理由】
		・プログラミングをする上で英字を打つことが多いため
		・記号や数字の練習も出来るため（他のサイトでは文字のみがほとんど）
		・間違えた際に打ち直さないと進めない仕組みになっているため
		（実際の文章タイピングに近い感覚で出来る）
	【成果】
		・正しいポジションで見ないで打てるようになる
		・大文字を交えて打つため、Shiftキーの使い方場所を覚えられた

　《現状》
キーボードにこだわるようになった（HHKBに手を出した）もちろん怒られた
スピードを上げるための練習に移行した
練習をする事が習慣化（気づいたら勝手にやっている）

・ここから新たに使ったツール
	寿司打
	URL：http://typingx0.net/sushida/play.html?kana
	【特徴】
		・無料でできる
		・WEBブラウザで気軽に出来る（ダウンロードなどしなくていい）
		・日本語のタイピング練習が出来る
		・上記よりゲーム感覚で出来る（打てた文字数で寿司屋で元を取れるかを競うゲーム）
	【選んだ理由】
		・日本のタイピング練習サイトで一番有名
		・ビジネスシーンで日本語タイピングが必要なため
	【成果】
		・日本語の打つスピードが劇的に上がった

TypingTest(英語のサイト）
	URL：https://www.keyhero.com/free-typing-test/?lang=0
	【特徴】
		・無料でできる
		・WEBブラウザで気軽に出来る（ダウンロードなどしなくていい）
		・英文がランダムのため同じ文になることはあまりない
	【選んだ理由】
		・英文の長文の練習が出来る
		・どこまで打ったかを把握しながら打つため速度が上がる
		・間違えた際に打ち直さないと進めない仕組みになっているため
		（実際の文章タイピングに近い感覚で出来る）
	【成果】
		・英単語ごとに打つ習慣が出来結果速度アップした
	
	

終わりに

タッチタイピングをするきっかけは単純にかっこいいと思ったからです。
何故習慣化出来たかというと今まで出来なかったことが出来るようになり昨日と今日で何が出来るようになったかを
比較しやすく昨日より出来なくなることはないからです。やればやるだけ返って来るからです。成果として。

実際に自分で習得するまでにいろいろ調べたのでこれから始める方の手助けになればと思い書きました。
アウトプットの練習のためにQiitaに記事を書くが本音ではあります。
最後まで読んでくださりありがとうございました。
既存プロダクトにBFFの導入、１画面１API思想　かけるべき工数の割にメリット少ないと思う

# BFFの導入、１画面１APIにするメリット

- 通信コストが減る
- クライアントのロジックが簡潔になる
- AndroidとiOSで同じ画面構成なら、表示用データを作るためのロジックをAPI層１箇所にまとめられる

# 問題となりがちな点

- 画面用APIは、クライアントの開発者が開発する（それができないと間に一層挟まるため開発が遅くなる）ことになるが、問題ないのか？
- BFF層のサーバーメンテナンスは誰がやるのか？
- 今現在使っているAPIへの新機能追加は止められない。並行してBFFの開発できるのか？
- クライアント開発者のスキルの問題、やる気の問題、キャリアの問題は解決されているのか？
- 上記のような問題点があるけど、手間暇かけてAPI層を作り変えるメリットある？

# 個人の感想

技術選定、APIの設計・開発、ドキュメントツール、インフラ構築、体制構築、クライアント開発者の意思確認、クライアント側の開発、やることの多さのわりにメリットが最初に上げた点だけだと辛い
自分自身過去にレガシーAPIのリプレイスをやったりしたが、かけた工数に比べての見返りは小さいと思う

APIが３桁単位で乱立しててそれぞれがスパゲッティに絡まってるとか、レガシーシステムのリプレイスのついでにやるとかならありかなと思う
プロダクト作って２～３年目とかで手を出すようなことではないと思う

BFFの資料とか結構出てきているけど、やることは多いけど考えることは単純ではあるので、たぶん走り出してしまえば上手く行くとは思う
でもかけた工数分のメリットは出ているのかなあとつくづく気になる

BFFは技術視点のメリットである部分が大きいので、プロダクトを熟知していなくても提案することができる
今思うと、大して自社のプロダクトに興味なかった＆最新の技術触ってたかったからやってたような気もする
自分のために作った仕事になってないか、よく考えたい
A - Apple Pie, B - Magic 2, C - Reconciled?, A - ><

2021/2/16
精進内容

##[A - Apple Pie](https://atcoder.jp/contests/abc128/tasks/abc128_a)

O(1)

```python:python
a, p = list(map(int, input().split()))
res = (a * 3 + p) // 2
print(res)
```

##[B - Magic 2](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_b)

O(N)
好みで書き方を変えました。

問題は赤を倍にした時、しなかった時、緑を倍にした時、、、、場合分けをしてdfsで処理をしました。

```python:python
import math
import heapq
import itertools
from functools import reduce

large = False
k = 0
 
def dfs(red, green, blue, num):
    global k, large
    if k < num:
        return
    if red < green and green < blue:
        large=True
 
    dfs(red*2, green, blue, num+1)
    dfs(red, green*2, blue, num+1)
    dfs(red, green, blue*2, num+1)
 
 
def main():
    global k
    red, green, blue = list(map(int, input().split()))
    k = int(input())
 
    dfs(red, green, blue, 0)
 
    if large:
        print("Yes")
    else:
        print("No")
 
 
# エントリポイント
if __name__ == '__main__':
    main()
```

##[C - Reconciled?](https://atcoder.jp/contests/abc065/tasks/arc076_a)

O(1)
犬の並べ方がN！、猿の並べ方がM！です。
|N-M| = 1の時、それをお互いに交互に組み合わせるのでN!M!です。
|N-M| = 0の時、犬が先頭の時と猿が先頭の時の２パターンが存在します。
２*N!M!になります。
|N-M|>=2の時、並べる事ができません。

```python:python
import math
import heapq
import itertools
from functools import reduce

def main():
    N, M = list(map(int, input().split()))
 
    if abs(N-M) == 1:
        print(math.factorial(N) * math.factorial(M) % 1000000007)
    elif N==M:
        print(math.factorial(N) * math.factorial(M) * 2 % 1000000007)
    else:
        print(0)
 
# エントリポイント
if __name__ == '__main__':
    main()
```

##[A - ><](https://atcoder.jp/contests/agc040/tasks/agc040_a)

O(N)
<<<<のみならば、a < a+1 < a+2 < a...となります。
しかし、>>>>の時も考察しなければいけません。

分かりやすいのは、
a < a+1 < a+2 < max(a+3, b+4) > b+3 > b+2....
と<, >と分けて処理するのが分かりやすいです。

```python:python
import math
import heapq
import itertools
from functools import reduce

def main():
    S = str(input())
 
    total = 0
    dp = [0] * (len(S)+1)
    for i in range(0, len(S)):
        if S[i] == '<':
            dp[i+1] = max(dp[i+1], dp[i]+1)
    for i in range(len(S)-1, -1, -1):
        if S[i] == '>':
            dp[i] = max(dp[i], dp[i+1]+1)
    
    print(sum(dp))

# エントリポイント
if __name__ == '__main__':
    main()
```

##感想
茶色diff上位でも解けない問題が多いです。
どうやって勉強していくか悩んでます。
railsを使ってアプリを作る1

####プロジェクトの作り方####
rails new app_name
このコマンドでベースプロジェクトが作成される

####ページの作り方####
rails generate controller home top
home.rbを作成し、topメソッドまで作成してくれる
home/top.html.erbを作成してくれる
routes.rbに```get "home/top" => "heme#top"```を作ってくれる

***説明***
・home/topにアクセスすると、home.rbのtopメソッドが呼ばれ、その後home/topに対応したhtmlファイルが呼ばれる
・routesのhome/topをfefefeに変更するとアクセスする時もfefefeでOK


####ページの追加####
・homeコントローラに関するページを追加する時はコマンドが使用できない
・自分で手作業で作成する(list画面)
routes.rbに```get "list" => "home#list"```を作成する
homeコントローラーにlistメソッドを作成する
view/homeの中にlist.html.erbを作成する

新しくページを作る時の順番は
1、ルーティング
2、アクション
3、ビュー
の順番で作る

####リンクの作成と対応するroutes####
```<a href="/">TOPへ</a>```　→　```get "/" => home#top```
```<a href="/list">TOPへ</a>```　→　```get "lest" => home#list```
link_toメソッドを使った場合
<%= link_to("TOPへ","/") %>
<%= link_to("TOPへ","/list") %>
####その他####
画像ファイルの読み込み方```<img class="about-img" src="/tweets.png">```
Djangoにヘッダーを設定してGET/POSTでリクエストを送り、サーバーから取得する方法

「Djangoのheaderにトークンを設定して、それをサーバー側から取得したい」

ただそれだけだったのに。。。

なんでかうまくいかず四苦八苦していました。
AuthorizationにBearer Tokenを設定するやり方は実装経験があったのですが。。

結論から書くと、ヘッダーとしてセットした値が

```json
{
  "Abc-Def": "hoge"
}
```
だとしたらこれをDjango側から取り出すときは

```python
fuga = request.META["HTTP_ABC_DEF"] // fuga: "hoge"
```
と書けば取り出せます。
理由はよくわかりませんが

```With the exception of CONTENT_LENGTH and CONTENT_TYPE, as given above, any HTTP headers in the request are converted to META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be mapped to the META key HTTP_X_BENDER.```
https://docs.djangoproject.com/en/dev/ref/request-response/

「全ての文字列がアッパーケースに変換され、ハイフンはアンダースコアに変換され、プリフィックスにHTTP_がつく」らしいです。
てか英語でハイフンってhyphenだったんですねww
日本語かと思ってましたww