OmniAICreator/Qiita-1.07M huggingface dataset:
Macで画面の一部分を画面収録しよう！

#はじめに
画面収録をする際に一部分だけを画面収録したいときがあると思います。例えばシュミレーターだけを写したい、見られたくない箇所があるなどですね。
そんなときMac初心者で上手く使いこなせない、、となっていませんか？
そこで簡単にわかりやすく紹介したいと思います。

#方法
#####①画面録画は__Shift__ + __command__ + __5__で行う。
Appleサポートにも載っていました！！
![スクリーンショット 2021-12-16 23.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/d542521c-6859-adc8-e76c-9d0dc910edf9.png)




####②出てきたバーの右から三番目（点線のマーク）を選択し、画面収録する範囲を決める。
![スクリーンショット 2021-12-16 23.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/64522327-119f-de4f-bb3e-f88cec07b5c0.png)

####③選択した状態で収録ボタンを押す。(収録開始！)
![スクリーンショット 2021-12-16 23.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/f46e89a1-bf13-9a5e-d39f-a8d187a823b9.png)



####④再び __Shift__ + __command__ + __5__を押すと、停止ボタンが現れる。(保存完了)
![スクリーンショット 2021-12-16 23.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398435/750a92bd-cb96-d462-ce0a-59f9539b7144.png)

#参考にした記事

 [https://support.apple.com/ja-jp/HT208721](http://qiita.com "Qiita Home")
オフライン勉強会開催後の振り返り

#はじめに
こんにちは、Mozuです！
まめコーヒーもくもく会の司会を担当しております。
先日、コミュニティの1周年記念としてオフライン勉強会を開催しました。
この記事では、
大阪・東京・オンラインでの同時開催となった本イベントを振り返り
学びになったことを共有したいと思います。

#オフラインイベントを開催してみて
これまではオンラインのみで開催してきた
まめコーヒーもくもく会ですが、
オンライン勉強会の良さは、会話の時間を長く取れることで
勉強仲間と関係性をしっかり築けるところに
あるのではと思いました。
黙々と勉強に集中できるオンラインでの勉強会もよいですが、
たまには息抜きにオフラインで交流するのもよいかもしれません。
（ただし黙々と勉強するのには向いていないかもしれません。。）

#事前準備編
##Twitterでの呼びかけも大事
大阪会場はラスト1週間で人が集まったそうです。笑
本当は行きたいけれどなかなか踏み出せない人もいるので、
積極的に声をかけてみるのもいいのではないでしょうか。
個人で呼びかければ来てくれる人もいます。
あとは、なかなか人と接する機会が少ない昨今の情勢だと、
実際に会えるだけで嬉しいというのはあると思います。

##準備の役割担当も決める
割り振りを決めずに当日を迎えると、
一人の人に作業量を偏らせてしまうことになる可能性もあります。。
事前に担当する作業を割り振っておき、
特定の人にしかできない作業を除いたほかの作業を
残りの人で取り組んだらよかったなと思います。

#当日編
##早めに集まったほうがいい
初めての場合は特に！
もちろんなれるとすぐに準備できるようになるかもしれませんが、
開始2時間くらい集まっておくと安心です。。

##お金の徴収はいつがいいか論争
###着いてすぐの場合
+ メリット
 + もらい忘れる確率は少ないかも。
+ デメリット
 + 開催者と参加者の立場がはっきりしてしまうので、フラットな関係を気づきたい場合はお勧めできないかもしれません。
 
###途中もしくは最後の場合
+ メリット
 + 開催者が慣れていると、スムーズに回収できる。
+ デメリット
 + タイミングを逃すと集めるタイミングを逃す。

#まとめ
今回オフライン勉強会を初めて開催してみましたが、
準備から含め、主催者はとても大変なんだなぁと
思ったと同時に、
普段得ることのできないことを多く経験させていただきました。

あらためまして、まめコーヒーもくもく会初のオフライン勉強会にお越しいただいた皆様、
一緒に頑張ってくださった運営の皆様、
お会いできてとってもうれしかったです！
ありがとうございました！
Dynamics 365 Finance and Operations ~ 外部MESとの統合 ~

おはこんばんちは。
ひとつ前の投稿で、MES みたいな Production floor execution を紹介しましたが、やはり MES というのは複雑な I/F やきめ細かな機能が必要で ERP 1つで実現するのは難しいのが現実のようです。
参考: https://it-trend.jp/production_management/article/the-difference_between_mes_and_seisankanri-system

そこで2021年 Wave2 にて外部の MES との連携がサポートされるようになりました。MSは仕事が早いなあ。

https://docs.microsoft.com/ja-jp/dynamics365-release-plan/2021wave2/finance-operations/dynamics365-supply-chain-management/manufacturing-execution-systems-integration

デモできないので、イメージで語ります。左から FO と MES の連携が進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/93b7aa74-88cd-ea77-92d3-07ee77550647.png)

① 製造オーダーのステータスをリリースすると、ビジネスイベントがトリガーされ MES に通知が行く。
製造オーダーのステータス→ https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/about-production-order-status#overview-of-production-order-statuses

② 完成品・数・部品表（BOM）の情報は、MES から FO にデータを連携される
③ MES 上から製造を開始すると、FO にも開始ステータスが連携される
④ MES 上から材料消費すると、FO にも材料消費が連携される
⑤ MES 上から工程・作業時間を登録すると、FO にも工程・作業時間が連携される
⑥ MES 上から製造を RAF すると、FO にも RAF される
⑦ MES 上から製造を終了すると、FO にも終了される

とりあえず③～⑦ の MES の製造実績を FO へ連携させる API の実装が肝ですね（笑）
https://docs.microsoft.com/ja-jp/dynamics365/supply-chain/production-control/mes-integration#call-the-api

Odata, Custom ServiceなどのAPI の実装方式はこちらでご確認を
https://docs.microsoft.com/ja-jp/dynamics365/fin-ops-core/dev-itpro/data-entities/integration-overview

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/ea388fb8-acdd-2a97-b653-093bfef5ce83.png)
walkを使って特定のファイルサイズのリスト抽出

## walkの練習


フォルダ構成は下記のようになっています。
(コマンドプロンプトでtree フォルダ名 /f）


```
LOGS
│  log.txt
│  log2.txt
│  大きいファイル君1.htm
│  新規 Text Document.txt
│
├─.ipynb_checkpoints
├─202112_15
│  │  log.txt
│  │  log2.txt
│  │  大きいファイル君2.htm
│  │
│  └─.ipynb_checkpoints
│          大きいファイル君2-checkpoint.htm
│
└─2021_1214
    │  koko.txt
    │  大きいファイル君3.htm
    │
    ├─.ipynb_checkpoints
    └─その他
        │  大きいファイル君4.htm
        │
        └─.ipynb_checkpoints


```

まずはどのように表示されるか見てみる。

``` python
import os

dir = 'logs'
for path,sub,filenames in os.walk(dir):
    print(f"path:  ,{path}")
    print(f"sub:  ,{sub}")
    print(f"filenames:  ,{filenames}")
```
実行結果

```
path:  ,logs
sub:  ,['.ipynb_checkpoints', '202112_15', '2021_1214']
filenames:  ,['log.txt', 'log2.txt', '大きいファイル君1.htm', '新規 Text Document.txt']
path:  ,logs\.ipynb_checkpoints
sub:  ,[]
filenames:  ,[]
path:  ,logs\202112_15
sub:  ,['.ipynb_checkpoints']
filenames:  ,['log.txt', 'log2.txt', '大きいファイル君2.htm']
path:  ,logs\202112_15\.ipynb_checkpoints
sub:  ,[]
filenames:  ,['大きいファイル君2-checkpoint.htm']
path:  ,logs\2021_1214
sub:  ,['.ipynb_checkpoints', 'その他']
filenames:  ,['koko.txt', '大きいファイル君3.htm']
path:  ,logs\2021_1214\.ipynb_checkpoints
sub:  ,[]
filenames:  ,[]
path:  ,logs\2021_1214\その他
sub:  ,['.ipynb_checkpoints']
filenames:  ,['大きいファイル君4.htm']
path:  ,logs\2021_1214\その他\.ipynb_checkpoints
sub:  ,[]
filenames:  ,[]

```

pathの動きをみることで、どのような歩き方をしているかが分かる。
階層ごとに歩くのではなく、１つのディレクトリに深く入れるところまで入り、
また次のディレクトリを行く動きになっている。

最初にA,B,Cというサブディレクトリがあった場合、
A → A-1 → A-2 ・・・　B → B-1 ・・・C → C-1・・・と歩くようだ。


それでは次に、特定の要件を満たすファイルをリスト化する処理を書く

要件
- 500キロバイト以上 1000キロバイト未満のファイルをタブル型でリストに追加
- 出来たリストをサイズサイズが大きい順に並べ替える


```python
## 500kb以上1000kb未満のファイルをリストにする
## フォルダ全体のサイズ

import os

def get_largefile_list(dir):
    large_file_list=[]
    size = 0
    for path,sub,filenames in os.walk(dir):
        for file in filenames:
            file_path = os.path.join(path,file)
            size = os.path.getsize(file_path)
            size = round(size/1024,1)
            if 1000>size >= 500:
                print(file_path)
                large_file_list.append((file,size))
    return large_file_list

large_file_list = get_largefile_list("logs")
large_file_list.sort(key=lambda s:s[1],reverse=True)
print(large_file_list)

```
実行結果

```
[('大きいファイル君4.htm', 796.9), ('大きいファイル君2.htm', 721.1), ('大きいファイル君3.htm', 721.1), ('大きいファイル君1.htm', 648.4), ('大きいファイル君2-checkpoint.htm', 648.4)]

```
VSCode拡張機能を開発できる環境をDockerでつくる

# はじめに
皆様普段エディタは何をお使いになっているでしょうか。
私はVSCodeを愛用しております。
何といっても拡張機能の豊富さが素敵です。

また拡張機能が作れることも良さの一つです。
自分が欲しい機能を持った拡張機能もないこともあるので、
プログラマらしく無いなら作ってしまえの精神です。

まず開発環境が必要なので、
今回はDockerを使って環境を用意する手順を記載します。

# 環境構築
Dockerは入っている前提です。
筆者はWindows環境ですが、MacでもLinuxでも変わらないかと。
ボリュームをマウントする際の書き方が少し違うくらいです。

Dockerfileは以下。というか必要なのはこれだけ。

```Dockerfile
FROM node:17-slim

# パッケージインストール
RUN apt-get update -qq \
    && apt-get install -y -git

# ユーザー設定
ARG USER="node"
USER $USER

# ワークスペース設定
WORKDIR /workspace

ENV NPM_CONFIG_PREFIX=/home/$USER/.npm-global
ENV PATH="/home/${USER}/.npm-global:${PATH}"

# エイリアス設定
RUN echo "alias ll='ls -al'" >> /home/$USER/.bashrc

# ライブラリインストール
RUN npm install -g npm \
    && npm install -g vsce generator-code yo
```

ビルドしてコンテナ作成。

```bash
> docker build -t vscode_extention_base --no-cache .
> docker run --name vscode_extention_base -v %cd%:/workspace -t vscode_extention_base /bin/bash
```

新規プロジェクトが作れるか確認。

```bash
$ npx yo code
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== (Y/n)n

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? test_extension
? What's the identifier of your extension? test_extension
? What's the description of your extension? for test
? Initialize a git repository? No
? Bundle the source code with webpack? No
? Which package manager to use? yarn
```

エラーが出なければOK。
あとはWORKDIR内で好きなだけ拡張機能を作る。

追加のパッケージが必要な場合、rootユーザーでコンテナにアタッチしてaptでインストールできます。

```bash
> docker exec -u 0 -it vscode_extention_base /bin/bash
```



## ポイント紹介
### ユーザーは一般ユーザーで
rootユーザーではPermissionの兼ね合いで「npx yo code」を実行時にエラーになってしまうため。

パッケージインストール以降、rootユーザーではなく一般ユーザーに切り替えています。
node:17-slimにはnodeユーザーが既にいるので切り替えだけ。

### npmのパッケージはグローバルでインストール
拡張機能作成に必要なNodeのパッケージ

* vsce
* generator-code
* yo

は-gオプションをつけてグローバルにインストールしています。
nodeユーザーでの操作になるので、Permissionエラーにならないように、
nodeユーザーのホームディレクトリ配下の「.npm-global」ディレクトリにインストールするようにしています。

WORKDIRにインストールするとボリュームをマウントした際に消えてしまうため。
entrypointでもインストールできるが、環境として完成させておきたいので、この形にしました。

### おまけ：エイリアス設定
```bash
alias ll='ls -al
```
は必須。

# まとめ
公式からもDockerfileは配布されているのですが、コンテナ作成時にエラーになったので自作しました。
追加のボリュームが必要な場合は面倒ですが、コンテナ作り直しです...

そのうち作った拡張機能の紹介ができればと。
拡張機能の作り方自体はたくさん記事があるので割愛します。

参考になれば幸いです。
個人開発したマッチングアプリのリリース後日談😭

この記事は[個人開発Advent Calendarの17日目](https://qiita.com/advent-calendar/2021/personal-project)の記事です。

# 人生初の個人開発アプリ
人生初の個人開発アプリでマッチングアプリを開発しました。
ざっくり作ったアプリを説明しますと、`オンラインゲームをしたいユーザーを結びつけるiOSアプリ`です。

https://apps.apple.com/jp/app/clan-%E3%82%AF%E3%83%A9%E3%83%B3/id1570006169

以前リリース記事を書いたのでよかったらこちらをご覧ください。

https://qiita.com/smizuno2018/items/1ead475e760bc1b9bd9c

# リリース後の結果
個人開発でアプリをリリースするとどれくらいのダウンロード数になるのかを
`App Store Conncect`、`Firebase`のアナリティクスで確認していきましょう。

## App Store Conncect アナリティクス
まず、App Store Conncectアナリティクスの結果からです。
前提として、マッチングアプリは9月中旬にリリースしましたのでリリースから３ヶ月が経ちました。
そしてご覧の通り、`アプリダウンロード数17`と悲しい結果になりました。。。

またWeb広告等々一切の宣伝媒体は使用していないのですが、`インプレッション数1914`となりこちらは個人的に意外と多い結果となりました。(100くらいだと思ってました)

そして`プロダクトページ閲覧数135`しかありませんが、こちらも個人的には意外と多い数値でした。

![スクリーンショット 2021-12-15 22.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506410/a95a3bf3-b5f3-2f39-2bf7-de02634d8a50.png)

## Firebase アナリティクス
続いてFirebaseアナリティクスの結果です。
`絶望的なユーザー維持率`となりました。。。
完成度の低いアプリへのユーザー登録後、アプリへ戻ってくる人なんていませんでした。。。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506410/5b5143b8-f6cf-22e5-b279-6e13e0067368.png" width="70%">

# リリース後の反省
`ダウンロード数17`、`絶望的なユーザー維持率`について分析しようと思います。
## ダウンロード数17の件
分析といいつつ、こちらの要因は無限にありますし、悲しくなるので言及はしません。
伸び代しかないことを信じ、`17人もダンロードしてくれた`と自分に言い聞かせて機能開発を続けていきたいと思います。
最近会社の同僚が開発メンバーに加わってくれたので、開発速度向上はもちろん個人開発にはない相互コードレビューで品質を向上させていきます。

![computer_mob_programming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506410/ab0bb860-6faf-7eb9-47ac-c3d279b76ae5.png)


## 絶望的なユーザー維持率の件
こちらは思い当たる要因が一つあります。
それは`PUSH通知機能が初期リリースに間に合わなかったこと`です。
自分自身がこのマッチングアプリを使用している中で、見知らぬ人からいいね！をもらっていたのですがPush通知を無かったためいいね！に気付くことができませんでした。
ユーザー目線から考えましても、クソアプリをインストールし、その後再度アプリを起動するきっかけがないとユーザーが戻ってこないことは明らかでした。。。
この反省を踏まえPush通知については優先度を上げて開発しており、バックエンドは実装完了、残りはモバイルのみとなりましたので年始リリースを目標に頑張ります。

![smartphone_airdrop_chikan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506410/38dad14b-8241-fdf2-abfd-7250c2939673.png)

# まとめ
ダウンロード数を上げることの難しさ、アプリに最低限必要な機能などをリリースから学べました。
リリースするまでの個人開発は、サーバーサイドKotlin、SwiftUIなど業務では使っていない技術への探究心をモチベーションに開発してきましたが今後はダウンロード数向上をモチベーションに個人開発を楽しめたらと思っています。
2021年は個人開発アプリのリリースをきっかけにQiitaへの記事投稿、アドベントカレンダーへ参加ができたので総じてリリースしてよかったなと思っています。
役に立つ内容では無かったと思いますが最後までご覧頂きありがとうございました！
次回はポジティブな内容かつ技術的な内容をお伝えします！
Blenderで戦艦大和を作った話

<h2>はじめに</h2>
こんにちは〜!
[S高生1年生](https://nnn.ed.jp/)・[NCodeLabo](https://n-codelabo.jp/?utm_source=qiita&utm_medium=qiita&utm_campaign=qiita)生のアメーバです。
今回が初めての投稿なので、まだまだ記述に慣れていなくて文章が所々おかしい点があると思います。
ですが、最後まで見ていただけると嬉しいです！！

今回は、Blenderを初めて6ヶ月の初心者が、戦艦大和を作った話をしようと思います
Blenderで戦艦大和を作ったので作った経緯や次作るときに工夫したい点などを書こうと思います〜
<h2>完成したもの</h2>
<h4>戦艦大和</h4>
![スクリーンショット 2021-11-30 16.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/f03f56bd-ee2f-6292-1206-1ead447fcc52.png)
![スクリーンショット 2021-11-30 21.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/3ef197b9-0cde-73c1-a9e5-89281e0693ff.png)

<h2>作るに至った経緯</h2>
一言でいうと「私が調子に乗ったから」です!
これだと、みんな(・・？)こんな状態になると思うので、詳しく経緯を話したいと思います。
Blenderに最初に作ったのは、学校の教材で作ったティディベアを作りました。そこからだんだんBlenderに興味を持ち始めました!
ということで、2つ目に作ったのがHK416というアサルトライフルを作りました。
そして上手くできた私はこう思いました。
「今なら、自分の好きなアサルトライフルも作れるのでは？」ということで作ったのが、『G36C』というアサルトライフルでした![G36C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/ec7371e0-7c1e-f8ab-af54-49d08613c6fa.png)
ここで
「上手くできた!」
と思った自分は、次は大きいものを作ろうと思って大和を作り始めました…
<h2>作成開始!</h2>
作成をしてまずやったことは、作成の順番を決めました。
順番は、「船体→主砲→副砲→その他武装→艦橋」の順番にしました。
しかし!ここで問題が発生します。
船体、主砲、副砲までは順調に作成できましたが、ここで問題が発生しました。
下調べをしていたのですが、色々な画像を見返してみると…大和がめちゃくちゃ細かかった…
この時は、完成まで行くかどうかかなり不安になりました。
この時私は、テクスチャなどの方法をまだ知らなかったので、全部一から細か作ることにしました。
結果、戦艦大和完成までに、約3ヶ月かかりました。
<h3>今回活用した機能</h3>
今回大和を作りにおいて、かなり活用した機能は「ミラー」と「配列」を使いました。
<h4>ミラー</h4>
ミラーは全体の色々なところに使いました。特に使ったのは、艦橋と煙突を作るのに活用をしました。
![スクリーンショット 2021-12-07 15.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/6883904d-ff2a-6d96-041f-0836381f761e.png)
<h4>配列</h4>
配列は、画像の部分2箇所を作るときに使いました。
カタパルト(上の画像)は、一つの箱を作ってそれ配列で複製しました。
機銃(下の画像)も同じ要領で、輪っかをひとつ作ってそれを配列で複製しました。
![スクリーンショット 2021-12-07 16.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/28c64a56-9441-92a0-1f6d-14a050f0b9bf.png)
![スクリーンショット 2021-12-07 16.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/4c3c79d7-d3a9-c8cb-0dc7-a074b9406b0f.png)
<h2>こだわり</h2>
・簡単な技術しか使っていない
→簡単な技術しか使わないことで、「初心者でもここまでできるんだぞ!」というところを見せたかった。
・なるべく史実の大きさに合わせた
→Blender内に、距離の概念があるので史実に合わせられるようにした。


<h2>次やるときに生かしたいとこ</h2>
・作品が大きいことや、点や辺がおおいいのでメモリをとても圧迫してしまった…
　ー＞なので、軽くするための技を使いたい。
![スクリーンショット 2021-11-30 22.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350327/742240af-3d29-5c39-59dc-36c5fd698dfa.png)
(※捕捉：MacbookAirなので、メモリは8GBとしかありません)

・色がつけられなかったので、次は戦艦に色をつけれるようになりたい。

<h2>さいごに</h2>
この記事を見てどなたかが、アドカレやBlenderに挑戦できる気かっけと慣れたらとても嬉しいです!
最後まで読んでいただいた方ありがとうございました!
セル・オートマトンで「脳」をシンプルに実装してみよう。その3  -ニューロンの配置-

[その2](https://qiita.com/yuky_az/items/c134fafb9311b9c15651)で解説したトーラス上の各セルに、ニューロン（神経細胞）を配置していきます。  

以下の通りに何回かに分けて解説しますが、今回はその3になります。
[その1 -セル・オートマトンとは？-](https://qiita.com/yuky_az/items/17fff285101ea365982b)
[その2 -セルの並べ方-](https://qiita.com/yuky_az/items/c134fafb9311b9c15651)
[その3 -ニューロンの配置-](https://qiita.com/yuky_az/items/cc5272d1c18270c5f7b2)
[その4 -恒常性と馴化-](https://qiita.com/yuky_az/items/9fd73452f8283262e54a)
[その5 -ヘブ則の導入-](https://qiita.com/yuky_az/items/065b764f59e2720214c2)

## 配置するニューロン

使用するニューロンの模式図を以下に示します。

![neuron.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/fe4baf0f-6102-5592-1339-ceb15a150bd2.png)


入力と重みの積の総和に、バイアスを足し合わせて活性化関数に入力します。
活性化関数として、以下に示すステップ関数を使います。

![step.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/123f872a-2722-44c7-eaa7-d2f889f95a23.png)

ステップ関数は関数への流力が負の値場合は0、正の場合は1をとるシンプルな関数です。
ステップ関数はニューラルネットワークの学習によく使われるバックプロパゲーション（誤差逆伝播法）による学習ができないのですが、今回はバックプロパゲーションによる学習は行わないのでこの関数で十分です。

## 投射ニューロンと介在ニューロン

大脳皮質の神経細胞には、おおまかに分けて「投射神経細胞」と「介在神経細胞」があります。
投射神経細胞は、属する領域を超えて長い距離軸索を伸ばし遠方の神経細胞と接続されます。
一方、介在神経細胞は近傍の神経細胞と接続されます。  

この2つの神経細胞に倣い、今回のニューラルネットワークには遠方接続する「投射ニューロン」と近傍のニューロンと接続する「介在ニューロン」を配置します。
以下に示すように、投射ニューロンは遠方のニューロンと接続されて、介在ニューロンは近傍のニューロンと接続されます。

![projection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/786ea4cf-23ed-844a-6def-73b11c457381.png)

実装時は、介在ニューロンの出力をランダムな位置にすることで投射ニューロンとします。
介在ニューロンを並べて、このうちの一定の割合の出力位置をシャッフルします。

## 興奮性ニューロンと抑制性ニューロン
大脳皮質の神経細胞は、「興奮性神経細胞」と「抑制性神経細胞」に分けることもできます。
これに倣い、「興奮性ニューロン」と「抑制性ニューロン」を導入します。
以下に示すように、興奮性ニューロンからの入力には正の重みをかけて、抑制性のニューロンからの入力には負の重みをかけます。

![excitatory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/ad9f8cda-bb9f-bc4b-2db8-f8e8891c64fb.png)

大脳皮質における神経細胞の20％程度は抑制性神経細胞なので、抑制性ニューロンの割合は20%程度にします。
重みの初期値はランダムな正の値としますが、そのうちの20%に-1をかけて負の値とします。

バイアスの値はニューロンの感度、すなわちニューロンの興奮しやすさですが、こちらも初期値はランダムに設定します。

今回の「その3」では、使用するニューロンについて解説しました。
「その4」に続きます。

なお、本記事の内容は、拙著「[あたらしい脳科学と人工知能の教科書](https://www.shoeisha.co.jp/book/detail/9784798164991)」をベースにしています。

【コミュニティ「自由研究室 AIRS-Lab」】
「AI」をテーマに交流し、創造するコミュニティ「自由研究室 AIRS-Lab」が活動中です。
​https://www.airs-lab.jp/​
Next2D Frameworkのrouting設定[導入編]

# routing.json
routing設定について解説したいと思います。
ルーティングに設定できるトッププロパティは、英数字、スラッシュ、ハイフン、アンダースコアです。スラッシュ、ハイフン、アンダースコアをキーに`CamelCase`で`View`クラスにアクセスします。

例)
下記のサンプルの場合は、`https://example.com/quest/list`でアクセスが可能になり、コンテキストに`QuestListView.js`がセットされます。

```json:routing.json
{
    "quest/list": {
        "requests": []
    }
}
```

## 第二階層のプロパティ設定

プロパティ|型|初期値|説明
---|---|---|---
private|boolean|false|SPAモードでも直接のアクセスを制御した時に利用します。trueに設定し直接アクセスすると、TopViewが読み込まれます。
requests|array|null|Viewにアクセスする前に、指定した先にリクエストを送信します。受け取った情報は、nameをキーにnext2d.fw.responseに設定されます。

## requests
requests配列の設定は以下の項目が利用可能です。

プロパティ|型|初期値|説明
---|---|---|---
type|string|content|json、content、image、customの固定値が利用可能です。
path|string|empty|{{***}}で囲むと、config.jsonの変数を取得できます。例）{{ api.endPoint }}path/to/api
name|string|empty|nameを設定すると、設定した値をキーとして取得したデータをnext2d.fw.responseに格納します。
cache|boolean|false|nameで設定した値をキーにして、取得したデータをキャッシュする。
callback|string or array|null|リクエスト完了後にコールバックするクラスを指定することができます。指定したクラスのコントラクターの第一引数に取得した値が設定されます。
class|string|empty|リクエストを実行するクラスを指定することができます。(typeがcustomのときのみ呼び出されます。）
access|string|public|リクエストを実行する関数へのアクセスを指定できます。publicあるいはstaticを指定することができます。(typeがcustomのときのみ呼び出されます）。
method|string|empty|リクエストを実行する関数を指定することができます。(typeがcustomのときのみ起動します）。

以下は初期で設定されているjsonです。

```json:routing.json
{
  "top": {
    "requests": [
      {
        "type": "json",
        "path": "{{ api.endPoint }}api/top.json",
        "name": "TopText"
      },
      {
        "type": "content",
        "path": "{{ content.endPoint }}content/sample.json",
        "name": "MainContent",
        "cache": true
      }
    ]
  },
  "home": {
    "requests": [
      {
        "type": "custom",
        "class": "api.HomeText",
        "access": "static",
        "method": "get",
        "name": "HomeText",
        "cache": true
      },
      {
        "type": "content",
        "path": "{{ content.endPoint }}content/sample.json",
        "name": "MainContent",
        "cache": true
      }
    ]
  }
}
```

routing設定は設計を考慮する点からも重要な設定項目になりますので、是非、初期サンプルを参考にしていただければと思います。明日はカスタム設定に関しての記事を書きたいと思います。
android:windowLightNavigationBarはAPI level 27だが、View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BARはAPI level 26という罠

Android 5以上ではNavigationBarの色を指定することができます。
テーマでは`android:navigationBarColor`で指定しますね。
ただし、ナビゲーションバーのボタンは白系統の色で描画されるため、明るい色を使いたい場合は、`android:windowLightNavigationBar`をtrueにすることでナビゲーションバーのアイコンが黒系の色に変わり視認性を確保することができます。

```xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="android:navigationBarColor">@color/white</item>
    <item name="android:windowLightNavigationBar">true</item>
</style>
```

この、`android:windowLightNavigationBar`はAPI level 27なのでAndroid 8.1以上でしか使えません。

https://developer.android.com/reference/android/R.attr#windowLightNavigationBar

Android 8以下では明るい色のナビゲーションバーは諦める必要がありますね。

ナビゲーションバーのアイコンを黒系の色に変更する方法はもう一つあって、`View.setSystemUiVisibility()`でView.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BARフラグをたてることでも変更できます。
この`View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR`はAPI level 26なのです。

https://developer.android.com/reference/android/view/View#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

`View.setSystemUiVisibility()`はDeprecatedなので、制御する場合は、`WindowInsetsControllerCompat`を使ったりしますよね。

```kotlin
val controller = WindowInsetsControllerCompat(window, binding.root)
controller.isAppearanceLightNavigationBars = true
```

WindowInsetsControllerCompatの実装はAPI26以上で別れています。

```java:WindowInsetsControllerCompat.java
public WindowInsetsControllerCompat(@NonNull Window window, @NonNull View view) {
    if (SDK_INT >= 30) {
        mImpl = new Impl30(window, this);
    } else if (SDK_INT >= 26) {
        mImpl = new Impl26(window, view);
    } else if (SDK_INT >= 23) {
        mImpl = new Impl23(window, view);
    } else if (SDK_INT >= 20) {
        mImpl = new Impl20(window, view);
    } else {
        mImpl = new Impl();
    }
}
```

API 26以上でAppearanceLightNavigationBarsの制御が行われます。

```java:
@RequiresApi(26)
private static class Impl26 extends Impl23 {

    Impl26(@NonNull Window window, @Nullable View view) {
        super(window, view);
    }

    @Override
    public boolean isAppearanceLightNavigationBars() {
        return (mWindow.getDecorView().getSystemUiVisibility()
                & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0;
    }

    @Override
    public void setAppearanceLightNavigationBars(boolean isLight) {
        if (isLight) {
            unsetWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            setWindowFlag(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            setSystemUiFlag(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
        } else {
            unsetSystemUiFlag(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
        }
    }
}
```

テーマパラメータとしてAPI 27だから26ではNO OPになってくれると期待で使ってしまうと、黒背景に黒アイコンという状態になってしまいます。注意しましょうというお話でした。
Expressアプリを無料のホスティングサービスRenderにデプロイする

## 概要
- [Express](http://expressjs.com/)とは
    - Node.jsで利用できるWebアプリケーションフレームワーク
    - 今回はHTTPサーバーとして利用
    - [Express/Node のイントロダクション \- ウェブ開発を学ぶ \| MDN](https://developer.mozilla.org/ja/docs/Learn/Server-side/Express_Nodejs/Introduction)
- [Render](https://render.com/)とは
    - コードを簡単にデプロイできるホスティングサービス。[次世代Heroku](https://zenn.dev/katsumanarisawa/articles/c9da48652f399d)とも噂されていてHerokuよりもコストが低い
    - Renderに[HerokuとRenderを比較したページ](https://render.com/render-vs-heroku-comparison)が用意されているのでそれを見ると分かりやすい。
    - 基本的にRenderのコストが低いが、無料プランの場合はHerokuは30分操作がない場合にスリープするのに対して[Renderの場合は15分](
https://render.com/docs/free#free-web-services)とHerokuに比べて短いなどの違いがある。

## Expressアプリをデプロイする

Renderのクイックスタートを参考にデプロイしていきます。
[Deploy a Node Express App \| Render](https://render.com/docs/deploy-node-express-app)

### チュートリアル用のリポジトリをForkする

Renderが用意しているチュートリアル用のリポジトリをForkします。

[render\-examples/express\-hello\-world: Express Hello World Example on Render https://render\.com](https://github.com/render-examples/express-hello-world)

### 新しいWebサービスを作成する

ダッシュボードから新しいWebサービスを作成する。
![Snipaste_2021-12-16_22-52-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/3ac20dd2-7350-3626-4768-d7f68a50a217.png)

先ほどForkしたリポジトリのURLを入力して、選択します。
![Snipaste_2021-12-16_22-55-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/6da3a247-f7a6-be0a-f47d-520f8c45d9ec.png)

一部の内容はリポジトリの内容を見て自動入力されているのでそれ以外で必要な内容を入力してWebサービスを作成します。
![FireShot Capture 003 - Render Dashboard - dashboard.render.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/67323d06-6130-ea79-6a8f-5437dc8e5fbf.png)

ビルドが始まるので少し待ちましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/bd571289-48ca-680d-ad18-b81566419abb.png)

### Webサービスにアクセスする
WebサービスのURLにアクセスすると画面が表示されていることが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/0c4178a4-ce69-d111-de7a-5ceb88d307c2.png)

## まとめ
デプロイするコードをGitHubにアップして、そのリポジトリを指定するだけでとても簡単にデプロイできました。

個人的にはダッシュボードがシンプルなので直感的に使えそうですごくいい感じです。

無料だと15分間リクエストがないとスリープしてしまうといった制限はありますが回避する方法は色々ありそうです。

RenderとSocket.ioとExpressを組み合わせてリアルタイム通信できる機能を今作っているChrome拡張機能に組み込んでいければいいなーと思いました。
docker-composeを既存のアプリへ導入【Rails×PostgreSQL】

既に作っていたrailsアプリにdockerを導入してみました。
なかなか難しくてかなり時間かかってしまいました。以下に記録として残しておきます。

# 早速やってみよう

```:Dockerfile
FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /port
COPY Gemfile /port/Gemfile
COPY Gemfile.lock /port/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /port

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```

基本的に公式の[クイックスタート](https://docs.docker.com/samples/rails/)を使用しました。結構シンプルです。
ただクイックスタートそのままだと「bundlerが無いよ」とエラーが出るので`RUN gem install bundler`を加えています。

`FROM`：ベースになるイメージ（Gemfileのrubyのバージョンと揃える必要あり）
`WORKDIR`：作業ディレクトリの設定
`COPY`：後に続くファイルやディレクトリをコンテナへコピーする
`RUN`：コンテナに対してコマンドを実行

---

```docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_DATABASE: app_user_role
    ports:
      - '5432:5432'

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/port
    ports:
      - "3000:3000"
    depends_on:
      - db
```

- `image: postgres` → docker hubから`postgres`というイメージをひっぱって来てビルドします

- `build: .` → ルートディレクトリにあるDockerfileを使ってイメージをビルドするのを意味します。

- `depends_on: - db` → コンテナの依存関係を示します。こうすることでdbが起動した後にwebが起動するようになります


---

デフォルトでSQLite3を使用していましたが、本番環境がPostgreSQLなので開発環境やテスト環境もpostgreSQLに統一しました。

```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  host: db
  username: app_user_role
  password: password

development:
  <<: *default
  database: port_development

test:
  <<: *default
  database: port_test

production:
  <<: *default
  database: port_production
```

`host: db`は必須です。これ無しで`docker-compose up`するとdockerコンテナではなくソケットファイルに接続されてしまうようです。

---


```entrypoint.sh
set -e

rm -f /port/tmp/pids/server.pid

exec "$@"
```

# 参考

皆さんの知恵を拝借させていただいたことでdockerの導入が完了し、dockerの理解も深まったと思います。ありがとうございました。

[【Docker】Rails + PostgreSQLの開発環境構築時に「psql: could not connect to server: No such file or directory」](https://qiita.com/rebi/items/e9625cedf0d41d1cfa28)
[Dockerの環境構築でcould not connect to server: Connection refusedのエラーが出た時の対処法](https://qiita.com/yuki_0920/items/84e2ca260bfe13cf3072)
[Dockerで既存アプリの開発環境を作成【Ruby2.6 + Rails5.2 + Mysql5.7】](https://qiita.com/d0ne1s/items/6caa212ca3af7e29e86c)
[既存のRailsアプリにDockerを導入する手順](https://qiita.com/kenz-dev/items/b9e716204e0cd0cea447)
[RailsのデータベースをSQLiteからPostgresqlに切り替える方法](https://codebox-lib.netlify.app/postgresql-setup/)
[docker docs (Quickstart: Compose and Rails)](https://docs.docker.com/samples/rails/)
jest.config.js設定とは？

## Jestの設定（jest.config.jsやpackage.jsonでの設定）について
以下のように設定した（一部デフォルト値と同じものがあるが、明示的に分かるようにする意味でもあえて書くようにした）。

```js
module.exports = {
	bail: 1,
	testEnvironment: 'node',
	testMatch: [
		'**/__tests__/**/*.js'
		//   "**/?(*.)+(spec|test).[tj]s?(x)"
	],
	testPathIgnorePatterns: ['/node_modules/', '/src/'],
	transform: { '\\.jsx?$': 'babel-jest' },
	verbose: true
};
```

詳細を見ていくと・・・

- [bail](https://jestjs.io/ja/docs/configuration#bail-number--boolean)<br>何回テストが失敗した場合にテストを中止させるか？を設定するためのオプション。今回は「1」としたので1つテストが失敗するとそこでテストは終了になる。
- [testEnvironment](https://jestjs.io/ja/docs/configuration#testenvironment-string)<br>jestのテスト実行環境を設定するためのオプション。デフォルトはNode.jsの環境になるが、フロントエンドのテストをする場合は`jsdom`を通してブラウザのような環境でテスト実行する事もできる。
- [testMatch](https://jestjs.io/ja/docs/configuration#testmatch-arraystring)<br>どのファイルがテストが書かれたファイルか？を設定するためのオプション。正規表現で書く。
- [testPathIgnorePatterns](https://jestjs.io/ja/docs/configuration#testpathignorepatterns-arraystring)<br>テスト対象外となるパスのパターンを設定するためのオプション。今回は`node_modules`や`src`以下はテストファイルがあるか？を探しに行く必要のないフォルダなので除外している。
- [transform](https://jestjs.io/ja/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object)<br>ソースコードを何で変換するか？を設定するためのオプション（ES6以降のコードを書く場合はES5への変換・トランスパイルが必須だが、それを何でするのか？を設定する）。<br>今回はデフォルトのbabel-jestにしている（babel-jestは同じプロジェクト内にあるbabelの設定を読み取って動くライブラリ）。
- [verbose](https://jestjs.io/ja/docs/configuration#verbose-boolean)<br>テスト実行時のエラーを都度表示するか？を設定するためのオプション。<br>デフォルトではfalseになっており、テスト実行後の最後にまとめてエラーが表示されるが、それだとエラーが見にくいので今回はtrueにし都度とした。
Retrofit2でform-dataにファイルを含む複数の値をPOSTする 

## はじめに

この記事は [N・S高等学校 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/n-s-highschool-1) の15日目です。

こんにちは。N高生です。空いてたので書きます。

## 本題

Postmanで言うこれをしたい。

![](https://i.imgur.com/WePkYDY.png)


```kotlin:ApiService.kt
interface ApiService {
    @JvmSuppressWildcards
    @POST("upload.php")
    suspend fun upload(@Body body: RequestBody): Response<ResponseBody> // Response<ResponseBody> はよしなに。

    companion object {
        var apiService: ApiService? = null

        fun getInstance(): ApiService {
            if (apiService == null) {
                apiService = Retrofit.Builder()
                    .baseUrl("URL") // TODO: ここにURLを入れる
                    .addConverterFactory(GsonConverterFactory.create())
                    .build().create(ApiService::class.java)
            }
            return apiService!!
        }
    }
}
```


```kotlin:Activity.kt
val api = ApiService.getInstance()

val file = File(/* TODO: いい感じに */)
val body = file.asRequestBody("application/pdf".toMediaTypeOrNull()) // MIMEはいい感じに変えてください。

val requestBody = MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", file.name, body)
    .addFormDataPart("a", "Vintage Culture")
    .addFormDataPart("b", "James Hype")
    .addFormDataPart("c", "Claptone")
    .build()

api.upload(requestBody)
```

## さいごに



N高S高成績確認アプリを作ったのでインストールしてくれると喜びます。

[iOS版](https://apps.apple.com/jp/app/n-s%E9%AB%98-%E6%88%90%E7%B8%BE%E7%A2%BA%E8%AA%8D%E3%82%A2%E3%83%97%E3%83%AA-nuixo/id1571316361)
[Android版](https://play.google.com/store/apps/details?id=app.nuixo.Nuixo)

<!--

<a href='https://apps.apple.com/jp/app/n-s%E9%AB%98-%E6%88%90%E7%B8%BE%E7%A2%BA%E8%AA%8D%E3%82%A2%E3%83%97%E3%83%AA-nuixo/id1571316361#?platform=iphone'><img alt='Google Play で手に入れよう' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437056/106adee9-253a-27e5-3296-3228b3ce1214.png' width=190 /></a>
<a href='https://play.google.com/store/apps/details?id=app.nuixo.Nuixo&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Google Play で手に入れよう' src='https://play.google.com/intl/en_us/badges/static/images/badges/ja_badge_web_generic.png' width=222 /></a>
-->
<br>
<br>

宣伝ﾖｼｯ!
【Rails×AWS】capistranoでデプロイ時のNoMethodError: Cannot load database configuration

初めてcapistranoでEC2にデプロイするときにハマったエラーがあったので解決方法ともに共有しようと思います。
EC2環境構築についてはこちらの記事を参考に行いました↓
https://qiita.com/gyu_outputs/items/b123ef229842d857ff39

#エラー内容

```
$ bundle exec cap production deploy
.
.
.
.
deploy:migrating
01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
01 rake aborted!
      01 NoMethodError: Cannot load database configuration:
      01 undefined method `[]' for nil:NilClass

```

#原因/解決方法

最初はデータベース関連のエラーかと思いましたが色々調べてみるとdatabase.ymlの環境変数が読み込めないときに表示されるエラーということがわかりました。

```database.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %> #最初に読み込まれるのがデーターベースの環境変数であるためデータベースがロードできないというエラーが表示された。
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>

```

環境変数が読み込めない⇨credentials.ymlが読み込めていない⇨master.keyが読み込めていない
ということがわかりました。

master.keyはconfig/master.keyというファイルに保存されていますがこれをcapistranoで読み込むためには下記の一文を追加する必要がありました。

```config/deploy.rb
set :linked_files, %w(config/master.key) #追加
```

#バージョン

```
ruby '3.0.2'
rails '6.0.4'
capistrano '3.16.0'
```
【AWS】S3のまとめ

# はじめに

こんにちは。
この記事は[GFAMアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/gfamz)の7日目の記事です。
S3についてまとめてみました。

# S3の概要

S3はSimple Strage Serviceの略です。オブジェクトストレージサービスです。
安価で耐久性が高く、容量無制限というのが特徴です。

# オブジェクトネーミングスキーマ

オブジェクトはバケット内にフラットに格納されます。
S3://バケット名/プレフィックス/オブジェクト名

* バケット名： オブジェクトの保存場所。100個まで作成可能
* プレフィックス： フォルダ相当
* オブジェクト： データ本体

# ストレージクラス

用途に応じてストレージクラスを使い分けます。

* スタンダード： 複数のAZに複製。デフォルトのストレージクラス。イレブンナイン
* 標準低頻度アクセスストレージ： スタンダードより安価。データの読み出しに課金
* Intelligent Tiering： アクセス頻度によって最適なストレージクラスへ振り分け
* 1ゾーン・低頻度アクセスストレージ： １つのAZにのみ保存。標準低頻度アクセスストレージよりも更に安価
* S3 Glacier： 低コスト。データの取り出しに時間を要する
* S3 Glacier Deep Archive： 更に低コスト。取り出しに更に時間かかる
* 低冗長化ストレージ： Glacierから取り出したデータの置き場所

# アクセス管理

デフォルトでは、バケットを作成したユーザかルートユーザしかアクセスできないです。

## IAMポリシーによるアクセス制御

S3に関するポリシーがアタッチされたIAMユーザやIAMロールから操作を行うことができます。

## バケットポリシーによるアクセス制御

ポリシーが記載されたJSONをバケットに付与してアクセス制御できます。

## ACLによるアクセス制御

S3に対して、AWSアカウント単位、バケット単位、オブジェクト単位でアクセス制御できます。

# Webサイトホスティング機能

静的なWebサイトをホスティングする機能です。

# S3イベント通知機能

S3にオブジェクトがアップロードされたことをトリガーに他のAWSサービスを呼び出すことができます。

# バージョニング機能

オブジェクトの世代管理ができます。

# ライフサイクル管理

バケット内のオブジェクトに対して、自動でストレージクラスを移動したり、削除したりするよう設定ができます。

# おわりに

今回はS3をまとめました。
次回はRoute53について学習します。

# 参考

* [BlackBelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
全個人開発者に告ぐ！ デザインを学べ！

# はじめに
どうも、最近デザインを意識するようになった人です。

# 技術力とデザイン力は反比例する
先にはっきりと言わせてもらうが、お前らのwebサイトはダサい！
かくいう自分のwebサイトもダサい！

どうせ、原色使ってたり、情報を全て並べただけとかになってるだろ。
~~（過去の自分）~~

決して、原色を使っている人たちを全て否定しているわけではない。
使い所によっては原色はいいアクセントにもなる。

情報を全て並べることも悪ではない。
しかし、使い所によっては、（悪い意味で）ラスボス的存在になりうる。

# じゃぁ、どうすればいいの？
自分の経験やその道に詳しい人たちの話や記事を調査した結果をまとめてみた。

## 色
そもそも、原色を使ってる人は今すぐその行為をやめた方がいい。
原色を使い続けると、主張が激しすぎて、目が疲れてくる。

自分としては、「material color」と呼ばれる色を使うのが良いと思う。

カラーパレットをいくつか集めたので、載せとく。

https://material.io/resources/color/

https://materialui.co/colors/

https://www.materialpalette.com/

https://materializecss.com/color.html

## レイアウト
レイアウトはとてもむずかしい。
意識していたとしても、ついついダサいUI/UXを作ってしまいがちだ。

そこで、[Vuetify](https://vuetifyjs.com/ja/)というVue.jsのライブラリを紹介しておこう。

このライブラリはVue.jsに多数のコンポーネントを追加するものだ。
これらのコンポーネントは、マテリアル・デザインと呼ばれるものらしく、
まさに、「理想形」と言えるだろう。

~~知らんけど~~

## アニメーション
Web開発をしたことある人なら、「CSS」を使ったことがあるかもしれない。
そんなCSSで作れるアニメーションのことを「CSSアニメーション」という。

https://www.yui540.graphics/

この「臆病な魔女」は、 [@yui540](https://twitter.com/yui540) によってつくられた、CSSアニメーションがふんだんに使用されたポートフォリオサイトだ。

ここまでしなければいけないわけではないが、CSSアニメーションを使用することで、ワンランク上のwebサイトを作ることができる。

このcssアニメーションを勉強するにあたり、まずは、cssのプロパティの、`animation`と`transition`を学ぶとよい。

基礎が大体理解できたら、既存のプロジェクトのコードを解析するのがいいとおもう。
最終形態があるため、「ここがこうなれば、こうなるのか」ということを考えながらcssアニメーションを学習できる。

# 自分が意識していること
情報を並べただけだと相手に伝わりづらいのは、少しでも考えればわかるだろう。
しかし、それを考えていたとしても、実行できるかは別というのは理解している。

そこで、
「自分のwebサイト、カッコイイ/カワイイ？」
という風に、自分を常に疑いながらwebサイトを作ることで、デザイナーではない君たちでも、「カッコイイ/カワイイ」webサイトに近いものを作ることができると思う。

# おすすめの本
自分は、勉強するにあたり、本もいくつか買った。
その中での一押しを紹介する。

https://coco-factory.jp/ugokuweb/

【動くWebデザインアイデア帳】
この本がイチオシだ。

二つ種類があるが、大雑把に説明すると、

- 黄色い方は、「ヘッダー・フッター等、"外側"のアニメーション」
- 赤色い方は、「テキスト・ボタン等、"内側"のアニメーション」

のことが書かれている。

webサイトを動かすことを詳しく解説しているのは、黄色い方なので、
「webサイトのデザインを学びたい」というのであれば、黄色い方をおすすめする。

一方で、「自分が作りたいものははっきりしてる」という人は、赤色い方をお勧めする。
こちらは、テキストの現れ方やボタンの動き、画像の動きなどのサンプルがあるので、いい刺激になると思う。

# 結論
デザインをろくに学ばずにweb開発を始めた人は、「ダサいwebサイトしか作れない症候群」になってる可能性が高い。

「技術力とデザイン力は反比例する」
などと言われたくないだろ？

デザインにあまり触れない人たちには、デザインに少しでもいいから触れてほしい。
セカイが変わる。

# 最後に
具体的な勉強法を提示しておく。

**自分専用カラーパレットを作る**

これは、上で述べた「色」・「レイアウト」・「アニメーション」これら三つの要素すべてが関わってくる。

カラーパレットを作ることで、
自分が好きな色やクールな色を探すうえで、「色」と向き合うことができたり、
「使いやすいレイアウトはどのようなものなのか」と、レイアウトを一生懸命考えたり、
アニメーションを使った演出を学んだりもできる。

---
最後に一言、

**「全個人開発者に告ぐ！ デザインを学べ！」**
フォルダパスに"]"が複数個含まれる場合でも、シート名だけを取り出す関数


=MID(SUBSTITUTE(CELL("filename",A1),"]","★",LEN(CELL("filename",A1))-LEN(SUBSTITUTE(CELL("filename",A1),"]",""))),
FIND("★",SUBSTITUTE(CELL("filename",A1),"]","★",LEN(CELL("filename",A1))-LEN(SUBSTITUTE(CELL("filename",A1),"]",""))))+1,31)
cake.jpのカートを改善してみました


## 背景

もうすぐクリスマスなので、ケーキを買いたいなと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/e568f318-d2a0-c945-5ff3-c43dfe4dd4a4.png)
ちょうどこの前誕生日ケーキを買う時に利用した`cake.jp`というサイトがあり、今回は、このサイトで利用する時に気に入らなかった商品カートのUXを改善してみました。

## 現状

- 買い物カートの商品リストから、該当商品の詳細ページへの遷移ができない
- カートページのロゴから、HPへ遷移できない

## 目標1

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/f274b8c2-8b00-f077-a1fa-0f3632146668.png" width="70%">

## 目標2
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/5b3575a6-4abd-7e28-3b2a-3b51a81e7b8e.png" width="50%">


使用したツール

- tampermonkey(https://www.tampermonkey.net/)
- chrome developer tools(https://developer.chrome.com/docs/devtools/)

## やってみる

既知しているのは、サイトにある商品ページはこんなURLになっています（`https://cake.jp/item/0123456/`）

よって、商品ページへ遷移できるために、該当商品の商品番号を知る必要があります。

ただ、一見カートでは商品番号を表示されていませんが、実際はどうでしょう。ChromeのDeveloper Toolsを開き、カートにある商品のコードを見てみると、こんな感じのコードが入っています。


```html
<!--省略-->
<input type="hidden" name="item_id" value="実際のitem_idがここに入っています">
<!--省略-->
```

これがあれば、該当商品のinputのvalueを使って、詳細ページへのリンクを作成できそうだね！イメージ的にはこんな感じになります。

新しいelementを作成して（newElement）
↓
newElementに遷移先のURLを設置
↓
既存elementの前にnewElementを移動して
↓
最後既存elementをnewElementの中に移動すれば完成

### コードのイメージ

```jsx
// Create new a element
var newElement = document.createElement("a")

// Set href
newElement.setAttribute("href", itemUrl);

// Get exist element
var existElement = document.getElementsByTagName('tag name')

// get parent node of existElement
var parentNode = newElement.parentNode

// insertBefore
parentNode.insertBefore(newElement, existElement[0])

// put existElement into new element 
newElement.appendChild(existElement[0])
```

これで終わりかと思ったら、１つ問題があった。

今回使用されている情報源が、一部のカート商品しか持っていないことです。


## 別の対応策を考える

Developer Toolsからもう少し調べてみると、`window.dataLayer`に、カートにある商品のitemListが入っていることが分かりました。

これを使って該当商品のURLを作ることが可能になりました！


最終的なコードはここで見れます。
https://greasyfork.org/en/scripts/437141-cake-jp-cart-better/code


## 終わりに

商品カートの画像が該当商品に遷移できなくてイライラしてて、修正してみました。
必ずしも最善のコードを書いたと思っていないが、まぁいいっか
皆さんも何か使いにくいなと思ったらやってみてね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/5e9f1654-3224-bb4b-a594-fd4f6944a4f5.png)
Pythonエンジニア認定基礎試験を受けてきました。

Pythonエンジニア認定基礎試験を受けてきました。

# 受験しようと思ったキッカケ
単純にPythonに興味があったのと、[受験宣言して教科書のPython本をもらおう！（応募は2022年3月末日まで）](https://www.pythonic-exam.com/archives/news/555camp)で無料でテキストがもらえるので、今年中に受けてみようとなりました。

# 参考資料
Python本に申し込んだはずですが届かず…ということで公式サイトと模擬試験で学習しました。

- [公式チュートリアル](https://docs.python.org/ja/3/tutorial/)
- 模擬試験
    - [PRIME STUDY](https://study.prime-strategy.co.jp/)
    - [DIVE INTO EXAM](https://diver.diveintocode.jp/dive_into_exam)
    - [TRAINO CAMP](https://camp.trainocate.co.jp/)

# 学習方法
Pythonに興味があったので業務の簡単ツールをPythonで作ったりしていたので本当に基礎の構文は知っていました。
なので、模擬試験から始める方法で以下を6回程度繰り返しました。

1. 模擬試験を受ける
1. 試験問題で分からなかった単語をメモる
1. チュートリアルで分からなかった点を調べる
1. 構文の問題であれば実際にプログラミングをして確認する

チュートリアルがとにかく読み難かったので [Pythonチュートリアル(1章)の内容を箇条書きでまとめた](https://qiita.com/Wakii/items/543a60237060849326b8)のようなまとめサイトで知識を整理していきました。

基礎的な知識があったので学習時間の合計は40時間程度だったと思います。点数は950点でした。

# ポイント
チュートリアルの文章が分かり難いので自己理解した内容はプログラミングをして確認した方が良いです。
視覚と同様に手で覚える感じです。
また、単純に写経するだけでなく、仮説を立てて検証すると理解が深まります。
例えばタプル同士の比較で (1,2,3) > (1,2,4) のTRUE/FALSEの結果を確認するだけでなく、数値を1つ変えて実行という感じで一ひねりしながら確認していきました。

# ポイント2

- / はfloatが返る
- // はintが返る
- zip（タプルが作られる）
- 関数の引数（キーワード引数を使った時のOK/NG）
- 2重for文のラムダ式
- else:
    - for & continue & break & else:
    - try & except & else: & finally
- ミュータブル(list)／イミュータブル(tupple, string）
- 関数のデフォルト引数の決まるタイミング
- pipコマンド（show,list,upgradeの意味）

関数の引数でキーワード引数とデフォルト引数の組み合わせは意外とイメージができませんでした。

盲点なのは else: の扱いでした。if以外で馴染みのないelseの動きをちゃんとプログラミングして確認しておいた方が良いです。特にforとtryの組み合わせの時の実行順番や特徴をシッカリと理解しておかないと混乱します。（私はC#に触れる機会が多かったので try & finally & catch の習慣が抜けずに、先にfinallyが動作するのでは？と悩みました。

後は模擬試験の問題を読んで気になったものを確認して覚えておけばOKです。
Selenium webdriverの仕様&仕様変更でちょっとつまづいた話

先日、とあるサイトのクローリングのためにスクリプトを書くことになったが、getリクエストをしただけでは取ってこれないサイトであったためSelenium-webdriverを使うことになった。
しかし結構いろんなことで躓いたのでメモとして残しておく。

## ① xpathの指定の際に添え字が使えない(これが大問題)
例えば、id=fugafugaのdiv→div→ulの中に

```example.html
<li class="hoge">
    <div>
        <label class="hoge-label">
            <input type="checkbox" class="hoge-checkbox" value="目的のテキスト1">
            <span class="hoge-labelText">目的のテキスト1</span>
            <span class="hoge-count">目的のテキスト2</span>
        </label>
    </div>
</li>
<li class="hoge">
    <div>
        <label class="hoge-label">
            <input type="checkbox" class="hoge-checkbox" value="目的のテキスト1">
            <span class="hoge-labelText">目的のテキスト3</span>
            <span class="hoge-count">目的のテキスト4</span>
        </label>
    </div>
</li>
これが続く...
```

このようにli属性がたくさん書かれていて、
「目的のテキスト1,2,3,4…」の部分をxpath経由で取ってきたいとなった場合、
Chromeのデベロッパーツールでxpathをコピーすると

```python
//*[@id="fugafuga"]/div/ul/li[1]/div/label/span[1]
//*[@id="fugafuga"]/div/ul/li[1]/div/label/span[2]
```

このようなフォーマットで出てくる。

しかし、これをそのままぶちこんで

```python
driver.find_element(By.XPATH,f'//*[@id="fugafuga"]/div/ul/li[1]/div/label/span[{i}]')
```



なんてしてforループで回そう...なんて方法は使えない。
どうやら挙動を見たところ、Selenium-webdriverのfind_elementsは
**マッチした要素を順番に配列に格納していく**ようである。
(ちなみにマッチした要素は　`selenium.webdriver.remote.webelement.WebElement`で返ってくる)
そのため、今回の場合は

| liの添字 | 1つめのspanが格納される添字 | 2つめのspanが格納される添字 |
|:-:|:-:|:-:|
| 0  | 0  |  1 |
| 1  | 2  | 3  |
| 2  | 4  | 5  |
| $\vdots$  | $\vdots$  |  $\vdots$  |
| n  | 2n  | 2n+1  |
なので、

```python
driver.find_elements(By.XPATH,'//*[@id="fugafuga"]/div/ul/li/div/label/span')[2*i].text
driver.find_elements(By.XPATH,'//*[@id="fugafuga"]/div/ul/li/div/label/span')[(2*i)+1].text
```

とすることでようやく出てくるのである。ちょっとした算数。

これが更に上の階層でも添字が用いられている場合は図や計算が複雑になるので省くが、ちょっと計算することになるという点にだけ注意。


## ② 画面遷移を挟む際に適当にsleepしないとStaleElementReferenceExceptionになる(当たり前)

```python
driver.get('https://google.co.jp')
```

のようにページ遷移や更新などの処理をした際、ページが完全に読み込まれていないのに
即属性指定→クリックのような動作を行おうとするとエラーが出る。
ちゃんと適切な秒数sleepすること。

## ③find_elementとfind_elementsの違い
| メソッド | 戻り値 |
|:-:|:-:|
| find_element  |  要素一つ |
| find_element **s**   |  マッチした要素が格納された配列 |
適宜使い分けること。


## ④driver.find_element_by_*が非推奨になった(超重要)
selenium-webdriverは最近仕様変更が行われ、以前は

```python
driver.find_element_by_xpath('hoge')
```

で要素取得できていたものが

```python
driver.find_elements(By.XPATH,'hoge')
```

のように
`By.*`で第一引数に指定しなければならなくなった。
また、これを使うときには

```python
from selenium.webdriver.common.by import By
```

でインポートしてやらなくてはならない。
詳しくはここを参照すること。
[find_element_by_* commands are deprecated in selenium - StackOverflow](https://stackoverflow.com/questions/69875125/find-element-by-commands-are-deprecated-in-selenium/69875984)

## おわりに
添字が使えないってのはちょっとショックだった。
こういう感じでたまーに仕様変更があったりすると既存のサイトの情報が全く使えないなんてこともあるので気をつけなくては...
Udemy講座を受講した感想：みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】

#まず初めに

本記事ではUdemyの下記の講座を受講したため感想を書かせていただきます。
なお、事前にUdemy講座の講師から許可を頂いています。

Udemy講座URL
[みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】](https://www.udemy.com/course/learning-ai/)

#受講した感想

結論から申し上げますと、受講してよかったと思いました。
AI全般に関して、なるべく難しい数式等は用いずに図やコードなどを用いずに
丁寧に説明されていました。
主に下記4つについて重点的に紹介されており、
特に誤差逆伝播法については本講座の説明が一番頭に入りました。

 - Pythonの基礎
 - 活性化関数(シグモイド関数)
 - ニューラルネットワーク
 - 誤差逆伝播法

また、開発環境はGoogle Colaboratoryを前提に講義が進められていました。
そのため、初心者も簡単に環境を用意しやすい、また容易にコード実行しやすいといった点
もメリットとして挙げられます。


#注意点

この講座は基本的に初心者を対象としているため、
もっと詳細まで理解を深めるためには
他のUdemy講座や書籍などを購入する必要があります。
特にCNNやRNN、GAN、強化学習などは
講座内にておすすめのUdemy講座や参考書の紹介もありました。

#参考文献

[みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】](https://www.udemy.com/course/learning-ai/)
【UX】エンジニアも学ぶべきUXデザインのコツ ~インタビューから解決策の選定まで~

#はじめに
半年ほど前にUXデザインの方法に関する記事を書いてから、プロジェクトで様々なUX改善の提案をしてきました。
これまでは提案だけでしたが、インタビューやペルソナ作成などのユーザ理解の部分についても自分でやってみたくなったので(元々営業だし)、それらのコツを勉強して自分用にメモとして記事にまとめることにしました。

https://qiita.com/suzuki0430/items/4a04e63a36cbfbefa948

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/156c36d1-44fe-44ae-21a2-c2da74ee6d56.png)

#インタビューのコツ
インタビューの環境、入り方、進め方について、それぞれ以下のような工夫を行います。

##インタビュイーが話しやすい環境をつくる(環境)
- インタビュイーが萎縮しないようにインタビュアーと書記を最小限の人数(1人ずつ)にする
- インタビュイーと心理的距離を近づけるためにインタビュアーは正面に座らない(斜めの席に座る)
- インタビュイーの視界に書紀が入らないようにする

##インタビュイーが話しやすい雰囲気をつくる(入り方)
- インタビュイーの緊張をとくために、最初の10分間は悩まずに答えられる質問を行う 

ex.) 名前はなんですか？、インタビューはじめてですか？、電車できましたか？など

##正しい情報を引き出す(進め方)
- 仮定ではなく事実を問う(〜のとき〜でしたか？のように過去を問う質問など)
- オープンクエスチョンをつかう
- 相手が黙っても選択肢を与えずに回答を待つ(答えを誘導しない)
- 回答をWhyで深ぼる(なぜ?の多用に注意し聞き方を都度変える)

#ペルソナ作成のコツ
ペルソナは、ユーザに共感して理解しやすくするためにつくるものです。

とはいえ、自分のアプリを使ってなさそうな人をペルソナに設定しても、そのペルソナにとっての課題を解決したところで、自分たちが目指すUXデザインのゴールには近づきません。
そのため、ペルソナでは特殊な設定を避けるようにします。
いくつかの特殊な層の人々のためにUXデザインを行いたいのであれば、その分、複数のペルソナを作成します。

ペルソナに設定する項目としては以下の項目などが一般的ですが、UXデザインを行うアウトプットによってその項目を増減させてあげます。

- 名前
- 年代
- 性別
- 未既婚
- 職業
- 居住地
- 年収

例えば、アウトプットがスマホアプリであれば、以下の項目も増やしてあげる必要があるかもしれません。

- 趣味
- スマホ機種
- ブランド
- 利用アプリ
- 利用サービス
- 好きなサイト

#行動仮説のコツ
ユーザ理解や課題発見のフェーズで行う行動仮説や課題仮説の構築についてもコツがあります。
行動仮説は、相手になりきることで自分のアウトプットがどのような相手に必要なのかの本質を探ることです。
一つずつの行動がどのような時系列で行われるかを考えて並べます。

以下が行動を考えるコツとなります。

- 動詞で書き出す
- 主語をペルソナにする
- 行動の単位を細かくして間を埋める

#課題仮説のコツ
課題仮説で大事なのは行動の裏側にある感情を考えることですが、これを行うために様々なコツがあります。

##期待から課題を導く
行動から課題が思い浮かばない場合、まずは行動から期待されるものを考えます。
そして、期待をひっくり返して考えることで課題を導くことができます。

以下が期待から課題を導く例です。

行動：アプリを起動する
期待：早く起動したい 
 ↕
課題：起動に時間がかかる

##課題を深ぼって根本原因をみつける
課題をみつけたら、Whyで深ぼって根本原因を見つけます。
このように、課題にはレベルがあることを理解する必要があります。

##課題と行動を紐付ける
行動仮説で時系列に並べた行動に課題を紐付けます。

最後に注力課題を選ぶコツですが、これは以下の観点で行うのが重要です。

- 設定したゴールを達成できるかどうか
- ユーザーがより喜ぶかどうか

#アイデア出しのコツ
アイデア出しの目的は注力課題の解決策をみつけることです。
ペルソナ作成のように制限を考慮した上で選別するわけではなく、アイデア出しでは制限を考えずに自由に発想することが重要なので、以下のことを意識するようにします。

- 質より量
- 恥ずかしがらない
- 自分で価値を決めつけない
- 実現性は後で考える

また、アイデア出しでは、課題に対して「どうすれば〜できるだろうか？」というH(ow) M(ight) W(e)視点で方向性を広げてあげることも大事です。
ex.) 課題：買い物中に子供が退屈する → アイデア：どうすれば買い物せずにすむだろうか？、どうすれば子供なしで買い物ができるだろうか？など

そしてHMWで広げたアイデアに対してCrazy8で解決策を考えていきます。

https://goodpatch.com/blog/crazys8

#収束(解決策の選定)時のコツ
たくさんの選択肢の中から最適な解決策を選別する収束のフェーズにおいて、以下を考慮するのが大事です。

- 設定したゴールを達成できるか
- ペルソナにとってうれしいか
- バランスがとれているか

ペルソナにとってのうれしさを考えるというのは、「その課題を解決するとどれほどうれしいか？」「その解決策でどれほど喜ぶか？」を考えることと同義となります。
これらをリスト化したときに横に表情のイラストも添えると、その解決策の重要性が視覚的にわかりやすくなります。

また、バランスというのは、その解決策が社内リソースやセキュリティや法律などのユーザ視点以外の部分で実現可能であるのか、といったことを考慮することです。
このような資源面や技術面についても、収束のフェーズでは重要な視点となります。

#参考資料

https://www.udemy.com/share/104eC03@pVkcExEmxYwTmPwPnTCc18Opyd2zlgBbx_4aRNupDgVuMWeeISvOM6RxILQwF8zi/
負の数

##負の数のあらわし方
単純に「負の数を表せればいい」という考え方なら、やり方は様々です。最も単純なところでは、「先頭のビットは符号にするね」と決めてしまう方法があります。

前提として先頭の1ビットが0なら正の数、1なら負の数にする。そこで、例えば10進数の「3」を2進数の8ビットで表すと...

正の数 00000011 (3)
負の数 10000011 (-3)

ところが、これだと「足し算だけで引き算も済ませる」ことはできません。

 00000011 + 10000011 = 10000110
⇒3と-3を足したら0にならないといけないはずなのにそうなっていない!
***
###補数
そこで出てくるのが補数という表現方法です。

<font color="tomato">補数</font>とは言葉の通り「補う数」という意味。補数の種類には「__その桁数での最大値を補う数__」「__次の桁に繰り上がるために補う数__」という2つの補数が存在します。
…と書いただけじゃよくわかんないと思うので、10進数の数字を例に実際の数字を見てみましょう。
*例* :123 (10進数で3桁の数字があったとします。)
【9の補数】
  __999__ ➡ __999__-123=<font color="tomato">876</font>←これを"<font color="tomato">9の補数</font>"と呼びます。
↑(3桁の最大値)

 ⇒いくつ足せば__999__(最大値)になるかというと...__876__!
つまり876という数値を補ってやれば最大値が得られます。

【10の補数】
 __1000__ ➡ __1000__-123=<font color="tomato">877</font>←これを"<font color="tomato">10の補数</font>"と呼びます。
↑(次の桁に繰り上がる数)

⇒いくつ足せば__1000__(桁上り)になるかというと...__877__!
つまり877という数値を補ってやれば桁上りの数が得られます。
***
このような10進数でいうところの「9の補数」「10の補数」と同じものが、2進数にもあるわけです。2進数では、「__1の補数__」「__2の補数__」という２つの補数を使います。
*例* :0011 (2進数で4桁の数字があったとします)
【1の補数】
 __1111__ ➡ __1111__-0011=<font color="tomato">1100</font>←これを"<font color="tomato">1の補数</font>"と呼びます。
↑(4桁の最大値)

⇒いくつ足せば__1111__(桁上り)になるかというと...__1100__!
つまり1100という数値を補ってやれば最大値が得られます。

【2の補数】
 __10000__ ➡ __10000__-0011=<font color="tomato">1101</font>←これを"<font color="tomato">2の補数</font>"と呼びます。
↑(次の桁に繰り上がる数)

⇒いくつ足せば__10000__(桁上り)になるかというと...__1101__!
つまり1101という数値を補ってやれば桁上りの数が得られます。

この２の補数を使ってある計算をしてみますとですね...。
 00000011 + __11111101__ = <font color="lightgray">1</font>00000000←桁あふれは無視
 3  +  (__-3__) = (0)

8ビットの２進数00000011(3)と、その数の2の補数11111101(-3)を足し算すると桁上りした数になります。この時、8ビット目からあふれ出てしまった9ビット目を無視して8ビット部分だけ見れば全部0になります。
このように、ある数値に対する2の補数表現は、そのままその数値の負の値として使えるというわけなのです。このことから、コンピュータは<font color="tomato">負の数をあらわすのに2の補数を使います</font>。2の補数は、次のようにすると簡単に求めることができます。
 00000011　⤵ 全てのビットを反転させる(0と1を入れ替える) <font color="tomato">(3)</font>
 11111100　⤵ それに1を加算すると...
 11111101　 ➡__2の補数__ <font color="tomato">(-3)
</font>
***
###引き算の流れ
それでは実際に例を用いて、引き算の流れを見てみることにしましょう。ここでは「5-3」という式の場合どうなるかを見てみます。
0101(5) - 0011(3) ⤵
0101(5) + (-0011) ⤵ これはこのような足し算で表せるので
0101(5) + 1101(<font color="tomato">-3</font>) ⬅2の補数表現を使ってこう書くことができる
 つまりコンピュータはこのような足し算を行って...
0101(5) + 1101(<font color="tomato">-3</font>) = <font color="lightgray">1</font>0010(__2__)
 「2」という答えを得るわけです。

ちなみに、2の補数を用いて負の数をあらわす場合も、1ビット目は符号として扱うことができます。正の数と負の数は、互いに2の補数表現となる関係にあります。
0000(0)
1111(-1) ⇔ 0001(1)
1110(-2) ⇔ 0010(2)
1011(-5) ⇔ 0101(5)
1010(-6) ⇔ 0110(6)
1001(-7) ⇔ 0111(7)
1000(-8)
bitとn進数

#bit
1と2で表せるもの。
「オン」「オフ」しか表せない最小の単位。
いわば一個の電球:bulb:で一個一個はオンとオフしか表現できないが、いっぱい集まることで色んな文字や図形を表現できる。(例:電光掲示板)

#n進数
10進数 = 0~9の10個の数字で表す
(0,1,2,3,4,5,6,7,8,9→10...)

2進数 = 0と1の2個の数字で表す, <font color="SlateBlue">bit</font>
(0,1→10,11...)　

8進数 = 0~7の8個の数字で表す
(0,1,2,3,4,5,6,7→10,11...) <font color="PaleVioletRed">7で桁上がり</font>
このように8進数は一つの桁で0~7の数値を表現します。これは2進数にすると0~111の範囲に相当します。つまりひとつの桁で000~111→2進数3桁分の情報を表現することができます。

 16進数 = 10個の数字と6個のアルファベットで表す
(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F→10,11...) <font color="PaleVioletRed">Fで桁上り
</font>
Laravel Docker AWS EC2デプロイ④

前回に続き、今回は起動させたアプリの動作確認や必要なコマンド作業を行なっていきます!

https://qiita.com/yyy752/items/b9d7674fc349f669e801

https://qiita.com/yyy752/items/601646d3683869521f9b

https://qiita.com/yyy752/items/9cec9c44e8a389cb9c18

##必要コマンドの実行
###1.シンボリックリンク作成
先ず、画像アップロード機能を使えるようにするためにシンボリックリンクを作成します。

```
[root@ip-172-31-45-44 backend]# php artisan storage:link
The [/var/www/laravel-zaikokanri/backend/public/storage] link has been connected to [/var/www/laravel-zaikokanri/backend/storage/app/public].
The links have been created.
```

###2.シード実行
次にシードを実行して事前に用意していたアカウントを作成します。
ここは人それぞれなのでご自身の環境に合わせて実行してください。

```
[root@ip-172-31-45-44 backend]# php artisan db:seed --class=UserSeeder
Database seeding completed successfully.
```

###3.S3の設定
画像アップロード機能を使えるようにする為に.envへS3の設定を追加していきます。

```
AWS_ACCESS_KEY_ID=???????????????
AWS_SECRET_ACCESS_KEY=????????????????
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=zaikokanri
```

設定内容が入力できたら、.envの修正内容を反映させる為にキャッシュをクリアします。

```
php artisan cache:clear
```

##動作確認
ここでログイン画面からログインして各機能の動作確認をしていきましょう！
問題なく動作すれば、EC2/RDSのインフラ環境でアプリが動作したということになります！

今回は一旦ここまでで終了。
次回は独自ドメインを購入し、SSL化の設定などを進めていきます！

https://qiita.com/yyy752/items/0141d150d72a9a185e3f