OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoで raise self.model.DoesNotExist( django.contrib.sites.models.Site.DoesNotExist: Site matching query does not exist.というエラー

```
 raise self.model.DoesNotExist(
django.contrib.sites.models.Site.DoesNotExist: Site matching query does not exist.
```

というエラーが発生。


理由はGoogleプロバイダーをdjangoの管理画面から追加していなかったからでした。

以下のように追加して終わり。

![スクリーンショット 2022-12-19 8.40.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560864/8b4d8579-c765-0426-3097-8b7cfe9918c6.jpeg)

作成するときに、一番下にあるサイトの追加も忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560864/d1b9a9bc-2549-2ad5-fe3a-ed39ac8001eb.png)
Rails7になってひっかかったことあれこれ（UnsafeRedirectError、jquery/bootstrapなど）

Rails7になって日が浅いためか、いろいろと情報の混乱が多いので、ひっかかったところを備忘録的に

# Jquery/Bootstrapの導入が面倒くさすぎる
Railsで一番面倒臭いと思ってる/思ってたのがJquery/Bootstrap導入。ほんとーーーーに面倒くさい。ここにあれをかけ、yarnでインストールしろ、ここにもあれをかけ、ほんでwebpackを使うかesbuild使うかえらびなはれ。おや、Rails7では違うようだねやりなおしや。どこいじったっけ。どうやって直せばいいんだっけ。表示おかしくなってるで。

あああああ

どうやって直せばいいのかわからなくなってしまったから、もう最初から作り直すハメになった。最初から作り直す方が早い始末だ。そもそもJqueryとBootstrapの導入でやる作業なんてちょっとおしゃれな感じの動要素を入れたいとかそんな程度で、なぜここまで面倒くさいのか。こんなバカバカしいことするくらいなら

```html:app/views/layouts/application.html.erb
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
```

メタタグに直接書くこれでいい。マジで。

エレガントではなかろうし、いろいろ問題はあるかもしれないけど、少なくともこの方法はバージョンの違いとか全く関係ないし、現に動くし、バージョン変更もクソほど簡単だしでこれでいいんだ。もうつかれたよ。

# UnsafeRedirectError
検索フォームでモデル検索したら出てきたエラー。

```ruby:app/controllers/model_controller.rb
# パラメータを空白で分解して"＋"で繋ぎなおせ
word = params[:find].split(/[[:blank:]]+/).select(&:present?).join('+')
# 繋ぎ直した文字列でアドレスにリダイレクト
redirect_to hoge_find_path + "?find" + word
```

ここで日本語を使うと、**ActionController::Redirecting::UnsafeRedirectError**というエラーを吐くようになった。

どうやら外部ホストにリダイレクトするような場合はセキュリティ的に止めているらしいが、別に外部ホストなんて送っていない。英数字で検索したときは問題ないことを考えると、マルチバイト文字がアドレスに含まれてると止められるっぽい。

ただこの対策は（よろしいかは別として）簡単で
```ruby:app/controllers/model_controller.rb
redirect_to hoge_find_path + "?find" + word, allow_other_host: true
```
**allow_other_host: true**というオプションを足せば通るようになった。少なくとも検索フォームで外部ホストどうこうもないんで、ここだけ指定する分には、まぁ大丈夫じゃないかなって気はする。
少々変わったシステム関係の学習方法ですが、参考になれば

限定記事として用意していましたが、登録するのを忘れてしまった...


50を過ぎたおじさん（もしかしたら、おじいさんかもしれませんね）が新しいことを覚えるために使っているシステム関係の学習方法です。若いみなさんなら、同じことをしても、もっと早くたくさん覚えることができるかもしれません。体系的に学ぶわけではないので、じっくり学びたい方には合わないかもしれないことは最初に断っておきます。

まぁ、こんな方法もあるよというくらいで読んでください。

# 何のシステムについて学習しているのか？

ここ数年、Salesforceというシステムを中心に使っています。もともと実現したい業務システムがありました。PHPなどを使って実現できそうでしたが、スマートデバイスとPCの両方に同時に対応するのがネックとなっていました。そのためSalesforceを使うことになったというわけです。

初めは標準機能（コーディングしない範囲）だけで行おうとしましたが、あまりにも今までのUIとは違って、ユーザから賛同をいただけません。しかしコーディングするとどうにか思い通りのUIになりそうでした。ということで使う画面はすべて開発して対応することに決まりましたが、困ったことにお金がなかったので自分で開発することになりました。そのため何でもコーディング中心で実装してきました。実は設定でできること、ノーコードでできることは全く理解していませんでした。（まぁ、それでも全く困ることは無かったのは、ひとえにプラットフォームの優秀さかもしれません）

以下は、その時のシステムではなく現職で作ったものです。コーディングするとこんなことも簡単にできます。
[Aura Componentを使い込む1(受発注システムで使う)](https://qiita.com/Keiji_otsubo/items/e747ab95f3e686267f22)

# さて、どうやって学習するかな

ということで、少し標準機能やノンコーディングを勉強してみようと思いましたが、どこから手を付けようかと悩んだ末に思いついたのはTrailblazer Community という質問をやり取りする場所で質問に答えることでした。今現実に問題となっている事柄に対して、素早く調べて回答していきます。回答にはできるだけ回答の元になった資料（ヘルプや先駆者さんたちのブログなどの解説）を探して添付します。うろ覚えの内容を回答しても自分でも覚えることができないので、色々資料を探したりします。　そうすることで嵌ってしまいがちな設定などを実践的に覚えることができのではと考えたのでした。

また途中から日本語の質問の場所では質問自体が少ないので、（日本人は本当に考えて、考えてどうしようもなくなって質問するような傾向があるのと、就業時間外に質問するような気がします。私は夜は早くアルコールを飲みたいので、定時に上がります。）英語の質問にチャレンジです。当然回答も英語です。

実は英語の質問に答えるために会社で使っている本番環境とSandbox以外は英語環境で動かしています。案外日本語と英語の表記に隔たりがあるので、英語の環境に慣れていないと理解できません。

例えば取引先責任者というオブジェクト(リレーショナルデータベース風に言えばテーブル)がありますが、英語ではContactと言います。そのまま訳しても連絡先なので、個人的にはこちらの方が分かりやすいですが...

しかし、いいこともありますね。Salesforceは年３回バージョンアップがありますが、最初に公表されるのは英語の資料です。英語環境に慣れていれば、資料を読む時に理解がしやすくなります。というのと、年３回もバージョンアップがあるので最新の設定を確認するためにも、質問に回答して覚えるというのはなかなかいいと思っています。

# 覚えられたこと、成果はあったのか？

そうですね、今まであまり使ってこなかった数式の分野はかなり早く、正確に作成することができるようになりました。
またこれまでは、Aura　コンポーネントだけしか使っていませんでしたが、その一世代前の技術である Visualforce pageも一部の機能（リストビューのボタン、PDF作成、Visualforceメールテンプレート）については普通に使うことができるようになったと思います。

最近はフローの質問も多くなってきたので、少しずつですが回答できるように覚えています。まぁ、ただ実際に会社では使ってないので、Auraコンポーネントの開発に比べると理解が遅いですね。本当は質問に回答して、さらに自分でも使って覚えるのがいいのですが...

# そうだ、udemyは？

そうそう、udemyを検索するとSalesforceもありました。よく回答されている人も登録してそうですね。
一部のみなさんは、ここでも活躍している。私も... と思いましたが、英語がさっぱりダメです。読むのはグーグル翻訳で読めますが、スピーキングは無理です。リスニングも無理ですね。ということで無理そうだ。まぁ、英語に限らず外国語は私のとってはただのストレスの種でしかありません。できれば接したくないです。

[Salesforce管理コース](https://www.udemy.com/topic/salesforce-administration/)


# そうそうQiitaも活用しています。

英語の質問に英語で回答するのでものすごく時間がかかります。一旦日本語に訳して考えていますから...
そのため回答用の英文を予め準備しています。その管理にQiitaを活用しています。


# おまけ

実は回答者の回答数やベストアンサー数でランキングがつけられています。　回答をし続けると実は順位がどんどん落ちてきて維持するのはかなり大変ですが久しぶりにトップになっています。と言ってもほとんど差がないですけどね。2022/12/11現在

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0ab317e5-8447-4b4a-ac61-8a2ed6e5de69.png)

直近の回答数でランキングを計算しているようですが、たくさん答えていると少し回答しただけでは順位は伸びない（嫌がらせ）仕掛けのようです。そのため、たくさん回答している人はどんどん順位がい落ちていって、そのうち回答しなくなりますね。まぁ、それが狙いでやっているんだろうけど（意味はわかりません）
【C#】Enumから任意の文字列配列への変換を安全に行う【Unity】

# はじめに

この記事は[Unity Advent Calendar 2022-2](https://qiita.com/advent-calendar/2022/unity)の10日目の記事です。

Unityを使っていると、Enumで定義された型を選択させる場合に対応するラベル文字列の配列を定義する場合があります。

```エディタ拡張のPopupでEnumを選択させる例.cs
public enum Type { Item1, Item2, Item3, }

var list = new[] { "アイテム1", "アイテム2", "アイテム3", };
type = (Type)EditorGUILayout.Popup("ラベル", (int)type, list);
```

要素名をそのまま表示されるよりも分かりやすくなる一方で、型と文字列配列は順番(index)のみで紐づいているため、Enumの要素を追加した場合などに不具合に繋がるリスクがあります。

そこで、今回はEnumで定義された型をスマートに文字列配列に変換する方法を考えてみました。

# 方法

Enumの全要素を配列にした後に、switch式で文字列に変換する処理を書きました。

```.cs
list = Enum.GetValues(typeof(Type)).Cast<Type>().Select(type => type switch
{
    Type.Item1 => "アイテム1",
    Type.Item2 => "アイテム2",
    Type.Item3 => "アイテム3",
    _ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
}).ToArray();
```

この方法では要素と文字列の順番が必ず紐づきますし、定義されていない文字列があった場合に実行時エラーとなります（冒頭の例で要素を追加した場合、エラーは発生しません）。

また、IDE側で定義漏れの警告を表示することもできるので検知がしやすくなっていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/ab8aa76b-fb1c-bee1-629c-e7ee591212b0.png)
_Riderで警告表示をさせた例_


# おまけ：ジェネリックメソッドとして定義する

そのままだと少し煩雑に見えるので、ジェネリックメソッドで定義しておくと少しだけすっきりします。

```.cs
/// <summary> Enumの全要素を列挙した文字列配列を返す</summary>
private static string[] ConvertStrings<TState>(Func<TState, string> selector) where TState : Enum
    => Enum.GetValues(typeof(TState)).Cast<TState>().Select(selector).ToArray();

// Before
var list = Enum.GetValues(typeof(Type)).Cast<Type>().Select(type => type switch
{
    Type.Item1 => "アイテム1",
    Type.Item2 => "アイテム2",
    Type.Item3 => "アイテム3",
    _ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
}).ToArray();

// After
var list2 = ConvertStrings<Type>(type => type switch
{
    Type.Item1 => "アイテム1",
    Type.Item2 => "アイテム2",
    Type.Item3 => "アイテム3",
    _ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
});
```

# 最後に

エディタ拡張のPopupやuGUIのDropdownなど、地味にこういう変換をしたい場面がでてくるので、書き方覚えておけるといいかなと思いました。

よかったら Twitter のフォローよろしくお願いします！→ @nkjzm
Arduino UNOとカラーOLED SSD1331で遊ぶ2 (回路図)


x Adafruit SSD1331 OLED Driver Library for Arduino を　インストール
x Adafruit GFX Library を　インストール

目的
カラーOLEDのテスト

sclk 13　, SCL
mosi 11 , SDA
cs 10 , CS
rst 9 , RES
dc 8 , DC

有機ＥＬディスプレイ　０．９５インチ　９６×６４ドット　ＲＧＢ
[QT095B]
通販コード　P-14435
発売日　2019/09/02


![o_cop251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0229fd6b-06a1-0b3b-dc7d-e377217c900a.jpeg)



http://denshikit.main.jp/topf/technology97.html



![o_cop250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/692aa60c-c2d8-2008-0b3b-364bd4fdabcf.jpeg)
CTO興味ある人へ：CTOの業務についてその８　セキュリティ管理

CTOを長年やってるとよく聞かれる質問です。
```
CTOの仕事ってどんな仕事があるんですか？
```
から始まった**CTOの業務について**のその8です。

# セキュリティ管理
## セキュリティ指針作成・運用
CTOの業務として忘れられがちですが、昨今、情報漏えいは企業の根幹を揺るがしかねない部分となってます。CTO自らが指揮を取りセキュリティ対策の指針を決め、チェックしていく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ad69b7b6-1ef7-ef78-345a-2bf2a3f2457c.png)
## セキュリティ方針
会社の予算と共にセキュリティレベルの方針を決定する
・個人情報を保有しているか
・カード情報を保有しているか
・インフラは何か
・言語は何か
・フレームワークは？
etc
## セキュリティ対策決め
・IDC,IPS,WAF導入
・インフラ、言語、
　フレームワーク決め
・セキュリティinspection
## セキュリティ対策運用
・定期的なセキュリティ診断
・定期的な他社情報漏えい情報
　収集とチェック
・ログ監視
## セキュリティ対策見直し
年１回レベルの運用で見直しを行う

# まとめ
このタスクは、CTOにとって非常に重要である反面、量少ないタスクです。したがって、忘れがちになるのですが重要なタスクです。
年１回で良いので見直し、更新を行いましょう。
もちろん専門部署にて管理する事でも問題ありませんが、方針決めはCTOが行う必要があります。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！
# シリーズ記事まとめ
CTO興味ある人へ：CTOの業務についてその１　会社組織内での話
https://qiita.com/k1morikawa@github/items/5e9022a99a51d9a57576
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用
https://qiita.com/k1morikawa@github/items/b2b3fb2246bd0984bab1
CTO興味ある人へ：CTOの業務についてその３　チームビルディング/評価制度
https://qiita.com/k1morikawa@github/items/edb2e3c20ce02a201eec
CTO興味ある人へ：CTOの業務についてその４　チームビルディング/キャリア戦略
https://qiita.com/k1morikawa@github/items/9a6573dbba510c699362
CTO興味ある人へ：CTOの業務についてその５　チームビルディングまとめ
https://qiita.com/k1morikawa@github/items/7a4c9163a69cd9303e90
CTO興味ある人へ：CTOの業務についてその６　組織設計
https://qiita.com/k1morikawa@github/items/0b59893da6ecbb886a64
CTO興味ある人へ：CTOの業務についてその７　技術力アップ
https://qiita.com/k1morikawa@github/items/fa50105d0e6af34a9961
最初のPingが通らないのはなぜ？

本記事を読んでいただきありがとうございます！
初めて作る記事になるので不備も多々あると思いますが何卒ご容赦ください。

# はじめに
私がネットワークについて学習し始めた頃、簡単なネットワークを構築しPingコマンドを用いて疎通確認をしていたのですが、最初のエコーのみ応答が得られず疑問に思ったためそのころ学んだことをまとめていきます。

# Pingコマンドとは
Pingコマンドとは、ICMPパケットを送り、エコーが返ってくるかどうかによって相手までのネットワークの経路が正しく設定されているかどうかを確認することができるコマンドです。

# 実行環境
今回はCisco Packet Tracerというネットワークシミュレーションツールを使用します。
[Cisco Packet Tracerのダウンロードはこちら](https://www.netacad.com/ja/courses/packet-tracer)

# 実際にPingコマンドを実行してみる
今回は以下のネットワークを構築し、Pingコマンドを実行してみました。
![ネットワーク図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039716/892a4e0f-5915-60de-7648-c9837be18e06.png)

まずは同一ネットワークであるPC0(192.168.1.1)からPC1(192.168.1.2)に対してPingコマンドを実行してみました。
```
C:\>ping 192.168.1.2

Pinging 192.168.1.2 with 32 bytes of data:

Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128
Reply from 192.168.1.2: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.1.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
```
同じネットワーク内であれば問題なくエコーが返ってきていることが確認できました。

次に、異なるネットワーク同士であるPC0(192.168.1.1)からPC2(192.168.2.1)に対して
Pingコマンドを実行してみると以下のような結果となりました。
```
C:\>ping 192.168.2.1

Pinging 192.168.2.1 with 32 bytes of data:

Request timed out.
Replay from 192.168.2.1: bytes=32 time<lms TTL=127
Replay from 192.168.2.1: bytes=32 time<lms TTL=127
Replay from 192.168.2.1: bytes=32 time<lms TTL=127

Ping statistics for 192.168.2.1:
    Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
```
異なるネットワーク間での通信では最初のPingのみ失敗となっていることが確認できました。

# 原因
最初の１回目のみが失敗する理由として、異なるネットワーク通信においてMACアドレスの情報が得られていないことが挙げられます。
異なるネットワークと通信する場合、ルータのMACアドレス情報が必要となるのでまずルータに対してARPを実行します。MACアドレス情報が得られてARPテーブルができればデフォルトゲートウェイ（ルータ）に対してパケットを送り始めますが、ARPを実行している間にその最初の1回はPingが失敗してしまいます。
しかしながら、事前に通信先のMACアドレスの情報が分かっていれば失敗を回避することができます。
クイック パーツなんてものについて知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。クイック パーツ。

[長文の定型文はクイックパーツに登録して簡単挿入 | Outlook 2019 | 初心者のためのOffice講座](https://hamachan.info/outlook2019-quick/) という記事があるが
[クイック パーツ - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF-%E3%83%91%E3%83%BC%E3%83%84-4ffef7c5-7596-4e95-9faf-41c771847a7b)

定型文を登録して使えるやつである。
スタイル ガイド的なものを踏襲しながら定型文は作っておくと楽になる。

クイック パーツ
スタイル ガイド

この絶妙な半角スペース。お気づきだろうか。スタイル ガイドも公開されているのですね。
[Microsoft 文書作成スタイル ガイドをリリース | Microsoft Learn](https://learn.microsoft.com/ja-jp/teamblog/style-guide)

> ガイドには次が含まれています。
> Microsoft ブランド トーンの原則概要: 気の張らない雰囲気で思いやりがあり、はっきりと簡潔に答えます。また、いつでも手を貸す姿勢を見せます。
> 300 超のトピック ワード リスト: サービスとしてのプラットフォーム、サイバーセキュリティ、チャットボットなど、業界用語の正しい綴りと使い方を説明します。また、大文字と小文字の使い方を説明します (Machine Learning と machine learning の違い)。
> 特定の分野の用語集: クラウド コンピューティング用語一覧やボット用語一覧など。
> 開発者向け: コード例や参照ドキュメントの書き方やテキスト要素の書式設定方法に関するヒント。
> コンテンツを誰もが利用するためのガイドライン: ローカリゼーションのための調整。偏見がないこと。さまざまなデバイス上で動作すること。


[Microsoft Learn スタイル ガイド - クイック スタート - Contributor guide | Microsoft Learn](https://learn.microsoft.com/ja-jp/contribute/style-quick-start?WT.mc_id=twitter)
[Global communications - Microsoft Style Guide | Microsoft Learn](https://learn.microsoft.com/ja-jp/style-guide/global-communications/)
[Use technical terms carefully - Microsoft Style Guide | Microsoft Learn](https://learn.microsoft.com/ja-jp/style-guide/word-choice/use-technical-terms-carefully?source=recommendations)

https://twitter.com/kenjinote/status/1599607115060228096?s=20&t=7aIFU34qXocu_QEX5pk1Aw

普通に何でも公開されて手に入るのです。以上今年私が知らなかったことでした :snowflake:
【blender・Stablediffusion・PLATEAU】blenderのアドオンを使って、AIで建物を塗ってみた！

# 【blender・Stablediffusion・PLATEAU】blenderのアドオンを使って、plateauの建物を塗ってみた！
# はじめに
2022/12/16にdream-texturesの新しいバージョンが出ましたね！

今回はこのツールを色々触ってみたので、インストールの仕方から実際に建物に適用させるまで行っていきたいと思います🔥


# 前提
 環境
 - windows10
 - cpu:RIZEN 5 3600
 - gpu:Nvidia RTX 2600
 - dream_textures v0.0.9
# 手順
## 1.dream-texturesのダウンロード
下のURLから自分の環境に合わせてインストールします
https://github.com/carson-katri/dream-textures/releases

私はwindowsなのでwindowsのInstallationを参考に進めていきます！

↓のリンク二つからzipファイルをダウンロードし、分かるところに置いておきます。

 - Dream Textures for Windows (CUDA)
   - https://github.com/carson-katri/dream-textures/releases/download/0.0.9/dream_textures-windows-cuda.7z
 - Dream Textures for DreamStudio (Windows)
   - https://github.com/carson-katri/dream-textures/releases/download/0.0.9/dream_textures-windows-dreamstudio.zip
 
1個目のリンクは7zファイルなので7zファイルを解凍できるソフトで解凍しておきます、その中にあるzipファイルは解凍しなくて大丈夫です！（2個目も解凍しなくていいです）


## 2.blenderにdream-texturesのインストール
blenderを開き、ツールバー左上の編集からPrefarence⇒アドオンの順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069719/de41e136-d9c1-6c2e-05cd-e93f89fb3389.png)

その後開いたポップアップ右上のインストールから、先ほどダウンロードしておいたzipファイルを選択、インストールします🔥

## 3.アドオンの設定
ポップアップ右上の検索窓から"dream"と検索するとPaint:Dream Textureと出てくるので左上のチェックボックスをクリック、有効化します。

Find Modelsでは"stable-diffusion-2-depth"を検索、インストールしましょう🥕

これとは別にHugging Faceのアクセストークンが必要なのでGet Your TokenからTokenを取得、"Token:"の横に貼り付けましょう

これでアドオンの設定は完了です🔥

一度再起動し、実際に使ってみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069719/f89e8ccc-109d-ac3c-5115-5c5c85701f86.png)
↑こうなったらOKです！

## 4.使ってみる


右上のサイドバーを開くと下の画像のようにdreamというタブが出てくると思います。
出てきていない場合、左上のビューからサイドバーのチェックボックスを押すと出てくると思います🔥
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069719/48de4030-297d-44b0-c048-52564a7144ff.png)

実際にモデルを配置し試してみましょう（今回はplateauから豊洲周辺のモデルを引っ張ってきました！）

テクスチャを変更したいオブジェクトを全選択、編集モードでも全選択してから動画のように各種設定
 - Subjectに作りたいテクスチャを言語化したもの
 - GenreにはSFやCinematicなどテーマも入れることもできます（今回はなし！）
![image.png](https://im.ezgif.com/tmp/ezgif-1-8e32a98b14.gif)
結論⇒簡単！
ただ、正面を基軸として画像が配置されるので横から見ると、引き伸ばされて見えますね💦

# 終わりに

漫画の背景とかパースとか、簡単に作れてしまうので、新時代って感じがしますね
これからも楽しみながらblenderの発信していきます🔥
HowだけでなくWhyが質問できるエンジニアになろう

この記事は[ラクスAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus) 19日目の記事です。

この9月に3年半担当していたサービスから別サービスに異動となりました。  
実質初の異動の中、サービス問わず活かせているマインド（タイトルばれ）について思いを書いていこうと思います。  
技術的な内容とは違いますが、新卒で入社される方やまだ異動・転職などを経験されたことのない方への参考になれば幸いです。

## サービス比較

まず最初に異動前後のサービス体制を簡単にまとめます。

| | Before | After | 
| --- | --- | --- |
| サービス種別 | 人事労務システム | 販売管理システム |
| サービス継続年数 | 3年 | 10年以上 |
| 開発人数 | 10名 | 20名 |
| メイン言語 | Java (Spring Boot) | PHP (Zend Framework) |
| 他技術スタック | Vue.js (Vuetify), PostgreSQL | jQuery, PostgreSQL |

同じ会社の中なので、Webクラウドサービスという根本は変わりませんが、それ以外は結構変わっていることがわかると思います。  
これだけ違うサービスでも適用できる基本的なマインドを紹介します。

## わからないことは質問しよう

「そんなの当たり前じゃん」という人もいらっしゃると思いますが、私を含めて人に質問することが苦手な人は大勢います。  
時間が経てば経つほど質問しづらくなる上に、まわりにも迷惑をかけてしまいます。  
**聞くは一時の恥、聞かぬは一生の恥**のマインドでわからないことはドンドン質問していきましょう。

また、ここでいう「わからないこと」というのは2通りあります。

* **どうすればいいのか（How）** わからない
* **なぜしなければならないのか（Why）** わからない

前者はイメージがしやすいと思います。  
わからないと仕事自体が進まないため、質問が苦手な人でも質問せざるを得なくなります。

問題は後者の「なぜしなければならないのか」に対してです。  
みなさん仕事をしている中で「この作業いる？」「こうした方がいいのにな」と考えたことはないでしょうか？こちらは前者と違って質問せずとも直近の作業に支障はありませんが、自分の中にもやもやが残ってしまいます。

実際に質問してみると周りの人も同じ課題感を抱えていることも多いです。人間とは慣れる生き物で長く続けていると惰性で続けてしまうことも多くあります。そんな時に誰かが発言しすることによって改善に繋がるケースがありますので積極的に質問していきましょう。

あるいは、自分では思いつかなかった理由・意図がある場合もあります。この場合でももやもやとした気持ちをため込まずに解消できるため、やはり質問はするべきです。

## なぜ質問できないのか

ここで私が言うまでもなくみなさん質問することは大事だということは認識されていると思います。では、なぜ質問できない人がいるのでしょうか？

* **質問することが恥ずかしい**
* **質問したら仕事を振られる（Whyの質問）**

前者は先に述べたように**聞くは一時の恥、聞かぬは一生の恥**のマインドで行きましょう。具体的には10年後くらいに同じ内容がわからない自分を想像してください。~~恥ずかしいというより恐怖です~~

後者は俗にいう**言い出しっぺの法則**ですね。Whyの質問をすると「じゃあ任せた」と改善や別案の検討を振られることが往々にしてあります。  
こういった時は「自分の裁量で物事を決めることができる」と前向きに考えましょう。もしかしたら改善しようとした結果失敗したり指摘をされる可能性もあります。が、自分で何かを決めようとした行動自体に価値があるはずです。  
周りの状況にや改前内容の温度感にもよりますが、任された際に通常業務との業務調整もできるとGoodです。

## 終わりに

今回私が言うまでもなく「質問をしよう」という話や記事は多くあります。質問したことによって何を得られるのか、質問しなかったことで何を得られないのかを意識してみてください。  
自分はエンジニアですが今回の話はエンジニアに限った話ではありません。  
この記事を読んだ人の考え方に何かしらのヒントを与えることができれば幸いです。
【PMMP】ConfigのgetNestedってナンダ

初心者の頃からずっと気になってて夜しか眠れかった。
Configクラスの`setNested` `getNested` `removeNested`

https://github.com/pmmp/PocketMine-MP/blob/stable/src/utils/Config.php

ソースコードを見てなんとなく動作は察しが付いてたけど、今更になって動作確認をした。
まあネストですよね。それ以上でもそれ以下でもない。

# 前提のconfig
```yaml:config.yml
foo:
  bar: "deceitya"
```

# getNested
キーを`.`で繋ぐだけです。setNestedもremoveNestedも同様。
```PHP:Main.php
$this->getConfig()->getNested("foo.bar");  // deceitya
```

# setNested
```PHP:Main.php
$this->getConfig()->setNested("foo.bar", "dededeitya");
$this->getConfig()->setNested("hoge.huga", "tsukimiya");
$this->getConfig()->setNested("hoge.fuga", "tsukimiya2nd");
$this->getConfig()->setNested("server.mcbe.jp", ["deceitya", "ツキミヤ", "MCハッピー月宮"]);
$this->getConfig()->save();
```
```yml:実行後のconfig.yml
foo:
  bar: dededeitya
hoge:
  huga: tsukimiya
  fuga: tsukimiya2nd
server:
  mcbe:
    jp:
    - deceitya
    - ツキミヤ
    - MCハッピー月宮
```

# removeNested
```PHP:Main.php
$this->getConfig()->removeNested("hoge.huga");
$this->getConfig()->removeNested("server.mcbe.jp.1");
$this->getConfig()->save();
```

```yml:実行後のconfig.yml
foo:
  bar: dededeitya
hoge:
  fuga: tsukimiya2nd
server:
  mcbe:
    jp:
      0: deceitya
      2: MCハッピー月宮
```
`hoge.fuga`のtsukimiyaと`server.mcbe.jp[1]`のツキミヤが消えましたね。
配列の要素を削除すると`-`で表現されてた配列がキーの番号に変わるようです。

# 令和コソコソ噂話
12/15は @ribnil さんの誕生日だそうで。
[去年のアドベントカレンダー](https://qiita.com/advent-calendar/2021/minecraft-server-dev)は誕生日をご自身で担当されてたから、今年もてっきり担当するのかと（笑）（笑）
2022/12/19主にITとかセキュリティの記事

ランサム被害のデータ復旧でトラブル多発 - 業界5団体がチェックシート
https://www.security-next.com/142301

Veeamバックアップ製品の既知脆弱性狙う攻撃ツールが流通か
https://www.security-next.com/142252

「Pulse Connect Secure」にサービス拒否の脆弱性
https://www.security-next.com/142173

フォーム設定ミスでイベント応募者の個人情報が流出 - 佐賀県
https://www.security-next.com/142243

米司法省、DDoS攻撃の請け負いで6人を起訴--48ドメインを押収(12/16)
https://japan.zdnet.com/article/35197496/

サイバー攻撃で「売上高の10%超の損害」4割　民間調査(12/16)
https://www.nikkei.com/article/DGXZQOUC162DU0W2A211C2000000/

重要なのはビジネスの「復元力」--Splunkが予測する2023年のデータテクノロジー(12/16)
https://japan.zdnet.com/article/35197484/

ビックテックに対する誤った競争政策がもたらすサイバーセキュリティ問題(12/16)
https://www.newsweekjapan.jp/watase/2022/12/post-37.php

米上院「TikTok禁止法」を全会一致で可決、下院で採決へ(12/16)
https://forbesjapan.com/articles/detail/52898

WordPressに対する積極的なブルートフォース攻撃を確認、注意を(12/17)
https://news.mynavi.jp/techplus/article/20221217-2538692/

11月マルウェアランキング、Emotetが復活-休眠は一時的なものだった(12/17)
https://news.mynavi.jp/techplus/article/20221217-2537394/

児童生徒情報 26万4000人分が一時閲覧状態　氏名、メールアドレスなど記載　鹿児島県教委管理(12/17)
https://373news.com/_news/storyid/167734/
Androidアプリのパケットを(ヘッダだけ)眺めてみる

PCを使用している場合、ブラウザのインスペクタを開くことで通信している内容・タイミングなんかを眺めることができます。
じゃあモバイル端末の場合はどうなんだということを思ったので、今回はAndroidアプリの通信を眺めてみる話をします。

※文中には適宜ふわふわした表現が含まれます。自信がない部分については可能な限りより詳しいドキュメントへの参照を貼らせていただきます。誤りなどあれば指摘いただけると幸いです。

# パケットキャプチャの導入

モバイル端末の通信内容を取得するためにパケットキャプチャを導入します。

>パケットキャプチャー
通信路を流れるパケットを取得するためのツールの機能や、その行為をする者。ツールとしての総称は「スニファー」という。
様々な目的に使われるが、プロトコルの情報を整形し通信状態を解析するツールを「プロトコルアナライザー」という。
https://www.wdic.org/w/TECH/パケットキャプチャー

要するに通信内容を取得するツールです。しかし通信内容といっても、例えばメールで送信されたテキストがそのまま読み取れたりといったことは（基本的に）出来ません。
そういうことをするにはバイナリ解読およびリバースエンジニアリングの知識が必要になります。
というわけで、~~私には無理なので~~今回はパケット本体のことは忘れてヘッダから取り出した情報を眺めて何かできないか考えてみようと思います。

## Android端末用のパケットキャプチャ導入

tPacketCaptureというのを導入しました。調べてください。

https://www.taosoftware.co.jp/android/packetcapture/

VPN経由で通信内容のキャプチャを行うそうです。
端末上でやることはアプリでキャプチャのON/OFFを切り替えるだけです。
キャプチャした内容はファイルに書き出されるので、後のことはPCに移して処理します。

## pcapファイルの確認

tPacketCaptureで取得した内容は.pcap形式のファイルで書き出されるので、 Wiresharkで開きます。

https://www.wireshark.org/download.html

開くとこんな感じになります。

![wireshark.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528082/991288f8-1df7-774b-483e-c7ab83078bf6.jpeg)

これだけ見るとなんのこっちゃって感じであり…
ここからどうするかというのは目的によるのですが、とりあえずここにはパケットキャプチャが有効になっている間に行われた全ての通信が記載されています。
これらの情報を眺めてみます。

### IPアドレスを見る
ヘッダには送信先と送信元のIPアドレスが記載されています。
sourceとdstのどちらかに10.8.0.1というアドレスが記載されていますが、これはローカルIPアドレスなのでこれが記録された端末のことを指していると思われます。
そして10.8.0.1で絞り込むことで上りもしくは下りのパケットを絞り込めます。
絞り込みにはWiresharkのフィルタ欄に以下のように打ち込みます。

```
上り：ip.src == 10.8.0.1
下り：ip.dst == 10.8.0.1
```

また、送信元IPアドレスからホストを逆引きすればなんとなくアタリをつけることもできます。
```
❯ host 142.251.42.161
161.42.251.142.in-addr.arpa domain name pointer nrt12s46-in-f1.1e100.net.
```

[1e100.net.はgoogleの所有しているドメインです。](https://support.google.com/faqs/answer/174717?hl=ja)
つまり、多分これはgoogleのデータセンターから送信されたパケットだろうなという気持ちになります。
キャプチャされた内容は雑多なバックグランド通信なども含んでいるので、やろうと思えばそれらを分類することも可能ですね。

### https通信の本体っぽいのを探す

パケットをずらっと眺めて、該当アプリがどのようなプロトコルで通信しているかアタリをつけます。
今回の私の場合だとprotocolはTLS、ポート番号はだいたい443、info欄にclient helloだのserver helloだのの文字列が観測されました。
なので多分https通信を行っているんでしょうということが察せます（自明）。

[https通信の構造についての解説は他のサイトに任せるとして](https://milestone-of-se.nesuke.com/nw-basic/tls/https-structure/)、ここから通信の本体を抜き出します。
とりあえずACKだのSYNだののパケットが凄く鬱陶しいですが、これらはTCP層なので`tls`でフィルタを掛ければ弾き出せます。
あとはinfoの部分を見てApplication Dataのパケットを抜き出せばいいですね。
ただし、Wiresharkではinfoの内容に対して例えば文字列検索などでフィルタを適用することはできません。そういう用途じゃないから仕方ないので、別途書き出してよしなに外部で処理するのがいいと思います。

### 時系列およびデータ長をみる

ヘッダからはパケットの送信されたタイミングおよびデータ長が見られます。
これらを集積すれば、アプリのデータ通信にかかる負荷を計測することができます。

![スクリーンショット 2022-12-19 3.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528082/1e098492-2111-c453-1631-f7f90ee03d1f.png)


こちらはGoogleスプレッドシートのアプリを動作させて総通信量をプロットしたものです。
実は今回やったのはこの計測を行うことが目的だったりもします。
端末上で操作を行ったタイミング等を記録しておいて比較すると、どのイベントに対応して通信が走ったか把握できるので面白いです。

おわり。
普段やらないことをすると、知らないことを色々調べることになるので楽しいです。
How to start COMPAS

# COMPAS とは

スイス連邦工科大を中心に開発中のパイソンフレームワーク。RhinocerosやGrasshopper上でロボットアームのシミュレーションが可能になります。コンピューテーショナルデザインからロボッティクファブリケーションまでをカバーする”COMPAS”のはじめかた。

## 参照
[COMPAS docs](https://compas.dev) |
[COMPAS FAB docs](https://gramaziokohler.github.io/compas_fab/latest/)

## Requirements　必須ソフトウェア

* Minimum OS / ミニマムOS: Windows 10 Pro or Mac OS Sierra 10.12
* [Anaconda 3](https://www.anaconda.com/distribution/)
* [Github Desktop](https://desktop.github.com/)
* [Rhino 6/7 & Grasshopper](https://www.rhino3d.com/download)
* [Visual Studio Code](https://code.visualstudio.com/)
* [Docker Desktop](https://www.docker.com/products/docker-desktop) After installation on Windows, it is required to enable "Virtualization" on the BIOS of the computer. / windowsではインスタレーション後に、使用コンピュータのBIOSでのVirtualizationをEnableする必要があります。👉[how to enable](https://bce.berkeley.edu/enabling-virtualization-in-your-pc-bios.html) / 👉[enableのやりかた](https://support.lenovo.com/it/ja/solutions/ht500006)

## Installation / インストール手順

We use `conda` to make sure we have clean, isolated environment for dependencies.
独立した簡潔な環境を構築するため、`conda`を使用します。

<details><summary>First time using <code>conda</code>? / 初めて<code>conda</code>を使用する場合</summary>
<p>

Make sure you run this at least once:
少なくとも一度は以下のコマンドを走らせてください：
    ```
    (base) conda config --add channels conda-forge
    ```


</p>
</details>

1. Create a environment with compas and compas_fab / 必要なライブラリとともに環境を構築する
    ```
    (base) conda create -n df2022 -c conda-forge compas compas_fab
    ```


1.  Add to Rhino / ライノセラスにコンパスをインストールする
    ```
    (base)   conda activate df2022
    (df2022) python -m compas_rhino.install -v 7.0
    ```


1.  Get the workshop files / 本ワークショップ用の[レポジトリ](https://github.com/trtku/KOMPAS_2022_DigitalFutures.git)をクローンする　
    ```
    (df2022) cd PATH_TO_YOUR_WORKING_DIRECTORY
    (df2022) git clone https://github.com/trtku/KOMPAS_2022_DigitalFutures.git
    ```

1.  go to the folder that you have just cloned / クローンしたフォルダに移動する
    ```
    (df2022) cd KOMPAS_2022_DigitalFutures
    ```


1.  Verify installation / インスタレーションの確認
    ```
    (df2022) python -m compas
    (df2022) python -m compas_fab
    ```

1.  Open Visual Studio Code / Visual Studio Code を開く
    ```
    (df2022) code .
    ```


1. （Open Rhinoceros3D and Grasshopper if necessary. / 必要に応じてライノセラス、グラスホッパーを開く）
![Capture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961940/e6b06b59-cc9b-ba7c-8c54-e2b2c7b79896.png)


🚀 You're ready! / 準備完了です！
[Examples](https://compas.dev/examples/)を参照しながら、コードを走らせてみましょう！

## Credits / クレジット

Arranged by Ko Tsuruta (<trtku0809@gmail.com>); with the help of Gonzalo Casas (<casas@arch.ethz.ch>).

本レポジトリはスイス連邦工科大で行われているCOMPASコースを参照しながらDigitalFUTURES2022ワークショップ用アレンジをしたものです。

アレンジはGonzalo Casasサポートのもと、鶴田航が行いました。
IRBの補完にRBSを組み合わせてみる

カタカタッ ターンッ！ RubyのIRBめっちゃ便利ですよね。
IRBは補完機能もすごく便利なんですが、ちょっと気になるところもあります。
- メソッドチェーンすると正しく補完できずありとあらゆるメソッド名が候補に出てしまう
- 正規表現で実装されてるので時々誤作動を起こす
  - `array[i].` `%s[symbol].` 配列のメソッドが候補に出る
  - `array.map{}.` `%w{words}.` HashとProcのメソッドが候補に出る

なので、型情報(RBS)とかも使ってもうちょっといい補完候補を出せないかなと 、gem `katakata_irb` を試しに作っています。

https://github.com/tompng/katakata_irb

<del>gemをインストールすると`kirb`コマンドが使えるようになります。</del>
変えました。使い方: `require 'katakata_irb'`

メソッドチェーンしてても、ブロック引数・変数などを使ってても、ある程度正しく型を推測して補完候補を出せたり出せなかったりします。

![katakata0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16596/d413415d-0d52-68e9-12ec-84dd92aa28e8.png)

![katakata1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16596/fc450bb7-b649-31a6-5976-31d0641b11a5.png)

![katakata2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16596/3fcd85c2-8f4e-5f3d-ace3-a31e0d7a64f3.png)

## 実装
こういうコードをirbに入力したときに
```ruby
irb> a = 10
=> 10
irb> a.times.map do |i|
irb>   j = i.times.map{}.join
irb>   j = a if foobar
irb>   puts((j * 2).█
irb>   ...
irb>   ...
```
1. カーソルより前の文字列を抜き出す
2. rubyのコードとして不完全なので、足りていない`)`と`end`などを追加したSyntax Validなコードから構文木を作る
  `sexp = Ripper.sexp(code + "method\n)\nend")`
3. 補完したい位置に該当する構文木のノード(`(j * 2).method`)を探す
4. ローカル変数aの中身やrbsの型情報を使って`(j * 2)`が何になり得るかを調べ、この場合はIntegerかStringなのでIntegerとStringのメソッドを補完候補に出す

ということをしています。

※ 不完全なコードのparseには、Ruby3.2から入るRubyVM::AbstractSyntaxTree.parseのerror_tolerantオプションが使えるかもしれない

## 未実装な部分

- Tuple, Record, Interface型などに対応していない
- `unless a.is_a? Foo` で aからFooが除外されてほしい
- TODOコメントを残した箇所がたくさんある
- 直前の解析結果を使いまわせる場合があるのでキャッシュしたい

## 動機

1. irbのruby-lex.rbを読んでいたら自分で書き直したバージョンを作ってみたくなった
2. 書き直した結果、閉じられていない括弧・do・quoteなどを調べるメソッドができた
3. それを使えば正規表現ではなく構文木から補完候補を出せそう
4. 型情報も使うとメソッドチェーンの補完候補も正しく出せそう
5. ブロック引数の型も調べたい、型推論っぽいことをしよう
6. 気軽に手を出した型推論、めちゃくちゃ大変じゃん(←今ここ)

## その他

<del>僕が快適に使いたいからという理由でirb/ruby-lex.rbとrelineにいくつかパッチを当てて読み込んでます。
(`Module#remover_method` `Module#prepend` `RubyVM::InstructionSequence.load_iseq`などを使って)
ヒアドキュメントのインデントとかが良い感じになってるはず。うまくいけばirbにリファクタリングのプルリクを出したい。
</del>パッチあてるのやめました


## Merry Christmas
Ruby3.2楽しみ
RailsアプリケーションをRuby3.0系にあげるために苦労したこと３選

現在Qiitaでは　[graphql-rubyアップデートで引っかかった点(1.8->1.12) - Qiita](https://qiita.com/WakameSun/items/eab39302b9580b51b7a2)　でも触れた通り、Ruby3.0へのアップデートを進めています。
基本的に自分1人がエイヤエイヤと進めて、ほぼほぼ動く（Rspecは全部通ったが、まだ実際に動かす検証が足りない状態）のものが完成しておりどんなに遅くなっても1月末には出せるだろうという状態です。
そこで、早計ではありますがここに苦労したよという部分を何個か選んで書いてみることにしました。
もしかしたら、今後何かにはまって増えるかもしれません。

## 1. 破壊的変更に付いていけず放置されたGem対応
若干主旨からは外れそうな気もしますが、一番苦労したのはこれです。
基本的にはDependabotなどにより可能な限り新しい状態を保とうとしていますが、 **破壊的変更多すぎ！今は余裕ないから後で！** 放置されてしまうGemや、そもそもDependabotが作るPR数を絞っているとなかなかPRが作られないGemが出てきます（基本的にセキュリティに問題があるGemを優先するので）。
今回のQiitaだと、 [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) がこれに該当し、使っている部分も多くCHANGELOGもべらぼうに長いため確認にかなりの時間を使ってしまいました。
開発が完全に停止したGemがなかったのが唯一の救いです。

## 2. rspecのオプションの理解不足による、エラー捜索の難航
基本的に今回のRuby3対応では、まずrspecを通そうというところからスタートするのですが、Rspecではエラーが起きた時、RspecはGemなどで引数エラーが起きた時にGemのトレースをデフォルトでは見れません。

```sh
bundle exec rspec -b #(--backtraceでもOK)
```

で、読むことが実際にはできるのですが、これを知らず（調べようとせず）最初の方は実際にどこで起きてるのか`#source_location`などを使って調べていました。
Gemにあたりがつけば、そのGemがRuby３対応してるか確認して、そのバージョンに上げる対応をする、してないならPRを送るなどの対応を即座に取れるので、こういう細かいオプションは知ってるととても便利です。

## 3. レビュワーに環境構築手順を教えられない
Rubyはrbenvあたりを使えば簡単にインストールできますが、Gemは数が多いと一発で通らないこともままあります。
そうなると調べてガチャガチャと入るまで試すことになるわけですが、何をしたかログを取ってなかったことで、
「試そうとしたらこのGem入らないんだけど（自分も一発で通らなかったが何をしたか記憶にない）」のような状態が起き、レビュワーに突っ込まれることになります。
しっかりと何をしたら動くのかログを取り、また他のメンバーが環境構築を楽にできるようにするとこまでがアップデートです。
自分の環境とCI動いただけで満足しないようにしましょう（自戒）。

## まとめ
この記事では、Ruby3のアプデで詰まったことについてまとめてみました。

- 日々使っているGem（ライブラリ）は可能な限りまめにあげておく
- 使っているツールの細かいオプションは、知ってると開発を助けてくれることがある
- 環境構築時には何をやったかログを取る

このように改善点をまとめると、Ruby3固有のものというよりは、日々の開発にも流用できそうな改善点が多くあります。
実際、Ruby3での変更点は公式がかなりわかりやすくまとめており、自前のコードの対応よりはライブラリの対応で苦戦した、っていう人も多そうです。
特にライブラリ周りは、怠っているといつか今回のRuby3対応のようなタイミングで地雷となり爆発するので、そうならないうちに上げていきましょう。
社会人未経験からのシステムエンジニア

# 初めに
僕が**3年4ヶ月3日**である程度なんでもできるシステムエンジニアになれた軌跡を記します。
これからシステムエンジニアを目指している方、未経験で不安を感じている方、伸び悩んでいる方の助けになれればと思います。

※素晴らしい会社の文化と成長を後押ししてくれる先輩や高め合える同僚がいたからエンジニアになれております。僕ひとりの力ではなれませんでした。

# 仕事の進め方
手取り足取り全てを教えてもらってどんどんこなしていく段階です。

ここで大事にしていた事は、受動的に学ぶのではなく能動的に学ぶ事でした。

教えてくれる方の時間をいかにたくさん奪うかが大事でいただた時間が多ければ多い程に成長の速度は比例していくんだなと感じました。

[5ヶ月]


# 自分で進める力
タスクを完了するために必要な事がわかってきた状態、タスクを完了するために必要な工程を洗い出し提案できるレベル。
自分から積極的に確認をお願いし、確実にタスクを完了させる動きができます。

ここで大事なのは、タスクの時間管理と対応の優先順位に対して自分の考えを持てるようになる事だと思います。

自分のタスクにできる限り責任を持ち、必要な情報を集めそれでも難しい時は、助けを求められる力が必要だと思いました。

[1年3ヶ月]

# 教える力
相手のタスクを自分のものとして、時間管理と優先順位を一緒に考えながら最大限の裁量を与えた上で最悪の状態なる前にタスクを完了させる事ができる力。

瞬時にタスクの苦戦しそうな箇所を特定して先に解決策をいくつか提案できる。
自分自身の作業はできるだけ優先順位を下げサポート優先をする。相手の意志を尊重して教え方関わり方を柔軟に変えていく必要がある。

[1年10ヶ月]			

# プロジェクトを進める力
全てのタスクを理解し、より大きい視点で優先順位を考えながらチームメンバーを動かす力。

お客さんとのミーティングも円滑に進め、開発以外にも必要な事を多くこなせる必要がある。

[3年4ヶ月]

# 最後に
僕は、**3年4ヶ月**である程度なんでもできるエンジニアになれました。
自分自身が主体的に動いて学びたいこと身に付けたい事を積極的に伝えていく事は必要ですが、最高の環境と関わる方々が大事にしている事が大きく関係してくると思います。

成長軌跡を見て、僕も私も「ある程度なんでもできるシステムエンジニアになりたい！」と思った方は是非コメントをください！
最高の環境とはどういうものなのか？一緒に働いているみんなが大事にしているものは何なのか？をお話しできたらと思います。
リファクタするのって難しいね

リファクタリングってしていますか？
取り急ぎ動くものを作ったけれど後から見ると色々改善できたりすることあるのではないでしょうか。
簡単に自分のリファクタリング例を載せていきたいと思います。

処理としては、
ユーザーをID検索し、退会済のユーザーであればエラーを出力するようにします。
```
package main

import (
	"fmt"

	"golang.org/x/xerrors"
)

// user ユーザー定義
type user struct {
	name     string
	id       uint
	userType uint
}

// userList ユーザーリスト
type userList []*user

// filterByIDs ユーザーリストからidで対象のユーザー検索
func (list *userList) filterByIDs(ids []uint) userList {
	out := userList{}
	for _, v := range *list {
		for _, id := range ids {
			if v.id == id {
				out = append(out, v)
			}
		}
	}
	return out
}

// invalidType ユーザータイプの判定
func (user *userList) invalidType() bool {
	for _, v := range *user {
		if v.userType == 2 {
			return false
		}
	}
	return true
}

func main() {
	if out, err := test(); err != nil {
		fmt.Printf("failed to test() : %v", err)
	} else {
		for _, v := range out {
			fmt.Print(v.name)
		}
	}
}

// test テスト用関数
func test() (userList, error) {
	// テスト用データ定義
	users := userList{
		{name: "kinoko", id: 1, userType: 1},
		{name: "takenoko", id: 2, userType: 1},
		{name: "suginoko", id: 3, userType: 2},
	}
	ids := []uint{2}
	// 有効なユーザーか判定する
	if out := users.filterByIDs(ids); !out.invalidType() {
		return nil, xerrors.New("invalid user")
	} else {
		return out, nil
	}
}
```

上のコードを見て、いくつくらい改善箇所見つかりましたか？
今回は3つ取り上げさせていただきます。
## レシーバ名
goにおいてレシーバ名は短く1文字あるいは2文字程度の省略形とすべきです。
また同様のレシーバは一貫性を持った名前にしなくてはならないのでメソッドによってバラバラの命名をしてはいけません。
よって`userList`型の構造体レシーバを使って、メソッドを定義している`filterByIDs()`,`invalidType()`をそれぞれ下記のように修正します。

```
func (l *userList) filterByIDs(ids []uint) userList {
	out := userList{}
	for _, v := range *l {
		for _, id := range ids {
			if v.id == id {
				out = append(out, v)
			}
		}
	}
	return out
}
```

```
func (l *userList) invalidType() bool {
	for _, v := range *l {
		if v.userType == 2 {
			return false
		}
	}
	return true
}
```

## 定数
コード内で意味のある数字や文字列を使用する際は必ず定数化してから使用しましょう。

```
const unSubscribe = 2

func (l *userList) invalidType() bool {
	for _, v := range *l {
		if v.userType == unSubscribe {
			return false
		}
	}
	return true
}
```

## エラーハンドリング

エラーハンドリングの分岐はなるべく最小になるようにします。
そのため`main()`,`test()`はそれぞれ以下のように修正します。
```
func main() {
	out, err := test()
	if err != nil {
		fmt.Printf("failed to test() : %v", err)
	}
	for _, v := range out {
		fmt.Print(v.name)
	}
}
```

```
func test() (userList, error) {
	users := userList{
		{name: "kinoko", id: 1, userType: 1},
		{name: "takenoko", id: 2, userType: 1},
		{name: "suginoko", id: 3, userType: 2},
	}
	ids := []uint{3}

	out := users.filterByIDs(ids)
	if !out.invalidType() {
		return nil, xerrors.New("invalid user")
	}
	return out, nil
}
```

## まとめ
今回は基本的な部分を記載致しましたが、
上記３つの他にも本来であればモデル定義と処理で別パッケージにし、ディレクトリ構造も分けられますし、変数名、メソッド名も人によってはこうした方が良いなどあるかと思います。
リファクタを重ねてより品質の良いコードを作成していきたいですね。

全然関係ない話ですが、明治製菓さんの有名なお菓子「きのこの山」、「たけのこの里」には他に「すぎのこ村」というのが昔あったらしいですよ。
みなさんご存知でしたか？

## 参考

https://knsh14.github.io/translations/go-codereview-comments/#indent-error-flow
https://github.com/golang/go/wiki/CodeReviewComments#receiver-names
Teamsの音声遅延がヒドイので、どれぐらい遅いか調べてみた

## はじめに
KDDIテクノロジーという会社で、映像配信のお仕事とかやってます。
昼間は打ち合わせ、夜は作業という感じで、Teamsは常に私のPCでは立ち上げっぱなしです。
今回は、Microsoft Teamsの音声遅延がどれぐらいなのか計ってみた！という内容です。

:::note warn
音声遅延が酷くて困っているから改善した！という話ではありません。
ただ、計測して、やっぱり遅延が結構ある！という内容なので、ご了承ください。
:::

## 打ち合わせ中、相手と声が被る！
リモート環境で仕事を行うことが当たり前になって、もう２年以上たちました。
リモート用PCを会社から渡され、そのPC内にあるTeamsやZoomを使って、打ち合わせを日々、行っています。
しかし、今月、リモート用PCが調子悪くなってきたので、交換したところ、Azure Virtual Desktopを使うことになっていました。

そして、Microsoft TeamsもAzure Virtual Desktop内にあり、リモートPC越しに使うことになりました。

使ってすぐに気が付いたのですが、打ち合わせをしていると相手との会話が重なることが多々、増えました。

音声遅延が増えているはなんとなく、分かっていましたが、打ち合わせが非常にやりにくい状態になっています。
今回、どれぐらい遅くなっているのかを調べてみることにしました。

下図のように、以前までの構成と新しい構成を検証環境として作り、リモートPC側に入力する音声と、受信側のPCで出力される音声をSound Capture device（BEHRINGER FLOW 8）へ入力し、音声の波形表示ソフトを入れたPCを使って、遅延の計りました。
## 構成図
![Untitled002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478109/d6f79351-5e19-beb8-79a8-2ec28dd92d77.png)
## 差分計測
波形表示ソフト(SoundEngine Free)を使って、音声遅延を計測しました。

<img width="500" alt="chien.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478109/dfad372d-7263-1bcc-b094-c61409ed432e.png">

## 音声遅延一覧表
|　計測回数　|以前までの構成|　新しい構成　|
|:-:|:-:|:-:|
|１回目|235 msec|363 msec|
|２回目|229 msec|354 msec|
|３回目|234 msec|381 msec|
|４回目|253 msec|372 msec|
|平均|238 msec|368 msec|

計測日:2022年12月19日23時頃

体感として350 msecを超えてくるとやはり、打ち合わせは困難と思われます。
新しい構成は、リモートデスクトップを使っているので、リモートPCの物理的なマイクからAzure Virtual Desktopへ送り、その後、受信者側のPCへ音声を伝送しているので、遅くなってあたり前なところです。

## ほかのサービスはどうなの？
リモート会議ツールとしては、Teams以外にもZoomやGoogle Meetでも音声遅延を計ったこともあります。
PCとAndroidスマホの1対1の構成でしたが、大体、音声の遅延は、200 msec～250 msecぐらいでした。

リモート会議ツール以外では、以下のような感じです。
ゲーマーご用達のDiscordが80～90 msec。
音楽セッションも行えるYAMAHAのSYNCROOMが20～30 msec程度（計測は、１年前ぐらい）。

## おわりに
音声の双方向通信技術は、今も昔もいろいろなサービスに組み込まれ、今まで以上に高音質、低遅延化は進んでいくと思われます。
非常に楽しみな要素技術ですので、今後もウォッチしていきたいと思います。
産休育休中9ヶ月間PCにほぼPCに触らなかったエンジニアが復帰したら

[Ateam LifeDesign Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-life-design)　の19日目です。
今年、産休・育休から復帰したのでその経験について振り返りたいと思います。
※妊娠や出産後の体については個人差が激しいことをご承知ください。

## 自己紹介
- webエンジニア歴10年ほど
- 産休に入る（去年）１年ほど前からインフラやDevOps的な業務
- 新卒からその前まではずっと開発
- 産休から約9ヶ月後に職場復帰
- 産休時特に役職なし

## 妊娠〜産休
![ninshin_onaka3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/60bc9cd0-6122-1c13-04b0-e3c55ab276b0.png)

つわりなど若干ありつつも、コロナになってからほぼエンジニアは全員リモートワークになっていたため、
辛いときはちょこちょこ休んだりしながら働くことができたのはとてもありがたかったです。
コロナ前から事情がある人はリモートワーク可になりつつありましたが、
安定期まではやはりできれば最低限の人だけにしか伝えたくないという気持ちはあったので、
コロナ渦での妊娠の一つのメリットではありました。
（ただ感染した妊婦さんに関してのショッキングなニュースが流れてきてそれはほんとに怖かったです。）

## 産休中（赤ちゃんが生まれるまで）
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/ddca3b29-bce0-00b7-5265-9918fed05d4f.png">

休みに入る前にまでは産休〜出産までは時間に余裕があるからじっくり勉強しようと思っていましたが、実際にはなかなか難しい状況でした。簡単に言うと臨月の体をなめていました。
お腹の赤ちゃんに内蔵が圧迫されちょっと動いただけで息がぜいぜいし、体がしんどくてちょっと家事をするだけでしんどくて休み休み進めざるを得ませんでした（個人差があります）。
それでも臨月になると「毎日1~2時間歩いてね☆」と医者から言われて（スムーズなお産のためにいいらしい）がんばって歩いたり、赤ちゃんを迎えるために家の中を片付けたり、ベビー用品を買い揃えたり、また割と保育園の激戦区だったので0歳で預けるために保活をして意外と慌ただしくその日を迎えるに至りました。

## 育休中（赤ちゃん誕生から復帰するまで）
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/3abc4092-5d40-a663-aa9e-eeb21fb6c03a.png">

### 生後0~1ヶ月
- ほぼ抱っこでしか寝ない。ので親は眠い。とりあえず隙あらば寝たい。赤ちゃんはかわいい:relaxed:

### 生後2~4ヶ月
- 授乳中にテレビを見る余裕が。目だけは暇なのでたまにYoutubeとかの勉強会動画くらいは見られる
- 技術書は読めない
    - この時期頭わらなすぎてちょっとだけ複雑な抱っこひもの説明書すら読めなかった
- 赤ちゃんはとてもかわいい:relaxed:

### 生後5~6ヶ月
- 比較的まとまって寝てくれるようになり、夜泣きは2~3回に
- それでもまだ眠いのでお昼寝も一緒に
- Youtubeとかは引き続き見れるがPCを触る余裕はない
- 育児書は読んだ
- 赤ちゃんは大変かわいい:relaxed:


### 復帰への不安
ほぼ勉強ができていない状況に加えて、
マミーブレインという言葉があるように、育休中は下記のような変化を感じていました。
- 物覚えが悪くなった
- 注意力が散漫になった
- 深く考えることが難しくなった

復帰前の上司との面談でもこういった不安や勉強ができていないことは伝えてさせてもらいました。
会社でも様々な変化はあったものの同じ役割で復帰することになりました。


## 復帰後
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93882/dcd263db-beda-9d26-457a-42c55471c892.png">

子供が生後７ヶ月になるころ4月から保育園にいれて職場復帰しました。
幸いにもこのころから子供が夜通し寝るようになってくれました。夜泣きが続く状態ではつらいと感じていたのでこれはホントにありがたかったです。

### 復帰後の変化
復帰直後はリハビリで簡単な開発もさせてもらいましたが、
簡単なコマンドが思い出せなかったり、プログラミングの感覚を思い出すのに少し時間がかかりましたが、
概ね1ヶ月ほどで感覚を取り戻せたと思います。
**長い時間をかけて獲得した能力はブランクがあっても少し慣れれば取り戻せる**と感じました。
以前育休復帰後の女性エンジニアの方が、「**自転車と同じ**でブランクがあっても大丈夫」というニュアンスのことをおっしゃっていましたがまさに、と思っています。
ただ、数年前に数ヶ月業務で書いていたGo→読むのはめちゃめちゃ時間かかるし、基本的な構文も割と忘れて感覚も取り戻すのに時間がかかっているので、これはそれだけ自分が深く習得できていなかったんだなと感じました。

### 復帰後の評価
弊社は7月締めでそのタイミングで評価面談もあるのですが、
「復帰前と変わらない」と言っていただけて安心しました。


## 改めて感じたこと
- ITエンジニアでよかった
リモートワークは別の職種でもできますが、エンジニアは特に相性がいい職種です。これは子供がいるとほんとにありがたく通勤時間があると、その分働ける時間が減ることになるので0にできるますし、もしお迎えが必要になってもすぐに行けるのでとても助かります。
- エイチームグループで良かった
弊社は手前味噌ですが「いい人が多い」とよく言われます。
実際それは感じていて、先輩社員も女性でも男性でも子育てに積極的に参加してる方が多く（男性育休取得率も非常に高い！）周りが子持ち社員への理解があり、制度も充実しています。
突発的に休んでしまったときにフォローして頂いてるみなさんにはほんとに感謝です。

## 今後に関して
やはり心配なことは新しい技術に触れたい、習得したいときに**勉強の時間が取れない**ということです。
復帰直後は以前までの知識でできていた業務も、時が経つにつれてそうはいかなくなってきます。
以前相談した方には「今はそういう時期と捉えてある程度諦めるのも大事」というお話をしていただきましたが、やはり不安はつきまといます。
なので業務時間でインプットの濃度を上げたいなと考えたりしていますが、引き続き考えていく必要がある問題だと感じています。
なのでまだ若い皆さんには「今うちにできるだけやっとけ！」と言いたいです。
AIが作る予想外な画像を考える

これは RICORA Advent Calendar 2022 19日目の記事です。
Google Colaboratory で Stable Diffusion 2.0 で画像生成します。
https://huggingface.co/stabilityai/stable-diffusion-2-1
生成された画像から、どうしてこんなものが作られるのか考えてみます。
※AIはブラックボックスなので、ただの個人的な予想であり、大した根拠はありません。

# Apple
"Apple" で画像生成してみます。

![apple.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/b5611614-4717-fe1b-ba35-c3e43bf2f15c.png)

Apple は Apple でもこっちの Apple が出ました。こうなる原因は、データセットでは果物の意味で Apple を使うよりも、Apple 製品という意味で使うことの方が多いからだと思われます。
果物のリンゴの画像が欲しいなら "Apple fruit" みたいに fruit を付けましょう
![apple2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/97fab285-2a68-2996-c33e-e5f50c807607.png)

# 謎の言語

"sentence" で画像生成してみます。

![moji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/318f734d-5b48-0ca7-d0f3-699481b18348.png)

見たことあるようで知らない言語が出てきます。おそらく文字っぽい曲線や直線は学習しているが、一文字ごとに区切られているのは理解できていないのでしょう。あと、機械翻訳じゃないのでちゃんとした文章は出来ません。

# ロボットは絵を描けない（主語と述語）

"The robot is painting a picture" で画像生成してみます。

![robot4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/6fa3151a-14d7-6d79-e93c-ff1609dec9a1.png)

何回やってもロボットが絵を描いている画像ではなく、ロボットの絵、または単にロボットと絵の組み合わせが生まれます。Stable Diffusion は機械翻訳ではないので、お題のどの単語が主語かを読み取らず、単語を飲み込むだけです。そして普通のロボットは絵を描かないので、ロボットに思い通りの動きをさせるのは難しいです。

# 指や境目

"human body" で画像生成してみます。

![body3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/7f1e9dbb-0a41-908f-7d6b-47f422e94144.png)

手が得意じゃない（体を作ることも苦手ですが）のも有名な話ですがなぜでしょう。手はいろんな形をとるからではないでしょうか。グーパーチョキ、手首を回す、箸を持つ、のように形を変える上、奥行きがあります。AIとしても見るたびに形が変わって学習しづらいのかもしれません。

![sword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070585/9619d75b-b7ef-be93-97d6-250b1a292bf2.png)

# 終わりに

それっぽいこと言ったかもしれませんが、最初に言ったとおりただの予想です。大した根拠はないので悪しからず。
何故マスタリング時の出力音源は0.0dBじゃダメなのか

# そもそも0.0dBを超えてはいけない理由
これはデジタル音声メディアの仕組みそのものに起因します。
デジタルの世界では、現実では滑らかな音の波が量子化されて数値化されます。
そして、この時の数値化された音の大きさの最大値が0.0dBなのです。
ちなみに最小値は-∞dBです。
この-∞dBから0.0dBまでを、16bitの音源なら2の16乗(=65536)に分割します。
24bit音源なら2の24乗に分割します。
では、ここで0.0dBを超える音声データが入力されたとすれば、それはどのように処理されるでしょうか。
結果として0.0dBを超えた分の音声データが失われることになります。
失われたデータは音源の歪みとなり、適切に処理されていない歪みはノイズになります。
なので、すっぱりと0.0dBに統一されないように、2mixの段階ではマスタリングのために多くのヘッドルーム(0.0dBから比べてどれだけ小さいか)を残します。(だいたい-6.0dB)
そして、マスタリング時は歪みが生まれないように音圧をあげます。

# じゃあマスタリング時は0.0dBまでせめて音圧を上げるべきでは？
wave形式はファイルサイズが大きいので、ストリーミングサービスや動画コンテナ内の音声データとしては適していません。
そのため、mp3やm4aなどに変換されます。
この変換は非可逆圧縮であり、音声データの情報量が削減されます。
0.0dBというのピークはコンピュータ上で処理される場合の理論値です。
これを波形に直すときには、その点を通る線を使います。
そのため、サンプルとサンプルの間では、そのサンプルの音圧を超える音声波形が作られる場合があるのです。
これによって作られるピークをTruePeakと呼び、mp3への変換などではピーク値に影響します。
wav
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/2872dc2d-9ea1-a35a-8cbf-0dae65054aa9.png)
同じ音源のmp3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/fb043562-7b95-edbb-4ad8-507092375307.png)


# どうすればいいか
まず一つ目ですが、TruePeakは高音域が影響して発生しやすいです。
適切なディザリング処理を行うことを心掛けてください。
また、TruePeakリミッターを利用することでTruePeakを制御することが出来ます。

これらの方法が使えない場合は、諦めてください。
実質、一般的な歪みによって発生したノイズに気付ける人は、よほど耳の肥えた人だけです。
それと、ただ単純にアウトシーリングを下げることも重要です。
人にもよると思いますが、私は-0.5dBに設定しています。
-0.1dBと、かなり攻めている人もいるのでどの程度に設定するかはかなり意見が分かれるところだと思います。
[Swift] エラー：Run script build phase 'Create Symlinks to Header Folders' 

## 背景
Venturaにアップデートしたらエラーが出た。ファイル自体を開くのが久しぶりなので原因は不明。

環境
M2macOS Ventura 13.0.1
Xcode 14.1

## エラー内容

:::note warn
Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase.
:::

## 解決方法
CocoaPodsのライブラリを再インストール
1.Podfileを開いてライブラリの名前を消す
2.ターミナルから"pod update"
3.Podfileにライブラリの名前を書く
4.ターミナルから"pod update"

## 考察
M2macだったりVenturaだったりと環境が変わりすぎて原因は不明のまま。
調べたらcocoapods関連のエラーな事だけは分かった。
難しそうな事ばかり書かれていたので、とりあえず再インストールしたら治った。
a

```c
#include <stdio.h>

int	main(void)
{

	int	n; //1 以上 N 以下の整数を 1 つ書き込みます。
	int	s; //カードに書かれた整数の合計が S 以下

	scanf("%d%d",&n,&s);
	// printf("%d %d\n",n,s);

	int i;// 赤のカード
	int box = 0;
	int box2 = 0;

	for (i = 1; i <= n; i++)
	{
		// printf("赤のカード%d\n", i);

		int j;// 青のカード

		for (j = 1; j <= n; j++)
		{
			// printf("青のカード%d\n", j);

			box = i + j;
			// printf("%d\n", box);

			if(box <= s){
				box2++;
			}
		}
	}
	printf("%d\n", box2);
	return (0);
}
```
モニコ ～目覚ましを、新たなコミュニケーションに！～

# はじめに


弊社、株式会社エニプラでは、毎月チーム毎に集まって社内活動を行っています。
私のチームでは、2022年の活動として「ヒーローズリーグ2022への挑戦」を掲げ、アプリの作成及び応募を行いました。

# 経緯
私のチームでは昨年も[イマココYa-Hoo 登山女子による登山女子のためのアプリ](https://protopedia.net/prototype/2708)という作品を出展していたのですが、
昨年は賞を獲得できなかったこともあり、賞の獲得を目標に2度目の挑戦となりました。

一年掛けて昨年のアワードの分析を行い、企画開発、動画作成という工程を踏み出展まで漕ぎつけています。

# 投稿作品
作品名は「モニコ ～目覚ましを、新たなコミュニケーションに！～」です。
モニコは目覚まし＋SNSをテーマにしたアプリで、グループメンバーの起きたい時間と起床状況を共有、寝坊しているメンバーにアラームを送ることができるアプリです。

**作品ページ**
下記リンクから作品ページへ飛べるので、是非そちらから詳細を見てみてください。
 [モニコ ～目覚ましを、新たなコミュニケーションに！～](https://protopedia.net/prototype/3561)

**動画**
作品ページからも動画は見れますが、ここでも見れるようにしておきます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/zBVmkpKdJTg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 反省点
主な点としては、分析や企画に拘り過ぎて、開発に割く時間と余力がなく、アプリとしては未完成となってしまったこと。
また、目覚ましアプリという特性上、3Dの動画が取りずらく、イラスト屋での動画作成となってしまったこと。
(30代のおっさんの寝起きはなかなか絵面が、、かと言って他メンバー、特に
女性社員にお願いしたらもうセクハラだよなというのがありまして。。。)
さらに、目標としていた賞を獲得できなかったことが挙げられます。

# 今後の展開
チームとしてまだ決定出来ていませんが、今度こそ賞を獲得するという案は上がっています。
その場合、未完成の作品をブラッシュアップするか、新たな作品を作成するかはこれから決めていくことになります。
どのような形になるにせよ、チームとしての活動は続けていきますので応援いただけますと嬉しいです。

最後まで閲覧いただき、ありがとうございました。
ルール説明・safety】risky-shell-pipe

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 19日目の記事になります。

今回はルール [risky-shell-pipe](https://ansible-lint.readthedocs.io/rules/risky-shell-pipe/) について説明します。

### risky-shell-pipe

[risky-shell-pipe](https://ansible-lint.readthedocs.io/rules/risky-shell-pipe/) は [ansible.builtin.shell](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html) モジュールでbashの`pipefailオプション`が付与されているか検証します。

[bashのman](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)によると

> pipefail オプションが有効になっている場合を除き、 パイプラインの返却ステータスは最後のコマンドの終了ステータスになります。 pipefail が有効になっている場合には、 0 以外のステータスを返した最後の (一番右の) コマンドの値が パイプラインの返却ステータスになり、 全てのコマンドが正常終了した場合にのみ 0 になります。

とあります。

例えば

```bash
false | true
echo "Ansible lint"
```

と書くと**Ansible lint**が表示されます。`pipefailオプション`を設定すると処理が途中で失敗しているため**Ansible lint**は表示されません。

```bash
set -o pipefail

false | true
echo "Ansible lint"
```

[risky-shell-pipe](https://ansible-lint.readthedocs.io/rules/risky-shell-pipe/)はパイプ処理の途中でコマンドが失敗した場合、タスクが期待通りに失敗することを保証します。

#### 問題のあるコード

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Pipeline without pipefail
      shell: false | cat
```

#### 修正されたコードその１

```yaml
---
- name: Example playbook
  hosts: localhost
  become: no
  tasks:
    - name: Pipeline with pipefail
      shell: set -o pipefail && false | cat
```

#### 修正されたコードその２

```yaml
---
- name: Example playbook
  hosts: localhost
  become: no
  tasks:
    - name: Pipeline with pipefail, multi-line
      shell: |
        set -o pipefail # <-- pipefailオプションを付与する
        false | cat
```





### 参考サイト

* [risky-shell-pipe — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/risky-shell-pipe/)
* [Man page of BASH](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)
PDFビューワ "Skim" で複数のPDFを同じウィンドウで開く方法

"Skim"はMacOSで使えるPDFビューワだが、デフォルトの設定だとPDFを開く度に新しいウィンドウを開いてしまう。そして、この設定はUIでは変更できない。そこで、以下のコマンドを実行することで、一つのウィンドウで複数のPDFを開くことができるようになる。

```shell
defaults write -app Skim AppleWindowTabbingMode -string always
```
また、[このページ](https://sourceforge.net/p/skim-app/wiki/Hidden_Preferences/)を参考にしてコマンドを実行すれば、他の細かい設定を変更することができる。

# 参考文献
- [Opening PDFs in the same tab in Skim](https://gnisitricks.de/2019/11/Opening-PDFs-in-the-same-tab-in-Skim/)
zshで開発効率を上げた自分的エイリアスを晒す

# 開発中によく使うコマンドなどはエイリアスで呼び出せる
開発中に良う使うけど長いコマンドなどがあります。

例えばDockerの起動コマンドや、
```
$ docker-compose up -d
```

Gitの状態を確認するコマンドなどです。

```
git status
```

このあたり、急いで打ち間違えてなんども実行し直すということがあったので、なにかいい方法が無いかを感がたところ、エイリアスという機能を知りました。


# エイリアスとは

エイリアスは任意のコマンドと紐付けるショートカットのような機能のことです。

使用シェルがzshであれば`~/.zshrc`
bashであれば`~/.bash_profile`に記述していきます。

# エイリアスの設定方法

構文としては下記のようになります。

```
alias 任意のコマンド=‘元のコマンド’
```

僕はzshを使っていたので、vimなどのエディタで`~/.zshrc`を編集して再読み込みすることで適用されます。

```
$ vim ~/.zshrc
// エイリアスを設定
$ source ~/.zshrc
```

# 実際に使っているエイリアス

際に僕が使っているエイリアスを紹介します。
アプリケーションで仕様するコンテナ名が`app`の場合が多いため、そちらに適した形になっています。

```sh:~/.zshrc

# Git関連
gb='git branch'
gp='git push'
gpf='git push -f'
gs='git status'
gsw='git switch'

# ディレクトリ移動
devpath='cd <パス>'

# Docker関連
dl='docker-compose logs -f --tail 100'
drs='docker-compose restart'
ds='docker-compose start'
ddup='docker-compose down && docker-compose up -d'

# Rails関連
rpa='docker-compose exec app ridgepole -f db/Schemafile -c config/database.yml --apply'
rpat='bundle exec ridgepole --config ./config/database.yml --file ./db/Schemafile --apply -E test'
rc='docker-compose exec app rails c'
rcs='docker-compose exec app rails c --sandbox'
rspec='docker-compose run --rm app rspec spec'
cc='docker-compose exec app rails r '\''Rails.cache.clear'\'

# Go関連
gosh='docker compose run go /bin/sh'

# GraphQL
gqldump='rake graphql:schema:dump'

```
# 参考

https://ios-docs.dev/alias/
https://qiita.com/terufumi1122/items/1bbb1cf96e376e30e9fc