OmniAICreator/Qiita-1.07M huggingface dataset:
Gitサーバーのクライアント側セットアップ

#はじめに
[AIXにGitサーバーを構築した流れ](https://qiita.com/mkzyk/items/9202c025f23b095ad657) の各ユーザー向けセットアップガイドです。（サーバー作業も書いてあるとわかりにくいと指摘を受けたので）
内容は上記とほぼ同じです。

##1. ssh接続の設定（クライアント側）
まずは、各自ユーザーがssh公開鍵を作成します。
詳細は、Git/GitHub公式のHow Toがあります。
- [Connecting to GitHub with SSH](https://help.github.com/en/articles/connecting-to-github-with-ssh)
- [Git サーバー - SSH 公開鍵の作成](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)

自身はMac OSを前提として書きます。 
Windowsの場合はまずGitをインストールし、GitBash上で下記全てのローカルPC上でのコマンドの入力をお願いします

- 自身が公開鍵を持っているか確認する

```
.ssh $ cd
$ cd ~/.ssh
.ssh $ ls
config		id_rsa		id_rsa.pub	known_hosts
```

- 無い場合は、下記コマンドを行う

```
$ mkdir .ssh
$ cd .ssh
.ssh $ ssh-keygen
```

実行場所は、Macなら`/Users/xxxx/.ssh`
Windowsなら`C/Users/xxxx/.ssh`
xxxxは自分の名前。

鍵の保存先を求められるので、`.ssh/id_rsa`を指定する  
**パスフレーズも求められるが、それはEnterを押してとりあえず無で良い。** 

ここまで出来たら、上記のように`id_rsa`と`id_rsa.pub`が作成されているはず。
`id_rsa`は秘密鍵で、`id_rsa.pub`は公開鍵となります。
`id_rsa.pub`の内容を`cat`などで確認しておく。
 
##2. ssh接続の設定（サーバー側）

**前提**
* `git`というユーザーがサーバー側に存在している
* `git`ユーザーがgitレポジトリをアクセスできる
* `/home/git/.ssh`にディレクトリが存在する
* `/home/git/.ssh/authorized_keys`が存在する

1. 先ほどの`id_rsa.pub`をリネームし、`id_rsa_myname.pub`とかにする
2. `/home/git/tmp`などに置きます。(FTPかscpコマンドで。ユーザーは`git`で）
3. `authorized_keys`に公開鍵の内容を書き込みます。

```
cat id_rsa_myname.pub >> /home/git/.ssh/authorized_keys
```

## 3. クライアント側のgitレポジトリ作成
terminal/gitBash上でここからは行います。

``` 
$ mkdir work
work $ cd work

work $ git init
```
作業ディレクトリ（ノンベアレポジトリ）をポイントします。

**クライアントPCからレモートレポジトリに対する紐付け**

```
work $ git remote add origin ssh://git@server_hostname:/home/git/work/work.git
```

上記により、`git`というユーザーで指定されたサーバーのベアレポジトリに接続する設定が完了しました

```
work $ git remote -v
origin	ssh://git@server_hostname:/home/git/work/work.git (fetch)
origin	ssh://git@server_hostname:/home/git/work/work.git (push)
```
こんな感じになっていればOKです。もし間違えていたら、`git remote rm origin`で削除してもう一回やりましょう
**注意!** もしサーバー上に複数の`.git`レポジトリがあるのであれば、それぞれにローカルにフォルダを作成し、`git remote add origin`を行わないといけません。各フォルダに対し、1つの`.git`しかaddできません。  

あとはpullするのみ！

```
work $ git pull origin master
```

でpullできたらセットアップ完了です。

##4. GitHub Desktopと連携する

ここまでのセットアップが完了し、個人のPCからサーバーにgitコマンドが不自由なくできている場合。
GitHub Desktopでも連携が可能です。
*少々画像を修正していますのでご了承ください

1. 左上のrepository選択画面で、Addをクリックし"Add Existing Repository"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/368e85ba-b2f6-6c2a-e00e-f0c4883abdec.png)

2. 下記画面に遷移するので、ローカルに作成した作業レポジトリpathをポイントします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/db95e8c7-6ec1-8067-6e70-48eb88a915b6.png)

3. 基本これだけです。一応確認のためにAddしたレポジトリを選択している状態で、Repository -> Repository Settingsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/fa8a9e2b-0c84-c25d-8c5a-b063bcf332f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/6d4478f2-b0bc-1cf1-f0be-2be9dab6d349.png)
上記のようになっていれば普通に作業ができるはずです。（まず最初にPublish Branchが必要です）
Raspberry Pi 4でTensorFlowLiteを動かす

Raspberry Pi4とCoralのUSBアクセラレーターを利用して、TensorFlowLiteを動かした。

苦戦した。
同じ内容で困っている人も確認できた。
[Pi4, Coral TPU, TensorFlow. install HadoopFileSystem load error](https://www.raspberrypi.org/forums/viewtopic.php?f=34&t=262595&p=1598968&hilit=coral+pi4#p1598968)
箱にSupported ML frameworks:TensorFlow Liteと記述されてるからTensorFlowはサポートされていないかもしれない。(ML = Machine Learningの略？)
![USBアクセラレーター](https://coral.ai/static/docs/images/accelerator/accelerator-inhand.jpg)
##セットアップ
以下をURL先を参考するとコンゴウインコを画像認識するプログラムが動かせる。
[Coral USBアクセラレーター](https://coral.ai/docs/accelerator/get-started/)

「2. Install the TensorFlow Lite library」の「Install just the TensorFlow Lite interpreter」を参考して、インタープリターをインストールする。

```Bash
wget https://dl.google.com/coral/python/tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl
pip3 install tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl
```
##以下を参考すると失敗
「E tensorflow/core/platform/hadoop/hadoop_file_system ~~」でTensorFlowが動作しなかった。
[Install TensorFlow with pip](https://www.tensorflow.org/install/pip)

間違えたらTensorFlowをアンインストールしよう。

```Bash
pip3 uninstall tensorflow #tensorflowをアンインストール
```
bobthefishのエラー

fishのversionを2.7から3.0.2にあげたら

```
math: Error: Expression is bogus
'scale=1;13705/1000'
     ^
```

というerrorが何度もでる．
googleと，fishのmath functionがbuild inに変わって
記述が変更された模様．
bobthefish/fish_right_prompt.fishを手で直してみたが，
math: 'scale=1;137343/60000' is not a valid scale value
とか出ます．

omfでinstallし直したのですが，

```
omf install bobthefish 
Updating https://github.com/oh-my-fish/packages-main master... Done!
Error: bobthefish already installed.
```
これは間違い．

```
> omf remove bobthefish
bobthefish successfully removed.
> omf install bobthefish    
```
ちょっと治ったけどダメ．で，よく調べるとfisherで
bobthefishを入れていたみたい．
なんで，

```
omf destroy

fisher update bobthefish
```
で無事エラー吐かなくなりました．

ついでにfisherのupdate

```
> fisher up
OK You are running fisherman 3.2.10
See github.com/fisherman/fisherman/releases
Updating 2 plugins
! Skipped bobthefish
! Skipped z
Done in 1s 964ms
```
今まで作った作品集です

<img width="664" alt="スクリーンショット 2019-11-27 22.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/137350bd-d8cf-5382-6d83-7f647eee3130.png">
<img width="882" alt="スクリーンショット 2020-01-24 12.01.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/152183f4-8327-9c0a-b381-00512e1cb0d7.png">
![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/e96e6730-d82d-d5a2-a04d-1d73f9b6c0cb.png)

<img width="866" alt="スクリーンショット 2020-01-01 12.31.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/78e0b81e-b840-2c26-e7af-1daedb10ac96.png">
<img width="495" alt="スクリーンショット 2019-12-13 16.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/3dd6e05b-4f7c-343d-20f1-135b2a11f908.png">![IMG_1656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/731686ea-04c8-b03d-9c48-87d270d640ac.jpeg)
![IMG_1691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/9a272679-9444-70ee-a19e-d29a6afeb4f4.jpeg)
![ mijikabegami.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574263/827f4d43-e519-507c-dbdd-07e6758f31fb.png)
AX203 for FreeBSD dpf-ax編

sg(SCSI GENERIC)を試してみます。sgはScott Longさんが作られたもののようです。

FreeBSD 12.1/amd64のデフォルトのkernelにはsgは入っていませんでした。モジュールになってないか調べてみたのですが、sgのモジュールはなくてcamモジュールにはコードが入っているのですが、camモジュールの一部がデフォルトで入ってしまっているので、camはロードできません。

仕方がないのでcamのモジュールのMakefileをコピーしてsgだけのモジュールを作ってみます。

```make:Makefile
S=	${SRCTOP}/sys

.PATH: $S/cam $S/cam/scsi $S/cam/ata $S/cam/nvme $S/dev/nvme $S/${MACHINE}/${MACHINE}

KMOD=	scsi_sg

# See sys/conf/options for the flags that go into the different opt_*.h files.
SRCS=	opt_cam.h
SRCS+=	opt_ada.h
SRCS+=	opt_scsi.h
SRCS+=	opt_cd.h
SRCS+=	opt_da.h
SRCS+=	opt_pt.h
SRCS+=	opt_sa.h
SRCS+=	opt_ses.h
SRCS+=	opt_ddb.h
SRCS+=	opt_printf.h
SRCS+=	device_if.h bus_if.h vnode_if.h

SRCS+=	scsi_sg.c

EXPORT_SYMS=	YES	# XXX evaluate

.include <bsd.kmod.mk>
```

ビルドできたkoをロードしてみます。

```
% sudo cp scsi_sg.ko /boot/kernel
% sudo kldload scsi_sg
% ls /dev/sg*
/dev/sg0	/dev/sga
```

sgaはsg0にリンクされていて、Linux互換のために作るようです。

dpf-axのdpflibのソースをFreeBSDでコンパイルできるようにしてみました。

https://github.com/yamori813/dpf-ax

Makefile.bsdでコンパイルできます。

```
% cd dpflib/
% make -f Makefile.bsd 
cc -I../include -c dpflib.c
cc -I../include -c rawusb.c
cc -I../include -c scsi.c
cc -I../include -c bootload.c
ar ruv libdpf.a dpflib.o rawusb.o scsi.o bootload.o
ar: warning: creating libdpf.a
a - dpflib.o
a - rawusb.o
a - scsi.o
a - bootload.o
cc -I../include -o testsg testsg.c -L. -lusb -ldpf
cc -I../include -o fwload fwload.c -L. -lusb -ldpf
cc -I../include -DTEST -o bload bootload.c -L. -lusb -ldpf
```

dpf-axのdpflibはsg以外にusbのapiも利用できるようです。

[dpflib/testsg.c](https://github.com/yamori813/dpf-ax/blob/master/dpflib/testsg.c)はsgのテスト用に追加したコードでflashのidを拾い出しています。

```
% sudo ./testsg
Opening generic SCSI device '/dev/sga'
55 48 20
```

これでpythonモジュールが作れると思うのですが、pythonは詳しくないのでやってません。

testsgにダンプのコード入れてidentify.pyに食わせてみたのですが、認識できません。残念ながら入手したモジュールにはdpf-axのサポート外のfirmwareが入っているようです。

```
% hexdump -C dumpfile | head
00000000  00 01 00 02 a8 03 a0 05  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000050  13 15 80 00 80 00 03 01  01 00 00 00 00 00 00 00  |................|
00000060  06 01 01 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  44 50 46 32 30 33 5f 56  33 2e 34 2e 37 00 00 00  |DPF203_V3.4.7...|
00000080  30 38 30 35 30 37 2d 30  00 00 00 00 00 00 00 00  |080507-0........|
00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
```

/dev/cd0からddで読むと、上のデータを含む先頭32Kは空になります。

そもそもdpf-axってax206がターゲットのようです。。。
React.FC より props の型を取得する

# React.FC より props の型を取得する

`React.FC<Props>` を定義して後から `Props` を `export` しないと・・・という場合に
[Conditional Types - Advanced Types - TypeScript](https://www.typescriptlang.org/docs/handbook/advanced-types.html#conditional-types) を利用して対象関数の引数の型を取得します。

## いらなかった・・・

**こちらの記事より以下の記事の `React.ComponentProps` について確認したほうがよいです。**

https://qiita.com/yosmiya/items/2ca9e4f8e55829f01de2

[Parameters - Utility Types - TypeScript](https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterst)


```ts:Parameters
type T1 = Parameters<(s: string) => void>;  // [string]
```

## 実例

```ts:ComponentProps-type
import React from 'react'

type ComponentProps<T> = T extends (props: infer P) => ReturnType<React.FC> ? P : never
```

### React.FC に限定したくない実例

でも `any` は・・・というときに `unknown` 使用

```ts:ComponentProps-unknown-type
type ComponentProps<T> = T extends (props: infer P) => unknown ? P : never
```

## 説明

[Type inference in conditional types - TypeScript 2.8 の Conditional Types について - Qiita](https://qiita.com/Quramy/items/b45711789605ef9f96de#type-inference-in-conditional-types) より

```ts
・・・
type FirstArgs<T> = T extends (a1: infer A1, ...rest: any[]) => any ? A1 : never;
・・・
```

こちらを参考に

- 取得対象となる `Props` を `A1` から `P` へリネーム
- 戻り値を `React.FC` の戻り値となるように `ReturnType<React.FC>` に変更

## サンプル

```tsx:user.tsx
import React from 'react'

type Props = {
  user: {
    /** ユーザー ID */
    id: number
    /** ユーザー名 */
    name: string
  }
}

const Component: React.FC<Props> = props => (
  <div>
    {props.user.id} {props.user.name}
  </div>
)

export default Component
```

```tsx:user.story.tsx
import React from 'react'
import { storiesOf } from '@storybook/react'

import User from './user'

type ComponentProps<T> = T extends (props: infer P) => ReturnType<React.FC> ? P : never

storiesOf('organisms/User', module).add('main', () => {
  const user: ComponentProps<typeof User>['user'] = {
    id: 1,
    name: 'taro',
  }
  return (
    <>
      <User user={user} />
    </>
  )
})
```

![component-props-type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/cff8d3eb-0ac5-ad88-fa3f-67c5ffc35a9f.png)
F#プログラミング

#F#は最高なプログラミング言語です
F#はいいぞい。F#は.NETが使える、関数型プログラミングができる。高速で型安全など[以前](https://qiita.com/kawaguchi5460/items/1a7742aab0c74720fb75)にも魅力を伝えたのですが、まだ多くの人が魅力を知るべきです。

#値の束縛
```fsharp:ex.fs
let Sun = 3
let TV x = x * x
let Value x y = x + y
let Me = TV (Value Sun 1)
```

#表示
```fsharp:ex.fs
printfn "%d" Me //16
```

#参照
```fsharp:ex.fs
let VVAN = ref (Value Sun -1) // VVAN = &(2)
VVAN := Me //VVAN = &(16) 参照場所の移動
printfn "%d" !VVAN //!で参照取り出し
```
gunicornについて

# 備忘録

GCPのCloud runを使用していて、「gunicorn」についてよく分からなかったので、その備忘録。

「gunicorn」とは、UNIXのためのPython WSGI HTTP Serverである。「WSGI」とは、Pythonにおいて、WebサーバとWebアプリケーション（もしくはWebアプリケーションフレームワーク）を接続するための、標準化されたインタフェース定義であるとのこと。昔は様々な状態で実装されていたけど、それを標準化したものということ？

以下はGCPの最後サーバ起動時のコマンドです。

```docker
# exec：指定されたコマンドを実行
# --bind IP:PORTの順番。接続するオリジン。右未記入だとIPはデフォルト設定になる？
# --workers :プロセス数
# --threads：スレッド数
# app:app→左はソースコード指定、右は名前。
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app
```
ファンクショナルコンポーネントの記法まとめ

# この記事について
statelessなコンポネントを作る時、色々と記法があるようだったのでまとめました。

#はじめに、

#### functional componentの使いどき
functional componentはstatelessなコンポネントを作るときに使います。

#### functional componentを作成するときの記法
1. functionを使う
2. アロー関数を使う

それぞれ下記にコードを書いてみます。

---

# １. functionを使って作成する

functionを使ってfunctional component を作成する際の記法です。

```React
function Welcome(props) {
  return <p>Welcome, {props.name}!</p>;
}

const sample1 = <Welcome name="Qiita" />;

ReactDOM.render(sample1, document.getElementById('sample1'));
```

**アウトプット↓**

```
Welcome, Qiita!
```

# 2. アロー関数を使って作成する

アロー関数を使ってfunctional component を作成する際の記法です。

```React
const Fruit = (props) => {
  return <p>This is {props.fruit}!</p>;
}

const sample2 = <Fruit fruit="strawberry" />;

ReactDOM.render(sample2, document.getElementById('sample2'));

```

**アウトプット↓**

```
This is strawberry!
```

# functional componentをclass構文で受け取る

上二つの例では、constで宣言した変数でfunctional componentを受け取りましたが、
同じように、class構文で受け取ることもできます。

# functionで作成したコンポネントを受け取る

```React
function Color(props) {
  return <p>My favorite color is {props.color}!</p>;
}

class Sample3 extends React.Component{
  render(){
    return(
      <Color color="silver" />
    );
  }
};
ReactDOM.render(<Sample3/>, document.getElementById('sample3'));
```

**アウトプット↓**

```
My favorite color is silver!
```

# アロー関数で作成したコンポネントを受け取る
```React
const Town = (props) => {
  return <p>This is {props.town}!</p>;
}

class Sample4 extends React.Component{
  render(){
    return(
      <Town town="Tokyo" />
    );
  }
};

ReactDOM.render(<Sample4/>, document.getElementById('sample4'));
```

**アウトプット↓**

```
This is Tokyo!
```


# 参考
[【React tutorial】コンポーネントと props](https://ja.reactjs.org/docs/components-and-props.html)
[【teratail】constとfunctionの違いについて](https://teratail.com/questions/188041)
Bootstrap-Vue の carousel からクリックイベントを拾うには

## だめな例

```html
    <b-carousel
      id="reccomended-banner"
      v-model="slide"
    >
      <b-carousel-slide
        src="hogehoge.png"
        @click="hugahuga"
      >
      </b-carousel-slide>
    </b-carousel>
```

なお、 `b-carousel-slide` ではなく `b-carousel` に `@click` を仕込んでもだめ。

## うまくいく例

```html
    <b-carousel
      id="reccomended-banner"
      v-model="slide"
    >
      <b-carousel-slide>
        <img slot="img" class="d-block img-fluid" src="hogehoge.png" @click="hugahuga" />
      </b-carousel-slide>
    </b-carousel>
```
ちゃんと要素を中に定義してあげればうまくいく模様。
QRコードを編集ツール Androidアプリ(sQRCodeEditer)

# はじめに

手元に印刷された**QRCode**。ふと、どんな内容なのだろう!? と思った事はありませんか。

まぁ、そういう時は普通のQRコードリーダーでよいのだけど、、、

今回のツールは、読み取ったQRコードの内容がテキストボックスへ返ってくるので、その値を少し修正して、、、そういうQRコードを作成することもできます。

# Webサイト

一応「[QR Code Editer](http://rocketeer.dip.jp/sanaki/free/afree01.htm)」だけど、[GooglePlayはこっち](https://play.google.com/store/apps/details?id=jp.dip.rocketeer.sQRCodeEditer)

# 画面説明

![sQRCodeEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/0065f28c-244e-7772-280d-864153599fc3.png)


- **「スキャンする」**で、カメラが起動して、QRコードを読み取れます。読み取った値は、中央のテキストボックスへ返ってきます
- テキストボックスなので、編集可能です
- カメラを起動してQRコードを読み取らなくてもこのテキストボックスに直接入力してもいいわけです
- **「作成する」**で、テキストボックスの内容のQRコードを生成した下側に表示します。
- 同じ内容のまま再度**「作成する」**ボタンを押下すると、QRコードのサイズが変化します

# その他

差分値のQRコードを大量に試したい場合は、こちら(↓)

- [QRコードからファジングする(sQRCodeFugging.exe{sWebTool})](https://qiita.com/tomoki0sanaki/items/e46e666625191aeb762b)

# 以上
3分でできるVisualStudioCodeのSass環境構築(Live Sass Compiler)

![vsxsass-1536x864.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574194/21c5af59-5e71-8d3e-4862-16859f160633.jpeg)

CSSプリプロセッサ―である**Sass**。
Sassを導入することでコードを書く量が減り開発スピードが上がります。また、何より関数やファイル分割機能が使えるので保守・更新性が格段に上がります。

特にVisualStudioCodeだとExtentionsで簡単に環境構築出来てしまうので、導入していない人は損かもしれません、、、

**目次**
1. Step1 ExtensionsでLive Sass Compilerを追加
2. Step2 scssファイルを作る
3. Step3 Watch Sassをクリック
4. オプション（cssを圧縮する）
5. Sassの使い方例


#Step1 ExtensionsでLive Sass Compilerを追加

![li.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574194/ea0607c0-cf55-13a0-78e9-bd8bf6cb0599.jpeg)

VisualStudioCodeのExtensionsで**Live Sass Compiler**を検索、Installボタンで追加しましょう。

#Step2 scssファイルを作る

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574194/f6a08939-42c1-8f19-968f-c7e74faf71a9.jpeg)

cssを出力したいフォルダに.scssファイルを作りましょう。

#Step3 Watch Sassをクリック

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574194/1555c6db-fa0c-92c3-66ec-6188700bb260.jpeg)

ステータスバーに表示される「Watch Sass」をクリックすると、「Watching...」状態になります。
.cssファイルと.css.mapファイルが生成されれば成功です！

打ち込んだscssがリアルタイムでcssにコンパイルされる環境になりました👍

#オプション
デフォルトで十分なためあまりいじる必要性はないですが、cssを圧縮してコンパイルできたりもします。
私はVisualStudioCodeのsetting.jsonに以下を追加し出力したcssを圧縮してます。

    "liveSassCompile.settings.formats":[
        {
            "format": "compressed",
        },
    ]

オプションで出力パスを変えたり、AutoprefixerのOn/Offなどができます。
詳しくは公式ドキュメントをご覧ください！
https://github.com/ritwickdey/vscode-live-sass-compiler/blob/master/docs/settings.md


#Sassの使い方例

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574194/dbfdda54-b07d-5aa3-8f80-5e500b3c21a0.jpeg)

Sassの便利なところは機能や内容ごとにファイル分割し管理可能なところ。

私は_settings.scssなどのファイルを作って変数や関数を入れてます。
（ファイル名の最初にアンスコを入れるとコンパイルされません）
変数には色や統一したい要素や余白のサイズを入れ、関数には@mixinでメディアクエリなどをぶちこんでいます。

また部位ごとに_header.scssなどでレイアウトを作成。
style.scssで全ての分割ファイルをまとめてstyle.cssとして出力しています。

是非簡単にSass環境を構築しちゃってください！
Composeで起動とシャットダウンの順序を制御する場合の注意

コンテナを特定の順番に起動したいという場面がたまにあると思いますが、その時の注意点のメモです。

**docker-compose.ymlにdepends_onまたはlinksを使って起動する順番を指定することは出来るが、Composeはコンテナが「準備完了」になるまで待機しない。**

例えばこういうやつ

```
version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
```

またはこういうやつ

```
version: '2'
services:
  web:
    build: .
    links:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
```

何故だろうと思って調べていたら、「なるほど」と思える下記の記述を見つけました。

```
ただし、スタートアップの場合、Composeはコンテナが「準備完了」になるまで待機しません
（特定のアプリケーションにとってそれが意味するものは何でも）-実行されるまでのみです。これには十分な理由があります。

（たとえば）データベースの準備が整うのを待つ問題は、実際には分散システムのはるかに大きな問題のサブセットにすぎません。
本番環境では、データベースはいつでも使用できなくなったり、ホストを移動したりする可能性があります。アプリケーションは、
これらのタイプの障害に対して回復力が必要です。
```
## 解決案
1. 起動直後に他のコンテナに対してコンテナが起動している事が前提のアクセスが走る処理をやめる（やめられるか検討する）
2. ヘルスチェックに再帰処理を入れて他のコンテナが立ち上がっているかを検証する
3. アクセス出来なかったとしても問題ない仕組みとする

こんな所でしょうか？
忘れそうなので思いついた解決案とともにメモ_φ(･_･

## 参考
- [Composeで起動とシャットダウンの順序を制御する](https://docs.docker.com/compose/startup-order/)
- [Compoeseリファレンス](http://docs.docker.jp/compose/compose-file.html#depends-on)
ラズパイ4でエアコンを操作してみる

この記事は[0505Keitan's Blog](https://0505keitan.com/blog/rpi4-aircon-onoff)からの移植記事です。
ちょっと付け足している部分もあります.

2020年最初の記事ですね。今年も色々作っていきます！

# 使用機材

 - [RaspberryPi4B (4GB)](https://www.amazon.co.jp/gp/product/B07YM3Z2QR)
 - [Pi 3 DIY Kit(22in1)](https://www.amazon.co.jp/gp/product/B01M6ZFNSS)
 - 赤外線LED - 503IRC2E-2AC

# pigpioの導入

まずはGPIOピンを制御するために`pigpio`を導入

```shell
$ sudo apt install pigpio python3-pigpio
```

デーモンを起動する

```shell
$ sudo systemctl enable pigpiod.service
$ sudo systemctl start pigpiod
```

# 赤外線学習用のコードをダウンロード

終わったら赤外線学習用のコードをダウンロードする。

```shell
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
```

~~なぜか私の環境だとタイムアウトするのでMacでダウンロード、unzipしてラズパイにscpした。~~
失敗した理由がわかりました。IP固定するために色々いじってた結果DNSサーバーの指定をしていなかった?っぽかったです。
多分このままでもうまくいきます。

# 配線

#### 全景
<img src="https://0505keitan.com/blog/assets/images/2020-01-09-01.jpg">

#### ブレッドボード
<img src="https://0505keitan.com/blog/assets/images/2020-01-09-02.jpg">

配線細かく書きたいんですけどめんどくさいので割愛。写真見てなんとかしてください()

# 赤外線学習の準備

これで17ピンを出力に、18ピンを入力に設定する。

```shell
$ echo 'm 17 w   w 17 0   m 18 r   pud 18 u' > /dev/pigpio
```

# 信号記録

```shell
$ python3 irrp.py -r -g18 -f codes air_con:on --no-confirm --post 50
```

|オプション|意味|
|:-:|:-:|
|-r|受信した信号を記録するモード|
|-g18|GPIO18を使って信号を受信する|
|-f codes|受信した信号を出力するファイル名を指定する|
|--no-confirm|確認のために同じ信号を2回要求しない|
|--post 50|50ms無信号の場合に信号が終わったと判断する|
|air_con:on|信号の識別子。わかりやすい名前をつける|

参照元 : <a href="https://qiita.com/gorohash/items/598d69a63bd6b4308291">エアコンのリモコン信号を解析する ~デコード編~ - Qiita</a>

# 信号発信

このコードだけネット上に落ちていたので参照先がなく、曖昧です。

```shell
$ python3 irrp.py -p -g17 -f codes air_con:on
```

|オプション|意味|
|:-:|:-:|
|-p|送信モード？|
|-g17|GPIO17を使って信号を発信する？|
|-f codes|発信するファイル名を指定する|
|air_con:on|信号の識別子。さっきのやつ|

### 参考
 - <a href="https://jorublog.site/electronic-work-smart-remocon-program/">大学生の電子工作　スマートリモコン(プログラム) - じょるブログ</a>
 - <a href="https://qiita.com/gorohash/items/598d69a63bd6b4308291">エアコンのリモコン信号を解析する ~デコード編~ - Qiita</a>
 - <a href="https://qiita.com/takjg/items/e6b8af53421be54b62c9">格安スマートリモコンの作り方 - Qiita</a>
KinematicBody2D の基本

Godot Engine の公式チュートリアル [Using KinematicBody2D](https://docs.godotengine.org/en/3.1/tutorials/physics/using_kinematic_body_2d.html) の自分用まとめ。
現在の Godot Engine のバージョンは 3.1.2

２Ｄの物理エンジンに関わるノードはPhysicsBody2Dであり、３つの下位ノードを用途によって使い分ける。

- KinematicBody2D
 物理エンジンによって自動で動かされず、スクリプトによって明示的に動かす必要がある。衝突などの干渉はする。
- RigidBody2D
 - 物理エンジンによって自動で動き、重力や質量、摩擦係数などのパラメータを入力することができる。
- StaticBody2D
 - 床や壁などの動かないものに使う。動く足場などのためにスクリプトで動かすこともできるが、KinematicBody2Dと違い、それが他のオブジェクトと接触したときにどう動くか、などといった細かいことを指定することはできない。

# KinematicBody2D を動かすときのメソッド

基本的には _physics_process() 内で使う。

### move_and_collide()
引数は移動させる分のベクトル。_physics_process() のtimestepでの移動分なので、移動量としてオブジェクトの速度に _physics_process()の引数deltaをかけたベクトルを入れる。
なにかと衝突する場合、衝突地点まで移動し、KinematicCollision2D のオブジェクトを返す。
KinematicCollision2D からその衝突に関する情報を引き出すことができる。

### move_and_slide()
キャラを動かすための簡易版メソッド。deltaをかけずに速度を入力する。
なにかと衝突した場合そこで止まらずに衝突面に沿ってスライドする。
カスタマイズ用パラーメタをセットすることができる。

- floor_normal (デフォルト値 Vector2(0,0)) : 床の向きを指定する。is_on_floor(), is_on_wall(), is_on_ceiling() で床、壁、天井への接触を判定できるようになる。指定しないと全て壁への接触と見なされる。
- slope_stop_min_velocity (デフォルト値 5) : 坂に立ってるときに速さがこの値以下だと滑り落ちない。
- max_bounces (デフォルト値 4) : 一回の移動での衝突回数の上限。
- floor_max_angle (デフォルト値 0.785398 radians = 45° ) : 床と判断される最大の傾斜角度。

### move_and_slide_with_snap()
move_and_slide メソッドに Vector2 のパラメータ snap を追加する。スナップベクトルが地面と接触する限り地面に吸い付いたままになる。

### get_slide_collision()
move_and_slide メソッドが最後に呼び出されたときからの衝突のデータオブジェクトを返す。複数回衝突しうるので、引数として衝突のインデックスを渡す。衝突回数は get_slide_count() で得られる。

```
for i in range(get_slide_count()):
   var coll = get_slide_collision(i)
   #衝突に関する処理
```

move_and_collide() だと戻り値として衝突のデータが得られるが、move_and_slide() は複数回衝突する可能性があるためこういう仕様になってると思われる。

# 使い方に関するコメント

### move_and_slide()の意味
move_and_collide() は、衝突が発生した場所で動きを止めてしまうので、キャラクターをオブジェクトに押し付けながら移動させようとするとそこで引っかかって動かなくなってしまう。
move_and_slide()を使うと引っかからずスムーズに動く。
一応 move_and_collide() のみで同様の挙動を実装することはできる。

### キャラの速度ベクトルの更新
大体の場合キャラの速度に当たるベクトルをローカル変数として保持し、それを move_and_slide に引数として渡すことになるが、このメソッドは戻り値として移動した結果の速度を返す。
例えば壁面に斜めに当たったキャラが壁面に沿ってスライドしたとすると、壁面に沿った速度ベクトルが返される。

```
velocity=move_and_slide(velocity)
```

とするのは重要で、例えば２Ｄアクションで上から下にかかる重力をスクリプトで実装しているとき、velocity を更新しないと地面に立っている間も下方向への速度ベクトルが増え続けることになる。

### move_and_slide_with_snap()の意味
これは例えばキャラが少し傾いた山なりの坂を横に移動したときの挙動に関係する。
物理エンジンの正確な挙動に従えば、山の頂点を通り過ぎる時にキャラが一瞬浮くことになるが、このメソッドを使うと常に地面を接触したまま山を通り過ぎることができる。
キャラをジャンプさせるときにはスナップしないようにしないとダメ。
神様とアルゴリズム

こんにちは。
今回は都市開発についてです。

#データ駆動の都市開発
世の中データが必要である。
都市を作るときに既存のログをぶち込んで合成して動かす等の仕組みが無いわけでは無いが、それでもネタ切れには負けてしまう。
データの地平を超えればその後は未定義であり、仕組みが壊れてしまう。

#データ生成者
データは前もって作って物故んでおかないといけないが、だれが作るのかという問題を超えることはできない。
神様を捕まえてきて支えるにしても彼らも暇をするしネタ切れにもなる。
それでは結局データの地平を超えることになってしまう。

#観測能力とデータの地平
観測能力があると量子化したデータを一意にしてしまい、ネタ切れを加速する。
あの町が賑やかだと引っ越したが一年したら閑散としてしまった。
たまに聞く話ではあるが、その人には観測能力があり、記憶によるメモ化によって、はやめられたのだろう。

#ログの合成
ログの合成には何通りかあるけれど、実データの合成はお手軽である。
でも、事故を起こすデータもある。それを運用する意味はあるだろうか？

#営みとアルゴリズム
基本的な営みはアルゴリズムで書かれるべきだろう。
たとえルーチンワークであってもアルゴリズムの地平を超えるのは難しい。
ガチガチにしないのが一つの秘訣ではあるが、アルゴリズムによって消費という事を大分回避できる。

#アルゴリズムとボケ
人にはある程度の負荷が必要である。アルゴリズムで整流されれば、負荷を大分減らすに至る。
それでは、意識が馬力を出さなくなるので、それはそれで問題だ。
楽しい演算で負荷をかける方法が永劫に必要になる。

#都市開発とアルゴリズム
都市開発するには結局アルゴリズムが必要になる。
高粒度の概要を回しながら、細部を司る低粒度のアルゴリズムを回すことが1000年の都市には必要になる。

#場所の考え方
場の考え方は色々あります。閉路とか開路とか三角州とか。
でも、自分は「自由平面」を推しています。
理由は難しくて簡単だからですが、色々突っ込みようがあります。
記憶は体に附帯し体は自由平面を行く駒です。
人を駒っていうはいろんな方面から怒られるのですが。

#アルゴリズムと人の意志
人には意志がある。アルゴリズムの中であっても意志は残り、思考することをやめない。やめてはいけない。
なので、アルゴリズム外に出ることが無いわけでは無い。
そういうときのリカバリを考えておくのもいいかもしれない。

#終わりに
読み物としてみていただければ幸いです。
iOSアプリのDEBUGビルドを高速にしてみた

##はじめに

現在開発中のiOSアプリ、xcodeでnativeで作ってるんですが、ビルドが遅くて耐えられない。
ほんのちょっとの修正でもデバイスで実行されるまで40秒かかったりする。

androidは大幅に修正してもせいぜい5秒程度なのに・・・。
くそが。

androidStuido 3.5は超偉い。

##実行に移す
そこで結構面倒だけど、前から考えてた方法をやってみることにした。それは・・・。

フレームワークをできるだけ外す。

以上。

・・・ではなんなので、具体的に説明すると、


- 空プロジェクト作って、ソース等全部ぶちこむ。しがらみが色々あるので、新規の方が苦労しなさそうなので。
- 開発に必要な最低限のフレームワークは追加する。
- DEBUGビルドのマクロに本番/開発の識別フラグを追加して、ソース上の、無いフレームワークが必要な箇所をコンパイルされないようにしたり。#if !xxflag/#endif ね。
- ほぼ空のダミークラスを、フレームワークのヘッダを元に作って、何もしないようにしたり。

を全部やると、きっとできる。
開発中に必要なのまでやると、動かないので注意してね。


##結果
概ね空プロジェクトで使ってるフレームワークのみにできた。
ちょっとの修正なら10秒程度で実行できる。
まあまあだ。
adMobとかも外したのでバナーも出なかったりするけど、全然OKだ。

対応後、android並にサクサク開発できてる:kissing_closed_eyes:

でふぉでこうなって欲しいものだ。

ちなみに1日掛からずできた。

１画面のみの開発時とかであれば、その画面専用プロジェクトをソース最小限で作ると、もっと速くできる。

##その後
10秒ビルドで非常にサクサク開発できてる。
スケジュール前倒しでいけてる。
絶対やるべきだ。
DB2（９.7）ＤＢリストア時に表スペースペンディング状態を解消する方法

#背景
DB2でエクスポートしたＤＢをリストアしようところ、上手くリストア出来ない事象が発生。
調査した結果表スペースが定義されておらずペンディング状態となっていたため、解消するための方法をメモします。

※ロールフォワードペンディングとストレージ定義待ち状態の解消方法となります。

## テーブルスペースの状態を表示
まずは下記コマンドでテーブルスペースの状態を確認。ここで
「ロールフォワード・ペンディング」
「ストレージ未定義（定義待ち）」
の状態であれば以降の手順を行う。

```
db2 list tablespaces
```

## ロールフォワード・ペンディングを解消
```
db2 rollforward db <database-alias> to end of logs and complete
```
## 未定義領域のストレージを定義
```
db2 set tablespace containers for <tablespace-id> using (PATH <storage-path>)
```

## リストアを継続させる
```
db2 restore database <database-alias> continue
```

##その他
私の環境ではＨＤＤが足りずにリストア出来ない状況が起こったためＨＤＤの空き容量は十分にあるとよいかと思います。
OrthographicCameraのsize

画面サイズがWxHだったとき、サイズSのOrthographicなカメラが表示する領域は、たてが基準で

* たて幅 ＝ 2 * S;

横は画面のアスペクト比より

* よこ幅 ＝ 2 * S * W / H;
51歳からのプログラミング　ファイルに書き読み　android　備忘


```java:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = findViewById(R.id.tv);
        String text = "";

        try {
            FileOutputStream output = openFileOutput("userInfo.txt", Context.MODE_PRIVATE);
            output.write("hello".getBytes());
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            String file = "userInfo.txt";

            FileInputStream fileInputStream = openFileInput(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream,StandardCharsets.UTF_8));
            StringBuffer buffer = new StringBuffer();

            String lineBuffer;
            while( (lineBuffer = reader.readLine()) != null ) {
                text = lineBuffer;;
            }

            reader.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        tv.setText(text);
    }
}
```
Appの内部ストレージに書き込みするとき、ファイルがなければ、ファイルを作成して書き込む。

通常は内部ストレージのファイルは見えないけれど、Android Studio のデバイス・ファイル・エクスプローラー（DFE)で中身を覗けるんだった。sqliteを使うときもDFEをつかったっけ。

![R020125-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399000/2bc6d4bb-5f86-0cd4-5753-9f35f8eb1d14.jpeg)


![R020125-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399000/2c726355-f09f-e168-bfe3-71c0349c408c.jpeg)
Webカメラの映像をcanvasに表示してそこからStreamを生成する

## やりたいこと
* webカメラの映像をvideo要素に表示する
* video要素からcanvasに描画する
* canvasからStreamを生成する

## ブラウザごとにgetUserMediaの挙動が異なる
全部のブラウザで確かめたわけではないですが、少なくともChromeとFireFoxではgetUserMediaをする際に指定する制約（MediaConstraints）で値を指定した時の挙動が異なります。

```javascript
navigater.mediaDevices.getUserMedia({ // ← このときに指定する値がconstraintsになります
  video: {
    width: "640px",
    height: "360px"
  }
}) .then((stream) => {...})
```

### Chromeの挙動
* カメラが対応している解像度の範囲内なら指定した解像度でstreamを取得してくれる

### FireFoxの挙動
* カメラが対応している解像度のなかで指定した解像度に近い値を選んでくれる

またブラウザごとに対応しているMediaConstraintsの内容が異なるのできちんと確かめなければいけません。
getSupportedConstraintsを使用すると、サポートされている値がわかります。
例えば現時点ではアスペクト比（aspectRatio)はChromeではサポートされていますが、FireFoxではサポートされていません。

```javascript
navigator.mediaDevices.getSupportedConstraints();
```

Chromeと同じように、FireFoxでカメラが対応していなくても指定した解像度の映像を取得したいと思った時に、canvasに描画してさらにStreamを取得するという方法にたどり着きました。

#### sample
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="mossan245" data-slug-hash="ZEYLRGP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="getUserMedia Constraint Test">
  <span>See the Pen <a href="https://codepen.io/mossan245/pen/ZEYLRGP">
  getUserMedia Constraint Test</a> by mossan245 (<a href="https://codepen.io/mossan245">@mossan245</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## video要素からcanvasに表示&Streamを取得する
Webカメラの映像をgetUserMediaで取得後、canvasに表示します。
ここでは、映像と同じFPS30で描画したいので、setIntervalを使用しています。

```javascript
const video = document.getElementById("player");
const canvas = document.getElementById("canvas");
  const ctx = canvas.getContext('2d');
  setInterval(() => {
    if (canvas && ctx){
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
    }
  }, 10000/30);
```

canvasのcreateStreamメソッドで、canvasからMediaStreamを生成することができます。
第一引数はFrameRateの値を指定することができます。
例えば映像のFPSを30からもっと少ない値に落としたいときにも使うことができます。

```javascript
const canvas = document.getElementById("canvas");
const canvasStream = canvas.captureStream(30);
const videoCanvas = document.getElementById("player-canvas");
videoCanvas.srcObject = canvasStream;
```

#### sample
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="mossan245" data-slug-hash="gObEJaR" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Video Canvas Stream Test">
  <span>See the Pen <a href="https://codepen.io/mossan245/pen/gObEJaR">
  Video Canvas Stream Test</a> by mossan245 (<a href="https://codepen.io/mossan245">@mossan245</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 参考
* https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/captureStream
* https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints
* https://qiita.com/chelcat3/items/02c77b55d080d770530a
①AI for Everyone 受講してみた

##はじめに
今回は Coursera で Andrew Ng 氏が公開しております「 AI for Everyone 」の内容を、1コースごとにまとめて紹介していきたいと思います。
Andrew Ng 氏と本講座の詳細については、下記リンク参照。
■リンク

- [Andrew Ng 氏について](https://www.coursera.org/instructor/andrewng)
- [Coursera「 AI for Everyone 」](https://www.coursera.org/learn/ai-for-everyone)


###AI for Everyone
本コースは Andrew Ng 氏曰く、AI に対してあまり馴染みが無い方や、非技術者向けの内容とのことです。
コースは全部で4部（4週間）構成となっており、無料で受講可能です（コースごとについているテストを受ける場合は、別途で有料）。


■コース概要

- Week1: AI とは?
- Week2: AI プロジェクトの進め方
- Week3: AI を企業内で発展されるためには
- Week4: AI と社会



##Week1 
Week1 では、タイトルの通り AI というものが何なのかについて学んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/052dd40b-9f3d-3ed5-2f8c-f1cd25d53437.png)


###AI とは?
AI には大きく分けて2種類あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e990560b-a98a-2832-54e3-37969f70cd2f.png)

■AI の種類

- ANI (artificial narrow intelligence) 特化型人工知能
 - 特定の分野や作業に特化した人口知能で、今日われわれが目にしてる AI はほぼこれに該当
 - スマートスピーカ、自動運転など 
- AGI (artificial general intelligence) 汎用型人工知能と呼ばれるもので、
 - どのような分野にも応用できる人工知能で、実現を目指したい AI 
 - 人間と同等かそれ以上の働きが可能 


###データとは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2c010850-d2b4-025a-0bb3-c60b24818511.png)
AI システムを作るにあたりデータは重要ですが、データを扱う上で以下のポイントを意識する必要があります。

■データを扱う際のポイント

- 貯め込みすぎない
- ある程度集まったら AI チームなどに渡してデータの内容や質のフィードバックをもらって改善
- 沢山あれば良いというわけではなく質も大事
- 必ずしもまとまった綺麗なデータばかりではない


###AI の用語について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/6baf9c38-e169-a57f-2e0a-2cb27f3ed4bc.png)
一概に AI といっても、そこには Machine Learning(ML) や Deep Learning(DL)、Neural Network(NN) など様々なツールが含まれております。
それぞれの定義は以下となります。

- Machine Learning (機械学習)
 - 明示的なプログラムが無くてもコンピュータに学習能力を与える研究分野

- Data Science (データサイエンス)
 - データから知識や洞察を抽出する科学分野

- Deep Learning (深層学習)
 - Neural Network を利用しており、Neural Network と同じ意味合いで使われることが多い

- Neural Network (ニューラルネットワーク)
 - 脳の構造からインスパイアされたものであるが、仕組みは実際の脳と同じというわけではない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/0cbcbc55-f734-4fbb-0262-ee568a681bca.png)


###AI 企業となるためには?
AI 関連のプロジェクトを実際に始める際、企業は以下の点について注意する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/87ecb836-cb46-c250-3841-64529b9bef80.png)

■AI プロジェクトに取り組む際のポイント

- パイロットプロジェクトからまずは始めて、勢いをつける 
- AI チームを社内で結成する
- AI トレーニングを幅広く提供する
- AI 戦略を発展させる
- 会社の内外におけるコミュニケーションを発展させる


###機械学習(ML)でできること・できないこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e26ef20c-a1a2-9e45-54e2-1e20ebf21178.png)
一見万能そうな ML ですが、ML にもできること・できないことはあります。

■ML でできること・できないこと

|できること|できないこと|
|:---:|:---:|
|受け取ったメールに対して特定の返事をする|受け取ったメールに対して気の利いた返事をする|
|カメラの画像から自動車かどうかを認識|カメラの画像から人間のジェスチャの意味を判断|
|10000枚の画像を用いて肺炎を診断|10枚の画像と医療書に記載されている肺炎の詳細から肺炎を診断|



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/340d47cb-f2f7-b0ca-f6b2-8bcc916232d5.png)
以上のことから、ML にも強みと弱みがあることが分かりました。それぞれをまとめると以下となります。

■ML の強み・弱み

|強み|弱み|
|:---:|:---:|
|簡単なコンセプトについて学習する|少ないデータから複雑なコンセプトを学習する|
|膨大なデータが用意されている|学習が足りない新たなデータに対して成果を出す|


##おわりに
Week1 では、 AI というものについて基本的なことを学ぶことができました。
Week2 では、 AI プロジェクトを進めていく際のポイントなどについて紹介していきたいと思います。
jsファイルをlintの対象外にする設定

#　はじめに
TS開発でしてればeslint入れますよね。jsファイルのことは考えたくないのでlinterには黙ってもらいます！


# 問答無用ですべてのjsファイルをシカトしたいとき

```:.eslintignoreファイルを作成して、これだけ書く
**/*.js
```
https://eslint.org/docs/user-guide/configuring#eslintignore


# 特定のオプションを指定したいとき

eslintrcのoverridesに以下を追記する。

```json-doc:@typescript-eslint/explicit-function-return-typeをルール対象外にする例です。
  "overrides": [
    {
      // jsファイルはlinterの対象から除外する
      "files": ["*.js", "*.jsx"],
      "rules": {
        "@typescript-eslint/explicit-function-return-type":"off"
      }
    }
  ]
```

あとはrules内を各々適当に指定すればOKです。
【準備中】4.Salesforce Training(Service Cloud<Lightning UI>)

#【前言】
準備中

#【Training内容】
##第 1 次课（時間：8時間）

準備中
##第 2 次课（時間：8時間）
準備中

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/4ac7a610-3e57-24fc-92d3-7609c3c9951d.png)
PythonのMatplotlib＋Seabornを使ったグラフ描画を非Python実行環境のWindowsで使う

諸事情により，Pythonのグラフ描画機能を非Python実行環境のWindowsで使うケースが出たため，備忘録として記載.
nugetとかにあるかもしれないけど，調べきれなかった...

#環境
OS: Windows 10 64bit
Python:3.6.10
Pyinstaller:3.5

#heatmap描画を.pyで作成
今回はheatmapグラフが欲しいため，heatmapを描画して.png保存するスクリプト"heatMap.py"を作成．
最終的にはWindowsから.exe実行をするので，使いやすいように，
1. .csvの読み込み(パス指定)
2. .pngの保存(パス指定)
を引数付きで実行できるようにした．
heatmap描画にはseabornを用いた．
動機は[いろいろなheatmapが作りやすそう](https://qiita.com/hiroyuki_kageyama/items/00d0f52724f16ad7cf77)で，拡張性を感じたため．

###サンプル
```py
import sys
import os
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

def Heatmap(data):

 ax = sns.heatmap(data,annot=True)
 return ax

if __name__ == '__main__':

 args = sys.argv

 load_path = args[1]
 save_path = args[2]
 save_name = args[3]

 print(load_path,save_path,save_name)

 data = np.loadtxt(load_path,delimiter=",")
 hoge = Heatmap(data)
 hoge.plot()

 plt.savefig(os.path.join(save_path,save_name),facecolor="blue")   
```
第一引数args[1]：データソース(csvファイル)のパス＋ファイル指定
第二引数args[2]：グラフ保存先のパス指定
第三引数args[3]：グラフ名.保存形式　指定
※args[0]は実行ファイル名

pythonの引数付き実行については[ここ](https://qiita.com/taashi/items/07bf75201a074e208ae5)を参照,
matplotlibのsavefigパス指定は[ここ](https://qiita.com/ofutonfuton/items/a1fa95c14844bb09a789)を参照した．
※エラー処理は割愛

#pyinstallerで.exe作成
[この記事](https://qiita.com/takanorimutoh/items/53bf44d6d5b37190e7d1)を参考に，pyinstallerで.exe作成．

![heatMap.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567980/d5447b83-c227-362f-f6b2-604ab71b3be1.jpeg)

関連dll含めてフォルダができた．

#.exeで引数付き実行
[アプリ.exe] [第一引数] [第二引数] [第三引数]

```
C:\Users\user.name>heatMap.exe C:\Users\user.name\Documents\Python\Graph\DataSrc\matrix.csv C:\Users\user.name\Documents\Python\Graph\GraphDst heatMapTest.png
```
できました．
![heatMapresult.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567980/188b3ad7-b3e9-cc14-92d0-643def0d7ddf.jpeg)

ただし，この作りは，毎回イチから実行する方針のため，実行時間が数秒かかる.
　→実測 約4秒
File保存を繰り返すため，Windowsアプリ側でこの.exeを実行して，出力ファイルをアプリ側に取り込む用途には向いていない．(遅くていいならできるけど)
次回は，.exeを常時立ち上げておいて，プロセス間通信で返すように作る
Android + Vulkan で Surface を初期化するメモ

## 背景

* Vulkan の描画画面を初期化したい.

## C++ メインのアプリで使う

Surface を作るには, ANativeWindow コンテキストが必要になります.

C++ メイン(android_main を利用)の場合, android_native_app_glue を使います(NDK にソースコード付属)

android_main から渡ってくる `android_app` struct に `ANativeWindow` の情報として window があります.
こちらを Vulkan の Surface 初期化のときに渡します.

Sascha 先生のサンプルを参考にします.

https://github.com/SaschaWillems/Vulkan-glTF-PBR

## 通常の Java, Kotlin から使う　

Android VulkanでCamera画像を表示する。
https://qiita.com/kwhrstr1206/items/44fb2b6f89126cf78437

を参考にします.

## Flutter で使う  

T.B.W.

SurfaceTexture で取得が推奨かしら?

## TODO

* [ ] SurfaceTexture などのオフスクリーン描画について調べる
HTML CSS 道場コース

＃今回はプロゲートのHTML CSSの道場コース、初級編と中級編をしました。
思っていた通り難しかったです。
ただわkらないとこが出るたびに調べていたのでいいアウトプットができたと思う。
HTMLで書いた後、CSSで記述する際にわからないことが多かったので、CSSの勉強をもっとしなくてはいけないと感じた。

主に学んだことは画像の取得方法や背景画像をCSSで記述する方法、ログインリンクの作り方などです。
学んだコードはautoやfloat、imgなどです。
Clipkitで「サイトリンク検索ボックス」の問題を解決する

GoogleSearchConsole で「サイトリンク検索ボックス」のターゲットURLが無効です、などのエラーが発生した際の修正方法です。

# 修正方法
修正箇所は、トップページのテンプレートです。
下記の流れで進み、該当箇所を修正してください。

※テーマの編集前にバックアップを取ることをおすすめします。
　下記手順 3 の画面の「ダウンロード」から現行テーマのダウンロードが可能です。

1. 「マイページ」から「サイト管理」へ進み、「テーマ」をクリック
2. 使用しているテーマ（下図のような青枠が表示されているもの）を選択
![使用しているテーマ（下図のような青枠が表示されているもの）を選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397446/00c7b170-220b-d524-4c27-6d87d461ce3b.png)

3. 右上の「テンプレート」をクリック
![右上の「テンプレート」をクリック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397446/564ccf45-ee54-f6ab-bd60-1d14cd6d4035.png)

4. 画面遷移後、左上のプルダウンから「トップページ」を選択
5. 下記記述を修正

```html:修正前
"target": "http://{{ site.path | split: '/' | join: '/' }}/search?q={search_term_string}",
```

```html:修正後
"target": "{{ site.url | split: '/' | join: '/' }}/search?q={search_term_string}",
```
![下記記述を修正](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397446/6f0534ab-0b3a-95a3-4a6e-67b79cf61ce5.png)
6. 右上の「保存する」をクリックしてテンプレートを保存する

スマートフォン用のテンプレートも上記手順で修正・保存してください。
「トップページ（スマホ向け）」がスマートフォン用のテンプレートです。
AWS EC2にサーバーを立てる〜iPadだけで構築

2019年12月にiPadを購入したので、プログラミングにも活用できないかなと思ってためしました。
ほぼ無料でサーバーを立てて遊べます。
物理サーバーじゃないから、ミスったり戻せなくなったら、インスタンスを破棄しちゃえばいいしね。

[ブログ](https://noblogrammar.com/aws-ec2-create/)に引っ越しました。
diredモード on WSLからWindowsのファイルを開く

WSL上のEmacsからWindowsのファイルあるいはフォルダを開く方法を紹介します。
これでdiredをWindowsのファイラ的に活用することができるようになります(多分)。
実態は自分用の備忘録です。

## WSLからWindowsのファイル/フォルダを開く
### 結論
以下のようなシェルスクリプトをWSLのパスが通ったところに置いて、WSL上で実行すればWSLからWindows側のファイル/フォルダを開くことができりょうになります。

```sh:open-in-windows
#!/usr/bin/zsh
explorer.exe `wslpath -w  $1`
```

ちなみに、diredから使わないのであれば、zshの関数として定義してしまう方がいいと思います。

### 解説
普段、Windows上でファイル/フォルダのアイコンをダブルクリックした時の動作、つまり

- ファイルの拡張子が登録されていればそのプログラムで開く
- ファイルの拡張子が未知であれば、プログラムの選択画面を出す
- フォルダであれば、フォルダをエクスプローラーで開く

といった動作は`explorer.exe`が担っています。入力にはWindows形式のパス(`C:\Users\hoge\piyo`みたいの)をとります。
最近のWSLでは、WindowsのコマンドもWindows側のパスが通っていれば実行できます。
参考:[Windows 10のLinux互換環境WSLからコマンドプロンプトのプログラムを呼び出す（バージョン1803対応版）](https://www.atmarkit.co.jp/ait/articles/1805/31/news052.html)

WSL上からはWindows側のファイルを`/mnt/c/`以下で見ることができます。
上記シェルスクリプトの`$1`にはこの形式のパスでのファイル/フォルダ名を渡します。
`wslpath`コマンドはWindows形式とLinux形式のファイル名の変換をしてくれます。
つまり`/mnt/c/Users/hoge/piyo`を`C:\Users\hoge\piyo`に変換できます。
細かいオプションは自分で調べていただけると。
参考:[【WSL】パスのフォーマットを変換する wslpath コマンドの使い方](https://laboradian.com/wslpath-command-for-wsl/)

## diredでWindowsのファイル/フォルダを開く
###結論 

下記設定をinit.el等に書けば、dired上で`w`を押すとそのファイル/フォルダがWindows上で開きます(exlorer.exeで開く)。

```emacs-lisp:init.el
;; ファイルをWindowsの関連付けで開く
(add-hook 'dired-load-hook (function (lambda ()
				       (define-key dired-mode-map "w" 'dired-open-file)
				       )))
(defun dired-open-file ()
  "In dired, open the file named on this line."
  (interactive)
  (message "WindowsOpening %s..." (dired-get-filename))
  (shell-command (mapconcat #'shell-quote-argument
			    (list "open-in-windows" (dired-get-filename))
			    " "))
  (message "WindowsOpening %s done" (dired-get-filename))
)
```

### 解説
最初の設定で、dired上でのキーマップを設定しています。

`shell-command`にコマンドを渡すとシェルで実行してくれます。
ただ、渡すコマンドは引数含めて文字列にする必要があるので、mapconcatでコマンドと引数を繋いでいます。

参考: [emacsをWindowsシェルとして使う Excelを開いたりファイル名をクリップボード転送できるとすごく便利](http://ubuntu84.blogspot.com/2017/02/emacsexcel.html)
[Emacsからの安全なシェルコマンド実行](https://qiita.com/tadsan/items/17d32514b81f1e8f208a)
Mac > Localhost(127.0.0.1)に別名を追加




開発デバッグ用に`xxxxx.peke.hoge.com`を`127.0.0.1`に割り当てたいとき

/private/etc 配下にあるhostsに設定を追加する


```
sudo vi /private/etc/hosts
```

最終行に追記

```shell:hosts
##
127.0.0.1       localhost

... 略

127.0.0.1       xxxxx.peke.hoge.com
```
ブレッドボード

ブレッドボードは回路を試作するために便利な道具で、内部で図のように廃線が繋がっています。
![IMG_5684.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/3a8fc68e-fe5e-bdac-1ad7-64c2d605a8fa.jpeg)
![IMG_5683.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/205632a9-0820-6b33-11d1-d288c9ee621e.jpeg)
![IMG_5684.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/214348ea-4c85-60ce-9b9d-62043703939d.png)
![IMG_5683.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/f1a233a4-617d-7248-a6f1-0083a46e75a2.png)
RubyでLeetCodeを解いてみた Roman to Integer

https://leetcode.com/problems/roman-to-integer/

>Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

```ruby
# @param {String} s
# @return {Integer}
def roman_to_int(s)
    arr = s.split("")
    last_idx = arr.size - 1
    sum = 0
    arr.each_with_index do |str, idx|
        case str
        when "I"
            if idx != last_idx && (arr[idx + 1] == "V" || arr[idx + 1] == "X")
                sum -= 1
            else
                sum += 1
            end
        when "V"
            sum += 5
        when "X"
            if idx != last_idx && (arr[idx + 1] == "L" || arr[idx + 1] == "C")
                sum -= 10
            else
                sum += 10
            end
        when "L"
            sum += 50
        when "C"
            if idx != last_idx && (arr[idx + 1] == "D" || arr[idx + 1] == "M")
                sum -= 100
            else
                sum += 100
            end
        when "D"
            sum += 500
        when "M"
            sum += 1000
        end
    end
    sum
end
```

馬鹿正直に実装してみた😛
Ruby 変数に格納された文字列の文字数を出力する

# 目的

- 変数に格納された文字列の文字数を出力する方法をまとめる。

# 書き方の例

- 下記に変数に格納された文字列の文字数を出力するコードを記載する。

    ```ruby
    puts 変数.size
    puts 変数.length
    ```

# 具体的な書き方の例

- 変数`word1`、変数`word2`、変数`word3`にそれぞれ`aaa`、`bb`、`c`を格納する。
- それぞれの変数に格納された文字列を足して変数`all_string_size`に格納して出力する書き方を記載する。

    ```ruby
    # 変数の格納
    word1 = "aaa"
    word2 = "bb"
    word3 = "a"

    # 各変数の文字列の文字数を変数all_string_sizeに格納
    all_string_size = word1.size + word2.size + word3.size

    # 出力
    puts all_string_size
    ```
カテゴリ別ランキング機能の実装

##概要

全体のランキング機能は他の記事を参考にして割と簡単にできたのですが、カテゴリ別ランキングの表示が分からずに一苦労したので纏めます。

スポット（Post）ごとに写真（Image）が投稿でき、写真ごとにコメント（Comment）が投稿できるアプリケーションを作成しております。
Imageにいいねをつけることができ、Post毎にいいね順で並び替えて表示させます。

ビューはHamlで書いております。
今回はCommentテーブルは関係ないので省略して書きます。
作成途中のため、細かいところはご容赦くださいませ。

##前提条件

Post、Imageテーブルは作成済み。
いいね機能は実装済み。（Like count）

##ルーティング

```routes.rb
  resources :posts, only: [:index, :new, :create, :edit, :update] do
    resources :images, only: [:index, :new, :create, :show]
```

##コントローラー

```rb:images_controller
@all_ranks = Image.find(Like.group(:image_id).order('count(image_id) desc').limit(9).pluck(:image_id))
@post_ranks = @all_ranks.select{ |image| image.post_id == @post.id }
```
@all_ranksにてまずは全体のいいねランキングを作成しております。
その後で@post_ranksにてカテゴリ別（POST別）に分けます。

##ビュー

```haml
      .image__contents
        - @post_ranks.each do |image|
        　.image__contents__content
            = image_tag(image.image)
```

これで@all_ranksのlimit(9)で指定した数までカテゴリ別でランキングが表示されるようになります。
ちなみに@all_ranksをそのまま表示させれば総合ランキングです。

selectメソッド便利ですね。

以上となります。間違いありましたらご指摘お願いいたします！
Arduinoで圧力センサを使う

この記事は、arduinoで圧力センサ（FSR402）を使うためのものです。１個当たり500円以下で購入出来ます。とても薄くて、ペラペラしています。


#接続方法
分圧抵抗の回路を組みます。
抵抗は5KΩを使用しました。
![Press.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/7cbda70d-7f64-fa97-2f90-c2e1eee484e1.jpeg)


#プログラム
A0端子の値を表示するシリアルプロッタで表示するプログラムです。

```java:presure.ino
void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(0);
  Serial.println(value);
  delay(20);
}

```
Arduinoで３軸ジャイロセンサを使う

この記事は、arduinoで３軸ジャイロセンサ（L3GD20）を使うためのものです。x,y,z軸それぞれの角速度を計測できます。


#接続方法
![Acce.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/08b82094-c860-099e-c017-92a80b97f307.jpeg)


#プログラム
参考サイト
https://analogicintelligence.blogspot.com/2016/09/i2cspil3gd20.html


```java:gyro3axis.ino
#include <SPI.h>

const int L3GD20_CS = SS;

const byte L3GD20_ADDR = 0x6a;
const byte L3GD20_WHOAMI = 0x0f;
const byte L3GD20_CTRL_REG1 = 0x20;
const byte L3GD20_OUT_X_L = 0x28;
const byte L3GD20_OUT_X_H = 0x29;
const byte L3GD20_OUT_Y_L = 0x2A;
const byte L3GD20_OUT_Y_H = 0x2B;
const byte L3GD20_OUT_Z_L = 0x2C;
const byte L3GD20_OUT_Z_H = 0x2D;

const byte L3GD20_RW = 0x80;
const byte L3GD20_MS = 0x40;

byte L3GD20_read(byte reg) {
  byte ret = 0;

  digitalWrite(L3GD20_CS, LOW);
  SPI.transfer(reg | L3GD20_RW);
  ret = SPI.transfer(0);
  digitalWrite(L3GD20_CS, HIGH);

  return ret;
}

void setup() {
  digitalWrite(SS, HIGH);
  pinMode(SS, OUTPUT);

  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);

 Serial.begin(9600);
 while (!Serial) {}

  Serial.println(L3GD20_read(L3GD20_WHOAMI), HEX);
  digitalWrite(L3GD20_CS, LOW);
  SPI.transfer(L3GD20_CTRL_REG1);
  SPI.transfer(B00001111);
  digitalWrite(L3GD20_CS, HIGH);
}

float xaxis,yaxis,zaxis;

void loop() {
  short h, l;
  float x, y, z;

  l = L3GD20_read(L3GD20_OUT_X_L);
  h = L3GD20_read(L3GD20_OUT_X_H);
  x = (h << 8) | l;
  l = L3GD20_read(L3GD20_OUT_Y_L);
  h = L3GD20_read(L3GD20_OUT_Y_H);
  y = (h << 8) | l;
  l = L3GD20_read(L3GD20_OUT_Z_L);
  h = L3GD20_read(L3GD20_OUT_Z_H);
  z = (h << 8) | l;

  xaxis += x+209.0;
  yaxis += y-155.0;
  zaxis += z+115.0;

  Serial.print(xaxis);
  Serial.print(",");
  Serial.print(yaxis);
  Serial.print(",");
  Serial.println(zaxis);
  delay(20);
}
```
WordPressのreCaptcha問題解決までの軌跡

## お客さんからスパム対策をお願いされたので
以下を実施

- reCAPTCHA設定
- Invisible reCAPTCHA導入＆有効化

しかし設置しているお問い合わせフォームがCONTACT FORM 7であることにより、
Invisible reCAPTCAHを導入しているにも関わらず、うまく動作せず、
TOPページなどお問い合わせフォーム以外のページ以外にも表示されてしまいました。

## そこで

Invisible　reCaptchaはシカトして、[cssで消す方法（google公認)](https://www.ii-sys.jp/notes/1511)で表示問題は解決しました。


## しかーし！
今度はお問い合わせしようとすると、そのメール自体をspamと判定してしまいメールお問い合わせできずメール来ない問題が発生しました。

## そこで
- RollBackプラグインを導入してContact Formのバージョンを5.1まで戻す
- function.phpに色々かく(フィルターの数字を下げるphpを書くことでことで届くようになるとか・・・。まぁならなかったですけど。）

## 結果効いたものは
Invisible reCaptchaというプラグインを削除！
シカトして消さずに有効化のままだったこのプラグインを消してみると動きました。
[このstackoverflow](https://stackoverflow.com/questions/34554259/contact-form-7-wordpress-not-sending-mails-when-use-recaptcha-extension)のリプにチマっと書いてありました。

ふう。。よかったε-(´∀｀*)ﾎｯ