OmniAICreator/Qiita-1.07M huggingface dataset:
初心者の初心者による初心者のためのPower Automate Desktop(RPA) 入門①

#こんな人に向けて

以下の要件を満たす方は有意義に読み進めていただけると思われます。

- 最近RPAってよく聞くけど何それ
- 興味はあるけど触ってみたいけど自動化までのハードルが高そうで手が出せない



#RPAってなんぞ
>ロボティックプロセスオートメーション(Robotic Process Automation)、通称RPAは、これまで人間のみが対応可能と想定されていた作業、もしくはより高度な作業を、人間に代わって実施できるルールエンジンやAI、機械学習等を含む認知技術を活用して代行・代替する取り組みです

https://www.nri.com/jp/knowledge/glossary/lst/alphabet/rpa

後半「高度な作業を、人間に代わって～」の部分については無視
ぶっちゃけRPAの超上級者が取り組める領域
これを実現しようと始めると間違いなく出会って３日で挫折待ったなしなので...

簡単にいうと
<b>PC上で動くブラウザやExcelなどのいわゆる媒体やツールを跨いで
自動で動くプロセス(robot)を作れる仕組み</b>
と理解してもらうのが入りやすいかなと思います。


#何ができるの？

身近な移動か自動化例でいうと
- ブラウザから勤怠打刻ページを開いて打刻した後、お決まりのページや社内ツールを開く
- Aシステムからcsvデータを10種類出力した後、きまった順番でBシステムに取り込む
- データ作成～納品物作成～メール送信　
　などなどetc...

ここまでの話で
「自動化ってこれまでもExcelのマクロやbatでできてたじゃん」
思う人いると思います。


その通りですがRPAの最大の強みは前項で記載した通り
>ブラウザやExcelなどの媒体やツールを跨いで自動で動くプロセス(robot)を作れる
ここは大きいです。
技術的な点でいうとほぼノーコードでそれが設計できるという手軽さもですね


#インストールしてみよう
百聞は一操作に如かずということでとりあえず触ってみましょう。
Power Automate Desktop(以後"PAD"と呼称します)はwindows10ユーザーならだれでも利用できます(ﾊｽﾞ)
無料ライセンス上の制約(※)はありますが個人利用の自動化であれば全く不自由ありません

公式の手順通りにインストールした後、拡張機能は利用してるブラウザの分くらいいれておけばいいです。
そもそもブラウザ使った自動化しない場合は拡張機能はいれなくてもOKです

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/install



#触ってみよう
いいチュートリアルが公開されていたので紹介です。
中級編くらいから会員限定公開ですが、基本操作習得には初級で充分です。

https://support.asahi-robo.jp/tutorial/power-automate-desktop


#どんなことにRPAは有用？
決まった作業を長時間繰り返すようなルーティン作業に向いています。
あとは作業品質といった面で作業自体はそんな負担ではないけどミスしがちな作業に向いてますね。機械的に行えるので毎回同じ品質の成果物がアウトプットできます。


またRPAのいいところでもあり欠点でもあるのですが、
"<b>やろうと思えばなんでもやれる</b>"
これで罠にはまって「RPA難しい」「RPAめっちゃめんどい」となってるユーザーはそこそこ多い気がしています。


例えばブラウザからデータを落として、Excelに転記し加工し特定フォルダに保存　という自動化を組む際
すべてRPAで自動化も可能です。


が、Excel内での操作はマクロや関数を駆使したほうが早いし、フォルダ移動等であればbatを組んだほうが早いです。


RPAの強みは<b>「ブラウザやExcelなどのいわゆる媒体やツールを跨げる」</b>だと思っていて、連結するための接着剤の意識を持つと有用に活用できると思います。
RPAはマクロやbatをキックするだけのイメージです。



#さいごに
ここまで読んでいただきありがとうございます。
RPAといっても多様なRPAツールがリリースされており各々の操作難易度は千差万別です。
今回紹介しているPADは天下のマイクロソフトが提供するものだけありコードを普段触ることがないユーザーにとっては比較的入りやすいツールとなっています。(正直それでもとっつきにくさはありますが...)


これから始める方には簡単な自動化をひとつ作ることをおすすめします


間違っても分岐や、繰り返しなどの入った複雑なフロー前提で設計すべきでないです。小さな自動化での成功体験を積み重ねて、<b>まず触ることへの抵抗感をなくすが一歩目</b>と思います。
MBOX CSVを変換する方法は添付ファイル付き?

"mbox csvを変換したい。ExcelでMBOXをインポートできるようにする。メールボックスファイルに25kのメールストアがあります。この問題について教えてください。" - Quoraのユーザー

MBOX CSV変換ツールをお探しですか? MBOXをExcelにインポートしたいユーザーはほとんどいないと思います。残念ながら、手動の方法やチュートリアルはありません。したがって、先週私が個人的に使用した1つのソリューションをお勧めします。

##MBOXをExcelにインポート-ワンストップソリューション

＃1を使用してMBOXメールをExcelにエクスポートします。 MBOXからCSVへの変換ソフトウェア。このユーティリティを使用すると、完全な電子メールと添付ファイルを含むMBOXファイルをExcelで開くことができます。 Thunderbird、Gmail、Protonmail、The Bat、Apple Mail、Opera Mail、およびほぼすべての電子メールプログラムによって作成されたMBOXファイルをサポートします。


**[Advik MBOX Converter](https://www.adviksoft.com/mbox/csv.html)** は、WindowsPCでMBOXをCSVに変換するのに役立つ便利なツールです。 MBOXメールをExcelに柔軟にエクスポートできます。このソフトウェアでは、MBOXファイルを25以上のファイル形式で保存できます。

###MBOXCSVを変換する手順は次のとおりです

1. WindowsマシンにAdvik MBOX Converterをインストールして実行します.
![mbox-csv-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526912/f40e8749-4c31-7df4-cd9c-39f79fb6e8e5.png)

2. [ファイルの追加]をクリックして、.mboxファイルをソフトウェアに追加します。
![mbox-csv-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526912/313c7182-bbea-04cf-73eb-f91800a61e5d.png)

3.リストから保存オプションとしてCSVを選択します。
![mbox-csv-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526912/1ab97689-7505-b0d4-fed0-347b2e59a1ea.png)

4.[変換]ボタンをクリックして、変換プロセスを開始します。
![mbox-csv-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526912/dadfaba8-7440-95cd-be74-fc364a4fd271.png)

終了した。これがMBOX CSVをエクスポートする方法です。

無料でダウンロード: https://www.adviksoft.com/dl/advik-mbox-converter.exe
Workato：IfでAnd/Orを混在させた条件を1回で定義するには

# はじめに
AndとOrを混在させた条件をWorkatoで定義する場合、通常は以下のように定義します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8ec861de-641b-5fd4-c523-b7ce74e7d866.png)

しかし、この方法には、次の問題があります。

- Triggerでは、上記のようなネストする条件(If)定義ができない
- Actionにおいても、Ifが増えることで、ネストが深くなる、ステップが多くなる等、見通しが悪くなる問題が生じる

# 対応方法

Formulaを利用することで、1つのステップ内で複数のAnd/Or条件を混在させることが可能です。
以下はTriggerの例ですが、ActionのIfでも同様の定義が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dff397b5-fdf5-fad5-124e-01c520078e45.png)
[Unity]uGUIのデフォルトシェーダーをカスタムしたが、マスク対象のuGUIに反映されない問題

# 問題

　`Canvas.GetDefaultCanvasMaterial`で取得できるマテリアルのシェーダーを置き換えることで、uGUIにカスタムしたシェーダーを使うことができます。

```ChangeUIShader.cs
Canvas.GetDefaultCanvasMaterial().shader = customShader;
```

　一部シーンでSRPを使っている関係で、ゲーム中に動的に`GetDefaultCanvasMaterial`のシェーダーを置き換えていたのですが、`Mask`コンポーネントで**マスクされたuGUIのシェーダーが置き換え前の初期uGUIシェーダーになってしまい、表示が破綻してしまいました**。

# 解決方法

上記のコードでシェーダーを置き換えた後、下記処理を入れることで解決しました。

```ChangeUIShader.cs
StencilMaterial.ClearAll();
foreach (var canvas in FindObjectsOfType<Canvas>().Where(x => x.isActiveAndEnabled))
{
    canvas.enabled = false;
    canvas.enabled = true;
}
```

## 解説

マスクできるuGUIは全て`MaskableGraphic`を継承しています。
`MaskableGraphic`は、マスクされたときに`GetModifiedMaterial`メソッドが呼ばれ、その中で現在のuGUIのマテリアルを基にして、マスクされた時用のマテリアルを`StencilMaterial.Add`で生成しています。
`GetDefaultCanvasMaterial`を置き換える前にマスク用のマテリアルが作られてしまうと、`GetDefaultCanvasMaterial`を置き換えた後もそのマテリアルが使われるため、これが原因で表題のようなことが起きていました。

対策として入れたコードは、UIのデフォルトマテリアルのシェーダー置き換え前のものが残ってしまっているところを、クリア＆全部`Graphic.SetMaterialDirty`呼ぶことで解決しているものです。

社内の有識者に教えてもらったんですが、コンナノワカラナイヨ…！

## 余談：Unityの標準コンポーネントのコードってどこで読むの？

今回だと、`MaskableGraphic.cs`を読むことで原因が分かったんですが、標準コンポーネントのソースコードってどこで読むのが正道なんですかね…？

URPをインポートしてるプロジェクトで`MaskableGraphic.cs`を検索にかけたら Librarly フォルダ内の下記の場所に格納されてて読めたんですが、こういう調べ方がセオリーだとは思わないので、次似たようなことが起きたときのために参照すべき場所を知っておきたい…。

```
Libraly/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/
```

# 参考：MaskableGraphic.GetModifiedMaterial

```MaskableGraphic.cs
/// <summary>
/// See IMaterialModifier.GetModifiedMaterial
/// </summary>
public virtual Material GetModifiedMaterial(Material baseMaterial)
{
    var toUse = baseMaterial;

    if (m_ShouldRecalculateStencil)
    {
        if (maskable)
        {
            var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform);
            m_StencilValue = MaskUtilities.GetStencilDepth(transform, rootCanvas);
        }
        else
            m_StencilValue = 0;

        m_ShouldRecalculateStencil = false;
    }

    // if we have a enabled Mask component then it will
    // generate the mask material. This is an optimization
    // it adds some coupling between components though :(
    if (m_StencilValue > 0 && !isMaskingGraphic)
    {
        var maskMat = StencilMaterial.Add(toUse, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0);
        StencilMaterial.Remove(m_MaskMaterial);
        m_MaskMaterial = maskMat;
        toUse = m_MaskMaterial;
    }
    return toUse;
}
```
colorプロパティとbackgroud-colorプロパティの違い

◾️ background-colorプロパティとは

　文字が書かれている後ろの背景の色を変える目的で使われるプロパティ。
　部屋の壁の色を決めれるようなもの。

◾️ colorプロパティとは

　文字の色を変える為に使われるプロパティ。
　部屋にアートや時計などを飾れると思えれな良いだろう。

　

この２つのプロパティを使うことでホームページなどを見栄えがいい物に変えられるという事だ。
自分の部屋であるかのようにイメージしてこの２つプロパティを使えば、いい部屋＜HPなど＞になる事間違えなし！！:cracker:
基礎的な情報ではあるが、是非とも頭にマージしといてもらいたい！:merge:
【長文要約AI】どんな文章でも、AIが３行に要約してくれるELYZA DIGESTを使って有名企業の企業理念をまとめてみました。

#ELYZA DIGESTとは？
東京大学・松尾研究室発のDeep Learningを軸としたAIプロフェッショナル集団、[ELYZA](https://elyza.ai/) (イライザ)が開発している、入力したテキストデータを３行に要約するAIサービスです。

https://www.digest.elyza.ai/

#企業理念の選定基準
文章が短いとエラーが出て要約できないため、企業理念（経営理念、基本理念も含む）がある程度長いものから選びました。それ以外の条件は特になく、単に僕が見つけられた企業のみを対象としています。
#トヨタ
国際社会から信頼される企業市民をめざす、国際法およびその精神を遵守する。クリーンで安全な商品の提供を使命とし、あらゆる分野での最先端技術の研究と開発に努める。環境と経済の発展に貢献する、クリーンで安全な商品の提供を使命とする。

[トヨタの企業理念（全文）](https://global.toyota/jp/company/vision-and-philosophy/guiding-principles/)
#SoftBank　Group
ソフトバンクグループは、情報革命を通じた人類と社会への貢献を推進してきた。幸せとは、感動することと同義であると考える。創業以来の志が、この理念に凝縮されているという。

[SoftBankの企業理念（全文）](https://group.softbank/philosophy/corporate_philosophy)
#ソニーグループ
新しいブランドコミュニケーションによりお客様に感動をお届けする会社。コンセプトは「3IN」で、自由でオープンであり余白・余地・余裕があること。モノ・コト・ヒト、複数の価値観が組み合わされていること。

[ソニーの企業理念（全文）](https://www.sonykigyo.jp/company/philosophy2.html)
#日立
日立は、社会の変化に伴う要請を敏感に察知した企業活動の推進をめざす。日立グループ・ビジョンを加えて体系化したものを「日立グループ・アイデンティティ」として定め。社会の変化に伴う要請を敏感に察知した企業活動の推進を、中長期的にめざす。

[日立の企業理念（全文）](https://www.hitachi.co.jp/sustainability/download/pdf/ja_sustainability2020_07.pdf)
#第一生命HD
第一生命は1902年、日本での創業以来、お客さま本位を経営の基本理念に据えてきた。生命保険の提供を中心に、地域社会への貢献に努めてきた。一人ひとり違う幸せの実現に向け、これまで以上に寄り添う。

[第一生命HDの企業理念（全文）](https://www.dai-ichi-life.co.jp/company/info/mission.html)
#セコム
セコムの社員が現状に安住しようとする怠惰な心を打ち破る。前進・進歩への意欲と信念を持ちつづけることが大切だという。セコムは、常に新しいサービス事業を行って発展を遂げてきた。

[セコムの企業理念（全文）](https://www.secom.co.jp/recruit/01/company/idea.html)
#積水ハウス
人間愛は、企業発展の原動力となる。すべての活動の実態や実績は真実の上に立脚せねば正しい評価はなされない。最高の品質と技術は、顧客のニーズに合った商品を絶えず開発することも重要。

[積水ハウスの企業理念（全文）](https://www.sekisuihouse.co.jp/company/info/philosophy/)
#サントリー
サントリーの歴史の節目ごとに創出された経営理念を紹介している。新しい価値創造を企業理念とする、チャレンジ精神を忘れず積極的な企業活動を推進。人と自然と響き合う、新しい価値創造を企業理念とする、など。

[サントリーの企業理念（全文）](https://www.suntory.co.jp/recruit/direction/)
#東宝グループ
映画・演劇を中心に、幅広い層に夢や感動、喜びをもたらす数多くの作品をお届け。小林一三が設立されて以来、幅広い層のお客様に夢や感動をもたらす作品をお届け。公明正大な事業活動に取り組むと共に、新鮮な企画を提案し続ける企業集団である。

[東宝グループの企業理念（全文）](https://www.toho.co.jp/company/info/management.html)
#まとめ
いろいろな企業の企業理念を調べていて、歴史の長い企業は長い傾向があり、逆に最近の企業だと短い傾向がありました。特にベンチャーのものはたいてい１行とかなので文章が短すぎるというようなエラーが出て要約できませんでした。企業理念が長くなるのは、時間を経るにつれて達成するべき目標や必要な文化、規範が増えるからということでしょうか。内容としては幸せ、感動、挑戦などが多いように感じました。どれもが企業に必要であると納得できるものなので、ある程度共通してしまうのは仕方のないことでしょう。また、名前は知っているけれど何をやっているのか知らなかった企業はこんなことをやっているのかと発見することもあり勉強になりました。CMとか広告でよく見る大企業は実はこんな理念を持っていたのかと知ることができ、今後は町中やネットでを見かけたときにその企業の理念が反映された内容になっているか、逆に反する内容になっていないか、など今までと違う視点で見られるようになると思いました。
もしもみなさんが気になった企業の企業理念が長くて読むのが大変だったら、ELYZA DIGESTを使って要約したものなら楽に読めるかもしれませんね。

#まとめのまとめ（３行）
企業理念が長くて読むのが大変だと、ELYZA DIGESTを使って解説している。歴史の長い企業は長い傾向があり、最近の企業だと短い傾向があった。内容としては幸せ、感動、挑戦などが多いように感じました。

#Qiita内の関連記事

https://qiita.com/kazuo_reve/items/f25b444fad35acfe6b41#_reference-44ba1b312c5ca4c08392
[Unity]Blitで渡したカメラに映る画面テクスチャがシェーダーで空になる問題


# 先に結論

CameraTarget（画面）はテクスチャじゃ無いため、`_MainTex`として渡せないことが原因でした。
`sourceとdestのみのBlit呼び出し`で一時的なレンダテクスチャに画面の表示を渡し、その後にシェーダーをかけることで解決できました。

# 経緯

```GameRender.cs
commandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, dest, material);
```

みたいなコードで画面にポストエフェクトをかけるシェーダーを書いていたのですが、シェーダー側の`_MainTex`に`CameraTarget`が持ってるはずのテクスチャが渡されませんでした。

https://docs.unity3d.com/ja/2018.4/ScriptReference/Rendering.CommandBuffer.Blit.html

ドキュメントを読んでも

> ソーステクスチャやレンダーターゲットは "_MainTex" プロパティーとしてマテリアルに渡されます

としか書いておらず、原因が分からず…
いろいろ調べても情報が無く、ヤケクソでTwitterで検索かけたら下記のツイートがヒットしました。

https://twitter.com/kaigyoPG/status/1189151538809147392

> 画面はテクスチャじゃ無いかららしい

という言葉のソースになるドキュメントは見つかりませんでしたが、起きてる状態に完全に合致したので、一時的なレンダテクスチャを用意してBlitを２段階に分けたところ、見事解決できました。ツイートに感謝…！

```GameRender.cs
static int TempID = Shader.PropertyToID("_Temp");

// 中略

// 一時的なレンダテクスチャを作成
commandBuffer.GetTemporaryRT(TempID, -1, -1, 0, FilterMode.Bilinear);

// CameraTargetを一時的なレンダテクスチャに移して、それに対してシェーダーをかける
commandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, TempID);
commandBuffer.Blit(TempID, dest, material);

// 一時的なレンダテクスチャを解放
commandBuffer.ReleaseTemporaryRT(TempID);
```

このようにコードを修正することで解決しました。
Workatoでレシピ内の途中の処理を強制的にエラーとするには

Workatoで強制的にエラーを発生させたい場合は、Rubyコネクターを利用して対応します。
例えば、特定のHTTPステータスコードの場合にレシピをエラーにしたい場合はこの方法で対応可能です。

# 手順
## １．レシピのアクションにRubyコネクターを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/78bae818-2d1a-e1c9-f458-3cc1abbe11ff.png)


## ２．Inputに `err_msg` という変数を定義します。
この変数へエラーメッセージをセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1956e163-b313-be83-ec9c-816d6496bea9.png)

## ３．以下のコードを追加します。
Rubyコネクターでは、Inputで定義した変数を `input['変数名']` で取得してコード内で利用することが出来ます。

```
error(input['err_msg'])
```

# レシピ例
以下の場合は、3ステップ目でエラーメッセージを定義（セット）し、4ステップ目でエラーチェックを行い、5ステップ目でエラーを発生させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/de2f9123-14b5-d703-f848-e51d5fe1103c.png)

# 参考
https://docs.workato.com/developing-connectors/sdk/sdk-reference/ruby_methods.html#pre-defined-ruby-methods
繰り返し画像の生成 ~Pillow vs OpenCV(というかnumpy)~

# 経緯
小さな画像を連続させて模様を作りたかったのですが、Python3でやろうとするとPillowを使うかOpenCV使うかで悩んだので、この際どっちの方が良いのか実験してみました。
自分用のメモです。

# 環境
* Windowns10
* Python 3.7.9
* ライブラリ
    * numpy               : 1.20.2
    * opencv-python       : 4.5.1.48
    * Pillow              : 8.3.1

# 連続画像の作り方
同じ画像を連続させた画像をPythonで作る場合、やり方はまぁまぁたくさんあります。今回はPillowで読み込んだ場合とOpenCVで読み込んだ場合を比較しました(自分がよく使うので)

やり方は次の通り。各々元の画像を縦に3回、横に4回繰り返し、12枚の元画像が並んだ画像を生成します。
元画像のサイズは`128×128`です。

* Pillow
    * 背景画像(大きさを「元画像の大きさ×連続させたい縦横の数」で定義しておく)に、元画像を貼り付ける

```python:read_and_paste_by_pillow.py
from PIL import Image

img1 = Image.open(pic_path)                                     # 画像読み込み
img2 = Image.new('RGBA', (img1.size[0] * 4, img1.size[1] * 3))  # 背景画像定義
for i in range(4):
    for k in range(3):
        img2.paste(img1, (i * img1.size[0], k * img1.size[1]))  # 元画像を指定位置に貼り付け
```

* OpenCV (& numpy)
    * ライブラリの関数で読み込んでarray化した画像を、`numpy`の`np.tile`で連続させたい数だけ繰り返す

```python:read_by_opencv_paste_by_numpy.py
import numpy as np
import cv2

img3 = cv2.imread(pic_path)      # 画像読み込み
img4 = np.tile(img3, (3, 4, 1))  # 繰り返し画像の定義
```

## 結果
上のやり方を各100,000回繰り返し、それぞれ時間を測定。一回当たりの時間の平均値を計算しました。(計算)

| * | mean (1回あたりの処理時間) |
| --- | --: | --: |
| OpenCV(numpy) | 0.00074 (秒) |
| Pillow | 0.00126 (秒) |

## 考察
まぁ予想通りでした。for使ったほうが遅いに決まってる。
画像系のライブラリって混ぜて使うと混乱の元なのであまりやりたくないんですが、画像を任意の角度で回転する関数がPillowにしかなかったり、OpenCVの方がメンドクサイ処理には向いていたりと長短があるので考えて使っていこうと思います。
とりあえず、繰り返しで画像生成しなきゃいけないときは

1. 画像はarrayで読み込んで、繰り返し画像は`np`で生成する
1. 回転処理等かけるときはPillowに変換して使う

でやろうと思います。
【Laravel】ルーティングの基本的な書き方

#はじめに

#ルーティングとは
「ユーザーがこのURLにアクセスしたらこの機能を呼び出す」というような感じで、URLと機能を紐付ける工程のことを言います。
Laravelでは、ユーザーからリクエストが送信されたら、ルーティングにしたがって決められたコントローラーのアクション（メソッド）が起動するという流れになります。
ルーティングは、routesディレクトリ内のweb.phpにRouteファサードを使って記述していきます。

#記述方法
(1)「/」にアクセスしたら、`views`の`welcome.blade.php`を表示する。

```php:web.php
Route::get('/', function () {
    return view('welcome');
});
```

(2)「/menu」にアクセスしたら、`MenuController`のindexアクションを実行し、menusディレクトリ内の`index.blade.php`を表示する。

```php:web.php
Route::get('/menu', 'MenuController@index');
```

```php:MenuController.php
public function index()
{
    return view('menus.index');
}
```

###Laravel8.xでは

```web.php
Route::get('/menu', [MenuController::class, 'index']);
```
と記述するようになったみたいです。

#おわりに
ルーティングは先（上）に記述した方が優先されるということは覚えておきましょう。
[Unity]Blitで上下反転して描画される問題

# 原因
GPUによって描画する際の`y座標の0`の基準が異なるらしいです。

* Direct3D系：座標の一番 **`上が0`**。Direct3D、Metalなど
* OpenGL 類：座標の一番 **`下が0`**。OpenGL、OpenGL ESなど

で、基本的に`これはUnityは勝手に吸収してくれる`ようなのですが、**レンダテクスチャに描くときにその吸収する仕組みが悪さすることがある**ようです。

**▼参考：公式ドキュメント**

https://docs.unity3d.com/ja/2019.4/Manual/SL-PlatformDifferences.html

# 対策

この仕組みが原因で上下反転する場合は、シェーダ書いて解決してね、と上記の公式ドキュメントに書いてありました。
具体的には DirectX系／Metalのときのみ、vertexシェーダーでUVを反転をさせるようです。

```ReverseResolve.shader
#if UNITY_UV_STARTS_AT_TOP
    // DirectX系, Metalの場合はY軸反転.
    o.uv.y = 1 - o.uv.y;
#endif
```

`UNITY_UV_STARTS_AT_TOP`を使って、座標の一番上が0のGPUであるかどうかを分岐させ、trueの場合のみ反転させています。
これで解決できました。


## 余談

今回の件でハマったときいろいろ調べてたら、「CommandBufferでレンダリング結果を利用する場合には、`Camera.forceIntoRenderTexture`を有効にすると良い」という記事も見かけました。

https://hacchi-man.hatenablog.com/entry/2020/12/24/220000

自分のケースには当てはまりませんでしたが、そういうこともあるみたいです。

また、`CommandBuffer.Blit`の内部で行われるいろいろな処理分岐によるハマりポイント的な記事も見かけたので、こちらも備忘録として記載しておきます。

http://blackmasqueradegames.com/2015/04/unity-5-afterimageeffects-and-aftereverything-traps/

これ↓とかよく分からないけど何らかのハマりポイントになりそう…。

> AfterEverything開始時の、CurrentActive, CameraTargetをsrcとしたBlit命令は、内部でBlit Copyではなく、Back BufferをsrcとしたGrab RenderTextureが発生する


# シェーダー全文

```ReverseResolve.shader
Shader "Camera/ReverseResolve"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
#if UNITY_UV_STARTS_AT_TOP
                // DirectX系, Metalの場合はY軸反転.
                o.uv.y = 1 - o.uv.y;
#endif
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}
```
AtCoderログ：0104 - ABC 217 B

# 問題
https://atcoder.jp/contests/abc217/tasks/abc217_b

## 問題文
> AtCoder では現在、 ABC , ARC , AGC , AHC の 4 つのコンテストが定期的に開催されています。
> AtCoder で現在定期的に開催されているコンテストは $S_1, S_2, S_3$ とあと 1 つは何ですか?

## 制約
> ・$S_1, S_2, S_3$ はそれぞれ、ABC, ARC, AGC, AHC のいずれかである。
> ・$S_1, S_2, S_3$ は相異なる。

# 回答
## 回答1 (AC)
4 つのコンテストの名称をリストに記憶し、コンテスト名を読み込むごとに何番目の要素と等しいかをチェック、別の配列にその情報を保存していけば良いでしょう。4x4=16回の繰り返しが必要ですが、全く問題のない回数です。コードは以下のようになりました。

```C++:abc217b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  vector<string> contest = { "ABC", "ARC", "AGC", "AHC" };
  vector<int>    found(4,0);
  string s;
  for ( int i=0; i<3; i++ ) {
    cin >> s;
    for ( int j=0; j<4; j++ ) {
      if ( s==contest.at(j) ) {
        found.at(j) = 1;
      }
    }
  }

  for ( int j=0; j<4; j++ ) {
    if ( found.at(j)==0 ) {
      cout << contest.at(j) << endl;
    }
  }
}
```

## 回答2 (AC)
回答1の場合、コンテストの個数が増えると繰返し回数が膨大になってしまいます。そこで考え方を逆転し、コンテスト名を読み込むごとに最初のリストから削除していくことにします。こうすることで、最後に残ったコンテスト名が答えとなります。コードは以下のようになりました。

```C++:abc217b-2.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  set<string> contest = { "ABC", "ARC", "AGC", "AHC" };
  string s;

  for ( int i=0; i<3; i++ ) {
    cin >> s;
    contest.erase(s);
  }

  for ( auto itr = contest.begin(); itr != contest.end(); ++itr ) {
    cout << *itr;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc217/tasks/abc217_b/editorial) → [公式解説](https://atcoder.jp/contests/abc217/editorial/2583)
回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0103 - ABC 217 A](https://qiita.com/RoadLynton/items/861291cdcc4ce8bd9558)
- 次の記事 → [AtCoderログ：0105 - ABC 217 C](https://qiita.com/RoadLynton/items/82c9162232c3c14241ec)
【備忘録】SSHとは

#はじめに#
　本番環境構築のためレンタルサーバーを使おうとしたらSSHという言葉が出てきました。あまり聞きなれない言葉だったので備忘録として残しておこうと思います。
　
　それではよろしくお願いいたします！

#SSHとは#
　SSHとは、Secure Shellの略で、ネットワークを介して別のコンピュータと通信するためのプロトコルです。SSHコマンドを使うことでサーバーなどを遠隔操作することが出来ます。映画とかでよく、主人公のサポート役がパソコンをカタカタやってドアロックを解除したり、監視カメラを乗っ取ったりしてますよね。あんな感じのイメージです。Macではターミナル、Windowsではコマンドプロンプトを使って操作します。

　同じようなプロトコルに、Telnetというものがあります。Telnetも、SSH同様コンピュータを遠隔操作するためのプロトコルですが、異なる点があります。それは、通信データが暗号化されているか、されていないかになります。　
　Telnetの場合は暗号化されていないので、パスワード情報やファイル情報がそのまま通信データとして送られますので、覗き見（盗聴とも呼ばれます。）されると情報が漏洩してしまいます。
　それに対してSSHは通信データが暗号化されているのでTelnetよりも安全性が高いです。


#どのようにして使うのか#
　SSHは主にサーバーのセットアップ時などに使います。先ほど述べた通り、Macではターミナル、Windowsではコマンドプロンプトを使用します。基本的な書式は下記の通りです。

```
 ssh ユーザー名@IPアドレス
```

〜というIPアドレスを持つサーバーに〇〇というユーザーでSSH接続します、という意味ですね。このように入力するとパスワードを求められますので、あらかじめ設定しているパスワードを入力すると認証成功です。こうすることでサーバーにログインでき、様々な操作を行うことができるようになります。


#公開鍵認証#
　今ご紹介したのがパスワード認証方式というものです。それとは別に、公開鍵認証というものについてもご紹介していきます。公開鍵認証方式とは、公開鍵と秘密鍵を使ってログインする方式になります。

　クライアントとサーバーの関係性を想像してみてください。公開鍵認証方式では、まずクライアントが公開鍵と秘密鍵を作ります。そしてサーバー側に公開鍵を渡し、秘密鍵は自分で持っておきます。認証時には、サーバー側で公開鍵を用いて暗号化されたデータを自分のパソコン側が秘密鍵で複号化します。複号化されたデータをサーバー側に送付し、元のデータと合っていれば認証成功です。

　パスワード方式だと、ユーザーが単純なパスワードを設定してしまったり、同じパスワードを使いまわしてしまったりすることがあるので、セキュリティ的にやや不安が残ります。それに対して、公開鍵認証で作られたデータは非常に複雑に作られているので、秘密鍵さえしっかり保管しておけば破られることはありません。そのため、一般的には公開鍵認証の方がより安全であると言われています。従って、SSH接続の際は公開鍵認証を使用することが望ましいです。


#まとめ#
　サーバーとの接続には、Telnetではなく暗号化されたSSH接続を使うこと、認証にはパスワード認証ではなく公開鍵認証を使うようにしましょう。
【JQuery】JQuery Validateに条件文 

# やりたいこと
簡単にバリデーションをかけることができる**JQuery Validate**ですが、
他の選択肢によって必須かどうかを操作したい状況がありました。

そこで簡単に実装することができたのでそれを書きます。

# JQuery Validate

例えば`form`で`email`というname属性に必須条件を加えたい場合は
以下のような記述になる。

```javascript

$('form').validate({
  rules: {
    'email': {
      required: true
    },
  }
});

```

# 条件文

これにいつでも必須ではなく
他の入力項目がある条件を満たすときに必須としたいとき。

例えば同じ`entry`という属性の値が`yes`なら`email`を
必須にしたいなら以下のようになる。

```javascript

$('form').validate({
  rules: {
    'email': {
      required: {
        depends: function(){
          if ($('[name=entry]').val() == 'yes') {
            return true;
          } else {
            return false;
          }
        }
      }
    },
  }
});

```

`depends`を用いて条件分を入れることができ
より複雑なバリデーションをかけることができます＾＾
Certbotでhttps化

#　はじめに

以前に「http・https通信」について学習しました。HTTPS通信は、ウェブセキュリティ重要な技術ということで
ポートフォリオのhttps化を実装を行い、まとめてみました。
http・https通信については過去にまとめたものがありますのでご参照下さい。


https://qiita.com/kinoshitaken123/items/38d87366371943fa1aab

# https化の方法

* Certbotを利用
* AWS Certificate Managerを利用

2つの方法で、httpsで接続することは可能。

ただし、方法によって違いがあるのでメリットがあるので自身で選択する必要があります。

| サービス | Amazon Linux 2 | Amazon Linux| 費用　|
| :---: | :---: | :---:| :---:|
| Certbot | ○ | ×　| 無料　|
| Certbot | ○ | ○　| 有料　|

* Certbotを利用する場合、料金は無料ですが、技術的に少し難易度が上がります。
* AWS Certificate Managerを利用する場合は、定中に使用するAWSの「Application Load Balancer （ALB）」で課金が発生します。

>[ALB料金表](https://aws.amazon.com/jp/elasticloadbalancing/pricing/)

# Certbotでhttps接続

Certbotでhttps接続を設定する前に、以下の3つを事前に準備が必要です。

* 1.EC2にhttpsを追加
* 2.nginxのconfファイルを編集
* 3.Railsのconfigファイルを編集

# 1.セキュリティーグループ　インバウンドにHTTPSの追加

<img width="1009" alt="スクリーンショット 2021-09-07 21 06 56" src="https://user-images.githubusercontent.com/82036851/132341889-3f336cf5-e533-43c0-b7d9-2ee6058e17a3.png">


# 2.nginxのconfファイルを編集


* "location /"に、proxy_set_header X-FORWARDED_PROTO https;を追記します。

* server nameの「ドメイン名」の部分に、取得したドメイン名を入力してください。

```
:
:

server {
  server_name  ドメイン名;
  root /home/ec2-user/nginx-puma-deploy/public;

  access_log  /var/log/nginx/access.log  main;
  error_log /var/log/nginx/error.log;

  sendfile            on;
  tcp_nopush          on;
  tcp_nodelay         on; 
  keepalive_timeout   65;
  types_hash_max_size 2048;
  client_max_body_size 100M;
  include             /etc/nginx/mime.types;

  location / {
      proxy_pass http://puma;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_redirect off;
      proxy_connect_timeout 30;
      # https add config 
      proxy_set_header X-FORWARDED_PROTO https;
  }

:
:


```

# 3.Railsのconfigファイルを編集
config/environments/production.rb、config.force_ssl=trueのコメントアウトを外す。
これによって、アプリケーションへのアクセスが強制的にhttps://……へリダイレクトされるようになる。

# Certbotを実装

```
$ cd 
$ sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
$ sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
$ sudo yum-config-manager --enable epel*
$ sudo yum install -y certbot python2-certbot-nginx
$ sudo certbot --nginx
```

以下が表示されたら成功です！
```
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://hoge.com 

:
:
```

```
# nginxを再起動する

```
$ sudo systemctl restart nginx

# 有効期限を自動更新
__CertbotによるHTTPS接続は、有効期限は90日間です。__

「cron」を併用することで、自動更新が可能.

#cronを設定

EC2へ接続、

```
$ sudo crontab -u root -e
```

viエディターに以下のように記述。

```
00 01 01 * * root  certbot renew --force-renew --post-hook "sudo systemctl restart nginx"
```

ちゃんと反映されているか確認。
```
$ sudo crontab -u root -l
00 01 01 * * root  certbot renew --force-renew --post-hook "sudo systemctl restart nginx"
```

この設定で、毎月1日の1時に期限を更新し、nginxを再起動する処理をしています。

最後にcronを再起動。

```
$ sudo systemctl restart crond
```

# 最後に

SSL証明書を使ってSSL通信でデータを暗号化し、セキュリティに強いウェブサイトとして利用できるようになりました。
ウェブセキュリティの第一歩です。引き続き、頑張っていきます。
Office-URI-スキーマ: ブラウザではなくデスクトップアプリを開かせる　

# 何の為に？
URLを踏んだら、既定のDesktopアプリを開かせたい。

- Office には Web と Desktop アプリの二種類がある
- Office-URI-スキーマを使うと既定のプロトコルに登録した Desktop アプリで起動可能
- Office-URI-スキーマで、編集モードや閲覧モード、Templateからの生成なの起動を制御可能

:::note info
インフォメーション
これらのプロトコルをそのまま使えるのは、HTML Mail やアプリなど限られてはいます。
Share/Teams/Yammer では貼り付けても無駄だったり、無視されたりします。
AutomateでTeamsへPostMessage by htmlでもダメでした。
:::

# 基本
> < scheme-name >:< command-name >"|"< command-argument-descriptor > "|"< command-argument >

|scheme-name|概要|
|-|-|
|ms-word|Word|
|ms-powerpoint|Power POint|
|ms-excel|Excel|
|ms-visio|Visio|
|ms-access|Access|
|ms-project|Project|
|ms-publisher|Publisher|
|ms-spd|SharePoint Designer|
|ms-infopath|Infopath|

|command-name|Full Spell|概要|
|-|-|-|
|ofe|Open For Edit|[編集](https://docs.microsoft.com/ja-jp/office/client-developer/office-uri-schemes?redirectedfrom=MSDN#edit-document)|
|ofv|Open For View|[閲覧](https://docs.microsoft.com/ja-jp/office/client-developer/office-uri-schemes?redirectedfrom=MSDN#view-document)|
|nft|New From Template|[テンプレートから生成](https://docs.microsoft.com/ja-jp/office/client-developer/office-uri-schemes?redirectedfrom=MSDN#new-document-from-template)<br/>s オプションで保存先指定可能|

|command-argument-descriptor|概要|
|-|-|
|u|基本これ|
|s|Template 生成時の保存先指定時|

**command-argument** は、URI

# 利用例
```text:Wordで編集
ms-word:ofe|u|https://www.soumu.go.jp/main_content/000488654.docx
```
```text:Excelで閲覧
ms-excel:ofv|u|https://www.soumu.go.jp/main_content/000408218.xlsx
```
```text:PowerPointで編集
ms-powerpoint:ofe|u|https://www.soumu.go.jp/main_content/000388591.pptx
```
```text:WindowsMediaPlayerで再生
DLNA-PLAYSINGLE:ofv|u|https://www.soumu.go.jp/main_content/000487276.mp4
```

# プロトコルごとの既定のアプリの調べ方
1. スタート画面で「既定」と入力
1. 「既定のアプリ」を選択
1. 「プロトコルごとに既定のアプリを選ぶ」を選択
1. 使いたいアプリとプロトコルを調べる 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/d653e522-34f2-00f4-1c9e-0feb93842275.png)

# 補足
SharePoint での起動アプリの設定をしたい場合は、サイト単位とドキュメント単位での起動設定があるので、基本はそちらで。

https://mokudai.jp/knowledge-base/spo-tips/spo_fileopen_to_clientapp/

# 公式情報

https://docs.microsoft.com/ja-jp/office/client-developer/office-uri-schemes?redirectedfrom=MSDN#bk_addresources

https://docs.microsoft.com/en-us/office/client-developer/office-uri-schemes?redirectedfrom=MSDN#bk_addresources
☆herokuでのしょうもない凡ミス、、☆エンコードを直しても直しても変わらない

##状態
①herokuへDBをプッシュできなかった。
②原因がわかっていて、エンコードのバイト数が基準を超えてしまっている。
③エンコードのバイト数を増やす記述を増やす記述を追記する
④なぜか変わらない、、
⑤どうやらherokuでプッシュするときは、ローカルでもプッシュしないといけないという凡ミス、、


```php:ターミナル
$ heroku run php artisan migrate
```

###②原因がわかっていて、エンコードのバイト数が基準を超えてしまっている

```php:ターミナル
  SQLSTATE[42000]: Syntax error or access violation: 1071 
Specified key was too long; max key length is 767 bytes
```


###③エンコードのバイト数を増やす記述を増やす記述を追記する

```
記述①
php:/app/Providers/AppServiceProvider.php
...
記述②
use Illuminate\Support\Facades\Schema;
...
public function boot()
{
	Schema::defaultStringLength(191);
}
...

```

結論から言えば、③の処理をすれば全く問題ないのであるしかし、、私は凡ミスをしていた、、

```php:ターミナル
git push origin master
```

...こんなことでした。どうやら私はherokuはリモートのmasterブランチが反映されることを全く知らなかった。

＊herokuにpushする前にはローカルから！
9.7振り返り

<h4>js呼び出す時にcreateでredirect_to入れて呼び出せなくなった</h4>

```ruby:
 def new
    @calender = Calender.new
  end

  def create
    @calender = Calender.new(calender_params)
    @calender.patient_id = current_patient.id
    @calender.save

    #jsの時は↓入れると読み込まれなくなる
    # if @calender.save
    #   redirect_to patient_calenders_path
    # else
    #   render :index
    # end
  end

```

<h4>$('ここの指定が違う')</h4>

```js:apprication.js
$(function () {

     ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ここに違うもの入れてエラーになって表示できない
  $('#calendar_test').fullCalendar({
    selectable: true,
    header: {
      left: 'prev,next today',
      center: 'title',
      right: 'month,agendaWeek,agendaDay'
    },
```
<h2>ブラウザでconsoleを使ってエラーを確認する　<h2>

<h2>console log "run"を走らせてどこまで動くか確認　<h2>


<h2>引数の指定が違ってエラー　　　　　　　　　　　　　　　　　undefined local variable or method `patient</h2>

<p>パスを確認する</p>
<p>/staff/patients/:patient_id/records/new(.:format)</p>
<p>から　:patient_idが必要であることがわかるので指定する</p>
<p>@patient = Patient.find(params[:patient_id])</p>

```ruby:staff/records#new
new_staff_patient_record_path	GET	/staff/patients/:patient_id/records/new(.:format)	
staff/records#new
```
```ruby:
 class Staff::RecordsController < ApplicationController
  def new
    @record = Record.new
    #@patient = Patient.find(params[:id])では情報がとれないというエラー
    #routesでpathを確認　　records#new　の　/staff/patients/:patient_id/records/new(.:format)
    #引数を次のように直す
    @patient = Patient.find(params[:patient_id])
  end
```
<p>routesのパスが</p>
<p>/staff/ostomies/:ostomy_id/comments(.:format)　なら</p>
<p>:ostomy_id　　が必要になる</p>
<p>　　　</p>
<p>/staff/ostomies/:id　なら</p>
<p>:id　が必要になる</p>
<p></p>
API30対応でcookie認証が通らなくなった



## 背景
2021年11月以降、AndroidアプリのAPIレベルを30以上に対応させる必要があります。
漏れなく対応に追われていたのですが、APIレベル29から30に上げたとたん、アプリの認証処理が失敗するようになったのでその調査の備忘録です。

## 調査
認証系なのでcookie周りが怪しい…。
取り敢えずAndroid developerの変更内容を読んでいたのですが、cookie周りの取り回しが変更されたとかは見つかりませんでした。
[Android 10（API レベル 29）から Android 11（API レベル 30）に移行する](https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=ja#pre11)

仕方なしにアプリの実装を追いかけて、API29とAPI30で何が違うのか追っかけてみたところ
CookieManagerのsetCookieにてsecure属性が付与された項目がAPI30ではrequestに乗っかっていませんでした。

なじぇ…と思いながら[ドキュメント](https://developer.android.com/reference/android/webkit/CookieManager#setCookie(java.lang.String,%20java.lang.String))を見に行くと、何か気になることが書いてありました。

> Note: if specifying a value containing the "Secure" attribute, url must use the "https://" scheme.

これじゃん。
Cookieを設定するURLの先頭に"https://"を設定するようにすることで無事requestにsecure属性の値が設定されるようになりました。

## 結論
API30に上げると、cookieにsecure属性の項目値が設定されなくなった。
CookieManagerのsetCookieにてsecure属性が設定される項目が、"https://"をつけることで対応できた。

というかなぜAPI29までは動いていて、何でAPI30からいきなり動かなくなったのでしょうか・・・。
過去どこかで宣言されていたのかな。現在調査中です。

もし原因や経緯をご存じの方がいれば教えて頂けますと喜びます。

本記事が同じような現象で困っている方の参考になれば幸いです。

## 2021年9月8日追記
下記ブログ内で、以下のような説明が引用されていた。

[SameSite属性どころか、HTTP自体がダメになってた件（Cookie）](http://www.osscons.jp/jov9t04kz-537/)
> Chrome 80が密かに呼び寄せる地獄
～ SameSite属性のデフォルト変更を調べてみた - Qiita
https://qiita.com/ahera/items/0c8276da6b0bed2b580c#none
> 「【追記】なおChrome 80以降でSecure属性を付けずSameSite=Noneを指定した場合、set-cookie自体が無効になります。」

あとこっちか。
[Chrome Platform Status](Feature: Reject insecure SameSite=None cookies)
> Deprecate and remove the use of cookies with the SameSite=None attribute but without the Secure attribute. Any cookie that requests SameSite=None but is not marked Secure will be rejected.

この辺の現象に近いような気がします。
が、API29→API30に変えただけで、「SameSite=None」が指定されるようになるのか？とかは相変わらず不明です。

Android12の[API31についての変更点のドキュメント](https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#samesite)だとSameSiteについてちょっと触れられているけど…。

引き続き調査中。
[CS] 進数ってなんぞ

##はじめに
基本情報技術者の勉強を始めました。
いきなり進数っていうのにつまづいています。

なんとか理解できたので記事にしたいと思います。

##進数

> 「N 進法」（エヌしんほう）とも呼ぶ。あらかじめ定められたN 種類の記号（数字）を列べることによって数を表す方法。N 進法で表記された数という意味で「N 進数」（エヌしんすう）と呼ぶことがある。
引用: https://ja.wikipedia.org/wiki/%E9%80%B2%E6%95%B0

とのことでn進数とかいうんですね。nには数字が入って、n種類の記号で数字を表現するということです。
我々が普段使っている数字は０〜９まで数えたら次は桁が繰り上がって10となります。
この表現の仕方を10進数とか10進法と言います。

```0, 1, 2, 3, 4, 5, 6, 7, 8, 9```
上記の10種類の記号を使って表しているから10進数。

じゃあ、8進数で表すと

```0, 1, 2, 3, 4, 5, 6, 7```
上記の8種類の記号で数を表現します。
７まで数字を数えたら次は10になって10~17まで数えたら次は20となるわけです。

そしてコンピュータは2進数でデータの処理を行っています。
つまり```0, 1```だけで表現しています。
「２進数で0から順番に数えてください」と言われたら

```0, 1, 10, 11, 100, 101, 110, 111, 1000 ...```
となります。

2進数で物事を考えるコンピュータは8進数や16進数との相性がいいと言います。
２進数で7までの数字を表現しようとすると0~111と三桁まで使いますが、8進数は一桁で2進数でいう111までを表現できます。

16進数も同様で0~15までを２進数で表現すると0~1111の四桁いっぱいを使いますが、16進数だと一桁で表現できます。

8進数と16進数は２進数でいうちょうど3桁いっぱい表現してくれる、ちょうど4桁いっぱいを表現してくれるという理由で相性がいいのです。

ちょまて16進数！？
てなりません？？私もなりました。

##16進数
我々は普段10進数で数字を表現しているので9の次は桁が繰り上がり、その10を一桁で表現する方法を知りません。

結論を言うと、16進数では9の次はAです。アルファベットで表現していきます。
```0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F```
この16種類で一桁を表現します。

Fまで数えて次が10です。
1Fまで数えて20です。
あまりなじみないので変な感じですが、これが16進数。

##基数変換（n進数でいう○○）
n進数のnの部分を基数と言います。10進数なら10が基数です。

私たちはいろんな基数での数字の表現の仕方を学んだので、ここからは「n進数でいう○○」と言う考え方が非常に重要です。

例えば16進数のFは10進数でいう15だよね。と言う変換ですね。

2進数の1000は10進数の8だよね。。。みたいな感じです。

これを基数変換と言います。
数えられるくらいのものであれば頭の中や紙に書き出すことで導き出せると思いますが、もっと大きな数字で、小数点も入ってきたらもうわからんですよね。。。

計算によって基数変換のやり方があるので、その計算方法を次回記事でまとめてみたいと思います。（まだちゃんと理解できていない）


参考: キタミ式イラストIT塾基本情報技術者
Gtk3アプリ イベントハンドラー自動生成ツール　改良

###Gtk3アプリ イベントハンドラー自動生成ツール　改良

https://qiita.com/iota_11/items/b3dfcc589829d470e32d

[Release](https://github.com/iotagtk1/gladeGenerator/releases)

####改良点１ シグナル GtkWidgetやGtkContainerに対応
GtkWidgetやGtkContainerや未対応だった箇所もイベントハンドラーを生成できるようにしました。

<img width="600" alt="Screenshot from 2021-09-07 20-21-46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/653f4132-3db0-2b94-bf17-8d5850df11dc.png">


####改良点2 
Riderのエクスプローラーの選択したgladeだけ書き出すようにしました。
フォルダを選択した場合その下にあるすべてのgaldeファイルを書き出します。
<img width="200" alt="Screenshot from 2021-09-07 20-26-32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/20783fff-bf33-90d1-3280-693f8d9f0995.png">

####改良点3 Gladeアプリに備わっているインテリセンス機能を優先する
GladeアプリにはOnを入力すると自動的にメソッド名が自動生成があります。そちらを優先することにしました。
本アプリにもあった自動でメソッド名を生成する機能を廃止しました。
<img width="300" alt="Screenshot from 2021-09-07 20-30-08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/a4333334-f00e-62e2-6a0b-64b7c27aa96a.png">


####使用方法のおさらい

#####gtkSharpのテンプレートをインストールする
https://github.com/GtkSharp/GtkSharp

#####Gladeをインストールする
https://glade.gnome.org/

#####RiderやVScodeにツールを登録する　コマンドも登録します。

#####引数を登録する
```
引数はReadMeを参照ください
```

#####新規プロジェクトを開く

#####GladeファイルにGUIパーツを追加する

#####Buttonを追加した場合

#####IDをWindowとコントロールに記入する。メソッド名を記入する On_を押すとインテリセンスがきく

#####ターミナルもしくはRiderの外部ツールから実行する

#####イベント文が自動生成されたファイルが生成される

[Gtk3アプリ イベントハンドラー自動生成ツール GUI版](https://qiita.com/iota_11/items/4e4d77e91ca3e2223cfe)

[Gtk3アプリのTreeViewの表示の簡略化 Part3](https://qiita.com/iota_11/items/cf5ac9c11969ad8b8307)に続く
末尾の文字列を3回出力するプログラムの作成

Ruby問題集から。
sliceメソッドを使って作成するのですが、今回ピックアップしたいのは模範解答にあるlengthメソッドについての所感というか愚痴というか私の知識不足の露呈というかをつらつら書いていきます。
まずは構成から。

問題
以下の要件を満たすextra_endメソッドを実装しましょう。

・対象の文字列から末尾にある2文字を取得すること
・取得した2文字を3回繰り返して出力すること

【ヒント】


```ruby:qiita.rb
# 配列を作成します
array = [0,1,2,3,4,5,6]

# 配列から引数で指定した要素を取得します
ele1 = array.slice(1)
puts ele1
#=> 1

# 配列番号-4から4つ分の要素をsliceします
ele2 = array.slice(-4,4)
puts ele2
#=> 3, 4, 5, 6

# 配列はもとのままです
puts array 
#=> [0,1,2,3,4,5,6]

```

この段階で末尾の文字列 = ヒントに記載されている3つ目の'配列番号-4から〜'あたりを使用するのかなと。
ここで模範解答と私の回答を並べてみます。


```ruby:qiita.rb
〜模範解答〜
def extra_end(str)
  char_num = str.length
  right2 = str.slice(char_num - 2, 2)
  puts right2 * 3
end

〜私の回答〜
def extra_end(str)
  num = str.slice(- 2, 2)
  puts num * 3
end
```
メソッドの実行結果は同じなんですよ。（私の記述の方が可読性た...)
ここで模範解答の解説文を見ると、、、


```
extra_end('Hello')でメソッドを呼び出した場合の解説をします。

まず、1行目のextra_endメソッドの仮引数strには対象の文字列’Hello’が格納されます。
そして、2行目ではstrに対してsliceメソッドを使用し、指定した要素を取り出しています。

sliceメソッドの1つ目の引数では、文字列（Hello）の後ろから2番目の要素を基準点としています。
そして、2つ目の引数により、基準点から2つ分の要素を取り出しています。
今回の場合、「H,e,l,l,o」の後ろから2番目の要素は「l」です。そして、基準点「l」から2つ分の要素である「lo」が取り出されるので、end_str = loとなります。

最後に、2 * 3と記述することによって、「lololo」と出力されます。
```
、、、lengthメソッドいります？
そもそも記述方法は多様にあることを理解した上で、lengthメソッドいります？

今回の問題文では「末尾の文字列を3回」と記述があり、【ヒント】にはsliceメソッドにて配列番号後ろから指定する記述もあり、解説文では「sliceメソッドの1つ目の引数では、文字列（Hello）の"後ろから2番目の要素を基準点"としています。」と書かれております。
lengthメソッド定義してわざわざ代入して（char_num -2, 2)ってhelloの場合（3, 2)ってなるわけでこれ前から3番目ですやん！！！
5文字中の前から3番目も後ろから2番目も同じだけども！！！
今回に限り私のコードの方が可読性た、、、っ！！！

はい。というわけで実行結果は同じでも、sliceメソッドでは文字列に対するアプローチがコードによって前からなのか後ろからなのか変わる会でした。（）

以上
【InterSystems】IRIS/Caché/Ensembleのドキュメントまとめ

業務で使用しているのですが、情報が少ないためよく参照するリンクや資料などをまとめてみました。
これからInterSystems社の製品に携わる方の一助になれば幸いです。

- [InterSystems公式ホームページ](https://www.intersystems.com/jp/)

- [IRIS/Caché/Ensembleのドキュメント](https://www.intersystems.com/jp/support-learning/support/document/)

- [Developers Community](https://jp.community.intersystems.com/)

- [InterSystems FAQ](https://faq.intersystems.co.jp/csp/faq/FAQ.FAQTopicSearch2.cls)

- [InterSystemsJapan（YouTubeチャンネル）](https://www.youtube.com/channel/UCuXkYvJF6a0kS8oBqQbvDNw)

- [InterSystems 開発者コミュニティ（YouTubeチャンネル）](https://www.youtube.com/channel/UC-fNl739w4X0K6_vkcE76GQ)

- [InterSystems IRISData Platform開発者ガイド（GitHubから閲覧）](https://github.com/wolfman0719/irisdg/blob/master/IRISDeveloperGuide.pdf)

- [IRIS実践プログラミングガイド（GitHubから閲覧）](https://github.com/wolfman0719/PG/blob/master/IRISRapidProgramingGuide.pdf)

- [Open Exchange（IRISサンプル、フリーアプリ公開サイト）](https://openexchange.intersystems.com/)

- [InterSystems IRIS トラブル対応ガイド～情報収集編～](https://www.intersystems.com/jp/wp-content/uploads/sites/6/2019/03/InterSystemsIRIS_troubleguide.pdf)

- [インターシステムズ・サポートセンター](https://www.intersystems.com/jp/support-learning/support/immediate-help/)
VRchatで動画プレイヤーを扱う( + Quest環境でも動画を再生する)

#1 この記事は

VRchatで自作ワールドを作るときに動画プレイヤーの設置方法とQuestでも動画が再生できるようにする方法を説明します。


#2 やり方は？

###2-1 前提条件
・Unity2919.4.29f1が導入されているものとします。
・最新の[VRChat SDK3](https://vrchat.com/home/download)と[Udon Sharp](https://github.com/MerlinVR/UdonSharp/releases/download/v0.20.2/UdonSharp_v0.20.2.unitypackage)が導入されているものとします。


###2-2 アセットの入手
まずはboothから動画プライヤーのアセットを取得します。

https://booth.pm/ja/items/2758684

ダウンロードが完了したデータを展開させると「VideoPlayerForVRChat_1.1.2.unitypackage」が格納されているので、Unityのメニューバーより Assets -> Import Package -> Custome package から「VideoPlayerForVRChat_1.1.2.unitypackage」を取り込みます。



###2-3 動画プレイヤー設定方法

Assets -> Kinel -> Prefab内に配置されている「KinelVideoPlayer.prefab」と「KinelPlaylist_tab」を描写エリアにドラッグします。

![222.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/a6f17cdd-d27c-244a-8b5c-d2d75b6d064a.jpeg)

KinelVideoPlayer(動画プレイヤー本体)とKinelPlaylist_tab(Playlist)のオブジェクトが埋め込まれます。
![223.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/eafbef9c-2014-0f24-4ad3-3a903a20534a.jpeg)



🔶KinelVideoPlayerの設定方法 / Assetに同封されているドキュメントを引用
![228.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/7ce6fab9-6d9f-3994-6a96-0bd424ce8aef.jpeg)



🔶KinelPlaylist_tabの設定方法(その1) Assetに同封されているドキュメントを引用
![224.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/ef3e7ddb-ef22-de8d-ac86-74321f6757db.jpeg)

🔶KinelPlaylist_tabの設定方法(その2) Assetに同封されているドキュメントを引用
![225.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/d836a956-6445-3fb6-67c8-64f6fc5afabb.jpeg)

🔶KinelPlaylist_tabの設定方法(その3) Assetに同封されているドキュメントを引用
![226.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/d3f1a555-3ee8-e6e3-de23-d1a7ac29f059.jpeg)

🔶KinelPlaylist_tabの設定方法(その4) Assetに同封されているドキュメントを引用
![227.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/30d04968-56ea-959d-83bb-0aef1dc7f8bc.jpeg)

###2-4 Questで動画を再生させるには

Youtubeの動画をQuest環境で再生させることができます。


"https://t-ne.x0.to/?url=(Youtubeの動画URL)　の形式でKinelPlaylist_tabにURLを入力してください。"

(例) YoutubeのURL                  https://youtu.be/gCSRMdA-qCI
KinelPlaylist_tabに入力するURL     https://t-ne.x0.to/?url=https://youtu.be/gCSRMdA-qCI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/ec9d7ae2-80ec-f27a-f4c1-1c3fe0456793.png)

詳細は下記のサイトをご参照ください。
https://t-ne.x0.to/
【Solidity】Address → bytes系,uint系 型変換


# 検証環境
- Solidity v0.8.4


# bytes系

```solidity
address addr = 0x1234...;

// bytes20
bytes20(addr);

// bytes8, bytes16, bytes32, etc
bytes8(bytes20(addr));

// bytes
abi.encodePacked(addr);
```

# uint系

```solidity
address addr = 0x1234...;

// uint160
uint160(addr);

// uint8, uint32, uint256, etc
uint8(uint160(address(this)));
```
railsのbutton_toメソットにfont Awesomeを適用する方法

#はじめに
railsでポートフォリオを作っていて、計画していた機能要件が一通り終わったので、少しデザインを整えてみようということになりました。
手始めにイイねボタンを整えようと思い、Font Awesomeを使うことにしました。
Font AwesomeはCSSでウェブアイコンを簡単に導入できるツールです。

##Font Awesomeをhtmlファイルで使う方法
Font Awesomeを使う下準備です。

```html
<head>
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.9.0/css/all.css">
</head>
```
headタグにこのように記述します。
hamlファイルで使うときは手順が異なるようなので、こちらの方の記事をご参照ください。

https://qiita.com/koki_73/items/fa6d31a3b54a84d19dcf

##button_toメソッドに適用する
まず、Font Awesomeのホームページに行き、使いたいアイコンを探し、コードをコピーします。

https://fontawesome.com/

そして、このように記述します。

```erb
<%= button_to article_likes_path(@article),class: "btn btn-primary", method: :post do %>
  <i class="far fa-heart"></i>イイね
<% end %> 
```

すると、こんな感じに少しは見た目が整ったイイねボタンが出来上がります。（bootstrapを導入しているので、```class="btn btn-primary"```で青くなっています"）
![イイねボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923880/5f457019-ede0-78bf-c848-662b1cf53925.png)

抽象化するとこんな感じです。

```erb
<%= button_to URL, クラス, HTTPメソッドの指定 do %>
  <i class="使いたいアイコンのコード"></i>ボタンに表示する文字 #なくてもよい
<% end %> 
```

・button_toの後ろに、ボタンに入れたい文字を記入する
・button_toとURLの間にカンマを入れる
などするとエラーになってしまうので気を付けてください。


##おわりに
button_toに適用する新しめの記事がヒットしなかったので、アウトプットとして書いてみました。
Font Awesomeは無料でも洗練されたデザインのアイコンがたくさんあるので、積極的に使っていこうと思います！
Reactの表示される仕組みについて〜DOMとは?〜

#DOM?
ブラウザがJavascriptを実行してDOMを作る。
正確にはDocument Object Model。
１つ１つのタグをJavascriptのオブジェクト(`{プロパティ:値}`のやつ）として表す。(Document.〇〇とかで使われるやつ…。)Documentオブジェクト＝DOMの認識
オブジェクトの値を変えるとタグの表示が変更される。
DOMで用意されるオブジェクトにはエレメントとノードがある。

##エレメント
エレメントオブジェクトはHTMLのタグを扱う。エレメントを操作することでタグの表示をJSから操作できる。
##ノード
ノードは、一番小さい単位、エレメントもノードの一種。改行や、タグの前の半角スペースもノードになる。

#Reactの表示を読み込む仕組み
###①querySelectorメソッドを使ってオブジェクトを取得する
idが`root`の要素を取得

```js
let dom = document.querySelector('#root')
```

###②仮想エレメントの作成

仮想DOMのElementオブジェクト。
React.createElementはReactの仮想DOMによるElementを作成するもの。

```js
React.createElement(タグ名,属性,中に組み込まれるもの)
```
引数について、
第一引数：pタグを作るときはp
第二引数：エレメントに用意される属性のオブジェクトを記入。特に必要なければ空のオブジェクトで{}と入れる。
第三引数：作成するエレメントの内部に組み込まれるもの。テキストを表示する場合はそのテキストを指定する。

```js
let element = React.createElement(
      'p',{},'Hello React!'
)
```
###③レンダリングの実行
作成した仮想DOMのエレメントはブラウザがレンダリング（実際に画面に表示されるデータを生成する）を行って画面に表示される。

```js
ReactDOM.render(エレメント,dom)
```

#まとめると
* 場所を指定して
* React.createElementでまっさらな仮想DOMに材料であるエレメントを作る（準備させる）
* ReactDOM.renderで仮想DOMから実際に表示させるDOMを作って表示できるようにする
でも、この流れは大変なので、**JSX**というHTMLのタグをスクリプトに直接記述する便利なものがあります。
Laravel Authでユーザー登録後の遷移先を分岐する。

# View

inputタグをhiddenをかける。

```register_blade.php
<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data">
:
<input id="name" type="hidden" name="company_register" value=1 > # 見えない要素にしておく。
:
</form>
```

# Controller

redirectPath()メソッドを用いて、ルーティングに分岐をかける。

```RegisterController.php
    // protected $redirectTo = '/';

    public function redirectPath()
    {

        if($_POST["company_register"] == 1){
            return '/company/new';
        }
            return '/';
    }
```


####　ログイン後の遷移も同じ要領で行う。
C#におけるインターフェースと拡張メソッドを用いたバリエーション定義のガイドライン

## はじめに

C#のインターフェイスで様々なバリエーションを定義したい場合に拡張メソッドを用いてバリエーションの定義をすると利点が多いため、そのガイドラインを記します。

- [インターフェースと拡張メソッドを用いたバリエーション](#インターフェースと拡張メソッドを用いたバリエーション)
  - [公式の拡張メソッドのガイドライン](#公式の拡張メソッドのガイドライン)
  - [Loggerでの例](#loggerでの例)
  - [Configurationでの例](#Configurationでの例)

## インターフェースと拡張メソッドを用いたバリエーション
-  インターフェースには、プリミティブなメソッドのみを定義し、そのバリエーションは拡張メソッドとして定義すると良い。
- 利点
    - インターフェース実装者は最低限のインターフェースのみ実装すれば良い。
    - 単体テストでもバリエーション部分のメソッドのモック実装が不要となる。
    - さらにメソッドを増やす場合も、インターフェースが変わらないのでインターフェース実装をしている他ユーザへの影響がない。
    - フレームワーク、ライブラリ提供側は、インターフェースはプリミティブ化して、バリエーションを拡張メソッド化するアプローチを取ると良い。

### 公式の拡張メソッドのガイドライン

https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/extension-methods

上記はマイクロソフトの拡張メソッドのガイドラインです。
どのような場合に拡張メソッドを利用すべきかが記されています。以下に例を記します。

>拡張メソッドをむやみに定義することは避けてください。これは自分が所有していない型に対して特に当てはまります。
型のソース コードを所有している場合は、代わりに通常のインスタンス メソッドを使用することを検討してください。 所有していないときにメソッドを追加する場合は、細心の注意を払ってください。 拡張メソッドを自由に使用すると、それらのメソッドを使用するように設計されていなかった種類の API が乱雑になる可能性があります。

### Loggerでの例

Microsof.Extensions.Loggingで同様のアプローチを取っています。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.logging.ilogger?view=dotnet-plat-ext-5.0#extension-methods

```cs
// インターフェイスでプリミティブなログのメソッドを定義する
public interface ILogger
{
    void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter);
    bool IsEnabled(LogLevel logLevel);
    IDisposable BeginScope<TState>(TState state);
}

// ログのバリエーションを拡張メソッドで定義する
public static class LoggerExtensions
{
    public static void LogDebug(this ILogger logger, EventId eventId, Exception? exception, string? message, params object?[] args)
    {
        logger.Log(LogLevel.Debug, eventId, exception, message, args);
    }
    
    ...

    public static void LogError(this ILogger logger, EventId eventId, Exception? exception, string? message, params object?[] args)
    {
        logger.Log(LogLevel.Error, eventId, exception, message, args);
    }

    ...
}
```

### Configurationでの例

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.configuration.iconfiguration?view=dotnet-plat-ext-5.0#extension-methods

```cs
// インターフェイスでプリミティブなConfigurationのメソッドを定義する
public interface IConfiguration
{
    IConfigurationSection GetSection(string key);
    IEnumerable<IConfigurationSection> GetChildren();
    IChangeToken GetReloadToken();
}

// Configurationのバリエーションを拡張メソッドで定義する
public static class ConfigurationExtensions
{
    public static bool Exists(this IConfigurationSection section)
    {
        if (section == null)
        {
            return false;
        }
        return section.Value != null || section.GetChildren().Any();
    }
    public static string GetConnectionString(this IConfiguration configuration, string name)
    {
        return configuration?.GetSection("ConnectionStrings")?[name];
    }

    ...

}
```
Conoha VPS on Factorio UPDATE

アップデートのやり方

1.
WinSCPでサーバーに入り、 
/opt/factorio/savedata
にあるセーブデータをローカルへダウンロード

2.
ConohaのWebコントロールパネルで
再構築→factorioを選択して再構築

3.
サーバーが稼働されたらセーブデータをWinSCPでアップロード。
コンソールに入り、以下のコマンドでfactorio自体を再起動

ps aux | grep factorio | grep -v grep | awk '{ print "kill -9", $2 }' | sh
デザインがわからないWebデザイナーによる、Webデザイナー1年目を乗り切るための心構え

#はじめに
2020年春、大学卒業と同時にWebデザイナーとして就職した。現在社会人2年目、兼Webデザイナー歴2年目。未だにデザインがわからない。
2年目でこれなのだ。1年目ではデザインのなんたるかがわからなくて当然だと思う。

そもそも、デザインには正解がない。あるのかもしれないが、少なくとも筆者はそう思う。
もちろん最適解はある。たくさんの人に受け入れてもらうことを目的としたデザイン作業なら、より多くの人から理解を得られるデザインを模索するべきだ。けれど、自分以外の人間が成果物の出来を評価する以上、正確なことはわからない。わからないから、デザイン作業中の筆者はいつでも迷子だ。なんやらかんやらこねくり回して、どうにか手探りで進むうちに、気づけばデザイナー歴は2年目に突入していた。

こんな筆者でも、世間的には(一応)プロのデザイナーに分類される。
プロである以上、自分が生んだものには責任を持たなければいけない。それはデザイナー歴が何年だろうがデザインのことがわからなかろうが、絶対に避けては通れないことだ。
幸いなことに、デザインのなんたるかがわからない1年目でも、できることはいくつかあった。
さらに幸いなことに、それができていたら、Webデザイナー歴1年目のうちはなんとか合格を貰えたのだ。
Webデザイナー歴2年目では不十分かもしれないが、1年目のうちは合格がもらえるかもしれない。
そんなちょっとした心構えをいくつかまとめておくので、これをもってWebデザイナー歴1年目の方へのエールとさせていただきたい。

#Webデザイナー1年目から使える3つの心構え
### 自分の作品を人に説明できるようにする
導入でも書いたように、デザイナーは自分が生んだものには責任を持たなければいけない。
言い換えると、自分の作品を説明できるようにしておく必要がある、ということだ。

仕事で作成したデザインは、誰かに見せる前提のものが多い。
誰かに見せる以上は、作品に触れた人に対してなにかしらの意図やイメージを伝えなければならない。
そのためには、デザイナー自身がデザインの意図を意識し、明確にする必要がある。

* なぜその配色にしたのか
* なぜその配置にしたのか
* なぜそのフォントを使っているのか
* なぜそのモチーフにしたのか

自分がそうデザインしたのだから、そこには理由があるはずだ。
また、説明には客観的な事実を交えるとより伝わりやすくなる。例えば、

* メリハリのある印象にしたかったので、補色を使った配色にしました
* 空きスペースと文字のバランスを6:4に統一しているため、この配置にしました

など。
ちなみに、筆者は色彩検定の勉強をする前は配色に苦手意識があった。色に関する知識がなく、自分の感覚以外に色を選ぶ指標がなかったからだ。
客観的な事実を理解していると、デザインの説明に説得力が増す。資格取得や勉強は、その点でとても有用だ。機会があれば是非挑戦してみてほしい。

### 修正指示の意図を考える
仕事でデザインしている場合、デザインした作品をそのまま公開することはほとんどない。
たいていはデザインが出来上がった段階で自分の上司や会社・依頼者にチェックしてもらう。そこで返された修正指示やコメントを反映し、再度チェックしてもらって……というふうにデザインをブラッシュアップしていく。上司や会社・依頼者からOKが出てようやく、デザインは公開される。

このように、デザイン業務と修正指示は切っても切れない関係にある。
修正指示の出し方は人によって異なる。
「このオブジェクトを10px左に移動させてください」
というふうに具体的に言葉で説明する人もいれば、
「画面の締まりがよくないのでもう少しパキッとさせてください」
というふうにデザインの印象で指示する人、
デザイン画に書き込んで
「こうしてほしい」
と言う人など、実に様々だ。

ただし、これらの修正指示は言葉通りに対応すればOKというわけではない。
そう指示が出されたのならそれなりの意図があるはずなので、まずはその意図について考えなければいけない。

例えば、上で例に挙げた
「このオブジェクトを10px左に移動させてください」
という指示を受けたとする。
その指示を受けたということは、画面に対してオブジェクトの配置の位置がズレていた、他のオブジェクトとの距離が近すぎた、などの理由が考えられる。
では、修正指示通りに作業したとして、オブジェクトの配置がイマイチ改善されていなかったらどうだろうか。
そのまま再度チェックに回せば、恐らくまた「もう10px移動させてください」と指示され、また対応し……の繰り返しになるだろう。
このようなとき、筆者はよく、指示通りに対応したものを1点と、筆者なりに修正指示の意図を汲んで対応したものを1点用意する。再度チェックに回すときに「指示通りに対応したのですが、○○という印象を受けたため、他の箇所を××して調整してみました」というふうに説明も添えるとなお良い。

言葉通りに修正対応するだけでなく、その修正指示の意図まで考えて対応する。そうすることで作業の手戻りが少なくなるかもしれないし、それをきっかけに指示を出す側との意思疎通が図りやすくなるかもしれない。なにより、デザインの意図を説明する力が成長する。ぜひ積極的にやってみてほしい。

### インプットを怠らない
デザイン業務は、自分の中にある知識や経験を再構築しアウトプットする作業だ。言い換えれば、インプットを怠った時点で新しいものを生みだせなくなってしまうということでもある。
これに関しては筆者自身も十分にできているとは到底言えない。身の回りにあるものを流して見てしまうことや、既に知っているものばかりを見てしまうこともある。そんな自戒を込めて、3つ目の心構えとして「インプットを怠らない」を挙げさせてもらう。
これからデザイナーとして活躍していく方たちには、世の中のあらゆるものを見聞きし、知り、体験してほしい。
それらすべてが今後のあなた自身を支えてくれるだろう。

# おわりに
なにか伝えられることはないかと思いつらつらと書いてみたものの、具体的なデザインのアドバイスというよりかは、個人個人が心構えを持つべき、というような内容になってしまった。
決して真新しい内容ではないため、当然のようにやっている方もたくさんいるかもしれない。そんな方は胸を張って、堂々と活躍してほしい。
これを意識したからと言ってあらゆる問題が避けられるなんてことは決してない。それでも、Webデザイナー1年目の誰かの励みに少しでもなってくれたなら嬉しく思う。