OmniAICreator/Qiita-1.07M huggingface dataset:
AMD Polaris(RX570)でのRCCL動作検証

なんといつのまにかRCCLがapt installできるようになってました


#環境構築

```
sudo apt install rccl
```
ROCｍがインストールされている環境なら割とすぐに立ち上げることができます。


```
$ git clone https://github.com/ROCmSoftwarePlatform/rccl-tests.git
$ cd ./rccl-tests/
$ sudo ./install.sh 

```
これでrccl-testのビルドが完成し

./rccl-test/build内にビルドされます


2wayの場合

```
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 2
```
でテストできます。

#動作検証結果

```
 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 2

# nThread: 1 nGpus: 2 minBytes: 8 maxBytes: 134217728 step: 2(factor) warmupIters: 5 iters: 20 validation: 1 
#
# Using devices
#   Rank  0 Pid   9012 on       rocm device  0 [0x02] Ellesmere [Radeon RX 470/480/570/570X/580/580X]
#   Rank  1 Pid   9012 on       rocm device  1 [0x03] Ellesmere [Radeon RX 470/480/570/570X/580/580X]
#
#                                                     out-of-place                       in-place          
#       size         count    type   redop     time   algbw   busbw  error     time   algbw   busbw  error
#        (B)    (elements)                     (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)       
Memory access fault by GPU node-2 (Agent handle: 0x1d58110) on address (nil). Reason: Page not present or supervisor privilege.
中止 (コアダンプ)
```
残念ながらテストは完走できませんでした
メモリアクセス障害となっているので改善が必要なやつかもしれません。


##環境

OS ubuntu 16.04.6 64bit
kernel 4.15.0-58-generic
ROCm version R2.7
RCCL version  2.6.0.182-rocm-rel-2.7-22-1fee6f9


CPU Intel® Xeon(R) CPU E5-2603 v4 @ 1.70GHz × 6 
MB  X99S GAMING 7
RAM DDR4 2400 16GBモジュール*3 48GB
GPU0 RX570 16GB
GPU1 RX570 16GB
VSCodeで効率的にswaggerを書く。


#VSCodeで効率的にSwaggerを書く
今まではSwagger Editor（http://editor.swagger.io/） を使ってyamlを書いていたがVSCodeのほうが超簡単で便利だった。


##前提
VSCodeはインストール済み(バージョン: 1.37.0 )

##拡張機能をインストールする
サイドバーのEXTENSIONS(Ctrl+Shift+X)を選択し、「Swagger Viewer」を検索する。
<img width="960" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/66c39a62-a08a-0d73-9cd3-ed1b1aa77870.png">

インストール後はこんな感じ。
<img width="960" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/93e6c381-4426-360a-889b-3ec12e1d4ac7.png">

##yamlを書く
<img width="960" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/890650a1-2507-41be-6b38-dac844a6ced5.png">

Viewerを開くには以下のどちらかを実行
・Shift+Alt+p
・コマンドパレットからPreview Swaggerを選択

<img width="960" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/2a2e3f20-0935-37a4-3fdf-158d763e985e.png">


Swagger Editorと同様に編集はリアルタイムに反映される。
だけどViewerを複数画面開くことは出来なそう。

##まとめ
単発での拡張だと便利さを感じることはできないけれども、VSCodeにはAPIリクエストを送る拡張機能などもあり、複数を組み合わせるとAPI開発が楽になりそうです。

---
**VSCode関連　記事リンク**
・[VSCodeでRESTクライアントを使って効率的にAPIを呼び出す。](
https://qiita.com/kawasukeeee/items/7bc5d948e3029c8a3a23)
CircleCIでAdd ProjectsにforkしたRepositoryが出てこない時の対処法

#経緯
個人でCircleCI触ってチームに導入できそうだったら導入しようと思い、開発中のリポジトリをフォークしてビルドしようと思ったら全然ビルドする以前の問題で困ったので備忘メモ
ビルド後の解説はいっぱいあるんだけどね

#そもそもforkができない
organization所属のprivateリポジトリだとforkできない設定となっている時がある
forkボタンが押せない時はプロジェクトのsettingsのこの項目をチェックしよう（チェックしてもらおう）

<img width="1437" alt="スクリーンショット 2019-08-18 15.31.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217652/2ac98ea6-dccb-4cc7-4a4b-965b1fd65e22.png">

#forkしたリポジトリの元の所有者からCircleCIに対するアクセス許可がない
forkしたリポジトリの場合は**元のリポジトリを所有するOrganizationアカウント**にアクセス許可依頼を飛ばして、承認してもらう必要があるらしい
自分のアカウントのsettings→appllicationsから承認依頼を飛ばせる・・・ハズ

公式にはこんな説明がある
>「Add Project」ページにプロジェクトが見つからないのはなぜですか？
ビルドしようとしているプロジェクトが見当たらず、目的のビルドでないものが表示されている場合は、画面左上にある Org を確認してください。もし左上に見えるのがあなたのユーザー名 my-user だったとすると、my-user に属する GitHub プロジェクトだけが Add Projects の下に表示されることになります。GitHub のプロジェクト名 your-org/project をビルドしたいということであれば、画面左上のエリアをクリックすると表示される [Switch Organization] メニューから目的の Org である your-org に切り替えます。


https://circleci.com/docs/ja/2.0/faq/


けど、これだけだとアクセス許可依頼までは読み取れず、すっごい色々調べるハメになった
もしかしたら、CircleCIに限らずforkしたリポジトリに対するアプリケーションの連携自体がそもそもそういうものなのかもしれないが
誰かの役に立てばいいなぁ
pandas 0.25.0が使えない(ModuleNotFoundError: No module named '_lzma')

## pandasを使おうとするとモジュールエラーで落ちる
pythonでpandasを使おうと思ったら、モジュールエラーで使えませんでした。
日本語の情報があまり出てこなかったため、記載しておきます。

## 環境
Mac OS High Sierra 10.13.6
Python 3.7.0
pyenv 1.2.5
pandas 0.25.0

## エラー文
```
ModuleNotFoundError: No module named '_lzma'
```
lzmaはpythonの標準ライブラリのはず。。

## 解決方法
pyenv側の問題だそうです。
下記を参考にしました
[ModuleNotFoundError: No module named '_lzma' #27532](https://github.com/pandas-dev/pandas/issues/27532)
[pyenv wiki](https://github.com/pyenv/pyenv/wiki)

```
# pyenvのpythonを一旦アンインストール
pyenv uninstall 3.7.0
# 下記をインストール
brew install openssl readline sqlite3 xz zlib
# Mojaveもしくは10.14以降のMacの場合は下記も必要
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
# pyenvを再インストール
pyenv install 3.7.0
```
UbuntuなどMac OX以外の場合は、[pyenv wiki](https://github.com/pyenv/pyenv/wiki)こちらに記載があります。

## まとめ
pandasのバージョンを0.24.0に下げることでも解決できるようです。
定期的にアップデートするの大事ですなぁ。
勉強になりました。

間違いなどありましたら[twitter](https://twitter.com/MuggyTeaa)までお願いいたします。
abc-134 B: Golden Apple の切り上げ処理について

# abc-134 B Golden Appleの解法について
最近競技プログラミングをはじめて，少し勉強している。
その中で，無事ＡＣをとれたのだが，解説を読んでいて腑に落ちない点があったので考察した。
## 解答

細かい内容は割愛するが，2つの整数A,Bが与えられるので，A/Bを切り上げた値を整数として出力すればよい。

解説で気になった部分は以下。
>一般的に，整数A,Bに対して，A/Bの切り上げは(A+B-1)/Bの商と等しい。

たしかにこれを信じて実装すれば，（場合分けも不要となり）簡単である。
##確認

例１
$A=7$, $B=3$のとき
$\frac{A}{B}$=$\frac{7}{3}$=2.3333 $\cdots$ 切り上げて3
$\frac{A+B-1}{B}$=$\frac{7+3-1}{3}$=$\frac{9}{3}$=3
となり，確かに一致する。
例２
$A=8$, $B=3$のとき
$\frac{A}{B}$=$\frac{8}{3}$=2.66666 $\cdots$ 切り上げて3
$\frac{A+B-1}{B}$=$\frac{8+3-1}{3}$=$\frac{10}{3}$=3.333$\cdots$
となり，一致しない。
というように思ってしまったのだが，結局3.3333・・・を整数型にキャストすると3となり求めたい答えと一致するということであった。


##まとめ
何が言いたかったのかというと，解説中の
>一般的に，整数A,Bに対して，A/Bの切り上げは(A+B-1)/Bの商と等しい。

という記述は，整数型にキャストする（される）ことで，小数点以下の切り捨て等が発生して正しい答えを得られる，ということであった。
部分テンプレートを繰り返し表示させる方法

##1,はじめに
railsでビューを繰り返し表示させたい時、eachメソッドを使うことが多いと思います。

``` haml
- @product.each do |product|
  %h3.item-title 
    = product.name
```
@productに入ってる配列の要素数分だけビューが出力されるようになります。

##2,部分テンプレートを使用し繰り返し表示させるには?

eachメソッドを使わず部分テンプレートで繰り返し表示させる方法もあります。

部分テンプレートを繰り返し表示させるには、**collectionオプション**を使用します。

```haml:listing.html.haml

%ul
  %li
    = render partial: "list_content", collection: @products
```

```haml:_list_content.html.haml
%li
  = link_to "/products/#{product.id}/detail" do
    = image_tag  "#{product.images[0].image[:medium].url}" ,size: "48x48"
    .display--item
      %p 
        = product.name
      .display--item__status
        = icon "far fa-heart",class: "far fa-heart"
        %span 0
        = icon "far fa-comment-alt",class:"far fa-comment-alt"
        %span 0
        .display--item__status__awiting
          出品中
```

これで`list_content`を@productsの配列の要素数分だけ呼び出せることができます。

##これで表示できるはずが...

エラーが発生してしまいます。原因は変数名の違いにありました。

`listing.html.haml`では@productsと変数名を定義しています。

しかし、`_list_content.html.haml`では変数名がproductになっているので、変数名をあわせてあげましょう。

```haml:listing.html.haml

%ul
  %li
    = render partial: "list_content", collection: @products,as: "product"
```

**asオプション**を設定することで変数名を変更することができます。

これで、部分テンプレートで繰り返し表示ができるようになりました。
SSHFSでRaspberryPiのソースをMacのGoLandから編集

VSCodeのようにGoLandでssh越しにソース編集したかったのでやってみた。

# FUSE for MacOSのインストール
下記URLからFUSE for MacOSのdmgをダウンロードしてインストール。
https://github.com/osxfuse/osxfuse/releases
※FUSE for MacOSは、Macのファイルシステムを拡張できるツール

# SSHFSのインストール
下記URLからSSHFSのpkgをダウンロードしてインストール。
https://github.com/osxfuse/sshfs/releases
※ssh越しにディレクトリをローカルにマウントするためのツール。

# マウント
マウントポイントを作成する。（ディレクトリ名は任意）

```bash
mkdir raspberrypi
```

マウントさせる。

```bash
sshfs pi@raspberrypi.local:/home/pi/ raspberrypi
# sshfs <user>@<ssh接続先>:<マウントさせたいディレクトリ> <マウントポイント>
```

あとはマウントポイントをGoLandから参照するだけでリモートのソースが手元のGoLandで編集できる。

アンマウントは下記のように

```bash

diskutil unmount raspberrypi
# force オプションをつけても良い
```

とても簡単。
react-transition-groupでスライドメニューを作ろうとしたときの備忘録

Reactでフロントエンド開発を行なっていて、画面に動きをつけたいときに便利なライブラリであるreact-transition-group。
今回はこのreact-transition-groupを使って横からニュッと出てくるメニューを作ろうとして躓いたところがあったので、その解決策について備忘録として書いておきます。
やりたいものはこんな感じ。
![main.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179987/79eca886-e7f8-9ce6-ec86-4fcfb02c6c2a.gif)

この記事ではstyled-componentsを使っていますが、Transitionを使った際の解決策としては他のスタイル形式でも変わらないと思います。

バージョン
・typescript: "3.5.3"
・react: "^16.9.0"
・react-transition-group: "^4.2.2"
## 困ったところ
最初は以下のように実装していました。(挙動に関係ない部分は省略しています。)

```tsx
interface Props {
  children: ReactNode;
  open: boolean;
}

export const SlideMenu = (props: Props) => {
  return (
    <Transition
      in={props.open}
      timeout={500}
      unmountOnExit
    >
      {state => (
        <Inner state={state}>
          {props.children}
        </Inner>
      )}
    </Transition>
  );
};

const slideWidth = 500;

const Inner = styled.div<{ state: TransitionStatus }>`
  position: absolute;
  transition: 0.5s;
  right: -${slideWidth}px;
  width: ${slideWidth}px;
  transform: translateX(
    ${({ state }) => (state === "entered" ? -slideWidth : 0)}px
  );
`;
```

unmountOnExitで最初は要素を消しておいて、右側のマイナス位置から左側へ動かすというイメージです。
ただこの設定だと、このように動かし始めが遅く、もっさりした動きになってしまいます。
![before.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179987/e9ba4f52-32e9-2274-0a60-cc94203c0720.gif)

## 解決策

ちょっと考えればわかることだったのですが、この現象はTransitionのinがトグルされてからtranslateによる動きが発生するまでが長すぎたことが原因で発生していました。
なので、Transitionコンポーネントのtimeoutを以下のように設定することで解決することができました。

```tsx
// before
timeout={500}
// after
timeout={{ appear: 0, exit: 500 }}
```

コンポーネントがマウントされてからTransitionのモーションに移るまでの時間を0に設定しました。
これによってコンポーネントがマウントされてすぐに設定したアニメーションが発動するようになったということになります。

## まとめ

地味ながらも忘れやすそうな設定内容だったので、備忘録として残しておきます。
もっとスマートな方法があるかも知れませんが、同じようなところで困っている方のお役に立てれば幸いです。
閲覧いただき、ありがとうございました。
httpd.confで行うPHPの設定について

最近行った設定をメモしておきます。

# PHPのバージョンが、php -vとphpinfo（ブラウザ表示）でそれぞれ違う
phpinfo（ブラウザ表示）はApacheのPHPモジュールを参照しています。

httpd.confで読み込んでいるPHPのモジュールが古かったので、現在のPHPバージョンに合わせたモジュールをセットしました。（Homebrewを使用しています。）

```httpd.conf
# 旧PHPモジュール
# LoadModule php7_module /usr/libexec/apache2/libphp7.so

# 新PHPモジュール
LoadModule php7_module /usr/local/Cellar/php@7.2/7.2.17_1/lib/httpd/modules/libphp7.so
```

# HTML内でPHPを使いたい
動作が1ファイルで完結するので、学習などで軽く使いたい時に便利です。

```httpd.conf
# html内でphpを使用する
<IfModule mime_module>
  AddType application/x-httpd-php .html
</IfModule>
```

このような感じで利用します。（うまく表示されていませんが、動きます・・・）

```test.html
<?php $fruits = array('apple', 'orange', 'peach') ?>
<?php foreach ($fruits as $key => $val) : ?>
<?php echo $val; ?>
<?php endforeach; ?>
```

ブラウザで確認する時は、Apacheを起動してからサーバへアクセスして確認します。
誤って``file:///``で確認しないように・・・（この場合、PHP部分は自動的にコメントアウトされます。）

httpd.confを編集した後は、Apacheの再起動を忘れずに行ってください〜

# 参考記事
[phpinfoとphp -vのバージョンが違う](https://soudan1.biglobe.ne.jp/qa3554219.html)
[htmlファイルでphpを動かす 〜httpd.confの設定〜](https://qiita.com/non0311/items/1114f080603d9007b1c4)
[PHPのforeachで配列処理（HTML埋め込みでもスッキリな書き方も）](https://www.flatflag.nir87.com/foreach-294)
ローカルPCからHeroku Postgresを利用する方法

## はじめに

Herokuにめでたくアプリをデプロイした後、DBをローカルから直接見るための備忘録。

## HerokuからDBの接続情報を取得する。

HerokuのOverviewから「Heroku Postgres」を選択する。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/2ee2549a-7fbb-d5cc-6959-71be4c433578.png)

次の画面でSettingsからView Credentialsで接続情報を見ることができる。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/ae511d77-19bc-d776-e4af-466a173363fa.png)


## PostgresのGUIツールに接続情報を入力する。

#### GUIツールをインストールする。

何を使っても大丈夫と思われるが、今回は筆者がよく使っている「[A5:SQL Mk-2](https://a5m2.mmatsubara.com)」を使用する。

インストール後、下記画面ではPostgreSQLを選択する。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/8bf01ba3-0183-fcb6-6519-8f6329c55bda.png)

#### 必要な情報を入力
接続情報を入力する画面では、Herokuにて取得した情報を入力する。

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/6c65a56c-a4b4-775b-b433-75102c2e225d.png)

SSLのタブでは優先接続を選択する。その他は触らなくてよい。

![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296013/3193a776-18a8-14aa-4929-b0349b116462.png)


## 完了！！
これでローカルPCからHerokuのPostgreを触れるようになる。
Django REST framework + Vue.js「SEIYU風のECサイトを作りましょう」全6回（予定）

# 前書き
本記事はまだ連載中、更新頻度は大体週に一回(多分)、忙しさ次第:nerd:

# コンテンツ紹介
#### バックエンドはDjango (Django REST framework) + 管理システムはXadmin

 
<img width="221" alt="django3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/011ef5ad-2f56-cefb-7836-401a9ea24fa5.png"><img width="223" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/57c49078-6584-10d0-93db-c2c9c2b1beb0.png">

#### フロントエンドは Vue.js + Vue Router + Vuex

<img width="222" alt="login.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/c128baf1-1ea1-1afc-b319-c5ec6c8b7b92.png"><img width="222" alt="django01.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/a4811513-817f-fb09-3aff-45f41115aecc.png"><img width="222" alt="django2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/f71fe570-f581-3b19-6db2-8cc5e66a5b01.png"><img width="221" alt="django4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/ed113a13-a17c-a38d-f638-6b799bdb90ce.png">

[動作確認リンク](https://twitter.com/mtf54324888/status/1162969211167100928?s=20)

# 読んで欲しい人

- Python大好き 
 - Pythonの基礎的な文法を把握しています

- Pythonでウェブサービスを作りたい
  - Djangoの環境構築をしたことがある
   
- Vue.jsに興味がある
  - Vue.js のCLIでプロジェクトを作ったことがある


# 環境説明
| PyCharm    |
|:-----------|
|Professional|

| Python    | Django   |  Django REST framework |Xadmin|
|:----------|---------:|-----------------------:|-----:|
| v3.7.1    |  v2.2.4  | v3.10.2                |v2.0   |

| node           |     Vue        |    axios     |vue-awesome-swiper| TypeScript |
|:---------------|---------------:|:------------:|:----------------:|:--|
| v10.15.1       |         v2.5.2 |    v0.19.0   |v2.6.7            |v3.6|


# 補足説明
記事を更新するたびに本記事内の「一覧」にリンクを追加します

各記事内でももちろん質問回答しますがそれでも分かりにくい場合、
Twitterまでメッセージ下さい、時間があるときに返信いたします
@mtf54324888

# リポジトリ

https://github.com/huanshenyi/qiita-Django-supermarket

# 一覧

[SEIYU風のECサイトを作りましょう（1）要求分析とプロジェクト初期化](https://qiita.com/Syoitu/items/eae447432c6135ff1174)

[SEIYU風のECサイトを作りましょう（2）Xadminを使って管理画面を一新します](https://qiita.com/Syoitu/items/11fac037759220b30cd2)

[SEIYU風のECサイトを作りましょう（3）Django REST frameworkで爆速APIを作りましょう](https://qiita.com/Syoitu/items/2ab045f5618bf9cb31d4)

[Django REST framework + Vue.js でECサイト作りましょう(4) Vue.js プロジェクト初期化 TypeScript使用](https://qiita.com/Syoitu/items/324a40a954324fab4e96)

[JWT使用したログイン機能の実装](https://qiita.com/Syoitu/items/bc32b5e1c2fa891c2f96)
おまけ[Vue.jsのTDD実践開発入門](https://qiita.com/Syoitu/items/bf4aed4ed72156cd13ff)
猿でもできる。Docker入門の前の体験

初めてDocker触ったんですが、**便利**。ただただ**便利**
チンパンジーなりに感動しました。
開発環境を作ったり管理する手間が大幅に楽になる〜ひゃっほーいって感じです。

ただ、Docker使うにあたり、ネットでの情報収集をしているとDockerは〜型の仮想化技術であり…
みたいなお話がまず始まるのが多くて最初の一歩に苦労しました。
いや確かに技術的詳細は大事なんですけど、とりあえず動かしてみたいんですよ。
便利だよ〜って言われても使ってみないとわからないので。

なので、この記事では　Dockerをインストールして、DockerHubのimageをダウンロードする、Docker Imageを実行してみる。
それだけに焦点を当てたいと思います。

Docker触ったことない人が、自分みたいに「え？これ便利では？」ってなるといいな

自分でDocker環境を作るところには触れません。チンパンジーには難しすぎてまだできてないからです。

#用語解説
###Docker
仮想環境動かせます。軽いです。流行ってると思います。
###Docker Image
仮想環境ファイルです。これを共有するだけで環境共有できます。
###Docker Hub
Docker Imageの共有がされてます。あとここからDockerダウンロードします。
###Docker File
これをビルドするとDocker Imageになります。多分難しいので本記事では扱いません。

#Dockerのインストール
windows10 **Pro**,Mac,Linuxの方はこのページから。
https://docs.docker.com/install/
特に引っかかることもありません。

**それ以外の方(Windows8以前,windows10 homeなど)はこちらから。**
https://docs.docker.com/toolbox/toolbox_install_windows/
レガシーとか書いてありますが、これしか方法がありません。ここだけは辛いところだと思います。

ダウンロードするときにDockerHubへの登録が必要になります。
これは回避できないのでおとなしく登録しましょう。

#仮想環境をダウンロード
今回はこれにしようと思います。
https://hub.docker.com/r/jupyter/datascience-notebook
いつもと違うパソコンでASAPにデータサイエンスしたくなった場合もDockerさえ入っていれば解決です。
ターミナルなどに、この通り打ち込みます。

```bash
docker pull jupyter/datascience-notebook
```

gitみたいな感じですね。するとイメージがダウンロードされます。ちょっとかかるかもしれません。
待ちましょう。

#仮想環境を起動
念の為、仮想環境の一覧確認してみます。

```
docker image list
```
とうつと、ダウンロード済みのdocker Imageが確認できます。

```
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/datascience-notebook   latest              8dd57239bf6d        7 days ago          5.04GB
```

先程のdatasicence-notebookがいることを確認したら、起動しましょう。

```
docker container run -it -p 8888:8888 jupyter/datascience-notebook
```

オプションは気にしなくていいです。が、とりあえず説明すると,
-itを打つと仮想環境内(コンテナ内ですが、用語を増やしたくないので)でbashが立ち上がります。
-pはポートフォワーディングの設定で、実PCの8888と仮想環境の8888をつなげますよということです。
これでdatascience用に諸々入ったjupter-notebookが起動します。まじで？

#Docker ToolBox使った人向け(それ以外は読み飛ばしてください)
次の接続で使うipですが、Docker Toolboxを使った人は**localhostではなくなります。**
変わりのipは

```
docker-machine ip
```

で確認することができるので、次のloaclhostの代わりにこれで得たipを入れてください。

# 仮想環境のnotebookへ接続。
先程の通りdocker container runすると、ターミナルに、localhost:8888[token]でアクセスしろみたいなのが出ると思うのでコピーしてブラウザに貼り付けます。

するとこの通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/1bbbd5f7-3eff-6bea-8dc2-f6811de64af4.png)

Juliaとか入ったnotebookに繋がります。
簡単。

#終わりに
こんなに簡単に環境共有できるとか、バチが当たるんじゃないでしょうか。
そのうち自分の今使ってる環境をDocker Imageにバックアップ等用に退避しておこうかなとか考えています。
nginxとphp-fpmの構成でトップページ以外が404になる問題の解決

# 問題点
* grav と呼ばれる軽量 CMS を利用してサイトを立ち上げたところ、トップページ `例： http://ドメイン/`は正常に表示されるが、サブフォルダ `例: http://ドメイン/blog` が 404エラーになってしまう問題が発生。
* 構成: 
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/3ad7e93a-2bd4-5927-8c25-8a4dd35532f3.png)
* それぞれのバージョンは以下
 * nginx 1.14
 * php 7.2


# 原因
* nginx の routing 設定で、サブフォルダが指定された場合に、 php-fpm に処理を飛ばせていなかったことが原因。
* ![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/b7cd7661-55f0-b4b8-9b33-b60082c1a275.png)

## 原因のコード
```
server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /var/www/html;
	index index.php index.html index.htm;
	server_name _;

	location / {
		try_files $uri $uri/ =404; # <--ここで 404 判定されている
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
	}
}
```

* php-fpm に処理を渡す前に nginx が 404 を返却している、ということから、`location /`内で 404 に判定されてしまっている、ということになる。

# 対処
## 対処方針
* grav は、/blog とリクエストされると、いったん /index.php が処理を受け取って内部処理を行う流れになっている
* とにかく php-fpm に処理を渡さないことには話にならないので、処理を渡すこと、そして、処理用のスクリプトは index.php であることを明示させておく。

## 対処コード
```
server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /var/www/html;
	index index.php index.html index.htm;
	server_name ドメイン;

	location / {
		try_files $uri $uri/ @grav;
	}

	location ~ \.php$ {
		try_files $uri $uri/ @grav;
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
	}

	location @grav {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
		fastcgi_param SCRIPT_FILENAME  /var/www/html/index.php;
		include	fastcgi_params;
	}
}
```
### 解説
* `location /` で 対象のファイルが存在しなかった場合、処理を `@grav` に渡すように変更
* `location @grav` にて、php-fpm を動作させる。その際にパラメータとして `SCRIPT_FILENAME` で index.php が処理用スクリプトであることを明示しておく。


# 参考にしたサイト

* [nginx + php-fpm で設定したが index.php にアクセスするとNOT FOUND(404)になってしまう](http://blog.livedoor.jp/saba_nano/archives/28213171.html)
* [nginxでWordPressのパーマリンク形式変更にすると404](https://yuuchika.com/wp_nginx_404/)
Anacondaの仮想環境にインストールされているライブラリを確認する

#目的
　現在インストールされているライブラリを知りたい。という場面は多々あります。
ここではその方法について比較を行います。

###実施環境
* Windows10
* Anaconda(2019.7)
* 

#比較結果
　今回の記事に使ったのは下記の仮想環境です。
https://qiita.com/officefutaro/items/db281fe1ea7ebde43a5e
pipでインストールした環境と混在しています。
###Anaconda　GUI
　Enviroments->仮想環境選択
　表にはpipでインストールした「tensorflow-gpu」は表示されませんでした。
###conda
```Bash
>conda list
# packages in environment at C:\Users\Futaro\Anaconda3\envs\tensorflow113_3:
#
# Name                    Version                   Build  Channel
absl-py                   0.7.1                    pypi_0    pypi
astor                     0.8.0                    pypi_0    pypi
attrs                     19.1.0                   py36_1
backcall                  0.1.0                    py36_0
　・
　・
edi                      0.13.3                   py36_0
jinja2                    2.10.1                   py36_0
jsonschema                3.0.1                    py36_0
jupyter_client            5.3.1                      py_0
jupyter_core              4.5.0                      py_0
keras-applications        1.0.8                    pypi_0    pypi
　・
　・
tensorboard               1.13.1                   pypi_0    pypi
tensorflow-estimator      1.13.0                   pypi_0    pypi
tensorflow-gpu            1.13.1                   pypi_0    pypi
termcolor                 1.1.0                    pypi_0    pypi
terminado                 0.8.2                    py36_0
testpath                  0.4.2                    py36_0
tornado                   6.0.3            py36he774522_0
　・
　・
　・

```
condaでインストールした分と、pipでインストールした分も表示されます。
項目に意味ついては公式サイトを見たのですが表記されていませんでした。
https://docs.conda.io/projects/conda/en/latest/commands/list.html

次にpipで確認します。

```Bash
(tensorflow113_3) C:\Users\Futaro>pip list
Package              Version
-------------------- ---------
absl-py              0.7.1
astor                0.8.0
attrs                19.1.0
backcall             0.1.0
　・
　・
　・

```
さっきの「conda listlist」に入っていないものも入っているものもあります。
どういう基準なのか不明です。

```Bash
>conda env export
name: tensorflow113_3
channels:
  - defaults
dependencies:
  - attrs=19.1.0=py36_1
　・
　・
　・
  - pip:
    - absl-py==0.7.1
    - astor==0.8.0
    　・
    　・
    　・
    　・
    　・
    - termcolor==1.1.0
    - werkzeug==0.15.5
prefix: C:\Users\｡｡｡\Anaconda3\envs\tensorflow113_3
```
最初、condaのみのライブラリかと思いましたが、それも違うようです。
どういう基準で表示されているかわかりませんでした。

すくなくとも,condaとpipを混ぜるとわけわかんなくなりそうです。
ただ、Tensoflowのようにcondaサポートしないと言われたらどうしょうもありません。
GCE にmysqlをインストールして、外部からmysqlにアクセス可能にするまで

## インスタンスを作成
- machine-typeは最小(f1-micro)を選択

```
$ gcloud compute instances create redash-datasource --machine-type f1-micro
```

## fire-wallで3306ポートからアクセス可能にする
- [VMインスタンス編集ページ](https://console.cloud.google.com/compute/instances)から、3306portにアクセス可能にするためのtagを作成、VMに付与する
- [ファイヤーウォールルールの設定](https://console.cloud.google.com/networking/firewalls/list)で3306を許可するルールを作成し、ターゲットに先ほど作成したtagを指定する


## mysqlをVM にインストールする
https://cloud.google.com/solutions/setup-mysql?hl=ja

## bind-address を変更する

今回は、どこからでもアクセス可能にする。

```
$ vi /etc/mysql/mariadb.conf.d/50-server.cnf
```

```
bind-address            = 0.0.0.0
```
に変更

## serviceをrestart

```
sudo /etc/init.d/mysql restart
sudo vi /etc/mysql/mariadb.conf.d/
```

##  mysqlでDBを作成

```
$ sudo mysql -u root 
```

```
mysql> CREATE [DATABASE_NAME]  DEFAULT CHARACTER SET utf8;
```

## root userは全てのportからアクセスできるように設定
```
mysql> grant all privileges on [DB_NAME].* to root@"%" identified by 'root' with grant option;
```
boto3 で pagination が発生する API を良い感じに処理する


# 結論

`Client` じゃなくて `Paginator` を使えば良い。

Paginators — Boto 3 Docs 1.9.210 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/paginators.html

# サンプル: CloudWatch Logs のロググループ一覧を取得したい場合

## そもそも pagination を考慮できてない例

CloudWatchLogs — Boto 3 Docs 1.9.210 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.describe_log_groups

```py
import boto3

client = boto3.client('logs')
response = client.describe_log_groups()
print(response)
```

`describe_log_groups()` の結果で全てのロググループを取得できない可能性があるので NG

## Client で頑張る例

```py
import boto3
client = boto3.client('logs')
response = client.describe_log_groups()
print(response)

while 'nextToken' in response:
    response = client.describe_log_groups(nextToken=response['nextToken'])
    print(response)
```

`describe_log_groups()` のレスポンスに `nextToken` が含まれる場合、`while` でループして続きを取得する方法。
まぁこれでも全でのロググループを取得できる。

## Paginator 使う例

CloudWatchLogs — Boto 3 Docs 1.9.210 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Paginator.DescribeLogGroups

```py
import boto3
client = boto3.client('logs')
paginator = client.get_paginator('describe_log_groups')

for page in paginator.paginate():
    print(page)
```

`Client` 使って `while` でループする方法と比較して、よりシンプルに書けた。
Vue CLIとfirebaseを使用し簡単なページを作成

## 概要

firebaseとVueでWebページを作成した記録です。

## 環境

macOS Mojave
バージョン 10.14.6
MacBook Air (13-inch, 2017)

## 準備

インストール
npm 6.10.3
Vue CLI 3.10.0
firebase CLI 7.2.2

ブラウザのfirebaseコンソールで、プロジェクトを作成しておきます。

ターミナルからfirebaseにログインしておきます。

```|bash|
firebase login
```

## プロジェクト作成

### vueプロジェクト作成

```|bash|
cd ~
vue create kotaro-dev
```

プロジェクト設定の質問に対しては、defaultを選択しました。

```|bash|
? Please pick a preset:
❯ default (babel, eslint)
```

gitのログを見ると、この時点で一度コミットされていました。

```|bash|
git log
```

### firebaseの初期化

firebaseを初期化します。

```|bash|
firebase init
```

セットアップするプロジェクトの種類を指定します。

```|bash|
? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, 
then Enter to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert select
ion)
❯◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

◯ Hosting: Configure and deploy Firebase Hosting sites
をスペースキーで選択し、Enterで決定します。

firebaseのプロジェクトを選択します。
私はfirebaseコンソールから作成済みだったプロジェクトを選択しました。

```|bash|
? Select a default Firebase project for this directory: 
```

公開ディレクトリ名を指定します。
firebaseのデフォルトは public ですが、
Vue CLIと合わせるために dist を入力します。

```|bash|
? What do you want to use as your public directory? dist
```

single-page app、つまりSPAを設定するかを指定します。
今回はインストールしていませんが、Vue CLIの場合Vue RouterでSPAにすると思いますので、
y を入力します。

```|bash|
? Configure as a single-page app (rewrite all urls to /index.html)? (y/N) y
```

これでfirebaseの初期化が完了します。firebaseによる追加ファイルをコミットしておきます。

```|bash|
git add .
git commit -m "firebase init"
```

## Webページ作成

簡単に作成しました。詳細はGitHubをご参照ください。
https://github.com/chanchanrk/kotaro.dev/commit/3976ceb2fc29726aa26778c537da0e954557520f

## 動作確認

### vueで確認

```|bash|
npm run serve
```

```|bash|
  App running at:
  - Local:   http://localhost:26397/ 
  - Network: http://192.168.1.18:26397/
```

このようにターミナルに表示されます。このURLをブラウザに貼り付けして確認します。

なお、npm run serveで実際に実行されるコマンドは package.json の "scripts" の箇所に書かれています。

```|json|
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
```

### firebaseで確認

Vue CLIプロジェクトをビルドします。

```|bash|
npm run build
```

ローカルのfirebaseサーバーを起動します。

```|bash|
firebase serve
```

```|bash|
i  hosting: Serving hosting files from: dist
✔  hosting: Local server: http://localhost:5000
```

このように出力されます。ブラウザで http://localhost:5000 を表示し確認します。

## デプロイ

```|bash|
firebase deploy
```

firebase上のドメインを確認します。
![スクリーンショット 2019-08-18 14.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298217/796f119f-103c-45ed-49cb-7fa3259b9c55.png)
インターネットに公開されていることが確認できました。
Pythonでneural networkの実装

最近勉強を始めたMachine learningやDeep learningについてPythonでコードを書いて実践してみたのでメモとして。完全に初心者向けです。

なお、今回の記事はO'Reillyの「ゼロから作るDeep Learning」を参考にしています。

##Neural Network (3層) の実装
まずは超シンプルに下の画像のようなネットワークをPythonで書いてみます。（適当な画像が見つからなかったので実際は出力層以外の各層の一番上のノードはbias unitと考えてください。）出力層での活性化関数にはシグモイド関数を使用します。
<img width="378" alt="Capture.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441751/3805d196-3685-87f3-39ad-1baac0eb8046.png">

まずはシグモイド関数の実装及び各層の重みを設定します。また、biasは常に1であると想定し予め重みをかけ合わせておきます。

```python:
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def init_network():
    network = {}
    network['w1'] = np.array([[0.2, 0.4, 0.8], [0.7, 0.1, 0.9]])
    network['b1'] = np.array([0.1, 0.3, 0.5])
    network['w2'] = np.array([[0.1, 0.8], [0.6, 0.7], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['w3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])
    
    return network
```
次に入力から出力方向へのForward propagationを行う関数を作ります。

```python:
def forward_prop(network, x):
    w1, w2, w3 = network['w1'], network['w2'], network['w3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
    a1 = np.dot(x, w1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, w3) + b3
    y = a3
    
    return y
```

実行すると、

```python:
network = init_network()
x = np.array([1.0, 0.5])
y = forward_prop(network, x)
print(y) #[0.33488935 0.73821001]
```

という結果が得られました。今までMatlabを使っていた身からすると、Numpyの多次元アレイは便利だなというのと素人目にもコードが読みやすいなと思いました。

今回は出力層のノードが二つだったためよりシンプルなシグモイド関数での実装を行いましたが、多クラス分類の場合にはsoftmax関数なんかを使うこともあります。またその際にはオーバーフロー対策としてNormalizationが必要になってきたりしますが、その辺は次の記事でまた書いていきたいと思います。
プログラム初心者がPythonを始めた話

#AIに興味を持ったアラサーがPythonを勉強した話

こんにちは！！プログラム初心者です！！
Aidemyでの3ヶ月間の勉強の記録として、そして復習もかねてブログに残していきたいと思います。
その第一弾です！

注意：コード等には触れないブログになります。承知の上、読み進めて頂ければと思います。


##AIになぜ興味を持ったのか？

![ダウンロード.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481563/e95f3300-901a-10e6-d6f8-4f986f745ec5.jpeg)

とある通信業界で働いていた時に、業務効率化として、Excel VBA(以下、VBA）を独学で学びました。
皆さんもこんな経験があるかもしれません。

**「なんでこんな作業が必要なんだろう？」**

**「これさえなければ、もっと時間が作れるのに」**

**~~めんどくさい~~**

それを半自動化するために、0からVBAをインターネット上で学びました。
ちゃんとしたコードを書けるようになるのに約3年かかりましたね・・・。

VBAでプログラムを作成している時に、ふと思ったことがありました。
VBAとは、何かを起点としてプログラムを実行します。
例えば、ボタンを押した時
例えば、ある時間になった時
例えば、ファイルを開いた時
（何もしなくても動く方法があるなら知りたいです←笑）

わざわざ起点を用意してあげる必要がありました。

・・・・。

・・・・・・・・・。

**この起点ですらも、いらないシステムを構築したら便利になるよね・・・。**

それは何だ！？　AIだ！！
はい。結構単純な思考回路でした。
でも、これがAIに興味を持った理由です。

##AIとITシステムの違いに四苦八苦

まさに今でもこれには悩まされています。
###AIとは
>誤解を恐れず平易にいいかえるならば、「これまで人間にしかできなかった知的な行為（認識、推論、言語運用、創造など）を、どのような手順（アルゴリズム）とどのようなデータ（事前情報や知識）を準備すれば、それを機械的に実行できるか」を研究する分野である。(wikipediaより)
>>https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD

###ITシステム（情報技術）とは
>「コンピュータをベースとした情報システム、特にアプリケーションソフトウェアやコンピュータのハードウェアなどの研究、デザイン、開発、インプリメンテーション、サポートあるいはマネジメント」である。(wikipediaより)
>>https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93


？？？
今でもまださっぱりわかりません（笑）

**システムは過去の現象を定義するもの
AIは過去の現象から未来を予想するもの**

といったくらいの理解しかできてませんが、１番しっくりきています。


##Aidemyでの3ヶ月間

[Aidemy](https://aidemy.net/)のプレミアムプランを受講し、学習を進めてきました。
初心者にもわかりやすく指導していただき、また様々なカウンセリングをしていただき感謝しかないです。

とはいえ、3ヶ月コースを受講していましたが
やはり「今までやっていなかったこと」を週３０時間以上やる。というのは苦労しました。
始めの1ヶ月は気合いで乗り切り、中の１ヶ月はダラダラと・・・。
最後の１ヶ月で追い込みをかけた。。。そんな感じでした。

今からAidemyを受講される方は、Udemy等のオンライン学習を進めてから受講すると
Aidemyさんのカリキュラムをとても活用することができると思います。

Udemyでのおすすめコースは
酒井さんの「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」　[Udemyへのリンク](https://www.udemy.com/course/python-beginner/)
~~私はこのコースを半分程度進めてからAidemyを受講したことで、中弛み期間を回収できました。~~


##終わりに

この3ヶ月間で学んだことを復習し、自身のポートフェリオ作成までを記録していきたいと思います。
拙い文章ですが、お付き合いくださりありがとうございました。
今後もお付き合いいただけると嬉しいと思います。

最後になりますが、
Udemyの酒井潤さん
Aidemyの講師の皆さま
個人的に相談させてもらった知人の方々
未熟な私の相談に乗っていただいたこと、目的までの指針をいただいたことに感謝します。
Apache/PHPの設定ファイルを確認する

よく忘れるのでメモしときます！

# httpd.conf
## 何をするのか
Apacheの設定を行います。

## どこにあるのか
Apacheの詳細情報を表示する``Vオプション``が便利です。

```
$ httpd -V | grep httpd.conf
 -D SERVER_CONFIG_FILE="/usr/local/etc/httpd/httpd.conf"
``` 

## 参考記事
[Apacheの設定ファイル httpd.confの場所](https://qiita.com/s2maeda/items/21d9458e44f86597d1ae)
[httpd - Apache Hypertext Transfer Protocol Server](https://httpd.apache.org/docs/2.4/ja/programs/httpd.html)
[Apache の起動、停止だけじゃない httpd コマンド](http://bashalog.c-brains.jp/10/01/27-140150.php)

# .htaccess
## 何をするのか
ディレクトリ単位でApacheの設定を行います。

存在意義はWikipediaさんが分かりやすく説明してくれています。
>Apacheではhttpd.confという設定ファイルでApacheの設定を行うが、Webサーバの要となる設定ファイルであるため、Webサーバの管理者でないと設定を変更することができない。.
.htaccessはhttpd.confで.htaccessの利用を許可している場合、Webサーバ管理者のみならずウェブサイトの管理者レベルでApacheの一部設定を行えるようにしたものである。

ですが、公式サイトから極力使うなと言われています。
>一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、 .htaccess ファイルの使用は極力避けてください。 世の中には、例えば、ユーザ認証は常に .htaccess ファイルで 行なわなければならない、という誤解が広まっていますが、まったくそんなことは ありません。ユーザ認証の設定はサーバ主設定ファイルに書くことができ、 実際、その方がより良い設定方法です。

## どこにあるのか
laravelなどのフレームワークでプロジェクトを作成すると、``ルートディレクトリの直下``に自動的に生成されています。

## 参考記事
[.htaccess](https://ja.wikipedia.org/wiki/.htaccess)
[Apache チュートリアル: .htaccess ファイル](https://httpd.apache.org/docs/2.2/ja/howto/htaccess.html)
[Apache コア機能](https://httpd.apache.org/docs/2.2/ja/mod/core.html)

# php.ini
## 何をするのか
PHPの設定を行います。

## どこにあるのか
``phpinfo()``と同じ内容を出力する``iオプション``を使っています。

```
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php/7.2
Loaded Configuration File => /usr/local/etc/php/7.2/php.ini
```

## 参考記事
[コマンドラインオプション](https://www.php.net/manual/ja/features.commandline.options.php)
[コア php.ini ディレクティブに関する説明](https://www.php.net/manual/ja/ini.core.php)
[php.iniの場所](https://qiita.com/tmsanrinsha/items/2fda05db29b62090e3de)
時間表示を経過時間表示にするプラグイン

日時の表示をn時間前、とかで表示させるためのプラグイン。

> Time Ago Twig Filter
> https://plugins.craftcms.com/time-ago-twig-filter

Twig のフィルタが追加される。

個人的にはこういう見せ方はあまり好きじゃないのだけど、要件として必要な場合もあったりはするのも事実。

> php - Twig – time ago format - Stack Overflow
> https://stackoverflow.com/questions/26311197/twig-time-ago-format

この辺の話だと思うのだけど、Twigはデフォルトでできないのかな、調べてみてないけど。。
Rails: ActiveRecord::Base

#ActiveRecordとは
・Ruby on Railsで採用されているOR Mapperのこと。
・モデルとテーブルをつなぎ合わせることでRailsからテーブルのレコードにアクセスできるようにする役割がある。
・Railsにデフォルトでインストールされており、実際に利用する際には ActiveRecord::Base というクラスを継承して使用する。

  *ORM (オブジェクトリレーショナルマッピング)とは、直接SQL文を書く代わりに非常に短いコードでデータベースの読み書きを行える機能のこと。OR Mapperとは、そのためのモジュールのこと。

##ActiveRecord::Baseメソッドとは
・ActiveRecord::Baseで定義されている「テーブルにアクセスして情報を取得するためのメソッド」のこと。

これによって様々な情報をテーブルから引き抜いたりできる
問題解決能力の重要性をデータ移行トラブルで説明

エンジニアがプログラミングできれば、よくスキルが高いと思われます。
実は上手にプログラムを書くと本番環境の問題解決能力は二つの分野と言っても過言ではありません。
つまり、コーディングができて、本番環境が出る際に問題解決できない人も結構います。

本番環境の問題解決能力はエンジニアの最高スキルを表していると言っても過言ではないと思います。

理由は3つ
1. いかなる厳しい状況にパフォーマンスを安定的に出すのが大事
2. 制限時間内で冷静に考える、問題分析、判断力どれも必要
3. プログラムは結局サービスとして提供しないと意味ない

実例で説明していきます。

あるシステムに数万の代理店データがあって、各代理店の配下に数十〜数万のショップがあり、
ある休日でで移行作業を決めて、事前にサービスの停止時間を連絡し、移行作業を行います。

事前に移行プログラムを作成し、十分にテストして、
メンテナンス時間内で問題なく移行できるという報告がありましたが、
本番作業の際に意外に重くて、なかなか進まないです。

確認したところ、テストに中小代理店のデータでテストを行ったため、
本番環境には全体取引量の5％〜6％を占める大型代理店もあるので、
当然移行時間も異なり、なかなか終わりません。

もちろんテストサンプルの選び方が悪かったですが、本番作業が始まり、
改めてユーザーにメンテナンス時間をいただくことも難しいですので、
予定時間内に移行作業を済ませないと翌日の取引ができなくなって、
数千の代理店、数万百ショップに連絡するのは無理でしょ！

解決しなければ、クレーム電話が殺到し、運営チームがお詫びで倒れそうで、ユーザーに対する賠償が発生、
さらに会社の信頼問題で、大変なことになります。

とにかく、問題解決が一番先にやること！

### 解決案1
- コアデータを先に同期させて、メンテナンス後のサービス提供を確保する。手動インポート＆エクスポートでDB移行。
- 現状
    - DBの規模によって、数千テーブルがあり、複雑性が半端ない。
- 問題点
    - DBAにとって、瞬時に終わる作業ではない、不可能なタスクであり。

### 解決案2
- 移行プログラムを改善
- 現状
    - 確認したところ、移行プログラムのWebページに代理店の番号を入力して、ループでデータ遷移処理を回しているようで、
ショップの方は複数スレッドで行なっているが、代理店の部分は複数スレッドで実行することで移行を加速化。
- 問題点1
    - すぐに移行プログラムを改修して、テストをしないとリスクが大きくて、怖い
- 改善案
    - Webページは1回のリクエストにバックエンドに1つのServletで処理する
- 改善案テスト
    - 4つページを開き、違う代理店の番号を入力してテストして、スムーズに実行できた
    - さらに数十ページで開いて、テスト実行。時々エラーになる
- 改善案エラー分析
    - エラー確認して、スレッドセーフではないのが問題
    - あるスレッドで変更した共有データが、他のスレッドによって上書きされてしまう可能性があります
    - クラス変数とインスタンス変数はスレッドセーフでない
- 改善案のエラー解決
    - ThreadLocalで改善
- 改善案再テスト
    - 1つTomcatは6つのスレッド並行処理すると、負荷が高い
- 改善案原因分析
    - 各スレッドはさらに他のスレッドを使って移行処理を行う
- 改善案の改善案
    - クラウド環境で複数サーバを立ち上げて、物理で負荷分散
- 結果
    - メンテナンス時間内に無事に移行できた


以上、プログラムを書いて問題解決ではないか、
本番環境の問題に対する原因分析や考え方など結構大事だと思います。


## 移行作業のあるある
- 事前テストは十分だと思ってるが、データ量は本番と異なると作業時間が長さが変わって、サービスに影響がでる
- 移行データの多様化による、テストデータが全てのパターンにカバーできない
- どうしても完全なる本番作業にできないので、予想外の問題が出てくる

## 本番問題解決のコツは？
簡潔に一言でまとめます。

実践！実践！実「戦」！

個人の意見ですので、不足な部分を指摘いただければと思います。<(_ _)>
paramsの定義と構造について

# paramsとは何か
paramsとは、ビューでフォームに入力された１つ１つの情報(parameter)のまとまりのことを言う。

# paramsの構造について
paramsは、ハッシュの構造をしており、キーとバリューでのセットになっている。
binding.pryなどでデバッグして、コンソール上でparamsと入力して実行すると、入力したデータがハッシュで表示されるようになる。

```
(自分なりの理解)
params　→　ユーザーが入力したデータのまとまり(複数のデータが格納されている)
　↓
　キー　　→　paramsの個別の情報の目印(ビューとコントローラで設定したキー名)
　↓
バリュー　→　キーの中の個別具体的な詳細データ(実際にユーザーが入力したデータのそのもの)
```

また、個別のデータを表示させたいときは、以下のように入力すると表示できる。
(paramsは、Railsの方であらかじめ設定されている文言みたいなで、なぜparamsを入力するとデータがハッシュ構造でコンソール上に表示されるのかはわからない。)

```
params[:個別のキー名]
```
https://gyazo.com/71a58c74eb4431cb1b55e268704bda1e

この書き方は、DBに保存するときの書き方と同じであるため、以下のようにコントローラにparamsを定義する。

```rb

def create
    Tweet.create(image: params[:image], text: params[:text], user_id: params[:user_id])
  end
```
Java リフレクションで関数をまとめて呼び出す方法

#リフレクションで関数を変数に入れて呼び出す。
呼び出したいクラス。適当に四則演算しているだけ。

```java:Calc.java
package refrectiontest;

public class Calc {

    public int plus(int a, int b) {
        return a + b;
    }
        public int minus(int a, int b) {
        return a - b;
    }
        public int multiply(int a, int b) {
        return a * b;
    }
        public int divide(int a, int b) {
        return a / b;
    }
        
}
```

呼び出すところ。

```java:RefrectionTest.java
package refrectiontest;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class RefrectionTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // インスタンスを作成する 
            Constructor<?> cons = Calc.class.getConstructor();
            Calc calc = (Calc) cons.newInstance();
            //使いたい関数名をリストへ登録
            List<String> methodNames = new ArrayList<>();
            methodNames.add("plus");
            methodNames.add("minus");
            methodNames.add("multiply");
            methodNames.add("divide");
            //登録した名前で関数をまとめて呼び出す。
            //呼び出し元のシグネチャが違う場合は中で分岐するかfor文を分ける必要がある。
            for(String methodName : methodNames){
                //Method型の変数に関数ポインタを取得する。
                //getMethod(上で作ったクラスインスタンス,使いたい関数の第一引数、第２引数、第３・・・）
                //使いたいシグネチャの数だけmethod1,method2のように定義する。
                Method method = (Calc.class.getMethod(methodName,int.class,int.class));
                //関数の使用。invokeの戻り値はObject型なので対象の関数に合わせてキャストする。
                int result = (int)method.invoke(calc,20,10);
                System.out.println(methodName + " = " + result );

            }

        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException ex) {
            Logger.getLogger(RefrectionTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
}

```
出力結果
plus = 30
minus = 10
multiply = 200
divide = 2

#使い所
メソッドをString型で指定した時に便利かもしれない。
この例ではmethodNamesを一つづつ手打ちで足していますが、
呼び出したい関数名がmethod1,method2,method3,method4・・・
のように連番になっている場合は

```java
for(int i = 1;i<10;i++){
    "method" + String.valuOf(i) ;
}
```

のような感じで自動生成すればコードの短縮を測れるかもしれません。
逃げるURL、追うブックマークレット

棋士の藤井聡太七段は気象庁のWebページで積雪深の情報を見るのが好きだそうですが、私は真夏に気温の高さを確認する癖があったりします。

気象庁の過去データというので、月単位で1日単位のデータを見ることができます。それをブックマークするのですが、しばらく日が経って（時には1年経って）ブックマークを利用してアクセスすると、ブックマークしたときの月のデータが表示されます。

（ちなみに、[ブックマークした2017年7月の気象データ](http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=2017&month=7&day=&view=)）

こ、これは不便だ……ということで、ブックマークレットを使ってみました。

```Javascript
javascript:
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth();
month++;
location.href = 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year='+year+'&month='+month+'&day=&view=p1';
```

使い方としては、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/5927b355-804b-2c47-1f48-6deef2fcff55.png)

Javascriptのプログラムを **ブックマークのURLのところに書く** だけ。

いやー、これで当該月の気象データを確認することができます。とても便利ですね。

ちなみに東京、7月26日から25.0度を下回っておりません。常に熱帯夜。暑すぎます :sweat_drops:
HTMLの基本

##HTML 「ブロック要素」「インライン要素」

ブロック要素：
見出し・段落など一つのブロックとして主にページ全体のレイアウトを行うために使う要素。
`<div><p><table>`など。

インライン要素：
主にブロック要素の中身として用いられる要素。文章の一部を装飾するときなどに使われる。
`<a><strong>`など。


##webフォントを使う理由
あらかじめ用意してあるフォントを使うことによって予期していない文字に
変換されるなどを防ぐため。
Anaconda の公式 Docker イメージがアクティベーションしないと使えなくなった件

[Anaconda の公式 Docker イメージ](https://hub.docker.com/r/continuumio/anaconda3) をベースにしてイメージをビルドするときにハマった話。

## [追記]
現在では PATH が戻っているようですね・・・。
https://github.com/ContinuumIO/docker-images/pull/148

## イメージのビルドが失敗するようになった
今まで Anaconda の公式イメージをベースにしてデータ分析用のイメージを作ったりしていたのだけど、Anaconda のバージョンを `2019.07` に上げたところ `conda` や `pip` コマンドが使えなくなった。

``` Dockerfile:Dockerfile
FROM continuumio/anaconda3:2019.07

RUN conda install -y cudatoolkit
```

``` console:ビルド結果
$ docker build .
/bin/sh: 1: conda: not found
```

ちなみに bash でログインした場合は問題なく使える。(Anaconda イメージのデフォルト起動コマンドは `bash`)

``` console
$ docker run --rm -it continuumio/anaconda3:2019.07
(base) # which conda
/opt/conda/bin/conda
```

これはログインシェルとして bash を起動した場合は `conda activate` が実行されるように設定されているため。

``` console
$ docker run --rm -it continuumio/anaconda3:2019.07 cat /root/.bashrc
(略)
. /opt/conda/etc/profile.d/conda.sh
conda activate base
```

しかし Dockerfile のビルド時は `/bin/sh -c` (debian の場合 `/bin/sh` は `dash` のエイリアス) で実行されるため自動で `conda activate` が実行されず、 `conda` や `pip` コマンドは使えない。

``` console
$ docker run --rm -it continuumio/anaconda3:2019.07 sh -c 'conda info -e'
sh: 1: conda: not found
```

ここで気になるのは「 `2019.07` 以前は使えていたじゃん」という点だが、これは何故かというと、以前は Anaconda イメージの Dockerfile に `ENV PATH /opt/conda/bin:$PATH` がベタ書きされていたので `conda activate` しなくても `/opt/conda/bin` 配下にある `conda` や `pip` コマンドにパスが通っていたため。 `2019.07` ではこれが削除されてしまった。

## Anaconda として正しい挙動は何か
Anaconda 公式的には「明示的に `conda activate` する」が正しく、アクティベートせずに使えていた以前の方が誤りらしい。[^pr]

[^pr]: https://github.com/ContinuumIO/docker-images/pull/141#issuecomment-522286881

個人的な意見としては、Docker コンテナ内でさらに conda 仮想環境を切り替える用途なんてそうそうないだろうし(そういう使い方をしたければ Docker コンテナを複数作ればよい)、最初から `base` がアクティベートされた状態にしれくれてもいいのになー、と思う。(ダメ元で Pull Request 投げてみたけどやはりダメだった)

ただまぁ、以前の状態は「`sh -c` のときもアクティベートされていた」わけではなく「たまたま `/opt/conda/bin` にパスが通っていたので使えていただけ (アクティベートされていない)」だったので、そのまま使い続けるのがお行儀が悪いというのは理解できる。

## 対処方法
おそらく最もお行儀の良いのは「 `conda` や `pip` など Anaconda 環境下にあるコマンドを使う場合は毎回アクティベートするコマンドを差し込む」方法だろう。

``` Dockerfile:Dockerfile
FROM continuumio/anaconda3:2019.07

RUN . /opt/conda/bin/activate \
  && conda install -y cudatoolkit

ADD . /app
WORKDIR /app

RUN . /opt/conda/bin/activate \
  && pip install -r requirements.txt
```

しかしこの方法では `RUN` が終了するたびにリセットされてしまう為 `RUN` のたびにアクティベートする必要があってとても面倒臭い。

もう一つの方法としては「ビルド時の `RUN` の実行コマンドを `bash -l -c` に変更する」が考えられる。 `-l` オプションをつけることでログインシェルとして扱われるので毎回 `~/.bashrc` が読み込まれる。

``` Dockerfile:Dockerfile
FROM continuumio/anaconda3:2019.07

SHELL ["/bin/bash", "-l", "-c"]

RUN conda install -y cudatoolkit

ADD . /app
WORKDIR /app

RUN pip install -r requirements.txt
```

これなら `RUN` のたびに `~/.bashrc` を読み込んで自動でアクティベートしてくれるので、毎回アクティベートをするコマンドを差し込む必要がなくなり、Dockerfile がスッキリする。

この方法は多少行儀は悪いものの「`/opt/conda/bin` を `PATH` に追加する (アクティベートせずに無理やり使う)」方法よりかはだいぶマシだと思う。

懸念点としては 「 `sh -c` から `bash -l -c` に変えたことで何か悪影響が出る可能性」だが、今のところ悪影響が出るケースが思いつかない。
何か思い当たる人はコメントしてもらえるとありがたい。

## ビルドしたイメージからコンテナを起動するとき
ビルドしたイメージからコンテナを起動するときもまたアクティベートする必要がある。

``` Dockerfile:Dockerfile
RUN echo 'exec "$@"' > /entrypoint.sh
ENTRYPOINT ["/bin/bash", "-l", "/entrypoint.sh"]
```

今のところ、こんな感じで ENTRYPOINT を用意して bashrc を読み込んでもらう方法くらいしか思いつかない・・・。
【ExcelVBA】「修飾子が不正です」でコンパイルできない

# はじめに

職場で事務作業用のマクロを作っていたところ、「修飾子が不正です」というコンパイルエラーが突然発生しました。

以前に投稿した[【ExcelVBA】「定数式が必要です」でコンパイルできない](https://qiita.com/nkojima/items/a64d0415a6a0224bf3fd)と同じく、最初は原因が全く分からなかったので、備忘録としてこの記事を書くことにしました。

![修飾子が不正です.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/0a12e8d9-49b4-d2a5-98c4-6c9030a88279.png)

# 実際のコードのイメージ

* 以下のようなコードを作ると、Module1の5行目の`Test.GetMessage()`でコンパイルエラーとなり、「修飾子が不正です」というエラーメッセージが表示されます。
* VBEditor上で以下のコードをよく見ると、`Test.GetMessage()`が自動的に`test.GetMessage()`に変換されていました。

```vb:Test
Option Explicit

Public Function GetMessage() As String
    GetMessage = "テストです"
End Function
```

```vb:Module1
Option Explicit

Sub Main()
    Dim test As String
    test = Test.GetMessage()    ' ★この行でコンパイルエラーが起きる
    MsgBox Test
End Sub
```

# 問題の原因

* コンパイラ側で、Module1内の変数`test`と、呼び出している関数のモジュール名`Test`が識別できなくなっていたことが原因でした。
 * 他の言語では大文字と小文字を区別してくれるものが多いですが、**VBAは大文字と小文字を区別せずに識別している**ようです。
* 変数名と標準モジュール名だけでなく、変数名とクラス名の場合も同様の理由でエラーが発生するようです。

# 解決策

1. モジュール名、もしくは変数名のどちらかを変える（リネームする）ことで問題を回避できます。
 * 例えば、以下のようにModule1中の変数`test`を`testMsg`に変えるだけでコンパイルエラーを回避できます。
2. 関数を呼び出す際に、関数の書かれている標準モジュール名を削除した場合も、この問題を回避することができます。
 * この方法の場合、`GetMessage`という名前の関数が同一標準モジュール内にあると、同一標準モジュール内の`GetMessage`が呼び出されてしまう欠点があります。

```vb:Module1
' 解決策1（変数名をtest→testMsgに変更）
Option Explicit

Sub Main()
    Dim testMsg As String
    testMsg = Test.GetMessage()
    MsgBox testMsg
End Sub
```

```vb:Module1
' 解決策2（関数を呼び出す際に、標準モジュール名を割愛）
Option Explicit

Sub Main()
    Dim test As String
    test = GetMessage()
    MsgBox test
End Sub
```
HTMLのname属性とストングパラメーターのキーとの関係性について

　コントローラには、ストロングパラメータというDBに保存するparameterのキー(カラム名)を指定するものがある。ここでは、そもそもparameterのキーはどこから送られてくるのか、なぜ、キーを指定なければならないのか、について書いていきます。

# parameterのキーはどこから送られてくるのか？
ユーザーのリスエストする際に送られるparamsは、viewの方(新規投稿画面など)から送られてきている。そして、viewの方では、どのような設定がなされているのかというと、ここではparamsのキーを設定するためのHTMLのname属性というのが理解の鍵となる。

※ちなみに、**parameterとは**、ユーザーがリクエストする際に入力される１つ１つのデータのことをいう。そして、**paramsとは**、parameterが複数あるもので、データのまとまりのことをいう。

#name属性とは何か？

name属性は、parameterに対してデータとしての名前をつけることができるHTML属性である。これによって、ユーザーがリクエストをする際に、viewの方で入力されたparameterにnameのキーをつけることができる。name属性をつけるときは、保存したいデータベースのカラム名にすること。

https://www.kanzaki.com/docs/html/htminfo31.html

以下の例では、ユーザが入力した文章はtextで、画像のURLはimageというキーをつけている。(今回はわかりやすく説明するため、form_tagを使いました。)


新規投稿画面のview

```html 

<div class="contents row">
    <div class="container">
      <%= form_tag('/tweets', method: :post) do %>
        <h3>
          投稿する
        </h3>
        <input placeholder="Image Url" type="text" name="image">
        <textarea cols="30" name="text" placeholder="text" rows="10"></textarea>           
        <input type="submit" value="SENT">
      <% end %>
    </div>
  </div>
  
```

そして、コントローラの方でストロングパラメータのキーにname属性ので指定したキーを設定すれば、入力されたparameterのキーとストロングパラメータのキーが一致して、紐づけができるようになる。
以下では、新規登録画面のviewのname属性のキーとストロングパラメーターのキーが一致
しているため、ユーザが新規登録した内容のparamsがDBに保存されるようになる。

```rb

params.permit(:image, :text)
```

コントローラのストロングパラメーター

```rb

  def create
    Tweet.create(image: tweet_params[:image], text: tweet_params[:text], user_id: current_user.id)
  end

private
  def tweet_params
    params.permit(:image, :text)
  end
```
margeメソッドを使う意義

mergeメソッドとは、2つのハッシュを結合する時に使うメソッドである。今回は、このメソッドはどうして使われているのか、というmergeメソッドの意義について書いていきます。

mergeメソッドが使われる場面
mergeメソッドが使われる場面としては、ユーザーが入力したparamsをDBに保存する時に使うことが多いです(個人的な感想)。
では、mergeメソッドを使わなかった時と使った時とで、どのような違いがあるのかを説明していきたいと思います。


# mergeメソッドを使わなかった時

例えば、以下のような新規等投稿画面があった時、ストロングパラメーターに保存されるデータは、新規等投稿画面のviewの方で、name属性で指定したtext(ユーザーが入力した文章)とimage(ユーザーが入力した画像のURL)しかDBに保存されない**(ただし、paramsとしてコントローラには送られてくる。)**。そのため、データを入力したuserのidをDBに保存することがデッキ無くなってしまうため、コントローラのcreateアクションの引数にuser_idを指定しなければならなくなる。そうすると、createアクションの引数のコードが長くなり、可読性は失われてしまう。


新規投稿画面のview

```html 

<div class="contents row">
    <div class="container">
      <%= form_tag('/tweets', method: :post) do %>
        <h3>
          投稿する
        </h3>
        <input placeholder="Image Url" type="text" name="image">
        <textarea cols="30" name="text" placeholder="text" rows="10"></textarea>           
        <input type="submit" value="SENT">
      <% end %>
    </div>
  </div>
  
```

コントローラのストロングパラメーター

```rb

  def create
    Tweet.create(image: tweet_params[:image], text: tweet_params[:text], user_id: current_user.id)
  end

private
  def tweet_params
    params.permit(:image, :text)
  end
```


# mergeメソッドを使った時
mergeメソッド使えば、paramsとして送られてきたcurrent_user.idのデータをストロングパラメーターのキーと結合させることができるようになり、createアクションの引数のコードを短くすることができ、可読性を保つことができるようになる。

mergeメソッド使った時のcreateアクションの引数とストロングパラメーター

```rb

  def create
    Tweet.create(tweet_params)
  end

private
  def tweet_params
    params.permit(:image, :text).merge(user_id: current_user.id)
  end
```
【Unity】意図しないコリジョンイベントが発生する場合の確認点

# 始めに
Unityでコライダーを複数もたせたオブジェクトを扱っているとき、
なぜか当たっていないはずのコライダーのイベントが発火するなんてことはないでしょうか。
それはRigidbodyコンポーネントが影響しているかもしれません。

# 例
**キャラクターオブジェクト**　←Rigidbody、Collider、被弾検出スクリプト
**└視界オブジェクト**　←Collider、他キャラクター検知スクリプト（←検知に使うため大きめのコライダーをセット）

上記のような構造のキャラクターに向かって攻撃コライダーを飛ばしたとします。（レイヤーはここでは考えない）

まず視界オブジェクトに当たった時点で、他キャラクター検知スクリプトが発火し、
そのあとキャラクターオブジェクトに当たった時点で、被弾検出スクリプトが発火するように思えます。
しかし実際には視界オブジェクトに当たった時点で、一気に被弾検出スクリプトまで発火してしまいます。

# 原因
[こちら](http://tsubakit1.hateblo.jp/entry/2017/02/22/230100)でも書かれておりますが、Rigidbodyは配下のコライダーをまとめて扱うという性質があり、
それによって子オブジェクトに付いているコライダーがまとめられているためです。

例の場合、キャラクターコライダーに視界コライダーも含まれた状態になってしまっているわけですね。
（正しい表現かはわかりませんが…。）

# 解消方法
### レイヤーを適切に設定する
同一のRigidbody配下だとしてもレイヤーはしっかりと判定されるので、
それぞれでレイヤーを分けられるのであれば、それがベストでしょう。

例の場合、キャラクターオブジェクトと視界オブジェクトのレイヤーを分けて、視界オブジェクトと攻撃はヒットしないようにすればOKですね。
しかし、視界オブジェクトにおいても攻撃コライダーを検知したい場合もあります。
試してみたのですが、レイヤーを変えてもその両方がヒット有効なら両方のイベントが同時に発火してしまいました。

### 階層を並列にする
動かすのにRigidbodyを使っていないのであれば、階層を変えてしまう手があります。
同一Rigidbody配下でなくなれば当然発火しなくなります。

**キャラクターオブジェクト**（キャラクター動作はここで実施）
**└キャラクター本体オブジェクト**　←Rigidbody、Collider、被弾検出スクリプト
**└視界オブジェクト**　←Collider、他キャラクター検知スクリプト

じゃあ、キャラクターをRigidbodyで動かしている場合は…？
上の例だとキャラクター本体オブジェクトだけ独立して動いてしまいます。

### 子オブジェクト側にもRigidbodyを付ける
これしか思いつきませんでした。
こうすると子オブジェクトはそのRigidbodyで判定を独立できるようです。
Rigidbodyが別々に動いてしまわないようにするため、FixedJointで接続することになるでしょう。

**キャラクターオブジェクト**　←Rigidbody、Collider、被弾検出スクリプト
**└視界オブジェクト**　←**Rigidbody**、Collider、**FixedJoint(キャラクターのRigidbodyと接続)**、他キャラクター検知スクリプト

なんかゴチャゴチャとくっついてしまいますね…。もっとよい方法があればご教示ください。

# 終わりに
コリジョンイベントの発生には様々な条件がある分、意図しない動作をしたら色々とチェックしなければなりません。
今回の内容は知らないと結構ハマってしまうと思いますので、こちらに残させて頂きました。