OmniAICreator/Qiita-1.07M huggingface dataset:
GraphicsAPIについての覚書(自分用)

# GraphicsAPIとアーキテクチャについて

※自分用の学習用まとめとして記載していますので、仮に参考にされる方がいらっしゃいましたらご自身で精査お願いします。

ご指摘などありましたらコメントや編集リクエストでお願いします。

### Metal = Appleが開発した低レイヤーのGraphicsAPI

ざっくりまとめる＝
OpenGLは万物に対応するために冗長な設計、ハードウェアのパフォーマンスを上げてもOpenGLがボトルネックになっていったのでAppleは独自のGraphicsAPIを開発、それがMetal
致命的なのはジオメトリシェーダーが現状サポートされていない事、今後もしそうにないこと…

車でいうと　＝　エンジンの出力上がってたけど、社外の汎用的なパワートレインだと効率悪いから、そこも独自設計したよ的な感じ


#### OpenGLとmetal/vulkanの違いは下記

https://zenn.dev/n0mimono/articles/0b1c1b5f2a2549

#### Metalゲームでの利用(Unity)

Unity公式

https://docs.unity3d.com/ja/2019.4/Manual/Metal.html

よくお世話になってるあまがみさんのblog

https://amagamina.jp/blog/geometry-compute-mobile/

## ハードウェアとGraphicsAPIサポート早見表

https://dench.flatlib.jp/opengl/devices


## DirectX12以降のパイプラインについて

現在モバイルで主に使用されている、頂点(vertex)・ピクセル（flagment）シェーダーパイプラインから（間にジオメトリやテッセレーション独立してコンピュートシェーダー等も入る場合があるようです）、から、ラスタライズ前の頂点・ジオメトリ・テッセレーションのステージを統合したり効率化したパイプラインをNvdiaがメッシュシェーダーとして発表
UE5等に実装されているnaniteとかもこの辺りの技術っぽい

https://neuliliilli.hatenablog.com/entry/2019/04/25/231753
Power Platformソリューションにおけるアクティブレイヤーとは？

## Power Platformソリューションにおけるアクティブレイヤーとは？
まず、**通常時のソリューション運用のイメージ**を記載します。
テスト環境において**Active(編集可能状態)でソリューション**を作成し、本番環境に移行すると**カスタマイズ内容はInactive(編集不可能状態)に**なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/ad578016-77e3-2b95-fe22-21aa2e666e7c.png)

ここで、**移行先環境でソリューションに変更を加えた場合にアクティブレイヤーが作成**されます。
例えばフローの名前変更、トリガーやアクションの追加など移行先環境での新たなカスタマイズは全てレイヤーを分けて保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/65c1d6c6-bb15-f88d-df8d-5ecb20687433.png)

実際の画面でも、**ソリューション ＞ 各コンポーネントのメニュー ＞ 詳細 ＞ ソリューションレイヤーの表示** を選択することで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/72ba566a-1ae1-8fac-1942-2964b84da90f.png)


このアクティブレイヤーが存在することで、**テスト環境のソリューションをインポートして本番環境をアップデートしても、その内容をアクティブレイヤーがらさに上書できる**ようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/5d408a62-90d7-7e52-a48c-af8da97f0047.png)

このように、アクティブレイヤーは**移行先の独自のカスタマイズを保持しつつソリューションのアップデート内容だけを反映したいようなユースケース**に活用することができます。

一方、この**アクティブレイヤーが作用してソリューションのアップデートの障害要因になる**こともあります。その場合の予防策/対処法はこちらを確認してみてください。

https://qiita.com/hikaru37111/items/4c8b6efce0ff6e83798e
laravelでjQueryを使う方法

# 開発環境
laravel　8.83.11
php　　　7.4.29

# 記事を載せた経緯
techpitというプログラミング学習サービスのlaravel講座の中の [Tinder風マッチングアプリを作ってみよう！](https://www.techpit.jp/courses/42)という世界のアオキさんの講座を受講していたのですが、最終章の8-5の __チャット機能の実装ができなくてく困っていたところ、原因はjQueryが使えていないことだった__ ので、jquryを導入する方法を記載します。
 <font color="Crimson">＊</font>なお私は省きましたが、5-3章の画像をスワイプできるようにする為に導入するJtinderというやつもjqueryが機能していないとできないと思います。
参考サイトは以下の通りです。
[Laravelでjavascript、jQueryを使う方法](https://dkssksk.com/laravel-javascript-jquery/)
[Laravel8×DockerにjQueryを導入する方法
](https://www.kamome-susume.com/laravel-jquery/#index_id3)

# jQuryの導入方法
## 手順１（jQueryの）インストール

プロジェクトがあるフォルダに移動してそこのターミナルまたはコマンドプロンプトで
```
npm install jquery --save
```
と入力します。
これでjQueryが使えるようになります😍
## 手順（webpack.mix.js の編集）

次に、webpack.mix.jsを編集します。webpack.mix.jsを開いてjqueryに変換したいファイルのパスを追加します。ここでは上から2行目のchat.jsがそれにあたります。

```webpack.mix.js 
mix.js('resources/js/app.js', 'public/js')
    js( 'resources/js/chat.js', 'public/js' ) //追加

    .sass('resources/sass/app.scss', 'public/css')
    .sourceMaps();

```
:::note warn

このchat.jsがただのjsファイルにもかかわらずjQueryの書き方をしていたため、ファイルが正しく読み込まれていませんでした。😂
:::


## 手順３（webpack.mix.js の編集　続き）
次に.autoloadを追加します。以下をを追加した後ターミナルで　npm run devを実行してください

```webpack.mix.js 
mix.js('resources/js/app.js', 'public/js')
    js( 'resources/js/chat.js', 'public/js' ) //追加
.autoload( { //追加ここから
    "jquery": [ '$', 'window.jQuery' ],
} )//追加ここまで
    .sass('resources/sass/app.scss', 'public/css')
    .sourceMaps();

```

```
npm run dev
```
:::note info
npm run devをすることにより'public/js/app.js'に記載した内容が読み込まれます
:::
## 手順４（viewファイルへ記載）
最後にjQueryを読み込みたいviewファイルに、先ほど追加したファイルを読み込みます。
私の場合はchat.blade.phpというファイに読み込みます。

```chat.blade.php 
<script src="{{ asset('js/app.js') }}"></script>
```


:::note info
豆知識
{{ asset('js/app.js') }}この書き方の意味を説明すると、まずasset()とはpublicフォルダを指していて、その中のjsフォルダの中のapp.jsファイルを読み込んでいるという意味です

先ほどwebpack.mix.jsに追加したファイルはnpm run dev実行後は,publicフォルダのjsフォルダの中のapp.jsに書き込まれるため、このようになっています。
:::
いちいちうるさいMicrosoft Auto Update を削除する方法（Mac）

## はじめに

Microsoft Officeをふつうに、Office.comからダウンロードしてインストールすると、毎日この画面が現れます。

![SS 2022-05-31 8.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/c5a1b7d4-6b50-08ac-c5e3-7c027cfcd36d.png)

かならずアプリが立ち上がってウィンドウを出しますし、頻度を落とすこともできないという鬼仕様。

たいへんに鬱陶しくて困っていたのですが、ほかにも同じ悩みのかたがいるようで、対処法が書かれていました。

- [うざい Microsoft Auto Update を削除する方法（Mac）](https://medium.com/@toiee_kame/%E3%81%86%E3%81%96%E3%81%84-microsoft-auto-update-%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-mac-c04b8b3cfa5)
- [うざったいMicrosoft Autoupdateに対処する方法 - Koji Kadoma](https://koji.pages.dev/posts/31/)

記事の内容をまとめると

:::note
- Microsoft AutoUpdate（MAU）というアプリが、ライブラリの奥深くにある
- 削除することはできるが、ソフトウェアアップデートができなくなる
- OfficeをAppStoreからインストールすれば、MAUを使わないので、鬱陶しい画面を見なくて済む
:::

ということでした。もうOffice.comからインストールしちゃっているので、削除してAppStoreから入れ直すことにしました。


## 作業の概要

- AppCleanerというアプリをインストール
- Office本体の削除
- MAUの削除
- OfficeをAppStoreからインストール

## 詳細

### AppCleanerというアプリをインストール

https://freemacsoft.net/appcleaner/
から`AppCleaner`というアプリをダウンロードし、インストールします。

:::note
これはmacOS利用にあたって、必携アプリです
:::


### Office本体の削除

![img](https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20220601/20220601092716.png)

Officeアプリを、AppCleanerにドラッグ・アンド・ドロップし、チェックボックスをすべてONにして、`remove`。

:::note warn
Teamsも消しそうになって、危なかった
:::

### MAUの削除

![img](https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20220601/20220601093536.png)

`/Library/Application Support/Microsoft/MAU2.0`にある、`Microsoft AutoUpdate.app`をAppCleanerにドラッグ・アンド・ドロップし、チェックボックスをすべてONにして、`remove`。

### OfficeをAppStoreからインストール

![img](https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20220601/20220601094740.png)

AppStoreからインストール。

:::note
念のため、１つだけ（Wordだけ）インストールして動作確認して、そのあとに残りのアプリ（Excel, PowerPoint）を入れました
:::

![img|300](https://cdn-ak.f.st-hatena.com/images/fotolife/m/masatora_bd5/20220601/20220601100248.png)

`既にご利用の場合はサインイン`を押して、Microsoftアカウントとパスワードを入力すると、起動できるようになりました。

![SS 2022-06-01 10.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/b22d8d2f-7fa7-8ebf-78c3-13151a7c0b02.png)


:::note
Word, Excel, PowerPointそれぞれで、サインインをしなければならないのは、ちょっと面倒
まあでも、初回だけだし……。
:::


## おわりに

もう、日本のビジネスマンしか使っていないのでは？　とおもうMicrosoftオフィススイート（Word, Excel, PowerPoint）。

インストールせずに済むのがベストなのですが、10年にわたる抵抗の末、ついに屈してmac版をインストールしました。

そうしたらMAUという落とし穴が……。このあたりのモヤモヤ感は「[うざい Microsoft Auto Update を削除する方法（Mac）](https://medium.com/@toiee_kame/%E3%81%86%E3%81%96%E3%81%84-microsoft-auto-update-%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-mac-c04b8b3cfa5)」が代弁してくださっているので、繰り返しません。

Microsoftオフィスが根絶される平和な世の中になることを、まいにち千羽鶴でも折りながら祈りつつ、でもそんな日はかなり遠いので、今日の心の平穏のため、MAUを削除しました。

Peace & Love.


### 環境

ここで書いていることは、下記のバージョンで実施しました。

- Microsoft Office Home and Business 2021
- macOS Monterey 12.1
- MacBook Pro (14-inch, 2021)
[ネットワーク試験]Pktgenの起動方法

初心者向けの記事。知識が無くて何で検索すれば良いのか分からない人向け。
詳細は他に任せて、とりあえず実施する方法のみ記載。

## 事前状態

``` 
# dpdk-devbind --status

Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,igb_uio *Active*
0000:00:04.0 'Virtio network device 1000' if=eth1 drv=virtio-pci unused=virtio_pci,igb_uio
0000:00:05.0 'Virtio network device 1000' if=eth2 drv=virtio-pci unused=virtio_pci,igb_uio

No 'Crypto' devices detected
============================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================
```

## eth1とeth2をDPDKポートへ設定

```
# dpdk-devbind -b igb_uio 0000:00:04.0 0000:00:05.0
```

## 設定確認

```
# dpdk-devbind --status

Network devices using DPDK-compatible driver
============================================
0000:00:04.0 'Virtio network device 1000' drv=igb_uio unused=virtio_pci
0000:00:05.0 'Virtio network device 1000' drv=igb_uio unused=virtio_pci

Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,igb_uio *Active*

No 'Crypto' devices detected
============================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================
```

## Pktgenの起動

```
# cd /root/pktgen-3.6.0
# app/x86_64-native-linuxapp-gcc/pktgen -l 1-3 -- -m "2.0,3.1"
```

これでPktgen起動完了！
XXMppsレベルのパケット送信試験が可能に！
【Python】インスタグラムで自動フォローと自動いいねを実装する③(ことすたぐらむ[タイプドアン])

# 初めに
　インスタグラム自動化プロジェクト「ことすたぐらむ」について一旦、使えるレベルのプログラムが完成いたしましたので、依頼者の名前を取って、ソース名をことすたぐらむ[タイプドアン]とします。
　以下では実行ソースと、実行するために必要なもの、実行方法を記載いたします。
# ソースコード
　ソースコードは以下のGitに載せました。こちらからダウンロードしてください。

https://github.com/matsuzakaMado/kotostagram_type_doan

# 実行準備
## cromeDriver

　ソースコードをダウンロードできたら、chromeDriverをお使いのchromeのバージョンに注意して、同ディレクトリ内に保存してください。
　chromeDriverのダウンロードサイトは以下になります。

https://chromedriver.chromium.org/downloads

## credentials.py
  ソースコードにあるcredentials.pyは任意の値を設定してください。
```python:credentials.py
ACTIVE_FOLLOWEE = [] # 有効フォロウィーのリスト
MAX_FOLLOW_COUNT = 30 # フォローする最大人数
MAX_LIKE_COUNT = 30 # いいね！する最大数
LIKE_COUNT_FOR_KEY = 10 # 検索キーワードごとのいいね！する最大数
KEYWORDS = [] # 検索キーワード
```

　以上で実行準備は完了です。
# 実行方法
　実行はシェルで行います。
　以下のように入力してください。
```sh:実行方法
$cd ソースコードが置いてあるディレクトリ
$python main.py インスタグラムのID インスタグラムのパスワード
```
　こちらで自動で実行されるはずです。
　定期実行の場合はwindowsの場合はタスクスケジューラー、Linuxの場合はincronなどで設定します。
# 終わりに-今後の展望
　タイプドアンはいったんこれで完成です。
　今後の展望としては、まず、CSVファイルにフォローしたユーザーと時間を出力し、フォロー解除の際に使用できるようにすること。
　CSVファイルの代わりに、データベースで行うこと。
　有効フォロウィーと検索ワードや、各設定値の値をブラウザで行うことができるようにすること。
　随時進めてまいります。
　なおInstagramは自動化や、スクレイピングを認めていません。実行は自己責任でお願いします。
　また参考にしたサイトは以下のとおりです。

https://tech.fragment.co.jp/python/twitter-instagram-follow-like/

　ご質問、修正点などございましたら、ぜひコメントしてください。1日以内には返答いたします。
seleniumのベーシック認証回避

# 回避方法

```python
driver.get("https://user:password@google.com")
```

userとpasswordを変更して実行する
userやpasswordに!や？#等の記号がある場合、下記URLを参照し変更する

例)password! → password%21

https://developer.mozilla.org/ja/docs/Glossary/percent-encoding
[競プロ] 再帰的アルゴリズム（Backtracking）

## 制約充足問題（Constraint Satisfaction Problem）

制約充足問題は、複数の制約条件を満たすオブジェクトや状態を見つけるという数学の問題を指す。

制約充足問題は完全な解の存在する問題であり、要素の順序は問題とはならない。
一連の変数が与えられ、指定された制約を満足するようにそれらに値を設定しなければならない。

## バックトラッキング（Backtracking）

バックトラッキングは、制約充足問題の解を探索する戦略の一種で、力まかせ探索を改良したもの。
バックトラッキングでは、変数の値の組み合わせを**試行錯誤**して解を探す。
バックトラッキングの効果は部分的組み合わせを排除（枝刈り）する実装にあり、それによって実行時間を短縮する。

バックトラッキングのアルゴリズムは、単に正しい解を得るまで可能な組み合わせを試していくだけであり、一種の**深さ優先探索**である。

## 擬似コード

問題を解いている途中の部分問題において、可能な**解の候補**がいくつかあったとき、

1. 解の候補のうち、一つを選択し、その部分問題の「仮の」解にする。
1. 問題の続きを解いてみる。
1. 成功ならそのまま。失敗なら、1.の選択を破棄し、別の候補を「仮の」解にし、2.へ。

上記2.の部分は**再帰的**になる。

```python
func_backtrack():
  候補選択の初期化
  while 解が見つからない or 次の候補がある:
    次の候補の選択
    if 仮の解として適する:
      解の一部として記録
      if まだ解くべき問題が残っている:
        func_backtrack(次の段階) # 再帰
        if 失敗:
          先の記録を破棄
```

## 実戦問題 leetcode 473.

[473. Matchsticks to Square](https://leetcode.com/problems/matchsticks-to-square/)は以下のようにバックトラッキングで解ける。

```python
class Solution:
    def makesquare(self, matchsticks: List[int]) -> bool:
        total_len = sum(matchsticks)
        # マッチ棒が4本以下　または　合計長さが4の倍数でない場合はFalse
        if len(matchsticks) < 4 or total_len % 4:
            return False
        # マッチ棒の長さの逆順でソート
        matchsticks.sort(reverse=True)

        edges = [0] * 4

        # マッチ棒を候補とする
        def dfs(idx: int) -> bool:
            if idx == len(matchsticks):
                # 全てのマッチ棒を使った = 解が見つかった Trueを返す
                return True
            for i in range(4):
                # 候補のマッチを仮の解として、4つの辺にそれぞれ入れてみる
                edges[i] += matchsticks[idx]
                if edges[i] <= total_len // 4 and dfs(idx + 1):
                    # 入れてみた解が正しい場合は、次のマッチ棒を候補とし再帰的に解を探す
                    return True
                # 入れてみた解が正しくない場合は、辺を戻して次のマッチ棒を候補とする
                edges[i] -= matchsticks[idx]
            # 全てのマッチ棒を使ったが、正しい解が見つからなかった場合、 Falseを返す
            return False

        return dfs(0)
```


## 参考情報

* [制約充足問題](https://ja.wikipedia.org/wiki/%E5%88%B6%E7%B4%84%E5%85%85%E8%B6%B3%E5%95%8F%E9%A1%8C)
* [バックトラッキング](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0)
Unity BuildPlayerOptions.extraScriptingDefinesの使用

Unity 2022.1からビルド中にsymbolの変更ができなくりました。

`PlayerSettings.SetScriptingDefineSymbolsForGroup()`を使った場合、ビルドが失敗します。

今回はunity2022.3　から追加されたBuildPlayerOptions.extraScriptingDefinesを使用する例を紹介します。
これでビルド中にsymbolの追加することができるようになりました。

```
var opt = new BuildPlayerOptions();
opt.scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path).ToArray();
opt.locationPathName = path;
opt.target = target;
opt.targetGroup = group;
#if UNITY_2022_1_OR_NEWER
opt.extraScriptingDefines = BuildProcesser.ExtraScriptingDefines;
#endif

var report = BuildPipeline.BuildPlayer(opt);


```
正規表現早見表

## 正規表現早見表
※まだまだ更新中

意味  | 方法 | 例
------------- | ------------- | -------------
 １文字違い | 私は.が好きです。 | 私は卵が好きです。/ 私は魚が好きです。
 連続した指定文字数違い  | 私は....が好きです。 | 私はコーヒーが好きです。/ 私はたこ焼きが好きです。
 直前の文字の繰り返し(直前の文字を含まないものも含む) | わー*い | わい / わーーい　/ わーーーい 
 直前の文字の繰り返し(直前の文字を含まないもは含まない) | わー*い | わーーい　/ わーーーい 
 直前の文字を含まない、または１つだけ含む | わー*い | わい / わーい
 連続した指定文字数違い + 直前の文字繰り返し(直前の文字を含まないものも含む) | 私は.*が好きです。 | 私は猫が好きです。　/ 私はコーヒーが好きです。 / 私はが好きです。
 指定した複数の単語の検索 | りんご\|ミント\|チーズ | チーズ/ミント/りんご
 指定した文字が指定の場所に含まれている | 今日の天気は[雨晴曇雪嵐]です。 | 今日の天気は雨です。/ 今日の天気は晴です。
 アルファベット小文字のいずれかが入る | あの人は[a-z]+さんです。 |　あの人はtomさんです。/ あの人はkenさんです。
 アルファベット大文字のいずれかが入る。 | あの人は[A-Z]*[a-z]+さんです。| あの人はTomさんです。/ あの人はKenさんです。
 数字のいずれかが入る。 | あそこには[1-9]*[人匹台]※います。 | あそこには1人います。 / あそこには10匹います。
 指定文字以外の文字が入る | [A-Z]さんは[^山川海]+が嫌いなはずだよ。 | Aさんは魚が嫌いなはずだよ。/ Bさんは酒が嫌いなはずだよ。/ (※ひっかからない文章)　Cさんは山が嫌いなはずだよ。
 いずれかの記号が入る | 式:[1-9][-+*/^][1-9][=][1-9] | 式:3+1=4 / 式:4/2=2 / 式:3^2=9
 いずれかの文字の後ろ何文字まで | _(.) | _c / _d

## 参考
https://userweb.mnet.ne.jp/nakama/
docker-compose.ymlを分割したときのめんどくせぇ -f 問題


基本の共通部分
docker-compose.yml

環境に応じて、
docker-compose.local.yml
docker-compose.stg.yml
docker-compose.prod.yml
とか、分割している場合に、`-f`オプションで

```bash
$ docker-compose -f docker-compose.yml -f docker-compose.local.yml up -d
```
と、する。必要があり、非常に面倒

そこでぐぐると
```bash
$ export COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
$ docker-compose up -d
```
のような表記が出てくる
`export`を使えと。
それはそれでいろいろ事故を生む

ということで、
.envに書けばいいじゃないの
```
│
├.env
├docker-compose.local.yml
└docker-compose.yml
```
```.env
COMPOSE_FILE=docker-compose.yml:docker-compose.local.yml
```
これで解決
```bash
$ docker-compose up -d
```
Windows11のローカルにLaravel環境をデプロイするには

# Laravel でWebアプリを作るには
PHPベースのフレームワークなので、まずはPHPが何なのかを知っておく。
LAMP環境でPHPを用意するならXAMPPをインストールしておくことで軽快に用意できる。

## XAMPP を chocolatey でインストール
```
choco install xampp-80 -y
```
インストール後にバージョンを確認。

１．XAMPPのコントロールパネルを開き、Apacheの「Start」を押します。
(ボタン名が「STOP」に変わります)
Apache起動後に「Admin」をクリックします。
２．ブラウザが開き、XAMPPのバージョンが表示されます。

`http://localhost/`

応答結果

`XAMPP for Windows 8.0.15`

## composer を chocolatey でインストール
choco install composer -y
インストール後にcmdでバージョンを確認。
```
composer
```
応答結果

Composer version 2.3.5 2022-04-13 16:43:00

## Laravelのインストール
composer global require "laravel/installer"
インストール後にcmdでバージョンを確認。

laravel -v
応答結果

Laravel Installer 4.2.10

## php.ini の編集
カレントディレクトを移動する
```
cd C:\xampp\php
```
## php.ini の下記該当箇所を修正。
```
default_charset = UTF-8
date.timezone=Asia/Tokyo
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
```
## Laravelの8.x系をインストールする
インストールしたい htdocs ディレクトリに移動
```
cd C:\xampp\htdocs
```
Laravelの8.x系をインストールする
```
composer create-project laravel/laravel project-name "8.*"
```
composer.lock をインストール
```
composer install
```
composer.json をアップデート
```
composer update
```
composer.lock を再度インストール
```
composer install
```
vendor の中に autoload.php ファイルが出てきてることを確認。

## Laravelを起動
```
php artisan serve
```
## ブラウザで Localhost を開く

`http://127.0.0.1:8000/`

`http://localhost:8000/`

## 参考文献
Laravel - Wiki
https://ja.wikipedia.org/wiki/Laravel

Laravel - Qiita
https://qiita.com/tags/laravel 

Chocolatey - Wiki
https://ja.wikipedia.org/wiki/Chocolatey 

XAMPPのバージョンを調べる(PHP/Apach/MariaDB)
https://itsakura.com/xampp-version 

Composer - Wiki
https://ja.wikipedia.org/wiki/Composer 

Laravelのインストール手順（Windows）
https://blog.senseshare.jp/laravel-install.html 
→ laravel new は使わない。

バージョン指定してLaravelをインストールする
https://eclair.blog/install-laravel/ 

Windows 環境での Laravel インストールから起動まで
https://qiita.com/tsuna_kan/items/a51cfaa668ced7bacb0e 

【Laravel】Laravel初期設定
https://qiita.com/LingmuSajun/items/897b6f55e79d08eaed3f
VSCodeでエラー画面がでたときの対処方法。Failed to create file handle: Access is denied. Please verify there are no Visual Studio Code processes still executing.　のエラー対処

## VS Code を利用すると

Failed to create file handle: Access is denied. Please verify there are no Visual Studio Code processes still executing.

## エラー画面がでる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/0486d59b-4408-f226-caf5-a5c17c3fc9d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/981dd708-0a47-1a9b-c2fd-7259b04ea4b7.png)


## 対処方法
VSCode で Update 時に Code.admx が開けないというエラーが出てしまう方は、
VSCode を管理者として実行する。

https://github.com/microsoft/vscode/issues/150287

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/e993ea7f-95c1-e29d-e3c9-cab08e6d5289.png)

以上。
タケルの日報


<h1>初めまして！タケルです！

私は、新卒野球バカの未経験エンジニアです笑

５月から現場で勉強させていただいておりますが、
何をやっているのかわからない時があります・・・・・

そんな中ですが、がむしゃらに毎日勉強頑張っています！

これからは、私が学んだことやわからなかったところ、解決方法など、
みなさんにわかりやすいようにお伝えしていければなと思っております！

よろしくお願い致します！

<h1>今日の作業内容

今日は、dockerを使ってとりあえず、appseverを作ってみることをしました！
 
dockerとはコンテナ型の仮想環境を作成したり実行したりすることができる環境です。
簡単に言うと、とりあえず何でもできるイメージです！

これから今日行った手順を紹介していきます！

<h1>appseverの作成手順について（簡単に！）

今回は、詳しいファイルの説明などは省きますが、今後は私自身のインプットのためにもアウトプットしていきます！！


<h3>Dockerfileの作成

dockerイメージを作成するために、Dockerfileを作成します。
このファイルの中に、命令コマンドを記入していきます。

<h3>Dockerfileを使ってイメージを作成

＃docker build -t <イメージ名>を実行します。

続いて、

＃docker imagesを実行して確認します。

＃docker run -it -d name <イメージ名>　-p （数字）を実行

<h3>結果

IPアドレスと先ほどの数字を検索してみると表示されるはずです笑

<h1>まとめ

上記、初心者感が非常に丸見えですが今日行ったことです。
まだまだ、なぜそこでそのコマンドを使うのか、徐々に理解ができているのが現状です。

これから、２年後３年後５年後くらいには私もしっかりとしたエンジニアになれることを信じて
頑張っていきたいと思います！
しくじりPM！俺みたいになるな！


どうも、あーみーです。
今回は様々なプロジェクトを通じて「よかったPM、悪かったPM」そして私自身の経験に基づいてしくじりプロジェクトマネージャーを書いていきたいと思います。

※これは過去のPMへのディスリではありません、こういった行動が何故良くないか自戒も含めて記録していこうと思います。

それではいってみよう！！

# 作業ボリュームを把握する前にスケジュールを引く

いきなりこんなの出る？？？って感じるかもしれませんが **意外といます。**
例えば設計書のスケジュールであれば
* 粒度はどのくらいにするか(どこまで書くか）
* フォーマットを決める
* 作業量が分かる
* 機能に合わせてスケジュールを引く

このような形になるかスケジュール優先であれば

* スケジュールを引く
* その中で可能な設計書を顧客と協議する
* フォーマットを決める
* 作業量を割り出して問題あれば再度調整

上記の形になると思います。

この流れを組んでないと過多なドキュメント、コストに見合わない品質管理、可読性や保守性を意識しないソースコード、炎上して稼働MAX！などが完成していきます。

# タスクによってコストが掛かるウェイトを理解していない

基本的にタスクの難易度とそれを担当するメンバーのスキル感は理解していると思いますが、それの因果関係を把握していないPMが多すぎます。

|エンジニアスキル/難易度 |High |Low  |
|---|---|---|
|**High** |コスト高/納期も長め  | コスト安/納期最短  |
|**Low**  |**出来ない** | コスト中/納期そこそこ  

エンジニアスキルと難易度の因果関係は上記の通りです。
この因果関係を分からない為、エンジニアスキルが高/タスクの難易度が高のものについての見積もりが甘い結果になります。
あとはエンジニアスキルが低いメンバーに高難易度のタスクを割り当てしても「出来ない」が正解となります。

そのためこの辺りの因果関係とメンバーのスキルに合わせて、タスクの割り当てを実施していかなければ想定より大幅にズレる事になります。

# すべてリーダー任せ

PMが自分自身が統括しているアプリケーションの概要しか分かってない人が多いです…。
例えば〇〇アプリのモジュール××はAPIの連携が必要で、その為の仕様が来ていない等の課題があればそこは話を詰めなければいけない部分です。
（API仕様が公開されているようなモノなら優先度は少し下がりますが、そうでない場合は優先度がグンとあがります。）

優秀なPMは逆に進捗だったり交渉の部分でPMにPLが聴くケースが多いですが、しくじりPMは**その逆です。**
何でもPLに質問している人や丸投げ状態で依頼している人は要注意です。。

# 進捗管理ばかりで品質を追わない

プロジェクトの進め方によりますが、ウォーターフォールの開発だと進捗の中間報告でお客様に~~理不尽な激詰め~~ 問い合わせされるケースが多々あります。

その関係で進捗管理についてシビアなPMは割と多いですが、肝心の品質について説明できる人がいません。。
この辺りはコードについての理解がないのか、システムの全容が把握できてないのかは分かりかねますが、品質が一定のフェーズで担保出来てないと問題を後回しにしてるだけとなります。

この不具合は影響度が少ないのでテストフェーズで直します（なので許してちょ）
この不具合はマズいので次の定例までに修正入れます

みたいな会話もアジャイルではあるあるですが、ウォーターフォールも聞かれてないだけで把握はしておく必要があると思います。
なのでお客様との調整もそうですが、メンバーとの調整も必須となっていきます。

# 顧客が最も大切にしたいモノを理由込みで言えない

あなたのお客様が一番欲しいものはなんですか？
と言われて分からない人が多いと思います。

大まかに分けると
**品質・機能・納期・予算**
この4つに分類すると思ってますし、すべてが大事なお客様が多いのも事実です。

ただ、実際にプロジェクトがうまくいかなくなった際にどれを一番に優先したいですか？というのを予め把握しておかないと何かあった際の提案として「頑張ります」しか言えなくなってしまいます。

* 多少のテスト品質（セキュリティ等の重要度高いものを除いて）は落としても仕方ない。
* コストカットの為にこの機能はスモール化するか、機能自体を削るか
* 納期重視ならば運用を想定して、都度リリースに運んでいくのか

これらの選択肢があると無いとでは大分異なりますよね？
そのためにプロジェクトの発足時に把握しておくことが必要になります。

# プロジェクトの成功が何かを明示できない

これは請負や自社開発で特に重要になりますが、プロジェクトの成功って何でしょうか？
* 顧客の関係を継続する為に赤字を出してでも完成させる
* 利益を確保するためにアプリを納品する。
* メンバーの教育（未来への投資）に向けて、経験値を積ませる
* 社内のブランディングを高めるため、赤字でも完成させてビジネス上のイニシアティブを確保する

アプリを作ることが必ずしも、ゴールになってはいけません。
アプリを作るのは大前提で、その上に何をしたいのかが決まってない・明示していないPMが非常に多いです。
この辺を伝えていないと社員や協力会社さんのモチベーションがかなり変化し、方向性にズレが生じます。

-------

以上でしくじりPM、俺みたいになるな！を終えたいと思います。
私もPG、PL、PMとして様々な経験をしてきましたが、「うわーーーあーみーはしくじりPMだぁぁぁぁぁ！！！」って思われない様に日々高めていけたらと思ってます！

*P.S. コードが書けないPMはヤヴァイ*
CircleCI Enterpriseでorbのaws-ecrが動かない(ことがある)

GlobalのCircleCIで動作実績のあるaws-ecrでのデプロイJobがCircleCI Enterpriseの環境では動作しないという現象に遭遇しました。

エラーメッセージは以下

```
Build-agent version 1.0.114877-701271cf (2022-03-15T13:07:16+0000)
Creating a dedicated VM with ubuntu-2004:202010-01 image
failed to create host: Image ubuntu-2004:202010-01 is not supported

failed to create host: Image ubuntu-2004:202010-01 is not supported
```

どうやら使用しようとしているDocker Imageがサポートされていないと言われているようです。

## 調査
CircleCI Enterpriseは今回初めて利用しましたが、これはGitHub Enterprise同様企業のローカルネットワーク内にCircleCIのサーバーをまるごと立てたもの、と理解しています。

GlobalでのCircleCIは世界中からのCIリクエストをさばくために膨大なマシンパワー/リソースを使用していると想像しますが、企業内からのリクエストだけを捌けば良いCircleCI Enterpriseでは同等のリソースが必要なわけではなく、規模に応じたリソース割当が行われていると思われます。(今回、ゲスト的な立場だったので実際のところどうなのかは聞けておらず、半分は想像です。)

特に拡張機能などはサポートするためにはサーバ側に色々とインストールする必要があって、それなりにストレージを消費すると思われるのでサポート範囲は限定的になっているんじゃないかと思います。

実際、[aws-ecrのドキュメント](https://circleci.com/developer/ja/orbs/orb/circleci/aws-ecr)にリストアップされているバージョンをいくつか試しましたが、7.3.0と8.1.2以外は

```
Cannot find circleci/aws-ecr@6.15.3 in the orb registry. Check that the namespace, orb name and version are correct.
```

と、orbが見つからないというエラーになりました。
まぁaws-ecrだけでもバージョンは30個以上ありますし、はるか昔の0.xバージョンを置いておいてもストレージの無駄遣いでしかないと思うので、この辺を限定するのは妥当だと思います。

同様にDockerImageやDockerEngineのバージョンなどもある程度限定されているようです。

## 解決
[aws-ecrのドキュメント](https://circleci.com/developer/ja/orbs/orb/circleci/aws-ecr)によると`build-and-push-image
`のパラメータで`executor`や`remote-docker-version`を指定できるので、これらを指定することで動作しました。

こちらで動作した設定は以下

```
executors:
  custom-ecr:
    docker:
      - image: cimg/base:2021.07

...

      - aws-ecr/build-and-push-image:
          ...
          executor: custom-ecr
          setup-remote-docker: true
          remote-docker-version: default
```

前述の通り、環境によってサポートされているDockerImage/DockerEngineVersionは違うと思うので、この設定がすべてのCircleCI Enterprise環境で動作するとは限りません。

ちなみに`remote-docker-version`については[CircleCIのdocker versionドキュメント](https://circleci.com/docs2/2.0/building-docker-images#docker-version)に載っているバージョンを片っ端から試しましたが、どれ一つ動作せず。。。
最終的にdocker buildが動作している別のリポのCIの実行ログと見比べて`default`が使えるらしいらしいということがわかって、それでようやく動作しました。

思うに、これaws-ecrが変にこの辺のパラメータのデフォルト値を細かく指定しているせいで発生する現象なんですよね。。。
例えば[この辺](https://github.com/CircleCI-Public/aws-ecr-orb/blob/20543408da67b0013c3adea8a0dac192ab0b5540/src/commands/build-and-push-image.yml#L124-L127)

本家のCircleCIで`default`という値が有効かどうかわからないのと、パラメータの指定で回避可能であるのでIssueはあげませんでしたが、もうちょっとわかりやすくならないものか？とも思います。
シェルとバッチ

### 始まりはここから
業務でシェルスクリプトを作成することになった。
いくつか見たことがあり、コマンド命令を自動化するバッチファイルと思っていたので
昔作ったバッチファイルを思い出し、ソラで書けるHelloWorldを作った。
ダブクリ実行。…あれ？起動しない。
ターミナルから操作。…あれあれ？そんなコマンドないって？

### シェルとバッチは違うんだよ
なんでなんで？？？と焦ったが、すぐに調べてわかった。
そもそも、作成・実行環境が違った。
昔使用していたのはWindows。今使用しているのはMac。
<b>そう、先ほど作ったファイルは.batだった。</b>
そりゃ実行できないしターミナルで打ってもそんなコマンドないよって言われるよね。

#### バッチファイル（.bat, .cmd など）
Windows環境で実行できるコマンドを記述したテキストファイル。拡張子は.bat, .cmdなど。
基本的に<b>コマンドプロンプト</b>上で動くものを指します。
※最近はPowershellが後継として使用され、シェルスクリプトに統合されつつある。

#### シェルスクリプト（.sh, .bash など）
バッチファイルのUnix版、Unix系OSで実行できるのコマンドを記述したプログラムファイル。
基本的に<b>シェル</b>上で動くコマンドを記述したファイル。
詳しく突き詰めていくとBシェル系、Cシェル系などがあるらしい。

### つまり
双方ともに、実行コマンドをまとめたプログラムファイルではあるが、実行できる環境が異なってくる。
作成する際にはファイルを実行させる環境を確認し
バッチファイルなのか、シェルスクリプトなのかを判断する必要がある。
PowerPlatform でソリューションをアップデートしてもフローが更新されない場合の対処法 

本記事は下記コミュニティスレッドの内容を基にしてより容易に理解できるよう解説したものです。


https://powerusers.microsoft.com/t5/Building-Power-Apps/updating-a-solution-does-not-update-flows/m-p/712864#M228035

**＜目次＞**
**■ 初めに：Power Platformソリューションにおけるアクティブレイヤーとは？**
　**> 対処法①：管理プロパティで移行先環境での編集を不可にする**
　**> 対処法②：移行先環境での編集によって生じたアクティブレイヤーを削除する**


## 初めに：Power Platformソリューションにおけるアクティブレイヤーとは？
まず、**通常時のソリューション運用のイメージ**を記載します。
テスト環境において**Active(編集可能状態)でソリューション**を作成し、本番環境に移行すると**カスタマイズ内容はInactive(編集不可能状態)に**なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/ad578016-77e3-2b95-fe22-21aa2e666e7c.png)

ここで、**移行先環境でソリューションに変更を加えた場合にアクティブレイヤーが作成**されます。
例えばフローの名前変更、トリガーやアクションの追加など移行先環境での新たなカスタマイズは全てレイヤーを分けて保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/65c1d6c6-bb15-f88d-df8d-5ecb20687433.png)

では、このアクティブレイヤーの存在がなぜソリューションのアップデートの障害になるのでしょうか？
それは、**テスト環境のソリューションをインポートして本番環境をアップデートしても、その内容をアクティブレイヤーがらさに上書きする**からです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/5d408a62-90d7-7e52-a48c-af8da97f0047.png)


このようにアクティブレイヤーが存在していると、**何度ソリューションにアップデートをかけても移行先の編集内容が再度上書き**されてしまいます。**移行先の独自のカスタマイズを保持しつつソリューションのアップデート内容だけを反映したいようなユースケース**であれば便利ですが、通常時は下記2つの対策を行うことで正常にアップデートをかけれるようにするのがおすすめです。

## 対処法①：管理プロパティで移行先環境での編集を不可にする
**ソリューション ＞ 各コンポーネントのメニュー ＞ 詳細 ＞ マネージドプロパティ** を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/1fd72a2e-4677-a259-fcee-6c4138f9fcf1.png)

**「カスタマイズを許可する」をOFF**にする。
（※マネージドソリューションであってもこの設定を行わないと移行先環境で編集ができてしまう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/245e077e-7724-3014-cc1e-0ce697116236.png)




## 対処法②：移行先環境での編集によって生じたアクティブレイヤーを削除する
**ソリューション ＞ 各コンポーネントのメニュー ＞ 詳細 ＞ ソリューションレイヤーの表示** を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/72ba566a-1ae1-8fac-1942-2964b84da90f.png)


**ソリューションの中にアクティブ状態のレイヤーが含まれることを確認し、「アンマネージドレイヤーを削除する」を選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/8d07a35a-76b4-9b63-8984-3e6c8d3caec8.png)

これで、再度開発環境からソリューションをインポートすることで変更内容が本番環境で上書きされることなく反映されるようになります。
C言語のビット・シフト演算で符号を反転

（『独習C』第13章の理解度チェック大問1）

（コマンドライン引数で与えられた）int型の値の符号を反転した数を返すプログラム：

```c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	int n = atoi(argv[1]);

	if (!n) {
		puts("0");
	} else {
		int npositive = n;
		int shift = 0;
		for (; (npositive & 1) == 0; shift++) {
			npositive >>= 1;
		}
		printf("%i\n", ~npositive << shift | 1 << shift);
	}
}
```

（ヒントにある内容を噛み砕く）

~~まずint型の負数は2の補数。~~

int型の負数として2の補数を考える。

2の補数は、**元の値の最も下の桁の1以下はそのままで、それよりも上の桁のビットが反転したもの**。

どういうことかというと、`00001100`なら、最も下の桁の1以下とは`100`。なのでそれより上の`00001`を反転させればよい。

`00001101`なら、最も下の桁の1以下とは`1`。なのでそれより上の`0000110`を反転させればよい。

<br><br>

上記を踏まえてプログラムを見てみる。

まず`npositive & 1`で、一番最初に出てくる1（つまり最も下の桁の1、一番右端にある1）を探し出してる。

ここで`& 1`における`1`は`00000001`のことだから、`npositive & 1`は下一桁だけをみてる。

例えば（以下における`=`は等号の意味）

```
00001100 & 00000001 = 00000000 = 0
00000110 & 00000001 = 00000000 = 0
00000011 & 00000001 = 00000001 = 1
```

この動きのように、`npositive >>= 1`で1ビットずつ右シフトしてる（00001100→00000110→00000011）。


最後に「元の値の最も下の桁の1以下はそのままで、それよりも上の桁のビットが反転したもの」を思い出す。

`~npositive << shift | 1 << shift`について、そのままにする部分のことを考えて`<< shift`してやる。

そしてそれよりも上を反転（`~npositive`）してやる。

あとはそれらの和（`|`）をとってやれば目的のものが得られる。
身につくプログラミングの勉強方法

自分がやってきてすごく充実したなと思う学習方法を書いていきます
「自分はこうでした‼︎」という方がおられましたらぜひコメントほしいです
挫折なく勉強できた実績をこれから始める人とシェアできたらと


<h1>開発環境</h1>
Cloud9<br>
言語にもよりますが僕はこれが最強の開発環境だと思います<br>
「端末依存ではない」<br>
という点があり、PCがいきなりぶっ壊れた！となってもアカウントさえあればまたいつものCloud9で作業できます<br>
PCスペックも低くて大丈夫ですしね<br>
iPadやChromebookでも書けます<br>
開発環境で挫折する人も多い中このCloud9だとアカウント登録するだけなので躓くことはありません<br>
料金は1年間無料<br>
その後でも個人で小規模アプリケーション開発なら月200円程度です<br>
<a href="https://youtu.be/ld8sfalVDeg">Cloud9のアカウント登録方法はこちらを参照</a><br><br>

※HTML,CSS,JavaScriptをやる場合は特にCloud9はいらないと思います
テキストエディタとブラウザがあればできますので

<h1>学習教材</h1>
初めのうちは書籍より動画関係がいいかと思います<br>
・ドットインストール<br>
・Udemy<br>
がおすすめ<br>
動画でわかりやすく解説しています<br>
Udemyだと30日間返金が可能です<br>
合わなかったりおかしな点があれば返金できます<br>
<font color="Red">それとUdemyですが大幅セールを頻繁に行ってます</font><br>
11,000円のものが90％OFFとかになります<br>
頻繁に行われているのでその時にかうのがおすすめ<br>

<h1>学習方法</h1>
今回のキモとなる部分ですね
動画で学習していることを前提に進めます
<h3>学習の準備</h3>
まずはノートを準備<br>
おすすめは<br>
・EverNote<br>
・OneNote<br>
紙のものでも好きなもを使えば大丈夫ですが上記二つはかなりおすすめ
<h3>学習の流れ</h3>
<h4>STEP1</h4>
動画を見て実際に動かす<br>
これはそのままの意味で動画を見ながら普通にプログラムを書きましょう<br>
理解できない部分があってもOK<br>
<h4>STEP2</h4>
もう一度同じ動画を見てノートにまとめる<br>
ただ言われたことをまとめるんじゃなくて自分なりの解釈も入れると良いです<br>
ここでわからないことがあれば調べる<br>
もし15分調べてわからなければこちらのサイトで質問するのがいいでしょう<br>
<a href="https://teratail.com/">Teratail</a><br>
エンジニアの集う質問サイトです<br>
<h4>STEP3</h4>
STEP2をやり続け全ての動画が見終わったら<br>
<font color="red">次は自分でまとめたノートを見て同じものを作ってください</font><br>
いわゆる復習になります<br>
これが一番重要です<br>
理解度をここでチェックする感じですね<br>

<h1>最後に</h1>
はっきり言うとプログラミングなんて流れをつかめばいいです<br>
流れさえわかっておけば<br>
「ここはどう書いたらいいかな？」<br>
ってなったときに調べやすいですし<br>
学んだ言語の機能を全て把握して覚えているという方は僕の知る限りいません<br>
毎日触っていたら自然と覚えていきますし継続することが大事です<br>
無理に覚えようとせずに長い目で見てわからない時は調べたり質問すれば大丈夫です<br>
気楽にいきましょう
【個人開発】マンガの新刊チェックをBotにやらせる

マンガが好きで、発売前に知って予約しておきたいのです。
しかし、Amazonでは好きな作家をフォローしていてもなんか微妙なタイミング。
毎日Amazonや楽天を新刊パトロールするのも面倒だし・・・

そこで、 `openBD` という公開APIから書籍情報を引っ張って、タイトルや著者名の検索ワードから自動検索するボットを作成しました。

それ、プログラムにやらせよう！

## 特徴

- 毎日、最新の書籍データを取得
- 毎週、検索ワードで2週間分の新刊をチェック、検索結果をLINEで通知

というシンプルなボットを作成しました。
1か月ほどテストしていましたが、そろそろみんなに使ってもらいたいので公開します。

### マンガ新刊チェック！

LINEでお友達登録して、トーク画面のリッチメニューから検索してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417567/40d703c6-35c6-7ddd-15b5-e2c2acc2fb10.png)

MacやWindowsはこちらからどうぞ。
<https://manga.bitto.jp/>

## ざっと使い方

- マンガを検索する
![B77FE79F-1A57-4428-BB27-42EA0E7295B5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417567/56fc5bfc-1e1e-ca68-39aa-a965ffb0aa2e.jpeg)


- 検索条件を登録
![31EA087A-9812-46D1-ABD3-D898CB3A5D99.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417567/84c9e48c-4da3-51c0-9e20-b590f4541588.jpeg)



これだけで、毎週自動で新刊チェックします！

## 技術的な話

一応Qiitaなので、技術的な概要も書きます。

### 書籍データはopenBDから取得

[openBD](https://openbd.jp/)は、書誌情報・書影(書籍の表紙画像)を、だれでも自由に使える、高速なAPIです。
利用するにあたって登録も認証も不要です。全ISBNリストを取得したら、1万件ずつに分割して詳細情報を取りにいくだけです。

```text
# vscodeのrestclientで確認できます
### 全書籍のISBNがJSONで返ってくる。
GET https://api.openbd.jp/v1/coverage

### 単発ならGETで取れる(ISBNのハイフンはあってもなくてもOK)
GET https://api.openbd.jp/v1/get?isbn=9784065271056&pretty

### 1万件という制限があるが、POSTでまとめて取得もできる
POST https://api.openbd.jp/v1/get
content-type: application/x-www-form-urlencoded

isbn=9784065271056,9784098511488,9784065234150
```

データは全国の会員出版社が書籍情報をメンテナンスしているようです。
出版社の入力次第なので、あらすじや書影の存在しないデータや、そもそも書籍データが存在しないものもあります。

2022年5月現在、約160万件の書籍情報が登録されています。
そのうち、マンガのジャンルコードが付与されているのは11万件くらいです。

夜間に取得・加工して全データを洗替していますが、非力なインスタンスだと1時間位かかります。

### 新刊チェック

バッチで力技の全レコードLIKE検索。
夜間に検索結果をテーブルに保存して通知に備えます。
とはいえ通知対象は2週間分のマテビューなので、全部でも500件くらいです。
これを人数分処理します。

### LINE通知

新刊チェック結果を通知します。

LINEを選んだのは認証ができること、通知の際に気軽に開きやすい（と考えている）からです。
通知からリッチメニュー → webページへのジャンプがおっくうじゃないところもいいですね。

## 課題
### Kindle買うのが手間
iOSを使っていると、AmazonへのリンクがアプリになってしまってKindle版を購入することができません。
アプリからシェアでブラウザに行く必要があります。めんどい。

なんとかブラウザに飛ばしたいのに。
誰かいい方法知っていませんか・・・！！

### LINEの無料通知枠が小さい
LINEの無料通知枠は1000件しかないので、ユーザが増えてきたら要課金。
アフィリエイトの利益率によっては通知頻度を下げないといけないかもしれません。
アフィリエイトリンク以外の広告はあんまり表示させたくないんだよなぁ。

## 個人開発振り返り

### 開発の時間を作る
主に朝の始業前1時間を使い、途中でアーキテクチャ変えたりもして、ちんたら2ヶ月くらいかけました。
電車で通勤しているとインプットしかできないですが、リモートワークだとその時間にアウトプットできるのがいいですね。

### 投げ出さないためのモチベーション

途中で飽きて投げ出さないために、gitlabになるべく1〜3時間で終わるように細かくissue作って、カンバン片付けながら作業しました。
やったこと、考えたことをメモすることで同じような問題も探しやすくなります。

### UI/UXの改善

動くものができて使ってみると、けっこう考えて作り込んだ動線が使いにくかったり理解しにくかったりします。
これはかなり時間をかけて改善しました。
具体的には各画面での操作感の統一、ボタン位置の調整、配色や文字サイズなど・・・

検索時のレスポンスも重要です。
最初はタイトルと著者名、さらに発売日を検索条件にしていたのですが、発売日で区切ってマテビューを作ることで劇的に速度改善しました。

## まとめ

なんだかんだでリリースできるのが無上の喜び。
よろしくおねがいします！

モバイル版(LINE) -> <https://lin.ee/7VRmd1W>
PC版 -> <https://manga.bitto.jp/>
かっこいい操作・環境を作るyabai+skhd(MAC) 

# はじめに

以下のページを拝見しました。映画のハッカーみたいな「かっこいいディスクトップインターフェイス」のことを、UnixPornということを初めて知りました。

http://neko-mac.blogspot.com/2022/04/unixporn.html

> UnixPornは結局のところ、 様々な「 自分ちのウィンドウマネージャー自慢 」なのです。

とのことでした。リンク先のページでは、様々なウィンドウマネージャーが紹介されていますが、今回は、QiitaやZennに紹介があり、とても簡単に導入ができそうな「yabai+skhd」をやってみようと思いました。

**できるだけショートカットで操作できる・見た目がかっこいい**、という２つを兼ね備えたものなので、実際にやってみたときにメモとなります。

#### 参考にさせていただいたURL

https://zenn.dev/yootaki/articles/d6ba758c63a315

https://qiita.com/psyashes/items/68ac40659ddbe04f8f7f


## yabaiインストール・設定

https://github.com/koekeishiya/yabai

インストールや操作は、参考サイトのとおりでとても簡単。

(1) yabaiインストール

~~~:ターミナル
brew install koekeishiya/formulae/yabai
~~~

(2) アクセシビリティの有効化

(3) 設定ファイルの作成：ルートディレクトリに .yabairc を配置　=> 参照URLを確認

(4) yabai スタート・ストップ

~~~:ターミナル
$ brew services start yabai

$ brew services stop yabai
~~~

## skhdインストール・設定

https://github.com/koekeishiya/skhd

(1) インストール
~~~:ターミナル
$ brew install koekeishiya/formulae/skhd
~~~ 

(2) アクセシビリティの有効化

(3) 設定ファイルの作成：ルートディレクトリに .skhdrc を配置　=> 参照URLを確認

(4) skhd スタート・ストップ
~~~:ターミナル
$ brew services start skhd

$ brew services stop skhd
~~~

## 画面に表示してみる

yabaiにてターミナルをきれいに配置し、各種システム監視し難しいことをやってる風。
しかし表示しているのは、TOP関連コマンド＋neofetch＋Matrixということで、実際、特に何もしていない。skhdは、ショートカットを自分好みに設定できるのでやりこみが必要。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/5eb620f6-8d4c-aa03-1972-87b8b7fdf86a.png)


## コマンド紹介＆インストール

- bashtop
以下を参考にしてインストール

https://www.cyberciti.biz/open-source/command-line-hacks/bashtop-awesome-linux-resource-monitor-tool/

- htop
~~~:ターミナル
$ brew install htop
~~~

- gotop
~~~:ターミナル
$ brew install gotop
~~~

- neofetch
~~~:ターミナル
$ brew install neofetch
~~~

- cmatrix
~~~:ターミナル
$ brew install cmatrix
~~~

## eDEX-UIはかっこいいけど、重い

MACに限らず、かっこいいインターフェイスを簡単に実現してくれるnode-JavaScript製ソフトウェアの **eDEX-UI** も下記のURLを参考にさせていただき試してみました。

しかし、かなり重く、動作がもっさりでした。キビキビ動けば、映画のハッカー気分を味わえる「かっこいいインターフェイス」だと思います。

https://qiita.com/risto24/items/52726e100d1cf4887734

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/374eef28-db12-cf5f-831f-10cc630a9551.png)
RasPi Pico で I2C LCD表示する

Raspberry Pi Picoを買ったのでいじってみることにした
手元にある秋月電子から買ったI2C小型キャラクタLCDモジュールを接続し、Picoの温度センサを表示してみる

開発環境は、mac bookPro Monterey に Thonnyをインストールして行った
Pico の初期設定は省略する
I2C接続小型キャラクタLCDモジュール 8x2行 
  AQM0802A-RN-GBW 
  ST7032i

 [Pico]
 SDA:GP6
 SCL:GP7


----- main.py -----
from machine import Pin
from machine import I2C
import time


class st7032i:
    LCD_RS_CMD = 0x00
    LCD_RS_DATA = 0x40
    LCD_CMD_CLEAR = 0x01
    LCD_CMD_HOME = 0x03
    lcd_bus = 0
    my_id = 1
    my_freq = 400000
    my_sda = Pin(6)
    my_scl = Pin(7)
    my_addr = int(62)
    i2c = I2C
    
    def __init__(self):
        cmd1 = [b'\x38',b'\x39',b'\x14',b'\x70',b'\x56',b'\x6c']
        cmd2 = [b'\x38',b'\x0d',b'\x01']
        self.i2c = I2C(self.my_id, freq=self.my_freq, sda=self.my_sda, scl=self.my_scl)
        addr = self.i2c.scan()
        self.my_addr = [int(n) for n in addr]
        print (self.my_addr[0])
        for order in cmd1:
            self.i2c.writeto_mem(self.my_addr[0], self.LCD_RS_CMD, order)
            time.sleep(0.2)
        for order in cmd2:
            self.i2c.writeto_mem(self.my_addr[0], self.LCD_RS_CMD, order)
            time.sleep(0.2)
        
    def char(self, y, x, msg):
        dat = 0x80 + (0x40 * y) + x
        byte = dat.to_bytes(1,'littele')
        #dat = b'\x80'
        self.i2c.writeto_mem(self.my_addr[0],self.LCD_RS_CMD,byte)
        for order in msg:
            self.i2c.writeto_mem(self.my_addr[0],self.LCD_RS_DATA, order)
            #time.sleep(0.2)

if __name__ == '__main__':
    sensor_temp = machine.ADC(4)
    conversion_factor = 3.3 / (65535)
    led = Pin(25, Pin.OUT)
    #i2c = I2C(1,freq=400000,sda=Pin(6),scl=Pin(7))
    #print(i2c.scan())
    st = st7032i()
    msg = "RPi Pico"
    st.char(0, 0, msg)

    while True:
      led.value(1)
      time.sleep(0.5)
      led.value(0)
      time.sleep(0.5)
      
      reading = sensor_temp.read_u16() * conversion_factor
      temperature = 27 - (reading - 0.706)/0.001721
      msg = "%3.2f" % temperature
      st.char(1,2, msg)
【BizRobo!】 要件変更は当たり前　別にそのロボットを稼働させる為の設定ファイルなどに要件変更されそうな情報は退避している方が良い。

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回の内容は、RPAの開発をしている中でたびたび発生する要件変更、
「実はこんな状況も発生するので対応してほしい」や、開発していたら聞いていない状況が発生し、実は伝え漏れていた等、いろんな状況から要件変更は発生すると思います。

個人的には、「伝えといてよ…」と思いますが、そう言っていても前には進みませんので、要件変更はある前提でロボットを開発しています。
そんな状況が発生すると考えた時に、「開発時やっておいた方が良い事」についてが、今回のTipsになります

## Tips概要
開発時にやっておいた方がいい事についてですが、「あらかじめ変更される可能性がある値」については、ロボットに直書きするのではなく、<font color="#ff0000">**別ファイルに記載しておく！** </font>です。

## Tips詳細
これは、BizRobo!だけに限らず、他のRPAツールにも共通して言えることです。
例えば、以下の様なロボットで使用する値については別ファイルで記載している方が良いです。

- ログインID
- ログインパスワード
- URL
- ファイルパス
- ファイル名
- 開始行・終了行(何かをループする時に決まった行のみループする際の始点と終点)
- メールのアドレス(form、To、Cc)
- メールの件名
- メールの本文
など

こういった値を、あらかじめ別ファイルで管理しておく事で、急な変更が入った場合もロボットの修正はせずにファイルを修正し、置き換えるだけOKになります。
(RPAエンジニアの習性として、なるべくロボットは触りたくないと思いますので…)

実際の設定ファイルについては、ロボットがちゃんと読み込められればなんでもOKです。
(例)
![設定ファイル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/0c016af9-5220-ee0b-ff29-833418600461.png)

## まとめ
今回のTipsはいかがだったでしょうか。
上述しましたが、こちらはBizRobo!だけではなく、他のRPAツールを使用する際も同じです。
UiPathだと技術習得用のサイトでも、そういった記述がありました。
また、この別ファイルで管理するという開発方法は、ロボットの開発標準といっても過言ではないぐらい、各エンジニアの認識にあると思いますので、頭に入れておいて損はないと思います！
【BizRobo!】 ロボットの構成は1オペレーション１ロボットで。

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
普段、ロボットの開発を依頼された時に、要件調整をし全処理工程に対して、どの様な構成でロボットを開発していますでしょうか。1ロボットに、最初から最後までの工程をすべて詰め込んでいたりしていないですか？
今回は、そんなロボットを開発する時の構成について記事にしました。

## Tips概要
ロボットの構成は **1オペレーション１ロボット** にしましょう！
お客様先の既存ロボットが、そうではない場合はメンテナンスの観点から出来ない事があるかもしれないのですが、基本的には1オペレーション１ロボットが好ましいです。
ロボットの稼働、メンテナンス、エラー対応の観点から、1オペレーション１ロボットの構成にしておくと、大変運用がしやすいです。

## Tips詳細
BizRobo!を提供しているRPAテクノロジーズが、ロボットはこうやって開発しましょうと定義しているknowledgeを見ると…

- **ロボットのサイズはコンパクトに保つこと**
ロボット当たりのステップ数上限の目安は 100 ～ 200 程度にしましょう。
ステップ数の上限自体に厳格な数値的根拠はありませんが、ロボットを開いたときに全体が見渡せる範囲であることが、業務部門の非エンジニアを含め長期間複数人でロボットをメンテナンスしていく上でのちょうどいいサイズとなります。

- **単一の処理に集中すること**
人が作業をする場合には複数のことを同時にやってしまった方が（データをチェックしながら入力をするなど）省力化できることが多いですが、ロボットは繰り返し処理や個別処理を嫌がることはありません。
場合によっては人と役割分担したり、例外発生時に素早くリカバリーするためにもロボットへは単純に分解した作業を順次組み合わせて実行（データのチェックを集中して実施した後、正しいデータを集中して入力）させることにより、
作成時の業務整理の機会を得るととともに、ロボット自体を簡潔に保ちエラー発生時の影響を低く抑えることができます。

■[健康なロボットのための 10か条（解説）
](https://rpa-technologies.com/catalog/10RulesOfHealthyRobots.pdf)

上述されている通り、なるべく開発するロボットはコンパクトにする事で、「自分以外のエンジニアがメンテナンスする場合も見やすい」ロボットになります。
これは、運用する上でかなり大事です。ロボットは、自分が開発したものだけではなく、既存の別の方が開発したロボットについても、メンテナンスする必要が必ず出てきます。
その場合に、定義に則っていないと修正ポイントが定まらず、メンテナンスに時間がかかるだけではなく、正しくメンテナンスが出来ない(修正が漏れてしまう)可能性が出てきます。

また、コンパクトに開発が出来ていないという事は、単一の処理に集中したロボット構成にもなっていないと思いますので、何かしたエラーが発生した時に、該当のエラーステップは確認できますが、ステップ数が多いと何かどう作用してエラーとなったのかが、エラー原因によっては発見までに、多大な時間がかかってしまい、最悪お客様からの信頼を失ってしまう可能性もあります。

ですので、自分が開発を行う場合は、「ロボットのサイズはコンパクトに保つこと」「単一の処理に集中すること」を意識して、開発頂ければと思います。

では、例えば以下の様な作業についてロボット化を依頼された場合を例にみてみます。

[例]
ある基幹システムからデータを抽出し、用意されているExcelファイルへデータを書き込む

<ハンド作業手順>
①基幹システムへ接続
②IDとパスワードを入力しログイン
③データ抽出画面へ遷移
④データ抽出処理開始
⑤データ抽出処理終了
⑥転記先Excelファイルを準備
⑦出力したデータをExcelファイルへ転記・保存
⑧ファイル名に当日の日付を付与
⑨作成したファイルを該当のファイルサーバーへ保存
⑩作業結果について担当者へメール連絡

上記の様な作業があった場合、①～⑩までの作業を一つのロボットで開発するのはNGです。
ある程度、作業の場面が変るまでを基準に一つのロボットで開発していきます。

(1) 1つ目のロボット
①～⑤までの処理を実施

(2) 2つ目のロボット
⑥～⑨までの処理を実施

(3) 3つ目のロボット
⑩の処理を実施

この3つぐらいに分けて開発するのが順当だと思います。
こういう分け方をしておけば、エラー対応などもいろんな処理に範囲を広げて確認せずとも、エラー発見が出来ると思います。

## まとめ
今回は、ロボットの構成は1オペレーション１ロボットにしましょうというお話をさせて頂きました。実は、僕が最初にロボットを開発した時なNGの方の構成で開発をしておりました。
その時に、エラー発生時やメンテナンス時に、だいぶ苦労したのを覚えているので今回の内容を記事にさせて頂きました。どなたかの助けになれば、幸いです！
【BizRobo!】 貼り付け先にExcel関数があると、めっちゃ重くなる

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回の内容はTipsというか自分が経験した事で、当時は大変苦労しましたので、同じ思いをしてほしくなく思い、記事にしました。
要件調整の時に、この知識があれば、あんなに開発に時間がかからなかったのに…

## Tips概要
今回のTipsはすごくシンプルなのですが、ロボットが既存のExcelファイルに対し値を貼り付ける処理をする際に、貼り付け先のExcelファイルに関数が入っていると、処理がすごく重くなるという内容です。

## Tips詳細
これは、実体験からお話をしようと思うのですが、
要件を聞いたときは、すごくシンプルなロボットでした。毎週データが更新されるファイルの値を取得し、自分の部署のみで使用しているExcelファイルへ内容を転記し、会議などでそのファイルを使っているという内容でした。この自部署のみというのが肝だったのですが、あまり気にせずにスルーしていました。

それから、実際に各ファイルを頂き、開発を進めた所、値の取得は問題ないですが、既存ファイルへの貼り付けに、すごく時間がかかる状況が発生しました。
普段であれば、1秒かからない貼り付け処理が、その時は30秒ぐらいかかっていました。データ転記数が少なければよかったのですが、何万行の転記が必要でしたのそんな時間がかかっていたら話にならないので、調べたところ、貼り付け先のExcelファイルに自分たちが使いやすいように、たくさんの関数が使われている事が発覚しました。
結果としては、既存のファイルに貼り付けるための、別ファイルをロボットが新規で作成し、あとはお客様でハンド対応していただく形になりました。
(書きながら、あまり良い解決方法ではなかったなと思いますが…)

では、なぜ貼り付け先のファイルに関数が含まれていると重くなるのかですが、
knowledgeでは見つけられなかったので、あくまで個人的な見解として、貼り付け処理をする際に関数を読込なおしているのではないかと思います。
なので、関数の数が多ければ多いほど、貼り付けた時の処理時間が長くなってしまうんだと思います。

## まとめ
今回は、貼り付け先にExcel関数があると、めっちゃ重くなるについてお話をしました。
皆さんが今後要件調整の際に、既存Excelファイルへの転記といったワードが出てきましたら、先に見せてもらう事をお勧めします。
【BizRobo!】 月末金曜日の日付取得について

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、月末金曜日の日付取得についてお話します。
あまり使う機会はないのですが、他に応用できる技術でもありますのでご紹介します。

## Tips概要
内容としては、すごく簡単なのですが、
**「当月から月をプラス1して、日を金曜日になるまでマイナスしていく」** です。
では、詳しい内容を詳細で確認していきます。

## Tips詳細
ロボットの処理順序としては以下になります。

①当日の日付を取得
②日付を「1日」に変更
③取得した日付に1か月追加する
④1か月先の日付の曜日を取得する
⑤金曜日かどうかを判定
⑥(OK) ロボット終了
⑥(NG) 日付から1日マイナスする
⑦④に戻り、該当の日付になるまで④～⑥を繰り返し

- ①当日の日付を取得
当日の日付を取得して「Today」変数に格納します。
(変数の名前はなんでも大丈夫です (ShortTextで作成しています))
![①当日の日付を取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/cbd50e0c-f635-1c66-672e-10d357eedfc9.png)

- ②日付を「1日」に変更
取得した当日日付について、日の部分を「1日」に揃えます。
(後ほど、生成した日付から1日ずつマイナスしていき、月末金曜日を取得しますが、その際に取得した当日日付が10日とかだと、月末金曜日を取得する前に別の金曜日を取得してしまい正しい値が確認できないため)
![②日付を「1日」に変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/b304d29a-ab24-33d3-21f3-81b203178286.png)

- ③取得した日付に1か月追加する
②の工程で取得した日付に対し、1か月加算し「Friday」変数へ格納します。
(2023/05/01 → 2023/06/01)
(日付処理 > 変更日 の順に選択)
![③取得した日付に1か月追加する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/1066cdd7-9a51-42ad-c084-cb23b1baaf90.png)

- ④1か月先の日付の曜日を取得する
「Friday」変数に入っている日付の曜日を算出し、「Youbi」変数へ格納します。
![④1か月先の日付の曜日を取得する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/1abbb179-396e-f221-6efa-3c6b586a3e21.png)

- ⑤金曜日かどうかを判定
④で取得した曜日が金曜日かどうか判定します。
![⑤金曜日かどうかを判定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/596498cd-eed3-aaaf-b2f1-e8e33e474ce1.png)

- ⑥(OK) ロボット終了
金曜日であれば、後続の処理を実行します。

- ⑥(NG) 日付から1日マイナスする
金曜日ではなかった場合、「Friday」変数に格納されている日付をマイナス1日します。
![⑥(NG) 日付から1日マイナスする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/41658c33-ae45-9ad7-762a-d71e124828e9.png)

⑦④に戻り、該当の日付になるまで④～⑥を繰り返し
上記のループを「金曜日」になるまで続け、金曜日なったタイミングでループを抜ける感じです。

他にも、ただ月末の日が取得したいだけであれば、曜日の判定はいらないですし、
翌月の月末金曜日が取得したいのであれば、月を加算する処理で「+2」してあげればOKです。
色々、応用は出来る処理フローですので、困ったときは使ってみてください。

## まとめ
今回は、月末金曜日の日付取得について説明しました。
すごくシンプルな処理ではあるのですが、「月末の金曜日だけ動かしたいんだよね～」とお客様に聞かれた時、知らないとスムーズに回答できなかったりなど、意外にデメリットはあります。
どこかのタイミングで皆様のお役に立てば幸いです。
[Swift] オブジェクトの回転の中心をずらす

iPhoneアプリを開発している時にオブジェクトを回転させるアニメーションを付けたいことはよくあると思います。

今回私はオブジェクトの左端を回転の中心にしようと思ったらハマってしまったので、記録として残しておきます。

## オブジェクトの回転
オブジェクトを回転させる方法として今回は、<a　href="https://qiita.com/cyomox/items/bdb5d86b76b522cc6249">CGAffineTransform</a>を使います。

例として、UIViewを回転させることを考えます。
画面中央に配置したUIViewを時計回りに60度回転させるならば
```swift
view.transform = CGAffineTransform(rotationAngle: .pi / 3)
```
と書けば下の画像のようになります。

<img width="400" alt="Simulator Screen Shot - iPod touch (7th generation) - 2022-06-01 at 07.34.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070398/30d7ae1b-8b6a-cfb4-659e-d448c0fd2f81.png">

この場合回転の中心はUIViewの中心になっています。

## 回転の中心をずらす
回転の中心をずらすのはとても簡単です。
オブジェクトの左上を回転の中心とする場合は
```swift
view.layer.anchorPoint = CGPoint(x: 0.0, y: 0.0)
```
としてあげればうまくいきます。
他にも、
```swift
view.layer.anchorPoint = CGPoint(x: 1.0, y: 0.0) //右上
view.layer.anchorPoint = CGPoint(x: 1.0, y: 1.0) //右下
view.layer.anchorPoint = CGPoint(x: 0.0, y: 1.0) //左下
```
## 最後に
回転の中心をずらすことによって、
時計の針やレーダーのソナーみたいなものも再現できるようになると思います。

最後までありがとうございました。何かあればコメントしてください。

## 参考リンク
<a　href="https://qiita.com/cyomox/items/bdb5d86b76b522cc6249">CGAffineTransform</a>
AtCoder ABC252の復習だ

# はじめに
C問題が解けなかったため、まとめようと思います。


# C問題

|0|~|9|のリールを持つスロットがある。
経過時間をt秒とすると、以下に対応する秒数でボタンを押すことができる。
下の例では0秒時点で|1|-|8|-|2|が並ぶ。
```
1列目    2列目    3列目
|1|      |8|      |2|      < (t % 10) == 0
|9|      |1|      |3|      < (t % 10) == 1
|3|      |2|      |8|      .
|7|      |4|      |5|      .
|4|      |6|      |7|      .
|5|      |9|      |6|      < (t % 10) == 5
|8|      |0|      |0|      .
|0|      |3|      |1|      .
|6|      |5|      |4|      .
|2|      |7|      |9|      < (t % 10) == 9
```

例えば|1|で揃えたい場合は
- 0秒後に1列目のボタンを押す
- 1秒後に2列目のボタンを押す
- 7秒後に3列目のボタンを押す

つまりこのケースでは|1|を揃えたい場合は最低7秒必要である。(★ここの求め方は後述)
|0|~|9|で同様の計算をするとそれぞれを揃えるために必要な最低秒数を求めることができる。

この中の最低値が答えとなる。


★**各数値を揃えるための最低秒数を求めるアルゴリズム**
上のケースで0を揃えるための最低秒数を計算する。

重要な前提として、
>同時に複数の列のボタンは同時に押せない

を意識する。
|0|を揃えたい場合、6秒後に2列目と3列目に同時に出てくる。
したがって、6秒後に2列目を押し、16秒後に3列目を押さなければいけない。

同じ列に同じ値が何個あるかを求めれば、その数が多いほどリールを揃える時間がかかる。
一つの列に現れた同じ数の回数をk、それが最初に現れる秒数をtとすると
> t + 10 × (k - 1)

となる。ただし同じ数現れる秒数が複数あった場合は、より後ろのt(秒数)を使用する。
2秒後に2回現れる場合は12秒で必要だが、5秒後に2回現れる場合は15秒必要になるから。

これを前提に|0|~|9|を揃えるのに何秒かかるか求める関数を実装してみる

```python
from collections import defaultdict
def time(num):
    d = defaultdict(lambda: 0)
    for i in range(10):
        for j in range(N):
            s = int(S[j][i])
            if s == num:
                d[i] += 1 # 同じ値が何個あったかをインクリメントする
    
    mk = 0
    mv = 0
    for i in range(10):
        if d[i] >= mv:
            mk = i
            mv = d[i]
    v = d[mk]
    return mk + 10 * (v - 1)

# -------------------------
print(time(0)) # 0を揃えるための最低秒数
print(time(1)) # 1を揃えるための最低秒数
```

あとは各秒数の最低値が求める答えとなる。
```python
def answer():
    ans = 10 ** 7 + 1
    for i in range(10):
        m = time(i)
        ans = min(ans, m)
    print(ans)
```


**最終的な回答は以下となります。**
```python
N = int(input())
S = [input() for _ in range(N)]

from collections import defaultdict
def time(num):
    d = defaultdict(lambda: 0)
    for i in range(10):
        for j in range(N):
            s = int(S[j][i])
            if s == num:
                d[i] += 1
    mk = 0
    mv = 0
    for i in range(10):
        if d[i] >= mv:
            mk = i
            mv = d[i]
    
    v = d[mk]
    return mk + 10 * (v - 1)

def answer():
    ans = 10 ** 7 + 1
    for i in range(10):
        m = time(i)
        ans = min(ans, m)
    print(ans)

    
answer()
```


# 解けなかった理由

|0|~|9|を揃えるためにそれぞれ何秒かかるか、その最低値が答えとなる方針は持っていた。
しかし一回のforループで行おうとしたため、コードが複雑になってしまいACとWAが半分くらいのサンプルケースは通るけど、、の状態になってしまった。

上記でコードとして示したように、「0を揃えるためには何秒かかるか」をまず考える。それを一般化し関数にする。

問題の条件を把握して、|0|~|9|をそれぞれ別ループで確認しても実行時間は問題ないことを確認するべきだった。。
access2000の作法 その12

# 概要
access2000の作法、調べてみた。
フォームを作ってみた。

# フォームボタンを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド10_Click()
    Make_Form
End Sub
Sub Make_Form()
    Dim myForm As Form
    Dim myTextBox As Control
    Dim myLabel As Control
    Set myForm = CreateForm()
    myForm.RecordSource = "売上テーブル"
    myForm.Caption = "売上"
    Set myTextBox = CreateControl(myForm.Name, acTextBox, , , "支店", 1200, 100, 2000, 200)
    Set myLabel = CreateControl(myForm.Name, acLabel, , myTextBox.Name, "支店:", 100, 100, 1000, 200)
    DoCmd.OpenForm myForm.Name
    'DoCmd.MoveSize 0, 0, 5000, 3000
    'DoCmd.Close , , acSaveYes
End Sub

```

- フォームを閉じる
- 保存する

以上。
STM32G031と内蔵ADCで電圧をPA2ハードウェアシリアルに出力 3.300Vまで


x 動作確認済み2022/6/1 17:15

x adcは、0から4096

目的
主にGP2Y0A21YKの微小な電圧を測る。

説明
adcの値(4096)に6600掛けて8192で割ると3300にピッタリなる。

仕様

1
2 VDD
3 GND
4 GPIO ハードウェアシリアル

8
7
6
5 ADC


不採用の計算式

```

3300/2  = 1650
1650/2  = 825
 825/10 = 82.5
  82*4  = 328
82*10   = 820
825-820 = 5
   5*4  = 20
   20/10= 2
  328+2  =330 

   x = Voltage >> 2; //   3300/4=825
   y = ((DIV10(x))*4) + DIV10((x - ((DIV10(x))*10))*4);


```


![o_con511.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/87f7f593-5c5f-2417-baac-80b904281da7.jpeg)



名前は、まだない



```c++


//SER_Voltage_031_2

#include <Arduino.h>
#include <HardwareSerial.h>


//初期化
void setup()
{

  delay(3000); //not delete

  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

} //setup


//メインループ
void loop()
{

  int sensorValue; //センサーの読み取り値
  int Voltage;     //電圧

  //アナログ値の読み込み
  analogReadResolution(12);     //adc 12bit mode
  sensorValue = analogRead(A3); // PA11 PIN5 031

  //電圧に変換 ex 3.300 -> 3300 mVを出力
  Voltage = ( sensorValue  * 3300 )>>12;

  //小数点以上と小数点以下を分ける iiは1の桁 sは小数点以上の桁
  int x = Voltage;
  if     ( x >= 3000 ) { x = x - 3000; Serial.print("3.");}
  else if( x >= 2000 ) { x = x - 2000; Serial.print("2.");}
  else if( x >= 1000 ) { x = x - 1000; Serial.print("1.");}
  else                 {               Serial.print("0.");}

  //電圧の小数点以下の表示
  if        (x >= 100) {
    //Serial.print("00");
    Serial.print(x);
  } else if (x >= 10) {
    Serial.print("0");
    Serial.print(x); 
  } else {
    Serial.print("00");
    Serial.print(x);
  }

  //リターン
  Serial.println();

  //1秒の待ち
  delay(1000);

} //loop


```