OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt (Options API) で TypeScript を使う際に middleware や layout オプションを使うには

NuxtでTypeScriptを使う方法として、[Options API](https://i.gyazo.com/322fdd240b6ca8793af332148f423ee0.png), [Composition API](https://i.gyazo.com/cc7ad9429acc6885d3b646a8d2d0390c.png), [Class API](https://i.gyazo.com/e0cd0936084194694cd37cff35dc35f4.png) の3つの書き方が[公式ページ](https://typescript.nuxtjs.org/cookbook/components/#script)で紹介されています。

今回は Options API を用いることにしました。

## 環境

- Docker version 20.10.2
- docker-compose version 1.27.4
- node v12.20.1
- yarn 1.22.5
- Nuxt.js v2.14.12
- Visual Studio Code version 1.53.2
- Vetur 0.32.0 (VSCode Extention: Vue tooling for VS Code)

## middleware オプションや layout オプションを使おうとすると出るエラー
各ページ内で middleware オプションや layout オプションを使おうとしたところ、
![Error: No overload matches this call.](https://i.gyazo.com/bc38f9af842b4ba94a2ed9c7bf4d8508.png)
`No overload matches this call.` と出て、エラーになりました。

## 解決策

[こちらの記事コメント](https://qiita.com/kulikala/items/f11c37b7059d2a7572be#comment-6df850b23af56574b800)が参考になりました。

```
Project
 ├─ api
 ├─ app // ← Nuxt を使っているディレクトリ
 ├─ db
 ├─ nginx
 └─ docker-compose.yml
```
↑ 今回の場合はこのような階層になっており、作業ディレクトリは `app` です。

そこで、

```
Project
 ├─ api
 ├─ app
 ├─ db
 ├─ nginx
 ├─ docker-compose.yml
 └─ vetur.config.js // ← 追加
```

`vetur.config.js` を追加し、

```js:vetur.config.js
// vetur.config.js
/** @type {import('vls').VeturConfig} */
module.exports = {
  // **optional** default: `[{ root: './' }]`
  // support monorepos
  projects: ['./app']
}
```
↑このように記述してVSCodeを再起動すると、
![No Error](https://i.gyazo.com/a257b07ab65c56d813fdee4aebf62fc3.png)
エラーを解消することができました。

- VSCodeの拡張Veturを使っている
- 今回Nuxtを使っている `app` ディレクトリの他に `api` `db` `nginx` ディレクトリなど複数のワークスペースが存在する

ことが要因でVeturがフォルダを正しく解析できないことが原因だったようです。

## 型定義ファイル

さらに型定義ファイルを用意すると、VSCodeで予測変換を出すことができます。
[こちらの記事](https://dev.to/jaeheonjee/types-problem-nuxt-vuetify-with-vue-composition-api-33f2#vueshimsdts)を参考にして `ComponentOptions` の型を上書きしました。

今回は `app/types/index.d.ts` を用意して以下のような内容にしました。

```ts:app/types/index.d.ts
import { Context, Middleware } from '@nuxt/types'
import Vue from 'vue'

declare module 'vue/types/options' {
  interface ComponentOptions<V extends Vue> {
    layout?: string | ((ctx: Context) => string)
    middleware?: Middleware | Middleware[]
  }
}
```

VSCodeを再起動すると、`Vue.extend({})` の中で `layout` `middleware` オプションも予測変換で出るようになりました。

![type inference](https://i.gyazo.com/1927c11802aad1bfee6151846f586074.png)

## 参考

- [VSCode の Vetur で types/vue-shim.d.ts が有効にならないのはワークスペースにフォルダが複数あるから - Qiita](https://qiita.com/kulikala/items/f11c37b7059d2a7572be)
- [Types Problem: Nuxt, Vuetify with Vue Composition API - DEV Community](https://dev.to/jaeheonjee/types-problem-nuxt-vuetify-with-vue-composition-api-33f2)
bashで出力にダブルクォートをつける

# TL; DR

行ごとのやつ

```bash
$ echo -e "aaa bbb\nccc ddd" | jq -R .
"aaa bbb"
"ccc ddd"
```

列ごとのやつ

```bash
$ echo -e 'aaa bbb\nccc ddd' | sed 's/[^ ]\+/"&"/g'
"aaa" "bbb"
"ccc" "ddd"
```

## 動機

　bashで出力にダブルクォートを含める必要があるとき、エスケープを嫌ってシングルクォートを使いたくなる。

```bash
$ echo '"Hello, world"'
"Hello, world"
$ echo "\"Hello, world\""
"Hello, world"
```

　しかし変数を埋め込もうとするとシングルクォートは使えない。
　そこで上のようなちょっとした解決策が役に立つ。jqはjsonをシェルで扱うためのコマンドだ。sedのようにプリインストールされていないが、インストールしておいて損はない。

```bash
$ greeting=Bonjour target=monde
$ echo "$greeting, $target" | jq -R .
"Bonjour, monde"
```

　例えば、次のようにして標準出力をjsonのリストに押し込める。便利だ。

```bash
$ echo -e "Hello, world\nBonjour, monde" | jq -R . | jq -sc .
["Hello, world","Bonjour, monde"]
$ echo -e "Hello, world\nBonjour, monde" | jq -R . | jq -sc '{greetings: .}'
{"greetings":["Hello, world","Bonjour, monde"]}
```
SwiftUIで端末のロック/アンロックを検出できるようになるまでの道のり

SwiftUI初心者が端末のロック/アンロックを取得できるようになるまでの道のりを簡単にメモしておきます。

以前は[com.apple.springboard.lockcompleteをゴニョゴニョする非公開APIを使う方法](https://stackoverflow.com/questions/7888490/how-can-i-detect-screen-lock-unlock-events-on-the-iphone/57967050#57967050)で無理やり検出していたのですが、SwiftUIになってうまく制御できなかったため（なにぶん初心者で技術力が無いなもので・・・）、もうちょっとスマートな方法を調べました。

とりあえず以下を参考にしています。
- [【iOS】非公開APIを使わずにiPhoneのロック状態を検知する](https://qiita.com/shiba1014/items/63a7823160c26fcd1381)
- [How to set addObserver in SwiftUI?](https://stackoverflow.com/questions/58818046/how-to-set-addobserver-in-swiftui)
- [how to detect the locked/unlocked screen status with swift](https://developer.apple.com/forums/thread/70079)
- その他、Apple公式ドキュメントなど

# ContentView.swift
- UIApplication.protectedDataDidBecomeAvailableNotification
- UIApplication.protectedDataDidBecomeAvailableNotification


を検出することで、ロック/アンロック検出を代替できるようです。
ただし、本来は保護されたデータにアクセスできるようなった/できないようになったを検出するためのもので、パスワードロックされているとこれらのデータにアクセスできない（アンロックされるとアクセスできる）という仕組みを利用しているようです。
そのため、そもそも画面ロックのパスワードを設定していない場合は検出できません（未確認）。
とりあえず、ロック/アンロック回数を表示するようにしました。
```
NotificationCenter.default.publisher(for:UIApplication.protectedDataDidBecomeAvailableNotification)
NotificationCenter.default.publisher(for:UIApplication.protectedDataWillBecomeUnavailableNotification)
```
を設定しおておいて、それぞれの出力を.onReceiveで受け取るようにしています。

```swift:ContentView.swift

import SwiftUI

struct ContentView: View {
    
    @State var label_unlocked: String = "Unlocked: 0"
    @State var label_locked: String = "Locked: 0"
    @State var counter_unlocked: Int = 0
    @State var counter_locked: Int = 0
    
    //アンロックの検出用
    let pub_unlocked = NotificationCenter.default.publisher(for: UIApplication.protectedDataDidBecomeAvailableNotification)
    //ロックの検出用
    let pub_locked = NotificationCenter.default.publisher(for: UIApplication.protectedDataWillBecomeUnavailableNotification)
    
    var body: some View {
        
        VStack {
            Text(label_unlocked)
                .onReceive(pub_unlocked, perform: { _ in
                    self.counter_unlocked = self.counter_unlocked + 1
                    label_unlocked = "Unlocked: \(counter_unlocked)"
                })
            Text(label_locked)
                .onReceive(pub_locked, perform: { _ in
                    self.counter_locked = self.counter_locked + 1
                    label_locked = "Locked: \(counter_locked)"
            })
        }

    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```
画面ロック/アンロックの行為はセットになっているはずですので、表示される回数はどちらも同じになります。
[Python]beautifulsoupの取得結果が403 Forbiddenの原因と対策

#背景
[ココナラ](https://coconala.com/categories/231?ref=top_categories)のサービスランキングを確認したく、スクレイピングをやろうとしたら
403 Forbiddenが出力されたので原因と対策を備忘録しておく

# 症状
下記コードでsoupしたら```403 Forbidden```が出力された

```py
import requests
from bs4 import BeautifulSoup

target_url = 'https://coconala.com/categories/231?ref=header'
r = requests.get(target_url)

soup = BeautifulSoup(r.text,"html.parser")
print(soup)
```

よくやる典型例ですね

```py
import requests
from bs4 import BeautifulSoup
```
htmlを取得するために```requests```モジュールをインポート
取得したhtmlを解析するために```Beautifulsoup```をインポート

```py
target_url = 'https://coconala.com/categories/231?ref=header'
r = requests.get(target_url)
soup = BeautifulSoup(r.text,"html.parser")
print(soup)
```

htmlを取得するURLを定義して```getメソッド```で取得
取得したhtmlを```Beautifulsoup```で解析した結果を表示

本来ならhtml文が表示されると思ったところ
結果は下記になった。

結果

```
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>
```

## 原因
どうやら、ユーザーエージェントに問題があるらしい
ユーザーエージェントをFireFoxに変更したら取得できるとのこと

## 対策
原因が分かったのでユーザーエージェントを変更する方法を調べた
結果、```request.get(URL,headers=ユーザーエージェント(辞書型))```
こうするだけで上手くいきました。

下記にコードを載せておきますので参考に

```py
import requests
from bs4 import BeautifulSoup

ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
headers = {'User-Agent': ua}

target_url = 'https://coconala.com/categories/231?ref=header'
r = requests.get(target_url,headers=headers)
soup = BeautifulSoup(r.text,"html.parser")
print(soup)
```

```
<!DOCTYPE doctype html>

<html data-n-head="%7B%22lang%22:%7B%22ssr%22:%22ja%22%7D%7D" data-n-head-ssr="" lang="ja">
<head>
<title>プログラミングの代行依頼はオンラインでお得に！PythonやPHP、bot開発など豊富 | ココナラ</title><meta charset="utf-8" data-n-head="ssr"/><meta content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1" data-n-head="ssr" name="viewport"/><meta content="https://coconala.com" data-hid="og:site_name" data-n-head="ssr" 80d7194] .dropdown-content{display:-webkit-box;display:-ms-flexbox;display:flex;overflow-y:auto}.c-trigger[data-v-680d7194]{color:#111;-webkit-transition:opacity .2s;transition:opacity .2s}.c-trigger[data-v-680d7194]:link,.c-trigger[data-v-680d7194]:visited{opacity:1}.c-trigger[data-v-680d7194]:hover{opacity:.7}.c-trigger[data-v-680d7194]:active,.c-trigger[data-v-680d7194]:focus{opacity:1}@media (max-width:600px){.c-trigger[data-v-680d7194]:hover{opacity:1}}.c-trigger_icon[data-v-680d7194]{margin-left:4px}.c-loading[data-v-680d7194]{width:100%;min-height:120px;background-color:#fff}
[data-v-4e309438] .dropdown-content{display:-webkit-box;display:-ms-</script>(省略)
</body>
</html>

```
【kintone】数学で使うグラフを試してみた

数学で描くようなグラフをkintoneでも試してみようと思います。

# 2次関数のグラフ

y=0.5*(x-1)^2-5 

**Excelのグラフ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/55d421c7-8da7-7454-b614-d9630dfcd99b.png)

## アプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c977bf3a-1b8f-9e1f-226e-425bf17efca3.png)


## レコード一覧
xの値は、-10～10まで0.1刻みのレコードとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b67fbd29-d991-1c0d-764f-4684e8a36738.png)

## グラフの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7b8dc0ff-5363-96bd-6cb7-176d7e654784.png)

## できたグラフ
いい感じですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f8bd9822-b874-1058-0444-21920e939cd9.png)

## 2本目も追加できます
グラフにしたい計算フィールドを追加し、
集計方法にその計算フィールドを追加すると2本のグラフも描けます^^挑戦してみてね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b5743802-6a87-81be-7e17-2f2c45761a1b.png)

# kintoneでは表現できないグラフ 
## 反比例のグラフ
y = 50/x
という反比例のグラフを描いてみます。
※xの刻み幅は0.5に変更しました。

x=0 のときに値がない状態（∞）がERROR!。kintone上では値としては「0」になってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3324e81d-ced5-bfb2-25fd-68a3c62d5588.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/fc7000f7-d9c7-8805-f0e8-578f6f517b15.png)

x=0を条件から外してみると、0の刻み自体が消滅してしまいます。
さらに、x=-0.5とx=0.5の点がつながってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3f525876-b750-b1ac-cebf-5101e7c65544.png)

# まとめ
ある程度簡単なグラフは描くことができます。

数学的なグラフを描きたい場合は横軸になる値(x)は必ず等間隔で登録する必要があり、
すべてのxに対してyが存在するようにレコードを準備する必要があります。
また、エラーや空白のyは0となってしまいます。

ゆるがないx軸、y軸があったらいいなぁ～。
【C#】約数を高速で算出するアルゴリズム

# はじめに
競技プログラミングでは約数を算出しなければならないシーンが出てくるが、元の数があまりにも大きいと普通の全探索ループでは計算量が膨大になってしまってタイムアウトを起こしてしまう場合がある。
そういった場合は、「約数列挙」というアルゴリズムを使用することで、少ない計算量で高速に約数を算出することができる。

# 約数列挙の仕組み
i(ループ値) = 1から割っていき、割り切ることができればその値は約数であり、その値を2乗した値も約数であるという性質を利用したアルゴリズム。

#サンプルプログラム
```C#:SamplePG.cs
using System.Collections.Generic;
using static System.Console;

class SamplePG
{
    static void Sample()
    {
        //約数を算出したい値
        long N = 100;
        //算出した約数を格納するリスト
        List<long> ans = new List<long>();

        //--------
        //約数列挙
        //--------
        //iが割り切れたらiの2乗も割り切れるので、Forループの条件はi*iで加算していくように設定する
        //大きな値にも対応できるようlong型でループする
        for (long i = 1; i * i <= N; i++)
        {
            if (N % i == 0)
            {
                //iの値が割り切れるなら約数なのでリストに追加
                ans.Add(i);

                //iと(N/i)が同じ値でない時は(N/i)の値もリストに追加する(約数である)

                //ex:N=100のとき、i=2,N/i=50
                //ex:N=100のとき、i=10,N/i=10

                //↑昇順と降順で走査してるのでいずれ値がぶつかる。
                //ぶつかった値を入れてしまうと同じ値が二重にリストに追加されてしまうのでそれを避ける。
                if (i != N / i)
                {
                    ans.Add(N / i);
                }
            }
        }

        //リストを昇順にならべかえ
        ans.Sort();

        //順番に出力
        foreach (var item in ans)
        {
            WriteLine(item);
        }
    }
}
```

#出力結果
```
1
2
4
5
10
20
25
50
100
```
Ubuntu で BD フォルダを ISO 化

Ubuntu で BD フォルダをISO化します。

こういう様な BD フォルダをISO化します。

````
└ AACS
└ CERTIFICATE
└ BDMV
 　└ AUXDATA
　 └ BACKUP
 　└ BDJO
 　└ CLIPINF
 　└ JAR
 　└ META
 　└ PLAYLIST
 　└ STREAM
 　└ info.bdav
 　└ MovieObject.bdmv
````

mkisofs というコマンドを使用します。
デフォルトで使用できるかと思います。

````bash
mkisofs -udf -allow-limited-size -input-charset "utf-8" -o "output_name.iso" "target_dir_name" ;
````

ちなみに ISO化されたファイルを mkv 動画にするには makemkv というソフトを使うと１つの動画ファイルに変換することができます。

````bash
sudo snap install makemkv ;
````

あとは vlc で再生ができるか確認を行います。

####参考リンク
- [how do you create an .iso file from a bdmv folder? / Multimedia and Games / Arch Linux Forums ](https://bbs.archlinux.org/viewtopic.php?id=191400)
- [Install MakeMKV on Ubuntu using the Snap Store | Snapcraft ](https://snapcraft.io/install/makemkv/ubuntu)
ブロック変数

```ruby
<% @comments.each do |comment| %>
 <p>
  <%= comment.text%>
  <%= Link_to"#{comment.user.name}",root_rath,class: :comment %>
 </p>
<% end %>
```
ブロックとは、do〜endまでです。
ブロック変数とは、|comment|のことをいいます。メソッドからパラメータが渡されます。

do〜end内のcommentは、|comment|のことを指しており、
commentの情報内からuser.nameを取得するという意味もあります。
Ubuntu に音楽配信サーバーをインストールする

Ubuntu に音楽配信サーバーをインストールします。

インストール

~~~bash
sudo apt-get install forked-daapd ;
sudo mkdir -p /home/media/daap ;
sudo chmod 777 /home/media/daap ;
sudo gedit /etc/forked-daapd.conf ;
~~~

設定変更

~~~text:forked-daapd.conf
# Directories to index
directories = { "/home/media/daap" }　#←共有ディレクトリのパスに変更。
~~~

設定反映と起動

~~~bash
sudo service forked-daapd restart ;
sudo service forked-daapd start ;
sudo service forked-daapd status ;
~~~~

Webから状態を確認する
http://localhost:3689/#/

最新のプログラムをコンパイルしてインストールを行う場合（管理できる分、上のほうがいいかも）

~~~~bash
sudo apt remove forked-daapd ;
sudo apt install -y \
  build-essential git autotools-dev autoconf automake libtool gettext gawk    \
  gperf antlr3 libantlr3c-dev libconfuse-dev libunistring-dev libsqlite3-dev  \
  libavcodec-dev libavformat-dev libavfilter-dev libswscale-dev libavutil-dev \
  libasound2-dev libmxml-dev libgcrypt20-dev libavahi-client-dev zlib1g-dev   \
  libevent-dev libplist-dev libsodium-dev libjson-c-dev libwebsockets-dev     \
  libcurl4-openssl-dev ;
git clone https://github.com/ejurgensen/forked-daapd.git ;
cd forked-daapd ;
autoreconf -i ;
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var ;
make -j4 ;
sudo make install ;
sudo mkdir -p /usr/local/var/run ;
sudo mkdir -p /usr/local/var/log ;                                                                                    
which forked-daapd ;
sudo /usr/sbin/forked-daapd ;
~~~~

Webから状態を確認する
http://localhost:3689/#/

iPhoneのホームシェアリングが使えるかなあって思ったけど何やらアップルのライセンスの都合上、不可能なようです。
おとなしくwifiで同期などを行いましょう。

公式では直接mp3を開いてねって感じです。

~~~~
http://192.168.0.xxx:3689/mymusic.mp3
~~~~

Android なら使えるような（まだ未検証）
####参考リンク
- [Ubuntu サーバの設定　音楽共有サーバー: プログラマの歩き方 ](http://zorinos.seesaa.net/article/416449775.html)
- [ejurgensen/forked-daapd: Linux/FreeBSD DAAP (iTunes) and MPD media server with support for AirPlay devices (multiroom), Apple Remote (and compatibles), Chromecast, Spotify and internet radio. ](https://github.com/ejurgensen/forked-daapd)
- [PCのiTunesコンテンツをWi-Fi上のデバイスと同期する - Apple サポート ](https://support.apple.com/ja-jp/guide/itunes/itns3751d862/windows)
vscode-iconsをカスタマイズして、オシャレなエクスプローラーを実現しよう！

Visual Studio Codeのエクスプローラーのアイコンをリッチな見た目にする「vscode-icons」は、非常に多くの名称・拡張子に対応するアイコンが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702334/7191dca8-e02e-8160-e8a0-f0ab1e4a6328.png)

ただし、対応していない名称・拡張子の場合、シンプルなフォルダ(orファイル)アイコンになってしまいます。こうなると少しテンションが下がります。
先日Atomic Designに則ったディレクトリ構成のプロジェクトに参画したのですが、名称に対応しておらずアイコンがデフォルトのもので、少しテンションが下がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702334/8719aa3c-5be3-9c35-c9ae-ecf1596a3c42.png)

しかしご安心ください。vscode-iconsは、自分でアイコンのカスタマイズを追加することもできます！
この機能により、アイコンの見た目をさらにリッチにすることができました！
（なんか「目がチカチカする」とか、「逆に見にくくなってない？」とか言われそうですが、自分のテンションは上がっているのでよしとします。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702334/95587421-01f4-7227-7f4a-b787def3f05b.png)

## 設定方法
以下、今回はフォルダアイコン用の設定を掲載します。
ファイルアイコンの設定方法は、以下記事にて詳しく述べられていましたので、こちらをご参照ください。
https://medium.com/@chih.hsi.chen/how-to-add-your-custom-icons-to-vscode-icons-9ab8c3f9abc1

### 1. アイコン用のフォルダ「vsicons-custom-icons」を作成する
アイコンファイルを配置するためのフォルダを作成します。
注意点は以下のとおりです。

- アイコン用フォルダ名は```vsicons-custom-icons```とする。（自分は、```~/.vscode/vsicons-custom-icons```というパスにしました。）

- フォルダはローカルに配置する（vsiconsはローカルで動作するプラグインのため、リモートサーバーを利用している場合などでもローカルにフォルダを配置する必要があります。）
 
### 2. フォルダに、アイコンファイルを配置する
先ほど作成したフォルダに、アイコンファイルを配置します。
注意点は以下のとおりです。

- 使用可能な拡張子は```  svg, png, jpg, gif, bmp, tiff, ico```です。

- アイコンのファイル名は、「folder_type_」というプレフィックスが必要です。（例：folder_type_molecules.svg）

- 「_opened」というサフィックスがついたアイコンファイルを用意することで、フォルダ開閉時のアイコンを切り替えることができます。（例：folder_type_molecules_opened.svg）

- 「folder_type_light_」というサフィックスがついたアイコンファイルを用意することで、ライトテーマのアイコンを切り替えることができます。（例：folder_type_light_atoms.svg）

### 3. setting.jsonを編集します。
settings.jsonのvsiconsの設定を追加します。

```
"vsicons.customIconFolderPath": "~/.vscode", // 1で配置したディレクトリのパス
"vsicons.associations.folders": [
  {
    // アイコンファイル名から、プレフィックスと拡張子を除いた部分
    // 例: file_type_atoms.svg→atoms
    "icon": "atoms", 
    // アイコンを紐づけたいフォルダ名
    "extensions": ["atoms"],
    // アイコンファイルの拡張子
    "format": "svg"
  },
  ・・・
]
```

## まとめ
かっこいい見た目にすることは（個人的に）テンション上昇につながります。
もし同じようにテンション高めたい方がいらっしゃれば、カスタマイズしてみていただければと思います。

(例のatomic-designのアイコンは自作しました。もしよければ使ってください。）
https://github.com/go0dev/atomic-design-folder-icons.git
Portfolioサイトの配色をもっとお洒落に！！

#はじめに
エンジニアとして転職する際に、しっかりと自分をアピールしたいため、Portfolioサイトを作りたいと思いますよね！

でも、サイトのレイアウトが決まっても配色って結構悩むと思います。

そこで、本記事では配色についてお洒落に魅せるルールについて共有します。

#参考サイト
http://iroiro-color.blog.jp/archives/4696453.html

#概要
配色にはルールがあり、ルールに則ればお洒落な配色にできます。

#３色ルールを守る
３色（ベースカラー、アソートカラー、アクセントカラー）に色味を抑えて、比率を守ると配色が綺麗に見えます。

##3色の役割について（6:3:1）
①ベースカラー（基調色） 比率:6
一番面積が大きく、全体のイメージとなる色

②アソートカラー（配合色） 比率:3
二番目に面積が大きく、ベースカラーとアクセントカラーの間を取り持つ色

③アクセントカラー（強調色） 比率:1
一番面積が小さく、ポイントとなり特徴を出せる色

これらの配色の組み合わせの例は、多くのサイトで取り上げられており、
まずは真似てみることから始めるといいそうです。


#余談
私も例に乗っ取りサイトを作ってみました！！
お洒落ではなかいかもしれないです！！（泣）

トップページ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/4fa873a4-4286-ed1e-eb84-dbacfdea97d4.png)



以上です。
SwiftUIでTimerを使えるようになるまでの道のり

SwiftUI初心者がTimerを使えるようになるまでの道のりを簡単にメモしておきます。

とりあえず以下を参考にしています。
- [Triggering events repeatedly using a timer](https://www.hackingwithswift.com/books/ios-swiftui/triggering-events-repeatedly-using-a-timer)
- [How to use a timer with SwiftUI](https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-a-timer-with-swiftui)

# ContentView.swiftに追加
とりあえず、最初に生成されるテキスト（Hello, world!）部分に時刻を表示し、1秒ごとに更新するようにしました。
```
Timer.publish(every: 1, on: .main, in: .common).autoconnect()
```
を使うことにします。
上記だと、1秒毎に、mainスレッドで、他のイベント実行中でも実行する、という設定になるはずです。
everyで設定した間隔でTimerが出力を行います。
Timerからの出力は、onReceiveで受け取っています。
最初のパラメータで出力元（publisher）を指定していて、2番目のパラメータで受け取った出力を使って実行するfunctionを指定しています。


```swift:Contentview.swift

import SwiftUI

struct ContentView: View {
    
    var counter: Int = 0
    @State var labeltext: String = "Hello, world!"
    
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        Text(labeltext)
            .padding()
            .onReceive(timer, perform: { time in
                labeltext = "\(time)"
            })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
PHP5上級試験/準上級試験の上級合格に挑戦(2)　３章関数前編

# 先日の記事を書いた後
+ Qiitaに投稿後あらためて自分の記事見たら、参考記事としてPHP５上級試験のをまとめてる方がいた(下記）
+ せっかくなのでそれも参考にしつつ、自分なりに勉強に役に立つようにまとめたい

# 参考
[PHP5技術者認定試験(上級)に学ぶ、実はよく知らないPHPの仕様 (1) | ＠tmak_tsukamotoさん](https://qiita.com/tmak_tsukamoto/items/84f7d62f6106fad5fd23) 

#注意
初級ならわかるようなものはこちらには書きません。
すみませんが、変数や関数とはなんぞやがわかるようになってから再び来てください。
分かりづらい、間違いやすいと思うものだけ、下記に整理していきます。
勉強のために、問題形式になってますのでご了承ください。

# 覚えること雑記
+ マクロ屋時代からパラメータのことを引数と言っていたが、正確には<b>仮引数</b>。
+ その仮引数に入れる値こそが<b>実引数</b>。（確かにそのほうがわかりやすい）


# 副作用を持つ関数
+ 副作用とは、引数から返り値を計算する以外の動作をするもの
+ ユーザー定義関数に多い
+ 組み込み関数でいうと、unlink()がある。下の通り、引数を返す以外に、ファイルを消す動作がある。これが副作用。
+ ちなみにunlink()の第2引数はストリームなんだそうだが、たとえばどんなのを指定できるのかわからない。<b>誰か教えてくれると嬉しいです。</b>


```index.php
$filename = 'index.php' 
＄bool =unlink($filename); //指定したファイルを消す。成功したらTRUE,失敗ならFAlSEを返す。
if ($bool){
 echo 'ファイル削除しました'
else {
 echo 'ファイル削除失敗しました'
}
```

#問題

### Q１． 次のコードの関数または変数の呼び出しはうまくいくか否か。
（１）

```index.php
 function MYFUNC() {
    echo 'ようこそ';
}
myfunc();
```

（２）

```index.php
 function _sendme() {
    echo 'ようこそ';
}
_sendme();
```

（３）

```index.php
 function _１２３() {
    echo 'ようこそ';
}
_123();
```

（4）

```index.php
 function １２３_() {
    echo 'ようこそ';
}
123_();
```

（5）

```index.php
 function a１２３_() {
    echo 'ようこそ';
}
a123_();
```

（6）

```index.php
 sendme = "ようこそ";
 echo SENDME;
```
(7)

```index.php
 function judge($clue){
   if($clue){
    ?>ようこそ<?php
  }
}
func(true);
```
#A1（解答）
（１）関数の場合、大文字小文字は区別されない。
　　　よって、うまくいき、「ようこそ」が出力。
（２）関数名の最初は、文字、アンダースコアにする必要がある。
　　　よってうまくいき、「ようこそ」が出力。
（３）2番目が数字でもうまくいく。
　　　よってうまくいき、「ようこそ」が出力。
（４）１番目が数値だとうまくいかない。２番目から。
（５）関数名の終わりがアンダーバーでもOK。
　　　<b>１番目が文字とアンダーバー、２番目から数値のみ加わる</b>、と覚えればよい。
　　　終わりは考えなくてOK
（６）変数だと大文字小文字は<b>区別</b>される。
　　　したがって、エラーはないが、出力はない。
（７）?> ~ <?php に囲まれたテキストはそのまま出力される。
　　　したがって、「ようこそ」を出力。
　　　この書き方は、とくにHTMLファイルにPHPを埋め込むときによく使われる。


# 中間まとめ
+ 関数の場合、通常ならしないようなマイナーな書き方で書けるのかどうかを問う問題が多いと感じる。
+ そこで、普段ならしない書き方で書いてみて、実際にエラーが出るのか出ないのか確認する作業が必要
+ でも絶対的なルールはあるので、そこはしっかり覚えるようにする
画像をAPI Gateway+Lambdaで受け取って Pillow で処理する（AWS CDK）

# はじめに

API Gateway + Lambda で Post された画像を Pillow で処理したかったため、AWS CDK で環境構築してみました。

## API Gateway + Lambda（AWS CDK）

### プロジェクト初期化

AWS CDK では API Gateway と Lambda を構築します。今回は Python で構築します。
プロジェクト初期化コマンドは以下の通りです。作成するディレクトリー名は任意です。今回は `qiita-aag-image` としています。

```zsh
$ mkdir qiita-aag-image 
$ cd qiita-aag-image
$ cdk init --language=python
```

### インフラコード

qiita_aag_image ディレクトリーに qiita_aag_image_stack.py が作成されているため、編集します。API Gateway や Lambda の Id は好きな名前をつけてください。
また、今回想定する画像形式は png とします。こちらも状況に合わせて変更してください。

```python
from aws_cdk import core
from aws_cdk.aws_lambda import DockerImageFunction, DockerImageCode
from aws_cdk.aws_apigateway import LambdaRestApi

import os.path
dirname = os.path.dirname(__file__)


class QiitaAagImageStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        backend = DockerImageFunction(
            scope=self, id='k-test-docker-function', code=DockerImageCode.from_image_asset(
                directory='src',
            ), memory_size=1024, timeout=core.Duration.seconds(30))

        LambdaRestApi(scope=self, id='k-test-api', handler=backend,
                      binary_media_types=['image/png'])

```

### Dockerfile 作成

今回 Lambda では Docker イメージを動かすようにします。

```zsh
$ mkdir src
$ cd src
$ touch Dockerfile
```

```Dockerfile:src/Dockerfile
FROM public.ecr.aws/lambda/python:3.8
RUN pip install pillow
COPY app.py ./
CMD [ "app.handler" ]
```

### Lambda コード

```zsh
$ touch app.py
```

```python:src/app.py
import base64
from io import BytesIO
import json
from PIL import Image


def handler(event, context):
    data = event.get('body', '')
    data = BytesIO(base64.b64decode(data))
    image = Image.open(data)

    # Pillow Image で処理する
    # 今回は print のみ
    print(image)

    return {
        'statusCode': 200,
        'body': json.dumps({
            'status': 'ok',
        }),
    }

```

### デプロイ

事前に AWS のクレデンシャル情報の設定が必要です。設定方法はこの記事では取り扱いませんので、公式リンクを記載しておきます。
[Configuration and credential file settings - AWS](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)

```zsh
# プロジェクトの Root ディレクトリーに戻ります
$ cd ..
$ cdk deploy
```

デプロイに成功すると以下のリソースが構築されます。

- ECR
- API Gateway
- Lambda

## 実行

Insomnia や Postman などお好きなツールから実行できます。今回は API Gateway の Binary Media Type に 'image/png' を指定しているので、同じ内容をリクエストヘッダーの Content-Type に追加します。

### ログ

実行後に CloudWatch Logs を見てみると以下のように Pillow Image であるとログがでています。

```text
<PIL.PngImagePlugin.PngImageFile image mode=L size=28x28 at 0x7F6487C6F3A0>
```

# おわりに

API Gateway + Lambda で Post された画像を Pillow で処理できるようにするまでを解説しました。
Yarn で ✨  Done in XXXs. を消す

# はじめに

Yarn で ✨  Done in XXXs. を消したかった。
package.json には以下を定義しています。

```json:package.json
{
  "scripts": {
    "echo": "echo aaa"
  }
}
```

実行すると ✨  Done in XXXs. が表示されます。

```zsh
$ yarn run echo
yarn run v1.22.10
$ echo aaa
aaa
✨  Done in 0.04s.
```

# --silent オプション

--silent オプションを追加すると消えました。

```zsh
$ yarn run --silent echo
aaa
```

# おわりに

困った時は --help を見る。

```zsh
$ yarn run --help
```
Laravelのバリデーションエラーメッセージを日本語にする方法


Laravel5.5を使用してECサイトを作る勉強をしているのですが、その際にエラーメッセージを日本語仕様にするというのを行ったので今回はその時に行った事をこちらの記事に書いていこうと思います。

#日本語化しようと思った経緯
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933264/9436f4ea-e523-5f0e-8d24-20d9584fb256.png)
この様にphp artisan make:authを使用しログイン機能や会員登録を作成した際、会員登録画面、ログイン画面の各入力項目名が英語だったので「名前」「メールアドレス」「パスワード」の様に日本語に修正したが、エラーメッセージは英語で表示されているので、エラーメッセージも各入力項目名と同じく日本語で統一したかった為。
また、日本語化する際にどのファイルを編集したらエラーメッセージが日本語に出来るのかが当時解らず困った為。

#日本語化する為の手順

##日本語化する為のファイルをインストールする
こちらのサイトに記載されているコードを順番にターミナルに入力し、実行していきます。
https://readouble.com/laravel/5.5/ja/validation-php.html?header=%25E8%25AA%25AC%25E6%2598%258E

###手順1:日本語のエラーメッセージ用のディレクトリを作成し、そのディレクトリ以下に各エラーメッセージ用のphpファイルを作成する為のファイルをinstall-ja-lang.phpというファイルにコピーする。


```php:ターミナル
php -r "copy('https://readouble.com/laravel/5.5/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
```

コードの意味
https://readouble.com/laravel/5.5/ja/install-ja-lang-files.php
の中身をinstall-ja-lang.phpという名前のphpファイルにコピーする。
ファイルの中にあるコードの内容は日本語用ディレクトリの作成やそのそのディレクトリに各メッセージ内容が書かれたファイルを作成するといった物![日本語化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933264/dfad67ea-fdcf-7a55-8180-5a06e47fff74.png)
install-ja-lang.phpはLaravelプロジェクトのルートディレクトリにコピーされる。

###手順２ install-ja-lang.phpを実行する。

```php:ターミナル
php -f install-ja-lang.php
```
コードの意味
手順1で作成したinstall-ja-lang.phpを実行する。実行する事によりLaravelファイルのresources/lang/以下に、日本語化されたエラーメッセージなどが記載されたphpファイルを格納する「ja」というディレクトリが作成され、その中に各エラーメッセージの記載されたファイルが作成される。

###手順3 実行したinstall-ja-lang.phpを削除する

```php:ターミナル
php -r "unlink('install-ja-lang.php');"
```

コードの意味
実行した後のinstall-ja-lang.phpがルートディレクトリに残ったままなので、install-ja-lang.phpを削除する

###手順4 config/app.phpを編集する
このままでは、エラーメッセージ等が日本語ではなく英語で表示されるので、ローカリゼーション機能というものを使って日本語で表示されるようにして行きます。

ローカリゼーションとは
>Laravelのローカリゼーション機能はアプリケーションで多言語をサポートできるように、様々な言語の文字列を便利に取得できる方法を提供します。 言語の文字列はresources/langディレクトリ下のファイルに保存します。このディレクトリの中にアプリケーションでサポートする言語のディレクトリを設置します。
https://readouble.com/laravel/5.5/ja/localization.html?header=%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2588%25E3%2583%25AD%25E3%2583%2580%25E3%2582%25AF%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3 より引用

ざっくりと言うと様々な国の言葉に対応をするための機能の事

config/app.phpの

```php:app.php
 'locale' => 'en',
```
というコードを

```php:app.php
 'locale' => 'ja',
```
に編集する。
このコードが担う役割はこのプロジェクトでメインで使用する言語をどの国の言語にするかを設定するという物。

また、このコードの下に

```php:app.php
'fallback_locale' => 'en',
```
というコードがあるがこちらは上記で設定した第一言語のファイルが見つからなかった場合の言語をどの国の言語にするかを設定するという物。
デフォルト第二言語は英語になっているので、第二言語を英語以外にしたい場合以外は設定を変更しなくてもいいと思います。

以上になります！

##補足

この手順以外にも

1. resoure/lang以下にjaディレクトリを作成する
- enディレクトリ以下にあるphpファイルをjaディレクトリにコピーし、その中に記述されているメッセージを英語の物から日本語の物に修正する
- config/app.phpの```locale' => 'en'```,の箇所を```locale' => 'ja'```
に変更する

という方法でも、エラーメッセージを日本語に変更する事が出来ます。
ただ、既に日本語化された物が配布されているので、そちらをインストールして設定を変更した方が正確にメッセージの日本語化が出来るのではと思い、こちらの方法で実装致しました。

LGTMを押していただけると励みになります。
ここまで読んで頂き誠にありがとうございます！
vscode の Remote - WSL で vscode server for wsl closed unexpectedly エラーの解決

## 背景
vscode の Remote-WSL 利用時に表示されたエラーの解決方法を書き残します。

## エラー原因と解決方法
#### 原因
Windows アップデートにより設定が変更されたため。

#### 解決方法
コントロールパネルから「プログラム」>「プログラムと機能」>「Windows の機能の有効化または無効化」を選択する。
表示されたチェックボックスにて「Linux 用 Windows サブシステム」「仮想マシンプラットフォーム」の二つにチェックを付ける。その後再起動を要求されるので再起動する。

以上です。

#### 蛇足
私の記事に不備などありましたらご指摘いただけると幸いです。
【Rails】ストロングパラメーター

#基本形

```memo_controller.rb
private
def memo_params
  params.require(:キー(モデル名)).permit(:カラム名1, :カラム名2, ・・・).merge(カラム名: 入力データ)
end
```

#requireメソッド

requireメソッドを使用することで、params内の特定のキーに紐づく値だけを抽出できます。
引数には取り出したい値のキー（テーブル名）を指定する必要があります。

#permitメソッド

permitメソッドを使用することで、許可された値のみを取得することができます。
引数には登録を許可する全てのカラム名を指定する必要があります。

#mergeメソッド

mergeメソッドを使用することで、ハッシュ同士を結合することができます。
paramsに含まれない値(user_id: current_user.idなど)をストロングメソッドに加えたい場合など、
ストロングパラメーターの後に記述することができます。

#privateメソッド

privateメソッドは以下に記述したメソッドはクラス外からのアクセスができないようになります。
基本的にストロングパラメーターは、クラス外からのアクセスをさせないようにprivate配下に書きます。
GitHubコマンド早見表

##初めに
githubのコマンドをよくど忘れてしまうので、
アウトプットしようと思って投稿することにしました。

##初回のプッシュ
```
git init
git add ファイル名                          # add . でファイル全部を追加できる。
git commit -m ""                           # ""の中に簡単で分かりやすいメッセージを入れる。
git remote add origin リポジトリURL 
git push origin ブランチ名
```

##2回目以降のプッシュ
```
git add ファイル名
git commit -m ""
git push origin ブランチ名
```

##リモートリポジトリをクローン(複製)する
```
git clone リポジトリURL
```

##終わりに
閲覧ありがとうございます。
間違いなどございましたら、ご指摘お願いいたします。
pythonでzipを解凍せずに画像ファイルを読み込み、numpyの配列に格納する方法

タイトルがすべてです。
データサイエンスの画像分類コンペでは「train_image.zip」のような形式で訓練（あるいはテスト）対象となる画像ファイルがzipに圧縮されていることが多いです。
もちろん解凍して個々のファイルを読み込んでも良いのですが、zipのまま一括でアクセスできればスマートだと思い、少し方法を調べてみました。

# コード
以下のコードでOKです。

```python
import numpy as np
import io
from PIL import Image
import zipfile

# zipファイルのパス
zip_path = '.\data.zip'

# 配列格納用のList
train_X = []

# zipの読み込み
with zipfile.ZipFile(zip_path, 'r') as zip_file:
    # zipファイル内の各ファイルについてループ
    for info in zip_file.infolist():
        # 「zipファイル名/」については処理をしない
        if (info.filename != 'data/'):
            # 対象の画像ファイルを開く
            with zip_file.open(info.filename) as img_file:
                # 画像のバイナリデータを読み込む
                img_bin = io.BytesIO(img_file.read())
                # バイナリデータをpillowから開く
                img = Image.open(img_bin)
                # 画像データを配列化
                img_array = np.array(img)
                # 格納用のListに追加
                train_X.append(img_array)
                
# 処理が完了後、np.arrayに変換
train_X = np.array(train_X)
```

コンペでは画像データを配列化したものをそのまま特徴量としてCNNとかにぶん投げることが多いので、格納用の配列は最初から「train_X」としています。
np.empty（）等で生成してもよいのですが、一度Listにappendしてからnp.arrayに変換する方式なら画像サイズ等をコードに記述しなくて済むのでラクでした。

画像データによりますが、例えば128×128ピクセルのRGBデータが1000枚ある場合、shapeは以下のようになります。

```python
print(train_X.shape)
```

```
(1000, 128, 128, 3)
```

# 詳細
もう少し丁寧に、各記述の詳細についても説明します。

### zipの読み込み

```python
with zipfile.ZipFile(zip_path, 'r') as zip_file:
```

with構文を使いZipFile()で指定されたzipファイルを変数zip_fileに読み込んでいます。

### 各ファイルについてループ

```python
zip_file.infolist()
```

infolist()で読み込んだzip_file内のすべてのファイル名を取得することができます。
for文で各ファイル名にアクセスします。
が、環境によるのかもしれませんがinfolist()で取得するlistに「zipファイル名/」という文字列が含まれることがあります（今回は「data.zip」なので文字列は「data.zip」）。
以降の処理で画像ファイルを読み込みますが、その際にこの文字列を読み込むとエラーになってしまうので条件分岐を設定しています。

```python
# zipファイル内の各ファイルについてループ
for info in zip_file.infolist():
    # 「zipファイル名/」については処理をしない
    if (info.filename != 'data/'):
    # 以降の処理

```

なんて横着しましたが、zipファイル内に画像データ以外が含まれる可能性がある場合は例外処理を実装したほうが賢明ですね……。

### 画像ファイルの読み込み

```python
# 対象の画像ファイルを開く
with zip_file.open(info.filename) as img_file:
    # 画像のバイナリデータを読み込む
    img_bin = io.BytesIO(img_file.read())
    # バイナリデータをpillowから開く
    img = Image.open(img_bin)
```

zip_file.open()に対象のファイル名を指定し、img_fileに読み込んでいます。
画像はpillowモジュールから開くのですが、このimg_fileのままImage.open()をしようとしてもエラーが出て開けません。
一度ioモジュールのBytesIO()からバイナリデータとして扱えば、Image.open()で開くことができます。
（けっこうハマったポイントでした）


### 配列への変換

```python
# 画像データを配列化
img_array = np.array(img)
```

読み込んだ画像ファイルをnp.array()引き渡すことで配列化することができます。

# まとめ
以上です。
厳密な処理速度は拾っていないのですが、画像1000枚くらいなら解凍前後で実行時間に明確な差は出ませんでした。
いちいち解凍とかしたくないときなんかにどうぞ。
windowsでiverilog その91

#概要　

windowsでiverilogやってみた。
fizzbuzz書いてみた。

#サンプルコード

```


module fizz(input clk, input rst, output reg [7:0] out);
	reg [7:0] a;
	reg [7:0] b;
	reg [7:0] pc;
	reg [7:0] mod;
	always @(posedge clk)
	begin
		if (!rst)
		begin
			a <= 0;
			b <= 0;
			pc <= 10;
			mod <= 0;
		end
		else
		begin
			case (pc)
			10:
			begin
				a <= 0;
				pc <= 20;
			end
			20:
			begin
				a <= a + 1;
				pc <= 30;
			end
			30:
			begin
				b <= a / 15;
				mod <= a % 15;
				pc <= 40;
			end
			40:
			begin
				if (mod == 0)
				begin
					pc <= 120;
				end
				else
				begin
					pc <= 50;
				end
			end
			50:
			begin
				b <= a / 5;
				mod <= a % 5;
				pc <= 60;
			end
			60:
			begin
				if (mod == 0)
				begin
					pc <= 140;
				end
				else
				begin
					pc <= 70;
				end
			end
			70:
			begin
				b <= a / 3;
				mod <= a % 3;
				pc <= 80;
			end
			80:
			begin
				if (mod == 0)
				begin
					pc <= 160;
				end
				else
				begin
					pc <= 90;
				end
			end
			90:
			begin
				out <= a / 100 + "0";
				pc <= 91;
			end
			91:
			begin
				out <= a / 10 % 10 + "0";
				pc <= 92;
			end
			92:
			begin
				out <= a % 10 + "0";
				pc <= 100;
			end
			100:
			begin
				if (a < 100)
				begin
					pc <= 20;
				end
				else
				begin
					pc <= 110;
				end
			end
			110:
			begin
				pc <= 110;
			end
			120:
			begin
				out <= "F";
				pc <= 121;
			end
			121:
			begin
				out <= "I";
				pc <= 122;
			end
			122:
			begin
				out <= "Z";
				pc <= 123;
			end
			123:
			begin
				out <= "Z";
				pc <= 124;
			end
			124:
			begin
				out <= "B";
				pc <= 125;
			end
			125:
			begin
				out <= "U";
				pc <= 126;
			end
			126:
			begin
				out <= "Z";
				pc <= 127;
			end
			127:
			begin
				out <= "Z";
				pc <= 130;
			end
			130:
			begin
				pc <= 100;
			end
			140:
			begin
				out <= "B";
				pc <= 141;
			end
			141:
			begin
				out <= "U";
				pc <= 142;
			end
			142:
			begin
				out <= "Z";
				pc <= 143;
			end
			143:
			begin
				out <= "Z";
				pc <= 150;
			end
			150:
			begin
				pc <= 100;
			end
			160:
			begin
				out <= "F";
				pc <= 161;
			end
			161:
			begin
				out <= "I";
				pc <= 162;
			end
			162:
			begin
				out <= "Z";
				pc <= 163;
			end
			163:
			begin
				out <= "Z";
				pc <= 170;
			end
			170:
			begin
				pc <= 100;
			end
			endcase
		end
	end
	initial
	begin
		//$monitor("%d", pc);
	end
endmodule

module test;
	reg clk,
		rst;
	wire [7:0] out;
	fizz u(.clk(clk), .rst(rst), .out(out));
	initial
	begin
		clk = 0;
		rst = 1;
		$monitor("%s", out);
		#2
			rst = 0;
		#2
			rst = 1;
		#2500
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule



```

以上。
redshiftの監査ログを別のアカウントのS3に吐き出す

ちょっとドハマリしたのでメモ。

# 前提

まず、自分のアカウントでS3に監査ログを`既存のS3バケット`に吐き出す場合は以下を参考にしてやってみます。
[Amazon Redshiftでデータベース監査ログをS3に出力する](https://dev.classmethod.jp/articles/amazon-redshift-audit-cloudtrail/)
Redshiftにバケットを作成させる場合はマネジメントコンソールで有効化すれば特段なにも考えずともよしなに連携してくれます。

# 別アカウントのS3
ブログに書かれているように、Redshfitを保持しているアカウントの権限をS3のバケットに入れれば問題はありません。
注意点の一つとして、マネジメントコンソールではなくCLIから設定します。

```bash:コマンド
RS_CLUSTER="クラスターのID"
S3_BUCKET="S3のバケット名"
REGION="Redshiftを立てているリージョン"

aws redshift enable-logging \
    --cluster-identifier ${RS_CLUSTER} \
    --bucket-name ${S3_BUCKET} \
    --s3-key-prefix "redshift" \
    --region ${REGION}
```

この際、`enable-logging`を投げている認証主体にも`putObject`の権限が必要です。

> ログをアップロードするために put object のアクセス許可が必要です。 また、ロギングを有効にする IAM ユーザーまたは IAM ロールには、s3:PutObject バケットへの Amazon S3 アクセス許可が必要です。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/db-auditing.html#db-auditing-enable-logging

ですので、バケットポリシは以下のようになります。

```json:s3バケットポリシ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Put bucket policy needed for audit logging",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::404641285394:user/logs"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<redshiftlogtestbucket-name>/*"
        },
        {
            "Sid": "Get bucket policy needed for audit logging ",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::404641285394:user/logs"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::<redshiftlogtestbucket-name>"
        },
        ＋＋＋＋＋＋＋＋＋＋ここから別アカウント用の設定+++++++++++++++++
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<RedShiftのaccountID>:user/<IAM-USER-NAME>"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<redshiftlogtestbucket-name>",
                "arn:aws:s3:::<redshiftlogtestbucket-name>/*"
            ]
        }
       ＋＋＋＋＋＋＋＋＋＋ここから別アカウント用の設定+++++++++++++++++
    ]
}
```

document上は`putObject`でいいのですが、引っかかると嫌だったので検証時は`s3:*`でやってしまっています。

## S3バケットが暗号化されていた場合

ここでドハマりしました。
私の保持していたバケットはSSE-KMSを利用していたため引っかかったのですが、結論として`SSE-KMS`は非対応です。

> 注記
現在、Amazon S3 管理キー (SSE-S3) 暗号化 (AES-256) のみを監査ログ記録に使用できます。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/db-auditing.html#db-auditing-enable-logging

よく読んだらdocumentに補足が書いてありましたね。
KMSにGRANTしたり、Redshiftを持ってるアカウントで使用できるようにPolicy書いたり迷走しましたが、できないようです。

**Redshiftの監査ログを保管するS3バケットの暗号化方式は注意しましょう。**
【C#】.NET Frameworkと.NET CoreのRijndaelの挙動について

# はじめに
Rijidaelを使用したAESの文字列暗号化プログラムを書いていたが、ブロックサイズを初期値の128ビットから256ビットにしたい！と思ったときに、できる時とできない時があることがわかった。
なんでだろう？と思って調べてみると、どうやらRijindaelはプロジェクトが.NET Frameworkか.NET Coreかで仕様が違うというらしいことがわかった。

#サンプルプログラム
```C#:Sample.cs
using System.Security.Cryptography;

class Sample
{
    static void Encrypt()
    {
        //Rijindaelのオブジェクトを作成
        using (RijndaelManaged rijndael = new RijndaelManaged())
        {
            //Rijindaelのブロックサイズの設定
            //初期値128ビットを256ビットに変更
            rijndael.BlockSize = 256;
        }
    }
}
```

#プログラムの詳細
.NET FrameworkではBlockSizeの初期値128を256に変更することができるが、.NET Coreでは「System.PlatformNotSupportedException: 'BlockSize must be 128 in this implementation」エラーが発生してしまう。

#なぜ？
どうやら、.NET CoreではRijinDaelはブロック長256bitはサポートされていないらしく、今回のようなエラーが発生してしまったとのこと。
反省点としては、.NET Frameworkと.NET Coreの区別がまだしっかりついてなかったのでちゃんとつけるようにしていくこと…

参考URL:https://teratail.com/questions/137542
ローカル変数とインスタンス変数の違いとは？【超初心者】

<h2>ローカル変数とは</h2>

定義されているアクション内でしか使われない変数。下記のlistみたいなもの

```rb:controllers/lists_controller.rb
def create
  list = List.new(list_params)
  list.save
  redirect_to list_path(list)
end
```

ローカル変数はview→コントローラしかできない
このcreateアクションのlistはview→createアクションのみしか出来ず、createアクション→viewが出来ない
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/931e5021-d411-74f2-777c-0983b7fc419c.png" width=70%>

<h2>インスタンス変数とは</h2>
アクション(def~endまで)が終わるまでは使える(定義した文字列の行き来が出来る)もの
下記の@listみたいなもの


```rb:controllers/lists_controller.rb
def edit
  @list = List(params[:id])
end
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/551d79b4-c5e5-c764-8a23-6857d28594fc.png" width=70%>

view→コントローラもコントローラ→viewも出来る！
注意したいのは
・インスタンス変数はアクションが終わるまでしか使えないこと。
・editアクションが終わってshowアクションに行ったら@listの値は変わっていること。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/a95ddfaf-1522-2f3e-08a4-14ddee451cb1.png" width=80%>
<sup>全部に行き来できる引数はまた別の引数があるみたい</sup>

<h2>じゃあ全部インスタンス変数にすればよくね？</h2>
動くには動く。けど、重くなる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110799/f3f0ec0e-d117-0f99-9b83-5564a33d51ed.png" width=30%>
<sup>たくさん動いて疲れちゃったよ～</sup>
余分なコードを書くと無駄に色んな動作をしちゃうから、ちゃんと使い分けよう！
[Rails] 複数カラムに対する複数単語の検索フォーム

# はじめに
料理レシピ検索投稿サイト作成に伴い、検索機能の実装しました。
複数の単語で、かつ、関連モデルのカラムに対しても検索できるフォームにしました。

# 環境
Rails 5.2.4.4
MySQL 5.7.31

# テーブル構成
RecipesとIngredientsを多対多の関係で紐づけています。
このrecipesのtitleカラムとingredientsのnameカラムに対して検索できるものを作ります。
(必要のないカラムは省略しています)
[![Image from Gyazo](https://i.gyazo.com/748fa5b24e437c679e2848eccc62bd8a.png)](https://gyazo.com/748fa5b24e437c679e2848eccc62bd8a)
# 実装
### 1. ルーティング
```ruby:routes.rb
resources :recipes do
	collection do
		get 'search'
	end
end
```

### 2. コントローラー
```/controllers/recipes_controller.rb
def search
		redirect_to recipes_path if params[:search] == ""
		@array_searches = params[:search].split(/[[:blank:]]+/)
		@recipes = []
		@array_searches.each do |search|
			next if search == "" 
			recipes = Recipe.joins(:ingredients)
			@recipes += recipes.where('ingredients.name LIKE ? ', "#{search}%").or(recipes.where('title LIKE ?', "#{search}%"))
		end
		@recipes.uniq!
end
```

・`redirect_to recipes_path if params[:search] == ""`
　　paramsが空だった場合、recipes_pathに移動させます。

・`@array_searches = params[:search].split(/[[:blank:]]+/)`
　　paramsをsplitで分割させますが、`split(" ")`だと半角スペースしか対応できません。
　　空白文字の正規表現`[:blank:]`を使用し、連続した空白にも対応できるようにします。

・`@recipes = []`
　　空の配列を用意します。

・`@array_searches.each do |search|`
　　分割したparamsをひとつずつ検索にかけるため、繰り返し文に入れます。

・`next if search == ""`
　　これがないと、先頭に空白が入った時、全てのレコードにヒットします。

・`recipes = Recipe.joins(:ingredients)`
　　`.joins`を用い、RecipesとIngredientsを内部結合させます。
　　Ingredientsのnameカラムに対しても検索をかけるためです。

あとは、前方一致で検索をかけ、`.uniq!`で重複した検索結果がでないようにします。

### 3. ビュー
```/views/recipes/index.html.erb
<%= form_with(url: search_recipes_path, local: true, method: :get) do |f| %>
    <%= f.text_field :search, placeholder: "Search Recipes" %>
    <%= f.submit "Search" %>
<% end %>
```

# 参考にした記事
・https://qiita.com/Orangina1050/items/ca4e5dc26e0a32ee3137
・https://qiita.com/nao58/items/bf5d017a06fc33da9e3b
Djangoで個人開発

#初めての個人開発#
大学に通いながら趣味で個人開発をしているがその際にはまったエラーなどを共有していきたいと思う。が、リリースを優先したいので実際に記事を投稿するかどうかは気分次第である。ちなみにプログラミング歴はだらだら1年くらいで2か月ほど前から企画をして個人開発を始めた。2月中にα版をリリーズして、3月中にはマネタイズも含めてβ版がリリースできたらいいな。

一応現在の進捗としては依然Herokuにデプロイしたところfileが扱えないとわかったので無料で使えるcloudinaryの導入を3日ほどかけてしたところ。ローカルのファイルではなくWebフォームを介して画像を投稿し画像urlをDBに保存したかったので思ったより時間がかかってしまった。Qiitaやnoteを見ながらコードを書いていったが結局最強なのはドキュメントだということに気付いた。このことについてもいずれ記事にするつもりだがいつになるかはわからない。

最初の投稿では開発環境だけでも記しておくとしよう。

Django==3.1.4
python-3.8.5
cloudinary==1.24.0

何々書けばいいかよくわからなかったのでベースとなるdjangoとpythonと最近苦労して導入したcloudinaryのバージョンだけでいいや。

あと齋藤飛鳥はかわいい
【Godot】文字列で変数や関数にアクセスする方法

# 概要
この記事では、文字列指定で変数や関数にアクセスする方法について書きます。

# `get() / set()` で変数を操作する
GDScriptでは、`get() / set()` を使うことで文字列で変数にアクセスできます。

```gd
extends Node2D

var hp = 1

func _ready():
	print("hp: %d"%hp)
	
	# 文字列で "hp" から値を取得する
	print("hp: %d"%get("hp"))
	
	# 文字列で "hp" に値を設定する
	set("hp", 100)
	print("hp: %d"%hp)
```

実行結果は以下のとおりです。

```:実行結果
hp: 1
hp: 1
hp: 100
```

# `call()` で関数を呼び出す
`call()` を使用すると関数を名前で呼び出すことができます。

```gd
extends Node2D

func hoge():
	print("hoge")

func piyo(v):
	print("piyo", v)

func _ready():
	# 関数 "hoge" を名前で呼び出し
	call("hoge")
	
	# 関数 "piyo" に引数 "123" を指定して呼び出し
	call("piyo", 123)
```

実行結果は以下のとおりです。

```:実行結果
hoge
piyo123
```

名前で呼び出すと何が便利なのかというと、例えばIDに対応する関数呼び出しを簡素な記述にできることです。

```gd
extends Node2D

func ai_1():
	print("AI処理1を実行")
	
func ai_2():
	print("AI処理2を実行")
	
func ai_3():
	print("AI処理3を実行")
	
func exec_ai(id):
	# idに対応する処理を呼び出す
	match id:
		1:
			ai_1()
		2:
			ai_2()
		3:
			ai_3()
		_:
			ai_1()
			
func _ready():
	# 各AI処理を実行
	exec_ai(1)
	exec_ai(2)
	exec_ai(3)	
	
```

AI処理1〜3がある場合に、`exec_ai()` で `match` を使ってIDに対応する呼び出しを記述しています。ただこの書き方だと、AI処理を追加するたびに match文で IDに対応する処理を書かなければいけません。

そこで `call()` を使うと以下のように簡素化できます。

```gd
func exec_ai(id):
	# idに対応する処理を呼び出す
	var func_name = "ai_%d"%id
	if has_method(func_name):
		# 対象の関数名が存在していたら実行
		call(func_name)
	else:
		# 存在しない場合はひとまず1番を実行
		ai_1()
```

この書き方をすることで、AI処理が増えても呼び出し部分を修正する必要がなくなります。
注意点として、`has_method()` で対象の関数が存在するかどうかをチェックして、適切なエラー処理を行います。

# 参考

* [Godot Docs » スクリプト » GDScript » GDScriptの基本](https://docs.godotengine.org/ja/stable/getting_started/scripting/gdscript/gdscript_basics.html)
【kintone】目標と実績の比較棒グラフを描いてみよう

kintoneでイメージ通りのグラフが描けない！
・・・というわけで、目標と実績の比較グラフを試行錯誤しながら描いてみました。

# 目標と実績の比較グラフ

目標と実績を案件ごとの積み上げグラフとして表現したいです。
Excelで作るとこんな感じのイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d33e9d89-02bb-78e5-637e-bd079098990a.png)


# まずは失敗パターン

アプリを準備しました。
Excelと同じ見た目の一覧になるようにしました。
分類フィールドは目標と実績で分かれるようにしました。
案件A～Dには金額を入力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/0bd4cc4c-e48a-2fbb-7fd8-62f5ede84f97.png" width="400px">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/220a4bf3-1ec4-f2d1-5e16-9627888fd36c.png)

## グラフを作ってみる

縦棒グラフ、集合を選び、大項目に「分類」を設定しました。
棒グラフが目標と実績で分かれています。バッチリOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/dcaf7413-a282-ac93-f13f-15066c31f8fc.png)

と思いきや、
集計方法の合計で案件A～案件Dがバラバラ。
ということは、どれか一つの案件しか選べないということ・・・。
全案件の合計が良いのに・・・。
これは詰みです。グラフが作れなくなってしまいました。

# 1方向にデータを持つ

失敗したグラフでの詰みポイントは、**集計方法の合計で案件A～案件Dがバラバラ**というところでした。
フィールドで案件A～Dを持つということは、もし案件Eが増えたとしたら一覧は右に増えてしまいます。
データの方向が2方向のグラフです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5ff12749-f89c-c5ad-7f64-484aa3588e00.png)

「案件」というフィールドが一つあれば、データの向きが1方向のアプリになります。
分類する項目に案件を追加することで案件ごとに金額を集計してくれそうです。
というわけで、案件フィールドを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/a9506408-9b8d-5e46-e492-f913206255ef.png)

レコード数は増えてしまいますが、kintoneで処理しやすいデータの持ち方になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4ed28515-bb6c-eb2a-2e9a-a31fc286963e.png)

## グラフを作ってみる
縦棒グラフ、集合、分類する項目の大項目に「分類」を設定し、
集計方法に「金額」を設定することで、良い感じの棒グラフができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/c11929c0-16e1-1b76-7240-7b38acee3186.png)

案件フィールドも作成しましたし、せっかくなので、積み上げグラフも作ってみましょう。
グラフの種類を棒グラフ、「積み上げ」に変更し、
分類する項目の中項目に「案件」を追加すると、案件ごとに色分けされた積み上げグラフを作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/03da1967-a2b0-e74d-b199-95d390edf8ca.png)

## ちょっと工夫
年度ごとの目標と実績を見たい～！というとき
例えば年度フィールドを追加して。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/65a98a7e-87ea-4068-3a37-a9d765da5c86.png)

**年度ごとの目標・実績グラフ**
「年度」を中項目に追加することで、横軸に年度も表示されます。
色分けする項目は小項目に指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1bda8442-3a9f-d547-6232-cdc0da696dbb.png)

**条件に年度を指定して、目標・実績グラフ**
1つの年度だけで良い場合は、分類する項目から「年度」を削除し、
「条件」の項目で「年度」を指定するのが良さそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b3b40876-71e6-0961-fe35-c13cc7a2f1c1.png)

# まとめ
Excelとkintoneのデータの持ち方の違いや、グラフの設定方法のコツを掴むと、kintoneでもある程度のグラフが標準機能で作れます👀！
色々試してみてね！
SwiftUIで位置情報を取得できるようになるまでの道のり

SwiftUI初心者が位置情報を取得できるようになるまでの道のりを簡単にメモしておきます。

とりあえず以下を参考にしています。
- [SwiftUIで位置情報をコンソールに出力する](https://zenn.dev/johiroshi/articles/bb3689d7723ee1)
- [【SwiftUI】SwiftUIでAppDelegateの処理を実装する方法](https://qiita.com/peter_parker/items/0ec7fce46b23ddc1b589)
- その他、Apple公式ドキュメントなど

# 事前準備
まずは以下の設定が必要です。
- CoreLocationの追加
- info.plistにPrivacyを追加
- バックグラウンド処理の許可

## CoreLocationの追加
TARGETS -> Build Phases の Link Binary With Libraries に CoreLocation.frameworkを追加して下しあ。

## info.plistにPrivacyを追加
info.plistに以下の2つを追加してください。
- Privacy - Location Always and When In Use Usage Description
- Privacy - Location When in Use Usage Description
どちらも、Valueを設定しとく必要がありますので、適当な説明文を設定してください。

## バックグラウンド処理の許可
TARGETS -> Signing & Capabilities の +Capability を選択し、Background Modesを追加してください。
バックグラウンド処理を選択できるようになるので、Location updatesにチェックを入れてください。
アプリがバックグラウンドになったときに位置情報を更新する必要がない場合は、不要です。

# XXXXApp.swiftの編集
前処理が終わったらコードを追加していきます。
- Life CycleをSwiftUIに設定している場合、AppDelegateで細かい制御を行うために@UIApplicationDelegateAdaptorを使用する必要があります。
- AppDelegeteを使ってアプリ起動時に位置情報取得を開始するようにしています。

```swift:XXXXApp.swift

import SwiftUI
import CoreLocation //CoreLocationを利用

@main
struct CHIAPON3App: App {
    
    //AppDelegateを設定できるようにする
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

// アプリの起動時に、位置情報を利用できるように設定してしまう
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate{
    var locationManager : CLLocationManager?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool{
        locationManager = CLLocationManager()
        locationManager!.delegate = self
        locationManager!.requestAlwaysAuthorization()
        
        
        if CLLocationManager.locationServicesEnabled(){
            locationManager!.desiredAccuracy = kCLLocationAccuracyThreeKilometers //精度３km（かなり低め に設定している）
            locationManager!.distanceFilter = 10
            locationManager!.allowsBackgroundLocationUpdates = true //バックグラウンド処理を可能にする
            locationManager!.pausesLocationUpdatesAutomatically = false //ポーズしても位置取得を続ける
            locationManager!.startUpdatingLocation()
        }
        
        return true
    }
    
    //位置情報に変化があった場合の処理（今回は単純に緯度と軽度を出力する）
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        guard let newLocation = locations.last else {
            return
        }
        
        let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude)
        print("緯度: ", location.latitude, "経度: ", location.longitude)
    }
}
```

これで実行すると、緯度と軽度がprintされると思います。