OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]指定した日の投稿数を検索する方法(非同期化込)

### 目的
ユーザーの詳細ページから指定した日の投稿数を求めたい

### 考え方
ユーザーの詳細ページでのアクションなのでuser_controllerに記述（viewも同様)
form_withで調べたい日付を送信してbookのcreated_atで検索をかける
検索結果をcountで数え、表示する

### 前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びBookモデル作成済み

# 1.ルーティング、コントローラー設定
routesの記述
```routes.rb
resources :users, only: [:index,:show,:edit,:update] do
    get 'search' => 'users#search'
end
```
rails routesでルーティングの確認
```
 user_search GET    /users/:user_id/search(.:format)         users#search
```
コントローラーの記述
```users_controller.rb
  def search
    user_books = User.find(params[:user_id]).books #user_idで取得したユーザの本の一覧を取得
    created_time = params[:created_at] #created_atをcreated_timeに代入
    if created_time == "" 
      @search_book = "日付が選択されていません"
    else
      @search_book = user_books.where(created_at: created_time.to_date.all_day).count 
    end
  end

```
created_time = params[:created_at]には日付を選ばなかった場合
```
[1] pry(#<UsersController>)> created_time
=> ""
```
となるので、 "" の時、日付が入力されていない旨のコメントを表示します
またcreated_timeに日付を選んで送信した時は
```
[2] pry(#<UsersController>)> created_time
=> "2022-12-06"
```
と日付までしか取得されないので、**.to_date.all_day**を用いて
```
[3] pry(#<UsersController>)> created_time.to_date.all_day
=> Tue, 06 Dec 2022 00:00:00.000000000 UTC +00:00..Tue, 06 Dec 2022 23:59:59.999999999 UTC +00:00
```
その日の午前０時から午後１１時５９分５９秒まで取得して、whereで検索をかけます

# 2.viewの記述
form_withにlocal: falseまたはdata{remote: true}を指定して非同期化します
また後に使うためidも指定
```views/users/_index_book.rb
<div class ="mb-4">
  <%= form_with url: user_search_path(@user), method: :get, local: false do |f| %>
    <%= f.date_field :created_at %>
    <%= f.submit '検索', class: 'btn btn-primary' %>
  <% end %>
</div>
<div id="search_result"> #非同期化のためidを指定
  <% if @search_book.present? %>
    <%= render 'search', search_book: @search_book %>
  <% end %>
</div>
```
**@search_book.present?**
オブジェクトが存在すればtrueを返し、存在しなければfalseを返すメソッド
@search_bookがある場合のみ部分テンプレートを表示します


次に新しく部分テンプレート_search.erbを作成
```views/users/_search.html.erb
<h4>検索結果</h4>
<table class='table table-bordered'>
  <thead>
    <tr> 
      <th>投稿数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><%= search_book %></td>
    </tr>
  </tbody>
</table>
```


# 3.非同期処理
views/users/search.js.erbを作成し以下のように記述
```search.js.erb
$("#search_count").html("<%= j(render 'search', search_book: @search_book) %>");
```
$("#　")の中にはviews/users/_index_book.rbで指定したidを入力
("<%= j(　) %>");の中には部分テンプレートの埋め込みを同じように入力

これで完成です！
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/b6556ed1-afa6-6cf7-b032-ef41a9d29223.png)

# 最後に
ご覧いただいた方、ありがとうございました
意見、感想等ありましたらご自由にご記入ください
Twilioやーる（Python 3.9）

# はじめに
Twilioやっていきまーす

https://www.twilio.com/docs/libraries/python

# 開発環境
- Windows 10 PC
- Python 3.9

# 導入
1．Twilioでアカウント作成

https://console.twilio.com/?frameUrl=%2Fconsole%3Fx-target-region%3Dus1

2．コンソールからSIDとTokenをメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/af05b446-66a6-36b1-0b79-23c893bab680.png)

3．Trialの残高

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/1aa6eb52-f3c4-5c01-b78f-d55192c3fad4.png)

4．Get a Twilio phone numberをクリックして電話番号を取得

5．Twilioのライブラリをインストール

pip install twilio

6．PythonからSMSを送ってみる

~~~send_sms.py
from twilio.rest import Client

# Your Account SID from twilio.com/console
account_sid = "Your Account SID"
# Your Auth Token from twilio.com/console
auth_token  = "Your Auth Token"

client = Client(account_sid, auth_token)

message = client.messages.create(
    to="My phone number", 
    from_="Twilio phone number",
    body="Hello from Python!")

print(message.sid)
~~~

7．実行するとSMSが届く！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/8e89394b-ec93-ec28-d0e3-036fd0cf90d6.png)

8．200円くらい使ったみたい?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/e730f94e-870e-8758-e853-9b30faf2f76e.png)

9．次は自分に電話をかけてみる

~~~new_record.py
from twilio.rest import Client

account_sid = "Your Account SID"
auth_token = "Your Auth Token"
client = Client(account_sid, auth_token)

call = client.calls.create(
    to="My phone number", 
    from_="Twilio phone number",
    url="http://demo.twilio.com/docs/voice.xml"
)

print(call.sid)
~~~

10．かかってきた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b1d26f41-be05-b1c9-9780-1d34ee560248.png)

11．26円くらいかかった？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/6a3420e3-da18-a9d0-dc46-834727a8cac7.png)

12．ちなみに http://demo.twilio.com/docs/voice.xml の中身

~~~
<Response>
  <Say voice="alice">Thanks for trying our documentation. Enjoy!</Say>
  <Play>http://demo.twilio.com/docs/classic.mp3</Play>
</Response>
~~~

なんか違うこと言ってた気がするけどまあいいや

13．電話履歴を確認

~~~existing_record.py
from twilio.rest import Client

account_sid = "Your Account SID"
auth_token = "Your Auth Token"
client = Client(account_sid, auth_token)

call = client.calls.get("call.id")
print(call.to)
~~~

先ほどcallした時にコマンドラインに表示されたcall.sidを入れるがエラー
AttributeError: 'CallContext' object has no attribute 'to'

14．SMSの履歴を確認

~~~iterate_through_records.py
from twilio.rest import Client

account_sid = "Your Account SID"
auth_token = "Your Auth Token"
client = Client(account_sid, auth_token)

for sms in client.messages.list():
  print(sms.to)
~~~

SMSを送った電話番号が表示された

お疲れ様でした
UI/UXを考慮する上で、絶対に忘れてはいけないコト

# 使い勝手の向上だ！UI/UXだ！にはご注意を
最近あまりきかなくなってきたこのことば「UI/UX」。使いにくいアプリケーションは使われない。使われなかったら、作ってないのと一緒。
ということから、使いやすいアプリケーションを構築しましょう！というのは正しい方向です。
# UI/UXというと表層の話になりがち
これが今回1番いいたいこと。すぐに、見た目の話になりがちなんですUI/UX。もちろん、見た目も大事。ただ、特にUXを考えた場合、見た目よりも大事なことがあります。
# UXはイロイロ考えるコト多いが大事なのは「表層ではないUX」
UXはかなり広い言葉で、UX向上は奥が深いです。ここで全部を語らないですが、まずは、これだけ覚えてください。それが、

**表層ではないUX**

要は見た目重視に流されないようにするという考え方です。一旦、見た目を忘れる。特に初期段階において、きれいな見た目を作ってはいけません。というのも、ある程度完成されたきれいな見た目をつくってしまうと、みための細かい点の改善にいきがちで根本的なUXの改善になりません。
また、きれいな見た目＝開発の進行具合、と勘違いする非技術者は少なくないです。
# 表層ではないUXの考え方
例えば、データベーススキーマ。導線、「カスタマージャーニー」なんていうコトバも使われますが、導線を考える上で、データの保存方法や場所は重要です。逆にいえば、イケてないスキーマ設計をしている場合、いくら表層で、がんばっても、使い勝手向上になりません。
実際、使い勝手向上しようとしていても、データの持ち方自体に根本的問題があり、表層をいくら改善しても、まったく、UX的に向上しないこともよくあります。
[Hubspot] リストを使ってワークフローを実行する

返信がなくなってしまったコンタクトに対して、
サイトの閲覧があった場合に通知する仕組みを作ります


# 作り方
## 前提環境
サイト内にはトラッキングコードを埋め込んでおり、サイト内の動向データを取得できている状態とします
連絡をしたことがわかる(返信/送信)プロパティがある状態もあるとします。

## リストを作る
![スクリーンショット 2022-12-06 16.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/85a9f4d1-2b20-4d54-11e7-4a85bda0a741.png)

返信が途切れてしまった人リストを作ります

条件としては、
問い合わせがあったことを示すプロパティ(ここでは要望回答)に値があり
こちらから送ったメッセージがある状態で
送ったメッセージの更新日時以降に返信プロパティの更新がないこと、とします

## ワークフローを組む
![スクリーンショット 2022-12-06 16.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108154/331fb11b-4495-b931-2ff5-f1d65e18cb7a.png)

コンタクトの登録条件は、今回リスト名にします。
またサイトの最後に閲覧された日時を1日前未満にして、サイトに訪問があったことを条件とします

そして最後にslack通知の設定をしたら完成です


# まとめ
コンタクトをリストとしても管理しつつ動向を通知したい時に便利です。
commitを分割したいときはこれ！



## はじめに
[Qiita株式会社のカレンダー](https://qiita.com/advent-calendar/2022/qiita-inc)の14日目は @mayobimu が担当します。

間違えてコミットしてしまった時、差分を消す為の上書きコミットを作成→fixup→再度別コミットとして作成し直すことはありませんか？gitが苦手な私にはありました...
調べてみると簡単に分割できたのでその方法を紹介します。



## 前提
以下のb+cをbとcに分割したい

```
commit ec868 (HEAD -> main)

    d

commit 377b

    b+c

commit f0d0

    a
```

## 手順
1.　`git log`を実行し分割したいコミットの１つ前のハッシュをコピーする

```
commit ec868 (HEAD -> main)

    d

commit 377b

    b+c

commit f0d0 #これ

    a
```

2.　コピーしたハッシュで`rebase -i ○○`をする

```
#　こんな感じのlog
pick 377b b+c
pick ec868 d
```

3.　分割したいコミットをeditに変更しエディタを終了させる
```
edit 377be2d b+c　#　今回はここ
pick 98a98ba d
```

4.　`git reset HEAD^`でコミットを１つ前に巻き戻す

5.　`git st`でファイルを確認し、適切にコミットを行う

:::note info
コミットを間違えたら`git rebase --abort`で２まで戻れます
:::

```
git add b.rb
git commit -m "b"
git add c.rb     
git commit -m "c"
```

```
#　こんな感じのlog
commit 6507 (HEAD)

    c

commit c74c

    b

commit f0d0

    a
```

6.　問題なければ`git rebase --continue`



:::note alert
分割したコミット以下のハッシュが変わるので注意
:::

```
#　思った通りに分割ができていることが確認できる
commit ca36 (HEAD -> main)

    d

commit 6507

    c

commit c74c

    b

commit f0d0

    a
```

## おわりに
fixupなどと組み合わせると綺麗なコミットログが作れますよ！

https://qiita.com/getty104/items/a9b56f30744dfe52a05f


[Qiita株式会社のカレンダー](https://qiita.com/advent-calendar/2022/qiita-inc)15日目は @tomoasleep と@masato930 が担当します！

ぜひ、[Qiita株式会社のカレンダー](https://qiita.com/advent-calendar/2022/qiita-inc)を購読設定して、明日の記事もご覧いただけると嬉しいです。
mermaidを描画してくれるmarkdownプレビューア


2022年に起こった地味に便利な変化の1つに、GitHubが、Markdownのコードブロックの[mermaid][mermaid]を図に変換して表示してくれるようになった[こと](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/)が上げられます(主観)。

これが便利なので、emacsでmarkdownを書きながら自動更新されると嬉しいなと思い、ファイルを見張り自動で更新しつつ、mermaid部分を描画してくれるようなツール[fosi][fosi]を作りました。

## インストールと使い方

fosi自体は、node.jsで実装されたCLIで、npmコマンドでインストールできます。

``` shell
npm i -g @hotoku/fosi
```

インストール後、markdownファイルがあるディレクトリに移動してください。
`fosi -i ファイル名`を実行すれば、サーバーがport 3000で立ち上がります。その後、ブラウザで[localhost:3000](http://localhost:3000)にアクセスすれば、markdownが変換されたHTMLが確認できます。
このとき、コードブロックにmermaidが含まれていれば、その部分は画像に変換されます。また、元のmarkdownファイルを更新すると、ブラウザ上の表示が自動で更新されるはずです。

### Emacsから起動する

↑というような作業を、毎回ターミナルから実行していたのですが、Emacsから直接起動したいなと思ったので、そのための[関数](https://github.com/hotoku/fosi/blob/main/elisp/fosi.el)も作りました。

1. 上記のファイルを適当なパスに保存
1. `M-x package-install-file`で、そのファイルをインストール
1. `init.el`に`(require 'fosi)`を記述

した上で`M-x fosi`を`.md`ファイルから呼び出すと、上と同じようにfosiサーバーが起動します。

小ネタですが、2023年も良きEmacs lifeを。

<!-- link -->
[mermaid]: https://mermaid-js.github.io/mermaid/#/
[fosi]: https://github.com/hotoku/fosi
【Laravel】whereとorWhereの併用で気をつけること

## はじめに
こんにちは！
バックエンドエンジニアの @kat0 です。
アドベント企画に参加するのは初めてですが、いつも書いているような記事を投稿しようと思います。

## 環境
Laravel v9.5.1 (PHP v8.1.3)


## 状況
組織1の管理者権限をもったユーザー（```role```が```owner```か```admin```）を取得したい。


## OKバージョン

組織1の管理者権限をもったユーザーのみ取得できる。

```php
User::where('role', UserRole::Owner->value)
    ->orWhere('role', UserRole::Admin->value)
    ->where('organization_id', 1)->get();

=> Illuminate\Database\Eloquent\Collection {#4690
     all: [
       App\Models\User {#4689
         id: 1,
         name: "山田太郎",
         email: "yamada_taro@gmail.com",
         organization_id: 1,
         role: 1,
       },
     ],
   }
```

```AND```検索の```where```より```OR```検索の```orWhere```が先にきているため、そちらが優先される。
よって「```role```が1か2」かつ「所属組織が1」のユーザーが取得できる。

```sql
select * from `users` where (`role` = ? or `role` = ?) and `organization_id` = ?
```

## NGバージョン

違う組織の管理者権限をもったユーザーも取得できてしまう。
（鈴木のぶ子さんは組織2の管理者権限をもったユーザー）

```php
User::where('organization_id', 1)
    ->where('role', UserRole::Owner->value)
    ->orWhere('role', UserRole::Admin->value)->get();

=> Illuminate\Database\Eloquent\Collection {#4700
     all: [
       App\Models\User {#4698
         id: 1,
         name: "山田太郎",
         email: "yamada_taro@gmail.com",
         organization_id: 1,
         role: 1,
       },
       App\Models\User {#4697
         id: 2,
         name: "鈴木のぶ子",
         email: "suzuki_nobuko@gmail.com",
         organization_id: 2,
         role: 2,
       },
     ],
   }
```

```OR```より```AND```の方が優先されるため、「所属組織が1かつ```role```が1」または「（所属組織は何でもよく）```role```が2」のユーザーが取得できてしまう。

```where```検索の順番が前後するだけで取得したいものと結果が変わってしまう…。

```sql
select * from `users` where `organization_id` = ? and `role` = ? or `role` = ?
```


## ドキュメントには

>クエリを論理的にグループ化するため、括弧内のいくつかの"where"句をグループ化したい場合があります。実際、予期外のクエリ動作を回避するため、orWhereメソッドへの呼び出しを通常は常に括弧内へグループ化する必要があります。これには、whereメソッドにクロージャを渡します。

https://readouble.com/laravel/9.x/ja/queries.html

こうすることで行数は少し長くなってしまうけど、コードをぱっとみたときにどこでグループ化してるか一目で分かるので良さそう。

```php
User::where('organization_id', 1)->where(function ($query) {
    $query->where('role', UserRole::Owner->value)
        ->orWhere('role', UserRole::Admin->value);
})->get();
```

SQLをみても```OR```が括弧でグループ化されて、「所属組織が1」かつ「```role```が1か2」のユーザーが取得できている。
```sql
select * from `users` where `organization_id` = ? and (`role` = ? or `role` = ?)
```

## よりすっきり書くには
グループ化してもしなくても、今回の場合は```whereIn```を使うとよりすっきり書ける。

```php
// パターン1
User::whereIn('role', [UserRole::Owner->value, UserRole::Admin->value])
    ->where('organization_id', 1)->get();

// パターン2
User::where('organization_id', 1)->where(function ($query) {
    $query->whereIn('role', [UserRole::Owner->value, UserRole::Admin->value]);
})->get()
```

## おわりに

取得できる結果は同じでも、コードを見たときの理解のしやすさは他の人や未来の自分のためにも大事だと思うので、これからも頭に入れておきたい。
ベイズ初学者によるメモ　~ベイズ機械学習の概要~

## <font color = 'forestgreen'>1. このページについて</font>  
* 機械学習にようやく慣れてきたあたりでベイズに触り始めた主です。<br>学習したことをアウトプットのため書いています。
# <font color = 'forestgreen'>2. 機械学習とは</font>　　
##### ベイズ機械学習を学ぶ上で必要となる機械学習についてまず述べていきます。  
本稿において機械学習の定義としては、現在学習している参考書*1に則り、以下のように定義します。  
> 機械学習とは、データに潜む規則や構造を抽出することにより、未知の現象に対する予測やそれに基づく判断を行うための計算技術の総称である。

機械学習は、以下のように分類できる(細分化すればもう少しあるが省略)  
* 教師あり学習
    * 回帰問題
    * 分類問題
* 教師なし学習
* 強化学習

次の章では、これらに対する機械学習のアプローチについて述べていきます。
# <font color = 'forestgreen'>3. 機械学習のアプローチ</font>  
各タスクに対する機械学習のアプローチとしては二種類挙げられます。  
* ツールボックスとしての機械学習
*  モデリングとしての機械学習
### <font color = 'darkgreen'>3-1. ツールボックスとしての機械学習</font>  
#### <特徴>
**既存の予測アルゴリズム**に、データを与えてある基準を用いて性能の良いアルゴリズムを用いて予測モデルを得る。　
特徴量抽出などによって精度の向上を目指す。
#### <メリット>
* 数学的な知識がなくてもプログラミングが書ければ、ある程度使えること
#### <デメリット>
* アルゴリズムを逐一理解する必要がある
* 実際の現象においては最適解が存在することは稀なため、適用できる範囲が限られている。
### <font color = 'darkgreen'>3-2. モデリングとしての機械学習</font> 
#### <特徴>
データに関する**モデル(仮説)** を事前に構築し、データからモデルの含むパラメータや構造を予測、判断すること
アルゴリズムの「デザイン」にフォーカスされているため、開発プロセスが
「モデル構築×推論計算」として、明確に切り分けられる。
#### <メリット>
* 精度と柔軟性に優れている
* 解析の対象に対する不確実性をうまく表現できる(ベイズ機械学習)
* 特性の知られている確率分布を組み合わせることで様々な課題に適した解法を一貫性を持って提供できる
#### <デメリット>
* 自由に活用するには、ある程度の数学的知識が必要であること
# <font color = 'forestgreen'>4. ベイズ機械学習の特徴</font>　　
**<font color = 'Royalblue'>ベイズ機械学習** :確率モデリングと確率推論を利用した機械学習のアプローチ  
先述した通り、モデリングとしての機械学習には「モデルの構築」と「推論」を分けて考えることができます。  
そのため、ベイズ機械学習を解くには、モデルの構築と推論の導出の2ステップを踏みます。
### <font color = 'darkgreen'>1. モデルの構築  
[$観測データDと観測されていない未知の変数Xに関して同時分布p(D, X)を構築する$]
各種確率分布を組み合わせることでデータDと未知の変数Xの関係性を記述することや、グラフィカルモデルを用いた可視化も行われます。
### <font color = 'darkgreen'>2. 推論の導出  
[$事後分布p(X|D) = \frac{p(D, X)}{P(D)}を解析的もしくは近似的に求める$]  

$p(D)$:<font color = 'Royalblue'>**周辺尤度**</font>•••モデルからデータDが出現する尤もらしさを表す

1.を基にXの条件付き分布を求めます。

# <font color = 'forestgreen'>5. まとめ</font>  
ベイズ機械学習などの、モデリングとしての機械学習は「モデルの構築」や「推論」を分割することで、適応できるタスクの幅も広がり、現実的に解析不可能な課題に対しても解法を導くことができる。  
とまあ、いろいろ述べましたが自分の現状としてはめっちゃ面白い分野だ!ぐらいの所感なので色々ご教授いただければ幸いです。


### <font color = 'forestgreen'>6. 参考資料</font>  
◆ [**機械学習スタートアップシリーズ ベイズ推論による機械学習入門**](https://bookclub.kodansha.co.jp/product?item=0000148222)  <a name= "jump-there">*1</a>
Python AIで競馬予想はじめました


# Python AIで競馬予想はじめました



# 私の馬券購入手法
オッズ理論を原点にしている。
パドックが始まる前、パドックが始まった後では、オッズは激しく上下する。
特にＴＶの解説者がなにかコメントすると大きく動く。
パドックや返しウマの判断は競馬の経験値に大きく左右される。いわゆるプロ以外にはわからない目利きだ。　例えば毛つやで体調がわかり。歩調に違和感がないか。気性や緊張度合いで余計な体力を消耗していないか。前走との比較など。　新馬や1，2回しか出走していない馬であれば、水曜追切情報と同様に大きな判断要素となる。


- 人気集中１頭　か　人気分散５頭　　⇒　買目を定める　
（人気馬とは、単勝オッズだけではなく、馬連、馬単、WIDE、3連複、を投票数に応じて独自に算出する）
- 馬体重発表＋パドック　　発表前後のオッズ上下　　⇒　パドック後に人気が落ちる馬を消す

を基本としていた。


その結果、１～5番人気の馬の中からしか選ぶことができず、いわゆる荒れる万馬券を狙う事ができなかった。中程度以上に波乱が予想されるレースには、わたしの良かれと思っていたアルゴリズムは、全く歯が立たなかった。

予想としては、本命、小穴程度を選んでいた事になる。
プロの予想師や、玄人の予想師は、中穴や大穴をどのような経験値を駆使して狙うため。
本命、小穴程度を狙うのは、素人の予想師と言っていいかもしれない。


# JRA控除率
控除率：単勝20%,複勝20%,枠連22.5%,馬連22.5%,ワイド22.5%,馬単25%,3連複25%,3連単27.5%,WIN5 30%
となっている。

何年も数多くレースを買っていると、単勝であれば期待値（回収率）80％と確実に負けることになる。これではJRAの思うつぼ。よいお客様である。
玄人は期待値（回収率）100％を超えなければプロとは言えない。


期待値80％とはどのような状態かと言うと、
競馬の場合　100人が競馬に行くと、
玄人5人は18倍と平気で当てていく。　本命程度の配当オッズもそんなところだ。
残りの素人95人はハズレと言う計算になる。


ちなみに10人が宝くじとパチンコに行くとする。
テクニックと知識があれば確率を若干左右できるとは言うものの、基本はおみくじを引く等確率
宝くじの期待値は50％　　　雑に計算すると1人は5倍になり　のこり9人はオケラ。
パチンコスロット店の期待値は60％　1人6倍勝てば　のこり9人はオケラ。

とギャンブルはどれもこれも平均してひどいものである。
お遊びとして楽しむ一種のレジャーと言えども、運営会社にお金を巻き上げられるシステム構成となっている。



もう一度言わせてもらうが、
上記のようなレースを、何年も数多くレースを買っていると、
単勝であれば期待値（回収率）80％と負けることになる。
期待値（回収率）100％を超えなければ玄人やプロとは言えない。



# 期待値100％超え
かつて卍氏の競馬裁判事件が有名にはなった。
他にも、UPROデータリサーチ会社なども大規模に回収していた。

ウソかほんとか「JRAはおれの財布」などと公言していたらしい。
どちらも期待値（回収率）100％を超えているのである。


いや待てよ。
確率計算であれば、ＡＩが得意中の得意だ。
期待値（回収率）100％を超えることはできると断言できる。




# 既存の競馬ＡＩ
調べてみると、競馬AIはいくつも存在している。

ほぼ予想を売っている、いわゆる予想屋だ。
- SIVA：スポニチ
- AI-GALILEO：サンスポ、競馬８　月額1000円？
- 競馬予測AI-Mamba：ドワンゴ
- 競馬予想ＡＩ「オリジン」：JRA-VAN　無料・月額 2,090円(税込)
- Deep4cast：JRA-VAN　無料・月額 2,090円(税込)
- ニッカンＡＩ予想β版：日刊スポーツ　月額 800 円（税別）
- 的中型人工知能：netkeiba 　株式会社AlphaImpact 月額792円（税別）
- VUMA：株式会社quantum　月額980円
- Ringo ver.β：東大工学部卒2名　月額910円(税抜)




# pythonによるデータベース構築
ＡＩ開発はまずなにより先に、データベースを構築すること

Yahoo競馬の情報としては、
着順 枠番 馬番 馬名 性齢 斤量 騎手 タイム 着差 単勝 人気 馬体重 調教師
払い戻し情報
単勝　複勝　枠連　馬連　馬単　3連複　3連単

を約20年分のスクレイピングは、pythonで比較的簡単にできる。
（スクレイピングは別の機会にでも）




# AIアルゴリズム
得られたデータベースを、どう加工して、
以下のAIアルゴリズムに通して

1. 線形回帰
1. ランダムフォレスト
1. 決定木
1. k近傍法（k-NN）
1. ニュートラルネットワーク
1. サポートベクターマシン（SVM）
1. ナイーブベイズ（単純ベイズ分類器）
1. 正則化(Regularization)
1. ロジスティック回帰
1. マルコフ連鎖

などなど確率を算出することも時間がかかるが可能だ。

さらに、どの買い目を選んだらよいか再計算する。


とりあえず、
今あるデータベースとはランダムフォレストが相性良いように思っている。


1日分を算出してみると、110％程度といい感じを算出している。
これをだんだんとブラッシュアップしてみることにする。
ろう者のエンジニアとして働くということ①

# 自己紹介
初めまして！私は某企業でエンジニアをしています。
聴覚障がいは医学的に言うと難聴で、90dbの難聴です。
分かりやすく言うと、電話は難しいけど、話せるという微妙なラインの障がいです。

そして私は、自分のことを難聴ではなくろう者だと思っています。
これは、色々と話すと難しくなるので、単純に「この人はろう者なんだな」と思ってほしいです。

## WEBアプリとは？
私は今、エンジニアとして働いています。
内容はITで、主にWEBアプリを作っています。
例えば、一般的な例だと「食べログ」「note」なども一種のWEBアプリです。
そして、サイトの中に色々な機能が詰まっています。例えばユーザーの選択結果を表出する、コメントを書くなど。
それらをすべて含めてWEBアプリといいます。

## 私の簡単な生い立ち
そして、本題に入ります。

私は5歳から耳が聴こえなくなったので、ある意味では、中途失聴者でもあります。
そのため話せるというのもあるかもしれません。

そして５歳までは通常の保育園に通い、聴覚障害が発覚してからはしばらく入院し聴力検査などをしていました。
その時に、他の病気も見つかったため、２年ほど病院の中で過ごしていました。
その時に、聴能訓練といい、補聴器を付けて聴く訓練をずっとしていました。

その間に入る予定だった小学校の入学式が終わり、新しい先生が病院にやってきて「よろしくね」と言ってくれた時を覚えています。
その時は、私がまだ軽い難聴だったということで、聾学校ではなくそのまま地域の小学校に入ったのですが、来てくれた先生がちょっと戸惑っていたのを見て、不安を感じました。

### 院内学級で出会ったパソコン
その当時、私は小学校に入学してからは院内学級という、病院の中の学校みたいなところで日中を過ごしていました。
しかし、私はその頃は聴能訓練を優先しないといけないと言われ、勉強ではなく、聴能訓練ばかりさせられたので
院内学級で勉強した記憶はあまりないです。

ですが、時々、院内学級で他の子どもたちと遊ぶ時があり、その時に遊んでいたら、何かわけわからないものが置いてあるのを見つけました。
これは何かと親に聞くと、パソコンというものだよと教えてくれました。
それで、触りたいというと、親は先生に言って触らせてくれました。

先生は「このパソコンというもので、ゲームを作ったりするんだよ」と教えてくれました。
私は、このパソコンからそんなことができるの？とびっくりしました。

### 簡単なゲームを作ってみた
そして、先生は簡単なゲームの作り方を教えてくれました。
すごく簡単なゲームで、多分マルバツゲームのようなものだったかなと思っています。

とても簡単で、まだ小学校１年の私でもすぐに作れたので感動してしまいました。
そして、他にも何かないかと先生に聞きました。

すると先生は、他にも「インターネットというものができるよ」と教えてくれました。
インターネットで自分でゲームの作り方を色々と勉強して、自分で作ることもできると言われました。

しかし、もうすぐ退院ということもあり、その時はあまり時間がなく、色々とすることはなかったのですが、
その当時のことははっきりと覚えています。

### 悩み
退院し、小学校に通い始めました。
しかし、軽い難聴でも、先生の言っていることがほとんど分からず、また、病院でも軽い難聴だから大丈夫と言われ、勉強よりも聴能訓練を優先した方がいいと言われ、勉強をほとんどしてこなかったので授業についていけませんでした。
軽い難聴でも、聞き逃しや聞き返しはとても多いし、それに、自分が聞いた言葉が本当は違う言葉だったりすることもあるので、自分で自分が聴こえたことにも不安を感じてしまう毎日でした。

それで、もう一度病院に戻りたい、と毎日泣いて親を困らせていました。

でも親は、「あなたは軽い難聴だし、他にはもっと重い難聴もいるんだから、あなたは良い方なのよ。だからもっと頑張りなさい」と言ってきました。
でもそれは、なんか違うと思っていました。
でも、うまく言えませんでした。

そして、小学校では図書室に入り浸る毎日でした。

### 転機

そして中学生になった私は、あるクラブに興味を持ちました。
それはパソコン研究会（仮称。身バレを防ぐため名前をぼかしています）というもので、パソコンを触ったりプログラミングをしたりすることができる部でした。
それを見た時、院内学級でのパソコンを思い出し、すぐに入会しました。

そして、そこで私はチャットの存在を知りました。
そして、その会のメンバーたちでチャットをしたときに、私はびっくりしたのです。
皆の話がリアルタイムで見えること、私も、聞き返すことのなく、リラックスして会話ができるので、びっくりしました。

他のメンバーも、「これだったら、君と会話できるね」と言ってくれました。
今まで、聞き返したり聞き間違えたり聞き逃したりして、他のメンバーにもストレスをかけてしまっていたのですが、
チャットのおかげでそれが楽になってすごくうれしかったです。

そして、その時からパソコンにはまり、色々と勉強するようになりました。

### 高校生で初めて作ったアプリ

高校では本当は専門学校に行ってプログラミングの勉強をしたかったのですが、親の反対があり、やむなく高校に進みました。
その代わり、パソコンを買ってもらったので、毎日夜になると自分の部屋にこもってパソコンを触っていました。

そして、ネットで色々と調べて、自分でアプリを作れることを知りました。
そしてそこから時々簡単なゲームアプリやチャットアプリなどを作っていました。

### 現在
長くなりましたが、これが今までの私の生い立ちです。
続きは、次の日に書きます。

[続きはこちら](https://qiita.com/nao_mai/items/f48bba3f17730d644c4e)
CakePHP DebugKitが急に表示されなくなったときの対処法

# CakePHP DebugKitが急に表示されなくなったときの対処法

[Tips] エラーメッセージが出る場合もある

:::note alert
「エラーメッセージ: SQLSTATE[HY000]: General error: 11 database disk image is malformed.」
:::

ただ、画面になにも表示されない方が多い。私のVagrant環境では毎度表示されず焦っていた。

複数環境ある場合は、環境を複製して１から構築し直すのもあり。だけど面倒なので、なんとか解決したい。


## ＜原因の一例＞
私の場合は、Windowsの強制再起動→Vagrant/VirtualBoxが強制終了となり、ファイル破損したパターンだった。


## ＜とにかく画面に表示させてみる＞

### ① HTMLの下部にコードを埋め込んで強引に表示させる

```
    <script id="__debug_kit" data-id="af2a44f1-a8a8-4f9a-a181-73c4507d4087" data-url="http://*****/" src="/debug_kit/js/toolbar.js?1608568047"></script></body>
  </body>
</html>
```
→ body閉じタグ直前にscriptタグを追加する
→ data-urlのところは環境に合わせて適宜調整してください。

### ② Debugkitのiframeのスタイルを強引に書き換えてウィンドウ全体に表示させる

強引に表示させるとスタイルシートがバグっているor反映されないので、Chromeなら検証からスタイルシートを強引に書き換える

```
<iframe height="40" width="40" src="http://*****/debug-kit/toolbar/badf0b75-4308-421f-ae46-97de21e9a2c8" style="position: fixed; bottom: 0px; right: 0px; border: 0px; outline: 0px; overflow: hidden; z-index: 99999;"></iframe>
```
→　height・widthをそれぞれ100%に書き換える。srcは①で書き換えたものになっているハズ。

するとウィンドウ全体に表示されるので、エラー内容を確認する。

:::note warn
確認作業後はscriptタグを削除しておきましょう。
復旧作業後このタグが存在していると表示がおかしくなる可能性があります。
:::


# 「エラーメッセージ: SQLSTATE[HY000]: General error: 11 database disk image is malformed.」の対応

大体は冒頭でも記載したこのエラーだと思われる。※ 違う場合は適宜対応してください。

:::note warn
下記作業でファイル削除後、ブラウザをリロードする前に、HTMLに追加したScriptタグは予め削除しておかないと表示がおかしくなるので注意
:::

## ① /tmpにあるファイル【debug_kit.sqlite】を削除する

cache　　　・・・ 下層にフォルダが続く
sessions　・・・ 恐らく空
tests 　　・・・ 恐らく空
debug_kit.sqlite　←　このファイルが破損している確率が一番高い


まずは、debug_kit.sqliteを削除して、ブラウザをリロードしてみる。
これで解決できることもあるが、できない場合は以下続ける

## ② /tmp/cache内のファイルを一通り削除する

もしかすると、debug_kit関連だけでいいのかもしれませんが、Cakeに関連するファイルを全部消してもブラウザで更新する度に復活するので、一通り消してリフレッシュするのもありということで全部消しています。

### models
* myapp_cake_model_debug_kit_panels
* myapp_cake_model_debug_kit_requests

※ 以下、自分で作ったデータベースのテーブルに則った名称のファイルが続く
* myapp_cake_model_default_****

→　この辺りを全て削除する。

### persistent
* myapp_cake_core_translations.cake.ja_JP
* myapp_cake_core_translations.debug_kit.ja_JP
* myapp_cake_core_translations.default.ja_JP

→　この辺りを全て削除する。

### views

基本、なにもない？と思われる。

:::note info
Gitを使っている人は、こんなファイルがあるかも。　＞　.gitkeep
これはCakePHPに関係ないので消す必要ない。あくまでCakePHPに関連するものだけ削除することがポイント！
:::

# それでもDebugKitツールバーが表示されない場合

ここまでやってもダメな場合は、環境を作り直した方が早いかもしれない。
自分の環境下でこの方法で解決できない事案が発生した際は、解決方法を色々検証してみたいと思っています。



---

以下の環境で検証した結果です。他のOSやサーバで同じ結果になるかはわかりません。
```
OS：Windows 10
VirtualBox Version: 6.1
Vagrant 2.2.14
```
```
[root@localhost httpd]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 16 2020 16:18:20

[root@localhost httpd]# mysql --version
mysql  Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using  EditLine wrapper

[root@localhost httpd]# php -v
PHP 7.3.25 (cli) (built: Nov 24 2020 11:10:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies
```

・・・環境がちょっと古いですが、本番環境に合わせないといけないので致し方なし。。。
グラフィックス API のバージョンが不一致です 

```
$ Rscript plot.R
Saving 7 x 7 in image
 f(...) でエラー:  グラフィックス API のバージョンが不一致です 
 呼び出し:  ggsave -> dev -> png_dev -> f
 実行が停止されました
```

となった。

解決方法：raggを再インストールして直りました。

install.packages("ragg")
leetCodeの問題をVSコードの拡張機能でいつでも挑戦できるようにする

エンジニア3年目を機に、leetCodeを始めてみました。
そもそも僕の知っている中で、日本で有名な競技プログラミングのサイトは<b>「atCoder」「leetCode」「Paiza」</b>などがあるかと思います。
その中で僕は「leetCode」を普段から使っています。
なぜかというと、単純に
・<b>英語の勉強も兼ねたかった。</b>
・<b>atCoderみたいに出力から躓かなくて済む</b>
という理由でした。
atCoderは一気に時間を確保して解かないといけないところを、leetCodeは空いた時間で、自分の好きな問題を解けます。
(一応atCoderも一問ずつ解けたりますが、問題数に限りがあります。)
まだ始めて半年ほどなので、大したレベルではないのですが、最近middleの問題を結構何もみずに解けるようになって、ちょっとずつ進歩は感じています。
今回はそんな僕が、「leetCode」を楽しむための方法を伝授していきます！

<h1>leetCodeをVSコードでうまいこと連携させる</h1>
やっぱりこういったお勉強というかドリルみたいなのって、子供の頃から億劫になりますよね。
一度始まったらパズルみたいに集中できるのですが、その始まりまでが大変。
ずるずるとずっと一問も解けずに、1日が過ぎてしまうことが何度かありました。
そこで見つけたのが、VSコードの拡張機能です。
<h2>利点</h2>

![スクリーンショット 2022-12-06 15.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/22f5ba44-71c5-2b1d-ac93-a624842a56ba.png)

こちらがleetCodeのVSコードでのアイコンなのですが、これを入れることによって、いつでもクリック一つで問題を解くことができます。
また問題もeasyからhardまで2449問その場で選ぶことができます。

![スクリーンショット 2022-12-06 15.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/e107ab31-c7aa-e30c-2901-d30450d69ee6.png)
難易度も色分けされていて、とてもわかりやすいです。
また、leetcodeで問題を解いていていつも思うのが、もう一度その問題を解いたときに、前どうやって解いたっけ？となることがあります。
leetCodeのサイトでは、解けた問題のコードの保管までやってくれないので、VSコードで解くことでgitを使いコードの保管などもできるようになります！
僕はいつもここでメモをちゃんと書くように心がげ、日頃の業務でも未来の自分がみてわかるようなメモを心がけられるようになりました。

<h2>さっそく実践</h2>
では早速どうやって拡張機能を使うのかみていきましょう。
まずはleetCodeの拡張機能のアイコンから「leetCode」と検索をかけます。

![スクリーンショット 2022-12-06 15.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/f122d3ac-0012-e476-7eb5-8d501b743c62.png)

すると上記のようにいくつか中国語で出てくるのですが(おそらく拡張機能自体中国で作られている)、その中の一番上のものを使用しています。
(一応私が使っている中で現状、セキュリティで問題はありませんが、一応個人のPCのVSコードで利用することを推奨します。)

インストールが完了すると、sign-inを求められます。
(※ここで注意が必要なのは、現状2022/12/6 現在、通常の Email・Password でのログインが失敗するようです。
Third Party login か Cookieを選択しましょう。)

私はThird Partyでもうまく登録できなかったので、Cookieを選択しました。

最初に下記のようにleetCodeのアカウントのmailアドレスかIDを求められます.(無料で使えますので、まだ登録がお済みでない方は、まずはleetCodeの本サイトから登録してみてください。)

![スクリーンショット 2022-12-06 15.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/27b1613c-e81b-ac35-399c-3cbc43b6a12a.png)

その後、cookieを求められます。
![スクリーンショット 2022-12-06 15.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/6118e3b4-ffc2-cb07-3c6c-9709347feef4.png)

自分のleetCodeのダッシュボード画面で検証ツールを開き(右クリックから一番下の「検証」で開く)、Applicationを開きます。
![スクリーンショット 2022-12-06 15.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/2a6d35ec-dfde-7873-3a97-a48a996c1880.png)

すると、いくつかのcookieの中から「LEETCODE_SESSION」というものがありますので、そちらをクリックしてください。
すると下に長い文字列になったcookieが現れますので、それを全部コピペして、フォームに貼り付けます。

![スクリーンショット 2022-12-06 15.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/9bbb0605-3684-8c39-a10d-0333160dc9f3.png)

すると左のバーに問題欄が現れて利用することができます。

![スクリーンショット 2022-12-06 15.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371709/80d2e108-7a3d-bec9-20dd-e91c2c868890.png)

上記のように展開して問題を解きたい場合は、解きたい問題を選び右下にある青いボタンの「Code Now」から「Just Open The File」から開くことができます。

<h3>まとめ</h3>
以上、VSコードでleetCodeを利用する方法でした。
ぜひ活用して、日々のプログラミング学習に役立ててください。
新卒IT就活生たるもの成果物を作れ。

# まえがき
2回目の投稿になります。
この記事では、新卒でIT業界の就活をした学生の観点から、就活について書こうかと思っています。

## 筆者の情報
- 情報系の大学院生
- 専攻はAI系


# 就活で一番大事なのは事前準備である。
就活は必ずしも優秀な人だけが内定をもらえるわけではなく、事前準備が合否に直結します。
どんな準備をすればいいかなどざっくりと書こうかと思います。
## 選考フローを調べる
企業によって選考フローが異なるので、まずはそれを調べましょう。
例えば、以下のようなものがあります。
- ES
- Webテスト・コーディングテスト
- グループディスカッション
- n次面接・技術面接

それぞれ、汎用的な事前準備が可能です。

### ES
ESの締め切りが早い会社などで自分の書いたESが通るかを試してみましょう。

### Webテスト・コーディングテスト
SPIや玉手箱など有名なものや、trackというコーディングテストを使うところ、会社独自のテストを実施するところなどいろいろあります。
あらかじめ調べておいて対策をしておきましょう。特にコーディングテストがある場合、就活を始める前から趣味程度の感覚でやっておくととても気が楽になります。

### グループディスカッション
時間配分・自分の役割担当など、ある程度決めておくのが大事だと思います。
全体の流れを把握するかシミュレーションするかは最低限しておきましょう。

グループディスカッションでは天才的な発想ができる就活生を選ぶためのものではないことがほとんどです。この人と一緒に働きたいかという観点で自分の振る舞いを再確認するといいと思います。

### n次面接・技術面接
面接で聞かれることを調べておきましょう。

会社によって、頻繁に聞かれる特定の質問があったりします。
勝手な憶測ですが、その会社の対策している就活生なら当然知ってるはずという前提で、わざとその会社の定番質問をして、会社への志望度も同時に測るところもある気がしてます。

## 社員さんと面談する
知り合いやOB・OGが働いている場合、面談をしておくと嬉しいことがあったりします。
選考の対策ができるだけでなく、仲の良い先輩の場合紹介してもらえたりします。

会社によっては、知り合いの社員さんがいる方が圧倒的に有利になる会社もあるので、事前に調べておきましょう。
さらに、OB・OG訪問の回数を数えている会社さんもあります。

## インターンに参加する
会社によってインターンに参加することで、選考プロセスが大幅に省略されたり、早期で内定がもらえます。
夏インターンは面接練習もかねて必ず応募するようにしましょう。

## 成果物を作っておく
IT業界の就活をするにあたって成果物を作っておくと有利になります。
成果物を作っている学生は実は1割程度みたいな話を聞くこともあります。成果物を作っておくだけで、相当有利に働くことは明らかです。

そもそも成果物とは、例えば自作のWebアプリやゲームなどです。場合によっては、Qiitaの記事や著作物、学会発表なども成果物といえるかと思います。

成果物を作ることで以下のメリットがあります。
- ESが通りやすくなる
- 面接での話すネタになる
- 技術面接で答えられる範囲が増える

成果物を作るだけでも選考フローのあらゆる箇所で効力を発揮するのがわかるかと思います。

# 新卒IT就活生たるもの成果物を作れ。
就活は勉強ができるからうまくいくものではありません。
それ以上に事前準備がとても大事です。ですが、就活生はみんな会社のことを調べて準備してきます。ES・Webテスト・グループディスカッション・面接の対策は特にみんなやってくるでしょう。
しかし、前述した通り成果物を作っている就活生は割と少ないです。
Web系の企業を受ける就活生は基本成果物がありますが、コンサルやSIerの就活生は成果物ない人が圧倒的に多いです。

普通の就活生がやる準備にプラスして、成果物を作り、他の就活生よりも一歩抜きん出て、就活を有利に進めましょう！
自動化でお絵かきアプリを使って簡単なイラストを描いてみた

AIQVE ONE Advent Calender14日目を担当する@mmk_fです。

今年の2月頃に社内で開催されたイベント「自動化コンテスト」に参加し、
お絵かきアプリを使って自動で簡単なイラストを作ってみた時のお話しをしたいと思います。


# 自動化コンテストとは？
自社の[自動化ツールGarbo](https://www.aiqveone.co.jp/news/2022/491/)(言語はPython）を使って自動化を組んでみよう！というコンテストです。
テーマは「おもしろい自動化」。
ただ適当に自動化を組めばいいということではなく、
目的を持った自動化と、作成した自動化のおもしろさを競い合う楽しいイベントです。

・自動化コンテストの詳細はこちら
https://qiita.com/mi_373/private/85132416af540e63d9bd

# 用意したもの
・Garboが使用できるPC
・Android端末
・市販のゲームアプリ
・発想力
・闘志

# 試行錯誤あれこれ
### 作戦①
最近のスマホゲームの目玉と言えばやっぱりガチャだな、ということで
自動化でガチャを回しまくろう！と考え、なるべく多くガチャを回せるゲームを探しました。

探してみるとガチャを回して図鑑をコンプリートしよう！という
自動化しやすそうなゲームアプリを見つけました。
自動化を進める上で何度もスクリプトを実行する必要があるので
何度も気軽にガチャを回せる必要性がありました。
見つけたアプリはたくさんガチャを回せそうだったのも良いポイントでした。

さっそく自動化スクリプトを作ろうとしましたが、ここで問題が発生しました。
こちらのゲームアプリは調べた所iOS版しかリリースされていませんでした。
GarboはAndroid端末しか使用できなかったので(※現在はiOS版も対応可能となっています)
自動化を組めないことが判明しました。作戦失敗。

### 作戦②
・構想は変えず別のゲームアプリで代用する
・念のため代用のゲームアプリを探すことと並行して「自動化でガチャを回しまくる～」よりおもしろい内容が思い浮かんだら練り直してみる

という方向でゲームアプリを探し直しました。

結果：
・構想は変えず別のゲームで代用する
　⇒気軽に何度もガチャを回せるゲームがほぼない。
　　ガチャを回す素材を集めるのに時間がかかる。

・念のため代用のゲームアプリを探すことと並行して「自動化でガチャを回しまくる～」よりおもしろい内容が思い浮かんだら練り直してみる
　⇒育成ゲーム、対戦ゲーム、RPGゲームなど、操作が比較的簡単なものを探すも
　　「これを使ってどうおもしろい自動化を作るか」を考えるとなかなか思い浮かばない…

といった感じでなかなか考えがまとまりませんでした。(ここで1週間以上かかった気がします)

いろいろ考えた結果、
「育成ゲームのホーム画面に設定するキャラクターをガチャで決める自動化を作ろう！」
と考えました。
育成ゲームとガチャアプリの2つを使うことでなんかすごそうに見せる作戦です。

全体のフローはこんな感じです。
1.ガチャを自作できるアプリ(ルーレットやおみくじのようなイメージのアプリです)を使って
　キャラクターの名前を複数人セットする
2.ガチャを回す
3.ガチャで当たったキャラクターのデータをなんらかの形で記憶させる
　(↑ここはあまり細かく考えていませんでしたが、まあどうにか出来るだろう…ということでスルー)
4.ゲームアプリを起動し、ホーム画面にルーレットで当たったキャラクターを設定する
完！

といった流れです。
なんやかんやでスクリプトは半分まで完成。ヒャッホイ。ここまで出来てしまえばこっちのものです。
その日は満足して帰宅。
しかし帰宅後にある考えが脳裏をよぎりました。

##### 「この自動化って本当に お も し ろ い のか？」

なんということでしょう。肝心な「おもしろさ」に欠けていることに気が付いてしまったのです。
脳内のエンターテイナーな部分がそれを見逃しませんでした。
どうにか自分を納得させるためにいろいろ言い訳を考えましたが脳内会議の結果、否決。
私はガッカリしつつも、やるならもっとおもしろくしたいという闘争心を胸に
翌日、また一から構想を練り直すことにしました。

このあたりで考えすぎてしまい「おもしろい自動化とは何か？」状態になってしまっていたので、
また翌日、先輩や同僚のみなさんに聞いてみました。
すると
「こんな所を自動化しちゃうの！？とびっくりする内容だったら「おもしろい自動化」と言えるんじゃないか」
というアドバイスをいただきました。


### 作戦③
そこで思いついた作戦は
「お絵かきアプリを使って自動化でイラストを描いてみよう！」でした。
この時期に仕事関係でお絵かきアプリでイラストを作成する事があったので思いついたアイデアです。
これは始める前からかなり無謀だと思いましたが、ほかにいいアイデアも無かったので
とりあえずやってみることにしました。

お絵かきアプリは画面をタップすることで線を描ける作りなので、起点となる箇所を指定できさえすれば
ある程度自由に線を描いて簡単なイラストなら描けるのでは！？
という考えです。

全体のフローはこんな感じ
1.文字入れモードで任意の文字をキャンバス上に設置する
2.レイヤーを追加する
3.文字の形状を画像として記憶させ、そこを起点として座標を指定し線の長さや角度を指定する。
4.イラストが完成するまで1と3を繰り返す。
5.最後に文字を入れたレイヤーを削除する
完！

といった流れです。
まず真っ白なキャンバス上に起点となる目印を設置することがポイントです。
スクリプトを組み、何度か実行する中で失敗してグラデーションの模様を設置してしまいましたが
こちらでもうまく線の座標を指定することができたので急きょこちらを代用することにしました。


# 結果
残念ながら諸事情で描いたキャラクターの画像や
自動化ツールを動かしている動画などを掲載できませんが
試行錯誤の結果、58個目のキャンバスでようやく完成しました。
簡単なキャラクターの作成でしたが、線1本に対して座標を指定する際、数字を少し変えただけで
線が長すぎる、短すぎる、線の角度が思っていたのと違う、起点が数ミリずれているなど
思うように線が描けなかった点が一番苦労しました。

もっと座標指定の箇所を増やせば複雑な線を使ったキャラクターも描ける！？ような気がします。
今後に期待。


# おわりに
試行錯誤の結果、かなり無理はありましたが簡単なキャラクターを描くことに成功(？)し、
自動化コンテストでは準優勝を獲得できました。
自動化に関してはほぼ素人の私でも楽しく参加できていい経験になりました。
WPFアプリで、Ctrl+Sが押されたときに保存処理を呼ぶ

# はじめに
「ネットワーク接続してるような外部アプリ使うと、入力した内容が漏洩する可能性あるよね？
だからtrelloやらなんやらみたいなタスク管理ツールは使っちゃだめだよ」
と言われ、経験ないながら一からタスク管理ツールを作りました。

その最中で壁にぶち当たったので残しておこうと思います。

# やりたかったこと
よくある編集アプリのように、
* Ctrl+Sを押されたら
* 1回きりだけ
* 保存処理を呼び出す
* 当然、呼び出し処理の成功確率は100%

これがしたかっただけなのですが、うまくいかずあれやこれや試したので色々残そうと思います。

# いい感じに動いたパターン
これだとうまく動きました。
```c#
protected override void OnKeyDown(KeyEventArgs e)
{
    if (!e.IsRepeat
        & Keyboard.GetKeyStates(Key.LeftCtrl).HasFlag(KeyStates.Down) 
        & Keyboard.GetKeyStates(Key.S).HasFlag(KeyStates.Down))
    {
        RegistData();
    }
}
```

e.IsRepeatで、キー長押しで呼ばれたのかどうかを判定して何度も登録処理が走るのを防いでいます。

それと、LeftCtrlとSの状態がDownになっているかを、`==`ではなく`HasFlag`で判定しているのがポイントでした。
デバッグしてわかったんですが、ここの状態は`Down, Toggle`みたいな感じで複数の状態を持つことがあるようです。

# だめだったパターン
#### キーの状態を`==`で比較 & e.IsRepeatを判定してない
さっき書いた通り、状態が複数になっていると`==`ではないため、falseとなり登録処理が走らないことがある。
体感だと成功率70%くらい。
```c#
protected override void OnKeyDown(KeyEventArgs e)
{
    if (Keyboard.GetKeyStates(Key.LeftCtrl) == KeyStates.Down 
        & Keyboard.GetKeyStates(Key.S) == KeyStates.Down)
    {
        RegistData();
    }
}
```
<br>

#### コマンドバインドを使う
押した時にちゃんと動きはするものの、長押しするとするだけ登録処理が呼び出されちゃう。

```xml　MainWindow.xaml
<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Test"
        Title="MainWindow" Height="350" Width="525">
    <Window.CommandBindings>
        <CommandBinding 
            Command="{x:Static local:MainWindow.RegistCommand}" 
            Executed="CommandBinding_Executed"/>
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Gesture="Ctrl+S" Command="{Binding RegistCommand}"/>
    </Window.InputBindings>
    <!-- なんかいろんな要素 -->
</Window>
```
```c#　MainWindow.xaml.cs
public RoutedCommand RegistCommand = new RoutedCommand();

// なんかいろんな処理

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    RegistData();
}
```

# あとがき
ネットで調べてると`e.KeyCode`とか`Keys.Control`みたいな書き方がよくあったんだけど、僕の環境だとそもそも存在しないプロパティでした。
(はるか昔にどっかで使ったことある気もする)
見てる感じだと`e.KeyCode`に関しては、オブジェクトが`System.Windows.Forms.KeyEventArgs`じゃなくて`System.Windows.Input.KeyEventArgs`だったからっぽい。
なんでなんだろう。

textboxとかのOnKeyDownじゃなくてwindow自体の関数だから、とか・・？
普段業務でやってる言語と違って、同じC#かつ同じオブジェクト名でも、微妙に使えたり使えなかったりするからてんやわんやでした。

ただ、自分でアプリを作ると「この機能が欲しい！」→ すぐ作ることできるから良いですね。
楽しい。
Turbo 7: アプリケーションにTurboをインストール

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://turbo.hotwired.dev/handbook/installing

Turboは、アプリケーションの`<head>`で直接Turbo配布可能スクリプトを参照するか、Webpackなどのバンドラーを介してnpmを介してコンパイルされた形式でインストールできます。

# コンパイルされた形式で

配布可能な最新のスクリプトをGitHubリリースページからダウンロードして、ページの`<script>`タグで参照できます。 またはSkypackのようなCDNバンドラーを使用してTurboの最新リリースを使用することもできます。 詳細については[https://cdn.skypack.dev/@hotwired/turbo](https://cdn.skypack.dev/@hotwired/turbo)を参照してください。

# npm パッケージとして

`npm`または`yarn`パッケージツールを使用して、npmからTurboをインストールできます。 次にコードでそれを要求またはインポートします。

```javascript
import * as Turbo from "@hotwired/turbo"
```

# Ruby on Rails アプリケーションの場合

Turbo JavaScriptフレームワークはアセットパイプラインで直接使用できるように[turbo-rails gem](https://github.com/hotwired/turbo-rails)に含まれています。
Kino 0.8 で追加された Kino.Tree を使って Livebook でツリー表示

## はじめに

Kino 0.8 で追加された Kino.Tree を紹介します

## 通常の表示

例えばこんな感じの Map があったとします

```elixir
rek_res
```

![スクリーンショット 2022-12-06 15.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f92d8516-6f24-3ab4-4e43-7438e46a1ed1.png)

そのまま表示すると、中身がすべて見えます

細かいところではなく、おおよその構造をつかみたいときには見にくいです

## Kino.Tree を使った表示

`Kino.Tree.new` に入れてみましょう

```elixir
rek_res
|> Kino.Tree.new()
```

![tree.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/15df5d05-7648-8c74-abba-386563642ca2.gif)

ツリー構造をどんどん開いて見ることができます

構造が把握しやすいですね

## まとめ

便利な機能がどんどん増えてます！
Kino 0.8 で進化した Livebook のデータテーブル

## はじめに

いつの間にか Kino 0.8.0 が出ていました

データテーブルがさらに進化していて驚いたので記事にします

## データテーブルの表示コード

化石燃料データセットで進化を確認してみましょう

```elixir
Explorer.Datasets.fossil_fuels()
|> Kino.DataTable.new()
```

## Kino 0.7.0

![スクリーンショット 2022-12-06 15.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a70743c5-beb6-d447-0bf7-6fac61f6e057.png)

今までの表示です

## Kino 0.8.0

![スクリーンショット 2022-12-06 15.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4eaff580-d0e6-504a-caff-2da9b8e26826.png)

かなり変わっていますね

## 型表示

まず目につくのが、型表示が列名の左に付いたことです

文字列なら `A` 、数値なら `123` になっています

## グリッド

表がグリッドになっています

![grid.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c1a2575e-9e51-b28e-5ae0-a8304cc4c5f5.gif)

範囲選択して値をコピーすれば Numbers や Excel にそのまま表を貼り付けることができます

行選択や列選択もできます

![grid-row.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/77997efa-46ef-cec4-fa7d-21b03cf887cc.gif)

![grid-col.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/81320d2b-9bf1-6a41-99d4-4edd02f68def.gif)

## 検索

虫眼鏡アイコンは検索機能です

該当するセルの色が変わります

![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8e316e3b-1458-44bc-31fd-73af43a3cd9a.gif)

## 表示行数

表示行数を変更できます

![shows.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/1a316c47-0fa8-5dbf-0e99-6cd1981128b1.gif)

## まとめ

さらに便利になりましたね！

まだまだ進化が止まりません！
psコマンドで特定のプロセスのIDを取得する

以下のコマンドでプロセスIDを取得できる。

```bash
# プロセスIDを取得するコマンド
ps aux | grep ${対象のコマンド} | grep -v grep | awk '{print $2}'

# (例)sshコマンドのプロセスIDを取得する場合
ps aux | grep ssh | grep -v grep | awk '{print $2}'
```
ChatGPTを使ってみた結果、開発者として自信を失った

## 最初に結論
多数の言語、多数のアルゴリズムを知っているAI君と勝負をしても
単純なアルゴリズムの実装力では勝てないので、自信を少し失った。


## ChatGPTとは
[ChatGPT](https://chat.openai.com/)とは、対話形式で会話できる言語モデル
今はテスト中で、解放されています。

ChatGPTでは、以下のようなことができます。
(例：彼女との一周年記念に何かクリエイティブなアイデアをちょうだい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/bbc069db-110e-027c-1f50-ac1070f15718.png)


## コーディングもできるよ
以下のようにコーディングをしてもらうこともできます。
[こちら](https://qiita.com/relu/items/6cc9467748d580f50cfd)の記事ではAtcoder(競技プログラミングサイト)で正答を出すことにも成功しています。

試しにユークリッドの互除法を再帰関数を使って、Elixirで書いてもらった後に、テストコードも書いてもらいました。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/5223db4d-50cc-c9b6-aeff-e9d095e120be.png)

Lチカのプログラムを書いてもらいました。
1. 単純なLチカ
2. 複数ピンのLチカ
3. 並列処理を考慮して、複数のLチカ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/ffdf45cd-982b-dd49-2850-24a32b986cac.png)


関数名の命名もいい感じだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/a03c9426-c0f4-c282-1577-3b94c57254c7.png)

## さいごに
以下の記事は、ChatGPTにより、職を失う開発者が出てくるかもしれないという内容です。
[ChatGPTは、数年後に開発者を失業させるかもしれない](
https://programmingpercy.tech/blog/chatgpt-might-make-developers-unemployed-in-years/)

未来についての想像は今後も人間しかできない(と願っている)ので、
「顧客は自分が何が欲しいのかわかっていない」を体現できるような開発者になりたいと思っています。

ちなみに私vsAIの実装力対決ですが、
私はElixirでユークリッドの互除法を書くことができないですし、テストコードも書いたことがないですし、Lチカも書けないので、既に敗北しています。

## 補遺
私は浅はかなので、「内部の実装を見せて欲しいなあ」と言ったところ、断られました。
敗北です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/25650227-0644-6380-74cc-2b0bdffa2144.png)
デザイナーがノーコードツールSTUDIOでレスポンシブを学ぶ

##  はじめに
メタップスアドベントカレンダー7日目の記事です。
主に自社サービスのUIデザイン(figma）や広告・イラスト作成等を行うデザイナーです。
マークアップのスキルはありませんが、実務でノーコードツールのSTUDIOを使いLP運用しているので、デザイナーにとってノーコードは本当おすすめよ、的なお話を。

STUDIOのサービスサイトはこちら 
https://studio.design/ja


## 導入の目的
実装スキルの乏しい（私のような）デザイナーによるfigmaのレスポンシブ指定は、
「必ずこの位置・この動きになって欲しい」「大体こんな配置になればOK」「（バランスよく）縮める」
等の混在が多々発生します。Autolayoutで解決できる部分も多いのですがいかんせん。
結果として、意図しない差分がデータ化されるが故に無駄にコミュニケーションコストや工数が高くなりがちでした。

これを解決するべく、意図しないコミュニケーションコストを減らし、運用も含めてデザイナーで完結することによる作業の短縮と効率化、そして何より自身の知識向上を求めて導入しました。





## STUDIOの実装方法について
STUDIOはflexboxのGUIによるレイアウトを軸にしており、基本はドラッグアンドドロップで配置、`flex-start`や`space-between`といった値もアイコンボタンでポチポチ反映、余白周りやスタイルもスニューバーから`px` `%` `auto` `flex` `vh`単位で指定しながら組んでいくことができます。
体験談としてprogateのHTML&CSSを1週していれば理解ができると思います。


↓基本画面。やろうと思えばマウスで完結できます。
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991069/9f3e6ade-86f5-5cad-c730-6c803777aac7.png)



## どのようにレスポンシブを実装しているか
実際に、先ほどの画像のようなありがちなレイアウトを行う場合、こんな感じで作成していきます。

![作業サンプル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991069/3c940111-aa20-9457-65ba-19b0b3f6e149.gif)




- セクション作成
ボックスパーツを配置して全幅に

- 子要素作成
画像/小見出し/説明文を配置 値を一括設定

- スタイル反映
要素内の`pudding`設定

- セクション全体の`margin`設定 
<font color="gray">（これは最初にするのを忘れてました）</font>

- PC時のレイアウトを作成
`%`設定でレイアウトし、`space-between`アイコンをポチッと。
ありがちな「3分割」みたいな設定方法じゃないのが良い。

- ブレイクポイントを確認し、よきポイントでパーツを全幅（100%）に切り替え

- モバイル時向けに`pudding`設定

LPならではの作り方ではありますが、慣れるとここまでで5,6分ほど。
Figma等でデザインがある程度できていれば、タグ設定も含め表層的には手慣れた方のコーディングと同じくらいのスピードで実装できると思います。
（サンプルはこんな感じですが、STUDIOは本当に、こんなのも作れるのか..とびっくりするほど多彩なデザインができます）


## 運用してよかったこと
効率はもちろんですが、各種設定や細かなモーション設定がレスポンシブ時にコード上でどのなるのかを理解できるようになります。特にシームレスに調整したいレイアウトや、レイヤーで異なる動きをさせる時などは、wrap設定のないfigmaでは確認できない部分もあり、STUDIOで仮置きしレスポンシブを確認することで、意図しない差分や説明できない動きのデザインが発生してしまう事が少なくなりました。


## その他個人的おすすめポイント
プレビューが助かる。
STUDIOに限った機能ではありませんが、更新ボタン無しでリアルタイムに反映される仕様のため、ひとつの画面で作業を行い、別ウインドウとスマホで複数実機プレビューしながら編集ができます。
確認依頼した際のFBもその場で対応・確認まで行えるためスムーズ。
figmaで修正→実装修正→stagingにアップ→再確認  みたいな流れが短縮。


## 個人的な課題
往々にしてありがちですが、気を抜くとすぐにレイアウトが単調になります。
公開する情報の目的によって、伝達表現を見極めたデザインを忘れないようにする必要があります。
デザイナーとしての自戒。



## まとめ
どうせ学ぶなら実務を通じて理解し、考慮すべき視点を増やしていくことで、結果としてノーコード等では完結できないサービスのUI設計などにも活かせるようになると思います。
最近はSTUDIO以外にもノーコードツールは拍車をかけて良いものが出てきているので、デザイナーとしてはありがたい限り。重きを置くところを間違えず、どんどん使っていこうと思います。





----

#### おまけ  （自家製文字スタイルパレットを作る）
STUDIOには現状サイズまで含めたフォントの一括設定がないため、利用する文字スタイルのセットを作成し配置設定を固定、重ね順を高めにして表示させておくことで、都度ドラッグで動かせるコピペ用簡易パレットとして使ったりしてます。
早くスタイル設定実装されないかな。
<font color="gray">ちなみにシンボル化するとクリック数が増えるのでおすすめしません。</font>
<img width="300
" alt="スタイルセット.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991069/2514b846-a2a7-bf24-546c-cc0b89963425.png">
（メモ）Transit GatewayとVRA間でGREを張り、BGPで経路交換する

[この構成](https://qiita.com/y_tama/items/ed31cc909afcce66c862)のバリエーションで、下記を構成する際に、少し気を付けるポイントがあったのでメモ。
赤文字がアカウント1、青文字がアカウント2。GRE#1をアカウントまたぎで張っている。
PowerVS#1とPowerVS#2はTOK04を利用。

<font color="red">PowerVS#1-Cloud Connections#1(DL2.0)-TGW#1</font><font color="purple">=GRE#1=</font><font color="blue">VRA=GRE#2=TGW#2-Cloud Connections#2(DL2.0)-PowerVS#2</font>

最初の構成時、特定のセグメント間の通信だけできなかった。
①と②は通信OK
①と③は通信NG
②と③は通信OK

色々確認していたらTGW#1のBGPで、上流と下流の両方に同じASN（4201065555）が登場していた。

【TGW#1のBGP情報】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/74726e71-b798-c786-312e-525b7c822ace.png)

①の4201065555は認識していた。TGW#2でGREを終端するときにjp-tok-2を指定すると、ASNとして4201065555が使われる。

【TGW#2のGRE定義（再作成前）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/f8c57611-b8b3-f4cd-6e83-2c0e78109bce.png)

③の4201065555は、BGPコンフェデレーションの結果として渡されてきたAS Pathで、認識していなかった。

③のほうは変えようがなさそうなので、①でGREを終端するゾーンをjp-tok-1に変更（ASNとして65516が使われる）してGREを再作成した。

【TGW#2のGRE定義（再作成後）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7b89c7ef-a3bf-e551-801e-966dce51323e.png)

ASNの重複が無くなり①と③も疎通するようになった。

【TGW#1のBGP情報（TGW#2のGRE再作成後）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/a2125d77-765a-f64a-cb64-e256a9867748.png)


```
# ifconfig en1
en1: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet 172.16.32.196 netmask 0xffffff00 broadcast 172.16.32.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
# ping 192.168.150.195
PING 192.168.150.195 (192.168.150.195): 56 data bytes
64 bytes from 192.168.150.195: icmp_seq=0 ttl=240 time=4 ms
64 bytes from 192.168.150.195: icmp_seq=1 ttl=240 time=4 ms
64 bytes from 192.168.150.195: icmp_seq=2 ttl=240 time=3 ms
^C
--- 192.168.150.195 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 3/3/4 ms
# 

```

以上
Concrete CMS V9 のタスクを強制的に終了させる方法 (v9.2.0 未満)


Concrete CMS V9 から、バッチ処理をバックグラウンドで行う「タスク」という機能が追加されました。

しかし、このタスク機能、2023年初頭にリリース予定の V9.2.0 まで、エラーなどでストップしてしまった実行中のタスクを途中終了させるような機能がついていません。

MySQL テーブルの関係レコードを削除することで、強制終了させることができます。

```
mysql -h [DBホスト] -u [DBユーザー] --password="[DBパスワード]" [DB名] -e "delete from MessengerProcesses; delete from MessengerTaskProcesses;delete from MessengerMessages;"
```

## つまり

MySQLデータベースの以下のテーブルにタスクの実行情報（プロセス）が入っているので、それらのテーブルの中身を削除します。

MessengerProcesses
MessengerTaskProcesses
MessengerMessages



# a foreign key constraint エラーが出た時の対処法

タスク情報を削除する時に以下の様なエラーが発生する場合があります。

```
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`[データベース名]`.`MessengerTaskProcesses`, CONSTRAINT `FK_BE77DC6FBF396750` FOREIGN KEY (`id`) REFERENCES `[データベース名]`.`MessengerProcesses` (`id`))
Query OK, 0 rows affected (0.011 sec)
```

FOREIGN KEY が付与され、うまく削除できないことが原因です。
そんな時は、FOREIGN KEY チェックを一時的に無効にして実施します。

## MySQL ログイン後の場合

```
set foreign_key_checks = 0;
truncate MessengerTaskProcesses; truncate MessengerProcesses; truncate MessengerMessages;
set foreign_key_checks = 1;
```

## MySQL コマンドで直接実行する場合

```
mysql -h [DBホスト] -u [DBユーザー] --password="[DBパスワード]" [DB名] -e "set foreign_key_checks = 0;delete from MessengerProcesses; delete from MessengerTaskProcesses;delete from MessengerMessages;set foreign_key_checks = 1;"
```



## 参考

https://github.com/concretecms/concretecms/issues/10148#issuecomment-1044869498
iPadでpdfLaTeXをコンパイル (無料)

# やりかた
1. "a-Shell"をインストール
2. 「latex」と打ち込むとlatexインストールが始まる
3. 「vim test.tex」と打つとtest.texファイルが作成されて編集画面へ
3. 「i」で書き込みモード
3. 好きなコードを書き込む
3. 「Escape」でコマンドモードへ行き、「:w」で保存
3. a-shellをもう1画面で開く (分割表示可能)
3. 「pdflatex test.tex」でコンパイルされる
3. 「view test.pdf」で出力されたPDFファイルを表示

# Tips
- vim上で「:wq」とすると保存して終了
- s-Shell上で「ls」で今いる場所のファイル一覧を見れる
- 「cd」で「~/Documents」に戻れる
- 「rm ファイル」でファイルを消せる
- もちろんbeamerも使える
- 「pickFolder」で好きなフォルダを直感的に選べる、iCloudとか

# upLaTeX
upLaTeXが使えるかどうか開発者に聞いたら以下のような返答が
>There is no pLaTeX or upLaTeX yet on a-Shell. I'll try to add them when I do the update for texlive 2023.
Vue3/Nuxt3 の script setup で Firebase Storage を使うときの罠 

# Firebase Storage + Vue3/Nuxt3 の罠

下記のようなコードを書いたら、`Uncaught (in promise) TypeError: Cannot set properties of null (setting 'value')` というエラーがでました。

```storage.vue
<script setup>
import { getStorage, ref} from "firebase/storage";

....

const file = ref();

....

onMounted(()=>{
  const storage = getStorage();
  fire.value = ref(storage, 'hoge/foo.dat'); 
  // 上の行で Uncaught (in promise) TypeError: Cannot set properties of null (setting 'value') というエラーが出る
  ....
})
</script>
```

結論から言えば、firebase storage の `ref` 関数を import したことで、vue3 の `ref` 関数が上書きされてしまっていたせいでした。

一見、すぐにわかりそうなものですが、コードが上の例ほどすっきりしていない状態で、なおかつ nuxt3 だと `ref` は明示的に import しなくても良いこともあって、気が付くまでかなりの時間を要しました。

# 対策

`import { exportA as aliasA } from '....'` で `ref` に別名を与えることで解決できます。

```storage.vue
<script setup>
import { getStorage, ref as storageRef} from "firebase/storage";

const file = ref();

....

onMounted(()=>{
  const storage = getStorage();
  fire.value = storageRef(storage, 'hoge/foo.dat');
  ....
})
</script>
```

firebase 関連の関数名は、何気に短いものが多いので(forestore の `doc` とか）、忘れたころに同じような目にあう可能性が高そうです。エラーだけ見ても理由が分からないところが罠ですね・・・。

関数名が短いものは別名を付けて import するようにしたほうがいいかもしれません。
大規模案件を炎上させないために意識すべきこと

# 概要

今年度かなり大きな案件にリーダー的な立ち位置で携わったのですが、
順調に進んでいるとは言えない案件でした。。。

この案件を通じて感じたことを同じような境遇のエンジニアの人への助言になればとまとめてみます。

> 実際に手を動かす役割というよりも「複数人のエンジニアを束ねる役割」の人向けです。

# 予定通りに進むなんてことはない

よくタスクを実行する前に工数を見積もっておおよその計画を立てると思います。
人月の神話という言葉がある通り、工数が大きくなればなるほどその工数通りには進みません。

ただ、ずらせないリリーススケジュールとかはあると思うので、どうしたらスケジュールを守りやすいか感じたことを上げておきます

### ないとリリースできない機能から開発

予定している機能を最初から全部一気に作り切ろうとするのは無謀です。
作り始めて遅延が大きくなったころには遅延しながら進む以外に手が打てなくなります。
（かけたコストを無駄にしたくない心理が働くので、少し戻ってやり直すような調整は至難の業です）

優先度をつけて **「リリース可能な最小単位」から開発** しましょう。

### 10%のアウトプットを中間レビュー

> ※パーセンテージは目安です

進捗率10%ではなく（作業中なのでアウトプットがない）、全体のアウトプットのうち10%を完成させてもらい、方向性を確認しましょう。

全部作ってもらってから認識のズレが発覚して全部やり直しなんで笑えないですからね。。。

### 小さく始める

数人に同じ作業をしてもらうようなケースでは **先行して1人** その作業をやってみてもらいましょう。

作業してみないと分からない課題が出てくるはずで、事前に課題の潰し込みを行うことでその後の作業をスムーズに行うことができます。

> 万が一作業にクリティカルな問題があるときも最小のコストで方針転換をすることができます

# 課題が勝手に解決することはない

案件は当然一人ではなく複数人で進めます。
そんなとき課題にぶち当たると「誰かがいつか対応してくれるだろう」って思うことはないでしょうか？

その課題が解決することは絶対にありません。
なぜなら **全員あなたと同じく誰かがやるだろうと思っています**。

そもそもその課題はあなたの周りにしか顕在化していないものかもしれません。

あなたに降りかかった課題を解決したければ、あなたが行動しましょう。

# 犯人捜しには意味がない

タスクが遅延したとき、バグが見つかったとき、リリースに失敗したとき、、、
何かと犯人捜しをしていませんか？（人間の心理上したことない人はいないはず）

失敗の要因は犯人と思える「その人」だけではありません。
むしろ **「当時の状況」** や **「その人を取り巻く環境」** から原因を探るべきです。

既存のコードが汚すぎてバグが入りやすい状況であればリファクタするとか、
認識齟齬があってうまく進んでないのであればコミュニケーションを変えるとかが必要です。

> コミュニケーションは伝えられる側ではなく、伝える側の改善が必要と思う派です。「分からなければ聞いて」と積極性を求めるのは危なくて「分からないことが分からない」部分は確実に抜け落ちます。

# 報告を信用しない

「実装が終わりました」と報告を受けたある機能について、実際はモックだらけでまだまだ実装はたくさん残っているということがありました。

この例は極端ですが、**「人は良いように報告したくなる」** 傾向があります。

かならず定量的なものや実際のアウトプットを確認する等で、「実態を把握」するようにしましょう。

:::note warn
定量的に数値を出す場合、最初だけでも数値の出し方を把握しましょう。
都合のいいように数値を出すなんていくらでもできるし、
それを許容すると現場がごまかしきれなくなった時にリカバリ仕切れないほどの遅延がいきなり現れます。
:::