OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 2 Model B > I2C通信中にシャットダウン(フリーズ?)するようになった > 対処: Raspberry Pi 3 Model B + 新規OSインストール にて正常動作

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
Geany 1.24.1
GNU Make 4.0
gcc (Raspbian 4.9.2-10) 4.9.2
```

使用中のRPiがシャットダウンするようになった。

Pin #33, #35, #37を使ってのソフトウェアI2C通信をしている最中に発生。

- I2C結線
    - SDA: Pin #35(GPIO 19)
    - SCL: Pin #37(GPIO 26)
    - GND: Pin #39
    - 1秒ごとに50kHzの通信を実施
        - データ取得コマンドの送信を４セット実施
- その他結線
    - SDA, SCL, GNDに対して、Analog Discovery 2のロジック用ケーブルを接続
        - I2C通信のモニタのため
    - 有線のEthernetケーブルを接続
    - HDMIケーブルを接続
- 対処
    - 電源を1Aのものから2.5A供給のUSBアダプタに変更
        - => シャットダウンした
    - Raspbian JessieのmicroSDをUbuntu 16.04 LTSにマウントし、fsckを実施
        - マウントを解除し
        - ```fsck /dev/sdb3 -y```
        - ```fsck /dev/sdb5 -y```
        - ```fsck /dev/sdb6 -y```
        - => シャットダウンした
    - Analog Disocvery 2のモニタ用接続を解除
        - => シャットダウンした
    - I2Cのピン割当を変更
        - SDA: Pin #38 (GPIO 20)
        - SCL: Pin #40 (GPIO 21)
            - Python実装のSWシャットダウンのピン使用を回避
                - Pythonスクリプトは停止してはいるが。。。
        - => シャットダウンした
    - HDMIケーブルを抜いた
        - => 電源オン後15分は正常動作
        - => 電源オンから25分経過にてシャットダウン発生

I2C通信をすることによって、シャットダウンが起きるようになっているようではある。


### Raspberry Pi 3 Model Bにて動作開始

```
Raspberry Pi 3 Model B (以下RPi3)
Raspbian Stretch
- python 2.7.13
- python 3.5.3
- bash v4.4.12
- Geany v1.29
- GNU Make 4.1
- gcc (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516
```

- 対処
    - RPi2からRPi3に変えてみる
        - RPi3: 購入して数か月のもの
        - 新しいmicroSDにOS新規インストール
    - => 20分ほど経過した時点でI2Cセンサの読み取り結果がすべて0xFFになる
        - フリーズはしていない
        - センサー側の問題と思われる
        - 三回発生
            - センサー電源のオフ、オンで復帰
    - => 4時間21分経過: フリーズしていない

### まとめ

- Raspberry Pi 3 Model B + 新規microSDにOSインストール
    - 正常動作
- 問題の可能性
    - A. RPi2のmicroSDが壊れた?
    - B. RPi2に起きて、RPi3に起きない問題
        - ハードウェアの違い
        - ライブラリバージョンの違い

切り分けはできていないが、調査はいったんここで置いておく。
CloudFormationでLambdaのLayerを作成する

### 準備
ライブラリを作成し、ディレクトリ構成は以下のようにします。

```
layer.zip
│ python/lib
└ python/yourlib
```
zipファイルにして、S3にアップロード

```.sh
zip -r layer.zip python
aws s3 cp ./layer.zip s3://yourbucket
```



### CloudFormation template sample

```lambdalayer.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
#Layer作成
  LambdaLayer:
    Type: "AWS::Lambda::LayerVersion"
    Properties:
      CompatibleRuntimes: 
        - python3.6 #Valid Values: nodejs6.10 | nodejs8.10 | java8 | python2.7 | python3.6 | python3.7 | dotnetcore1.0 | dotnetcore2.0 | dotnetcore2.1 | go1.x | ruby2.5 
      Content: 
        S3Bucket: your-bucket
        S3Key: layer.zip    #Layer File
      Description: something
      LayerName: yourlayername

#LambdaSAM
  Lambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.6
      MemorySize: 128
      Timeout: 20
      Role: !Sub 'arn:aws:iam::${AWS::AccountId}:role/lambda-common-role'
      CodeUri: src/lambdasrcc/
      Layers:
        - !Ref LambdaLayer

```

## 注意
Layerのサイズ制限は以下になります。

| リソース    |       制限 |
|:-----------------|------------------:|
| サイズ           |  50 MB (圧縮)<br>250 MB(解凍) |
解凍の場合、既存ソースと合わせて250 MB以下です。
Adobe製品をインストールするときにエラーが出る

# はじめに
最近デスクトップPCを買い替えて環境設定中です。
備忘録として、ファイルやモジュールのインストールで詰まった部分を残していきます。
#今回はAdobe製品
Adobe製品は日ごろ一番使ってる（？）ので一番最初に入れました。
ネットからAdobeアカウントにログインしてみてクリエイティブクラウドをインストールしてみると何やらエラー画面が出てくる。
最初は普通に無視して×をおしていたら普通にインストールは進んだけれども、何度も出てきてうっとうしい。
![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/318447/49d62403-b593-1c28-62c5-376e07c80bd9.png)

# エラーメッセージ
```
Command Line Option Syntax Error . Type Command /? for help
```
と怒られました。

https://answers.microsoft.com/ja-jp/windows/forum/all/adobe-creative/6efb16ee-89c7-431a-89a9-367159f3bfe9
同じように悩んでいる人が..

# 解決案
https://www.megasoft.co.jp/support/3d/454/
ここにエラーの原因が書いたりしているのですが、ユーザー名が日本語になっている場合、「Microsoft Visual C++」のインストールができないという報告があるそうです。

Microsoftとローカルのユーザー情報を同期させてMicrosoftアカウントのユーザー名を英語にしてみてhttps://www.megasoft.co.jp/support/3dmhpro8/faq/data/vcredist_x86.EXE
からインストールしてみた。

#Windows10だと治らない
おそらくバージョンの違いか自分はエラーメッセージは消えませんでした。
エラーを消せば問題なくインストールでき、ソフトの起動もできたので、あまり気にすることはありませんが....
ソフトをインストールしてすぐエラーメッセージが出るのでその都度消すといいと思います。

#最後に

改善案がわかる方がいらっしゃいましたら、コメントで教えていただけるとありがたいです。
[備忘録] DiscordサーバーとTrelloを連携する手順

## はじめに

- 古い情報しかなさそうだったので備忘録も兼ねてまとめておく
- 過去よりも簡単になっているのかも？
- 抜け漏れがあったら指摘ください。

## 必要なもの

- Discordサーバー
  - ユーザーを追加できる、権限(役職)を作ることができる権限であること
- Trelloアカウント
  - 無償アカウントでOK

## 手順
### 1. DiscordにTrello BOTを追加する

こちらのBOTを追加しましょう。

> https://discordbots.org/bot/trello

1. Invite ボタンをクリック
2. Discordへログイン
3. 「BOTを追加します」にて、追加先のDiscordサーバーを選択
4. 認証 ボタンをクリック
5. reCAPTCHA
6. Complete !

追加先DiscordサーバーにてWelcomeメッセージが来ていることでしょう。

### 2. Trelloチームとボードを作成する

パーソナルボードでは使えませんので、チームを作成します。

作成済みの場合はスキップしてください。

1. チームを作成 ボタンをクリック
2. 任意の名前を入力
3. 作成 ボタンをクリック

そのままボードを作成しましょう。

1. 新しいボードを作成 ボタンをクリック
2. ボード名を入力
3. ボードを作成 ボタンをクリック

Trello側はこれだけです。

### 3. Trelloコマンドを実行できる権限(役職)を作成する

Discordにてコマンドを実行するのですが、それに先立ち、権限を作成する必要があります。

1. サーバー設定 → 役職
2. ＋ボタンをクリック
3. 役職名を「Trello」とする
4. その他は任意
5. 変更を保存する ボタンをクリック

### 4. ユーザーへの役職の割り当て

Trelloコマンドを使うユーザーに役職を割り当てます。

1. サーバー設定 → メンバー
2. 対象のユーザーの右にある＋をクリック
3. 「Trello」をクリック

### 5. DiscordアカウントとTrelloアカウントを紐づける

ここからTrello BOTのコマンドを使っていきます。

1. `T!auth`
2. レスポンスに記載のURLへアクセス
3. Discord、Trello各々の認証・認可をする

ちゃんと紐づいたかわかりにくいので確認します。

```
T!switch <Board ID>
```

これはボードを切り替えるコマンドなのですが、初期状態ではどのボードも選択されていないため、Switchコマンドを使います。

`Board ID` はボードのURLにある英数字です。

```
https://trello.com/b/<Board ID>/<Board Name>
```

以下のメッセージがメンションされたらNGです。

```
Either you didn't select a board or you haven't authorized your Trello account with Discord! Please authorize here: https://trello.snazzah-is.cool/auth
```

以下のメッセージがPostされたらOKです。

```
Switched board to <Board Name> (<Board ID>)
```

手順としては以上になります。

## カードID？なにそれ？

このTrello BOTですが、頻繁に使うであろう「カード」のコマンドで、「カードID」を入力する必要が出てきます。

カードIDってなんぞや？

私も苦労しました笑
数字とか＃数字とか入力しても 400番が返ってくるだけだし、
コマンドリファレンスもないし。。。

調べる方法は List コマンドです。

```
T!list <List Name>
```

リストにあるカードの一覧を拾ってくるコマンドです。
ここにカードIDが出てきます。
面倒ですがここからコピペしないと使えません。

```
#====== Page 1/1 ======#
[hoge](ID: vcC8LlJd){}
[fuga](ID: kfsUimnJ){}
```

## ちょっと使ってみた感想

1. コマンドがわかりづらい

    Listの作成は `T!addlist` なのに、カードの作成は `T!createcard` 
    AddかCreateか統一しろ！笑

2. ドキュメントが皆無に等しい

    Trello BOT公式のサーバーに入ってみたけど、情報が薄すぎる！

とまぁまだ触り始めたばかりなので感想も薄いのですが、このBOTを使うより、自作BOTやらFunctionやらを作ってWebhookした方が、自分好みにできるのでは？とか思ってしまいました。
気が向いたらやってみましょうかね。
学びの記録　〜Progate PHP II 〜　　

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回学んだものの中で、他の言語とは違ったものを中心に重要なポイントをまとめておきます。

#見やすいレイアウトに
PHPはHTML内に書いていくためどうしても見にくいものになってしまいます。
それを少しでも軽減するためにもPHPとHTMLのコードを分けるように書きます。
![スクリーンショット 2019-02-05 15.06.30.png](https://qiita-image-store.s3.amazonaws.com/0/351843/22f73337-6541-486a-4202-13c7b87b07a2.png)

#foreach文、if文の書き方
これらをHTMLに埋め込む際には書き方が少し変わるので注意が必要です。
![スクリーンショット 2019-02-05 15.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/351843/85738f40-154d-cf50-258c-c7d4b5b73023.png)

#フォームの値の受け渡し
Iでもやりましたがフォームで送信された値は「$_POST」で受け取ることができます。
あとはinputタグのnameを指定します。
![スクリーンショット 2019-02-05 15.17.04.png](https://qiita-image-store.s3.amazonaws.com/0/351843/5fca4be9-6aff-9f08-03d6-e6c95350577f.png)
旅行先で2週間だけpcが欲しくなった時に1万円くらいで調達できるマシン探したらラズパイに落ち着いた

一ヶ月間の旅行中にラップトップがぶっ壊れました。プログラマとしてPCなしは辛いので1〜2日間でPC調達する方法を調べます。ThinkPadユーザーなので新しいのを注文しましたが、到着まで最低2週間はかかる模様……。どうやって2週間PCライフを送る？

## 前提

* USキーボードユーザー(重要)
* Linuxユーザー(重要)
* 宅配が受け取れる
* 自宅に代替機を取りに戻ることは不可
* 予算1万円くらい（OSインストールの用のネカフェ代は別）
* プログラミングできればよい（Webブラウズは重いのでiPadに任せる。エディタはvimで）
* 宿にTVがあり、HDMI接続可
* Wifiあり、有線LANなし
* 手持ち電子機器はAndroidスマホとiPadのみ
* 1日か2日で調達したい
* 持ち運べるサイズ

さてどうする？

## レンタルPC

レンタルPCだと二週間一万円以下で借りられます。ただし、LinuxかつUSキーボードという条件は無理そう……。JIS配列のWindowsユーザーならこれで終わりだった。

購入する方向で検討開始

## 購入に当たり条件確認

* CPUはこの際なんでもよい。Core2Duoでもディストロを選べば快適らしい
* メモリ1GB以上。Chromeが1GB食う想定だと2GBは欲しい。
* ストレージはHDDでもSDカードでもおけ
* USキーボード、今回のボトルネック
* 軽くて持ち運びしやすい方がよい

## 選択肢

* 中古ラップトップ
* 中古デスクトップ+付属品
* シングルボードPC+付属品

### 付属品の価格について

* Amazon価格で有線無線ともにキーボード2000円
* HDMIケーブル600円
* ラズパイが動く電圧のminiUSBは所持

## 通販サイトについて

翌日に届くのがAmazonくらいなので7すが、一応手広く見ます、

## 7000円以下のデスクトップ

* 意外と数はある
* スペックも問題なし
* でかい

でかいので記憶にとどめつつ次の選択肢へ
旅行先でなく10000円でPCを用意したければ一般的な選択肢です。

## ラップトップ

Amazonでは選択肢見つからず。無念。

他サイトは一応あり。やはり安いとでかいものが多いです。15型くらいはまあ、許容範囲内ですが、問題はJISキーかあるいは__キー配列が書いてないこと__です。
書いてない、すなわちJIS配列と思いますが、中にはUSキーも混ざってるんじゃないかな？
US配列と書いてある中古はみつからなかったので次いきます。

Sosoon i2000なる__新品で14000円のコンピュータ__もあったようですが、今はもう売ってないみたいです。

## シングルボードコンピュータ

実は今回の本命です。ラズパイを（二週間とはいえ）普段使いってかっこよくね？程度の軽い気持ちです。

### ラズパイ

みんな大好きラズパイの出番です。
現行はRaspberry Pi 3 Model b+
私が書きたいGoは動きます。zshも問題なし。
neovimだけわかりませんがvimは動くので気軽に。
ちなみに__Visual Studio Code__は動くらしいです。
裸で使うといろいろ危ないので、セット品を探します。
6000円くらいから
心はラズパイに傾いていますが他のも見てみましょう。

### その他のシングルボードコンピュータ

Thinker board
Banana Pi
どちらもイマイチ（高かったりラズパイほど情報なかったり）

## 結論

ラズパイ買います。

* 2週間後に処分の面倒くさいデスクトップよりも、2週間後にほかの遊び方ができるラズパイの方が無駄が少ない
* コンパクト
* ラズパイ触りたかった

あたりが理由です。

後日デスクトップラズパイをレビューします
Composerのインストール

毎回忘れるのでいい加減メモる。

環境：
AmazonLinux2
PHPインスコ済

まずセットアッパーのダウンロード
これは後で削除するのでどこでDLしてもおｋ

```shell
[root@ip-XX-XX-XX-XX kara-age]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```

セットアップ実行

```shell
[root@ip-XX-XX-XX-XX kara-age]# php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 1.8.3) successfully installed to: /home/kara-age/composer.phar
```

セットアップが終わったらsetup.phpを削除

```sh
rm composer-setup.php
```

グローバルで使えるようにする

```shell
mv composer.phar /usr/local/bin/composer
```

セットアップ出来たかとcomposerコマンドで実行できるか確認

```sh
[root@ip-XX-XX-XX-XX kara-age]# composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.8.3 2019-01-30 08:31:33
```

ちなみにrootでcomposerコマンド使ってパッケージをインストールするのはセキュリティ上良くないらしい。

[How do I install untrusted packages safely? Is it safe to run Composer as superuser or root?](https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md)

上記リンクの内容は以下

>Certain Composer commands, including exec, install, and update allow third party code to execute on your system. This is from its "plugins" and "scripts" features. Plugins and scripts have full access to the user account which runs Composer. For this reason, it is strongly advised to avoid running Composer as 
 super-user/root.

rootユーザで実行すると中に入ってるexecとかinstallコマンドがrootで実行されてしまうからオススメしないよ！って話のようだ。

それらを防止するためにcomposer内の無関係なスクリプトを無効にする処理を入れておけばよいそうな。

```sh
composer install --no-plugins --no-scripts ...
composer update --no-plugins --no-scripts ...
```

**おわり。**
windows 2008 R2でpython+tensorflow+opencvをインストールしようとしたところ

python3.6
opencv3.4

# 結論
docker toolbox を使う

# 普通にインストールしてみる
## windows2008はおっしゃられた。DLLが足りないと
```
  File "C:...Python\Python36\lib\site-packages\cv2\__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

どのDLLが足りないのか、教えて欲しい。
該当フォルダの cv2.cp36-win_amd64.pyd が怪しいので、依存関係を探ってみる

## dependency walker
http://www.dependencywalker.com/
これを使って、dependencyをwalkerしてみる

> MF.DLL
> MFPLAT.DLL
> MFREADWRITE.DLL
> API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
> API-MS-WIN-CORE-WINRT-L1-1-0.DLL
> API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
> API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
> DCOMP.DLL
> IESHIMS.DLL
> WLANAPI.DLL

## MF.DLLとAPI-MS-WIN-CORE-WINRT関連
windows multimedia foundationと、winrtランタイムが必要っぽい。
そして、どちらもwindows2008R2には入らないっぽい
オワタ＼(^o^)／

# dockerを入れる
仮想入れるしかない、仮想ならDockerにしよう

## windowsで使える docker + linuxの種類
どのパターンでもvt-x必須

- Docker for Windows
Windows 10 pro対応、Hyper-VにDocker-machineが作られるっぽい。
Hyper-vコンテナとどちらが良いの？？

- Hyper-V コンテナ
windows 10 pro / windows server 2016以上
OSレベルでサポートされたコンテナ、現時点では使えるならこれを使うべき。
使ったことないけど。

- Docker Toolbox
Virtual BoxにLinuxなDockerMachineを作る。
レガシィで非推奨だけど、古い環境では使うしかない。

## Docker Toolboxを入れる(AWS編)

AWSのWindowsではvt-xをサポートしていないので、無理ぽ。

https://aws.amazon.com/jp/about-aws/whats-new/2018/05/announcing-general-availability-of-amazon-ec2-bare-metal-instances/
ベアメタルインスタンスを使うと行けるっぽいけど、価格がとんでもないのでとんでもない。

## Docker Toolboxを入れる(Azure編)

D-V3インスタンスなら、vt-xがtrueで仮想環境を中に作れる!

https://docs.docker.com/toolbox/toolbox_install_windows/
手順にそって入れた。

オフラインで入れる場合は、* 
boot2docker.isoをゲットして、
C:\Users\user_name\.docker\machine\cache
へ置いておく。

動いた。
なんか何もしなくてもCPU100%使われたけど、再起動したら治った。

## Tensorflow 1.9 が動かない。
> Illegal instruction (core dumped) gdb tensorflow

https://github.com/tensorflow/tensorflow/issues/17411

なんかCPUのバージョンとtensorflowのビルドの関係で動かないらしい。
再ビルドするか、tensorflowのバージョンを下げるかのどちらかで対応。

今回はtensorflowのバージョンを1.5まで下げた。

# 補足
windows上でpython動かす場合に比べて、uwsgiを支えるのは中々大きなメリット。
自動起動とかはちゃんと考えないといけない。

# 結論
サーバはlinuxにしよう。
iOS アプリの Certificate (証明書) を更新後、Bitrise の Code Signing の設定を更新する

# ０．はじめに

Apple より以下の様な案内が届きましたので、 

> Action Needed: iOS Distribution Certificate Expires in 30 Days
> 
> Dear XXXX,
> 
> Your iOS Distribution Certificate will no longer be valid in 30 days. To generate a new certificate, sign in and visit Certificates, Identifiers & Profiles. 
> 
> Certificate: iOS Distribution
> Team ID: XXXXXXXXXX 
> 
> To learn more about expired certificates, visit the certificates support page. 
> 
> Best regards,
> Apple Developer Program Support
> TM and © 2019 Apple Inc. 
> One Apple Park Way, MS 301-1TEV, Cupertino, CA 95014.
> All Rights Reserved / Privacy Policy / Account / Support

iOS アプリの Certificate (証明書) を更新して、

その後、Bitrise の Code Signing の設定も更新します。

# １．CSR ファイル　（CertificateSigningRequest.certSigningRequest）　の作成

* <font color="red"><b>※前回の CSR ファイルがあれば、それを流用しても問題無い様です。</b></font>

1. 以下のページの「証明書を要求するための準備」の手順に従って、CSR ファイルを作成します。
    * [iOS, Certificate 証明書を作ってみる](https://i-app-tec.com/ios/apply-application.html#1)

# 2．iOS Certificate　(証明書)　の作成 ＆ 削除
1. 以下のページの「Certificate の作成」の手順に従って、CSR ファイルを作成します。
    * [iOS, Certificate 証明書を作ってみる](https://i-app-tec.com/ios/apply-application.html#2)
1. 作成された iOS Certificate　(証明書)　を確認します。
    * ![FireShot Capture 394 - iOS Certificates - Ap_ - https___developer.apple.com_account_ios_certificate_.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4d306028-cdf3-a26a-8307-93b0810b0e8f.png)
    * 前回の証明書の有効期限が 2019.02.22 で、今回作成した証明書の有効期限が 2020.02.04 となっていることが確認出来ます。
1. 確認後、前回の証明書を削除します。

# 3．p12 ファイルの書き出し
1. 以下のページの「『.p12』ファイルの書き出し」の手順に従って、作成した新しい証明書から p12 ファイルを書き出します。
    * [Exporting code signing files without codesigndoc \- Bitrise DevCenter](https://devcenter.bitrise.io/code-signing/ios-code-signing/exporting-code-signing-files/)
        * [iOSアプリ開発用証明書（\.cer形式ファイルと、\.p12形式ファイル）の取得 \- モーリーのメモ](http://mmorley.hatenablog.com/entry/2015/09/07/131745#p12%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97)

# 4．プロビジョニングファイル (Provisioning Profile)　の更新
1. 以下のページの手順に従って、プロビジョニングファイルを更新します。
    * [【続スクショ全部入り】iOSプロビジョニングプロファイルの更新 その2 \- Qiita](https://qiita.com/siglab/items/8c09674d33444a04640c)
        * [【スクショ全部入り】iOSプロビジョニングプロファイルの更新 その1 〜証明書更新〜 \- Qiita](https://qiita.com/siglab/items/c3f8560fbafd44ad7633)
1. 更新後、プロビジョニングファイルをダウンロードしておきます。
    * ※次述の Bitrise の設定や Xcode での開発用

# 5．Bitrise の Code Signing の設定の更新

* ![FireShot Capture 410 - Conne-iOS - Bitrise - https___app.bitrise.io_app_ea4a2c89c5bb52f2#_workflow.png](https://qiita-image-store.s3.amazonaws.com/0/161939/dbead6f7-8318-f265-2126-c96f5681b64d.png)

1. 「Code Signing」の設定から、古い PROVISIONING PROFILE を削除した後、新しいプロビジョニングファイルをアップロードします。
1. 「Code Signing」の設定から、古い CODE SIGNING IDENTITY を削除した後、新しい p12 ファイルをアップロードします。

# ９９．ハマりポイント

* あまりハマりはしなかったですが…、
<br><br>
* もうちょっと簡単な作業が無いものかと色々調べてたら、結構時間食っちゃいました…。

# ＸＸ．まとめ

毎年のことなので、手順を残して置かないとと思い、

証明書の更新の手順については、たくさん見つかったんですが、Bitrise の設定の更新も合わせて残して起きたかったので、投稿しました。

ご参考までに♪
SublimeText3でIMESupportを使っているのに日本語入力がまだ変な人向け

SublimeText3(`ST3`)で日本語入力するとき、変換候補ウィンドウが意味不明の場所に出てきてしまうので、`IMESupport`というパッケージで解決しているよ、という人は多いでしょう。

ところがこのパッケージ、**Windows10だとうまく動かない**という説があるようです。

[[teratail] sublimetext3でIMEsupportを入れているが、インラインにならない](https://teratail.com/questions/100952)

そんな馬鹿な！
自分の環境(windows10)ではちゃーんと動いてますぜ！
……と思っていたのですが、なんとそのバグを自分で再現してしまいました(笑)

というわけで、同じような現象で悩んでいる方への朗報(?)

---

ずばり、原因は　**上下の画面分割**　でした！！！！


ST3では、一つの画面を分割して複数のファイルを表示させることができます。この表示領域を`Pane`と呼びますが、Paneを縦に2つ以上並べるとIMESupportの挙動がおかしくなります。横方向にはいくつ増やしても大丈夫そうです。少なくとも5つくらい増やしても問題ありませんでした。それ以上増やすとPaneの幅が27インチ画面でもつらい細さになってくるので、まぁ実用的には問題ないのではないかと。

根本的な解決にはなっていませんが、「は？わからん？？なんでや？あーもうSublimeTextなんてやめてAtomやAtom...(本当は重いからatomは使いたくない)」みたいな迷える人を少しでも救えたら幸いです。ま、とりあえずここに置いておけば誰かの参考になるでしょう、ということで。

直ったとか直らなかったとか、適当にコメントいただければ嬉しいです。
ではでは。
Ionic 4でGestureを実装する方法（Angular）

[Ionic 4](https://ionicframework.jp/docs/)では、First Meaningful Paintの向上を目指しており、デフォルトでできるだけ不要なライブラリは読み込まないようになっています。 `(tap)` や `(press)` 、 `(swipe)` などのジェスチャーイベントを実装することができる `hammer.js` も例外ではなく、もし必要な場合は自分で追加実装することが必要になりました。

追加で実装してみます。

まずはnpmでインストールします。

```bash
npm i hammerjs --save
```

そして、Angularプロジェクト全体で読み込むために、 `src/main.ts` に、一行追加します。

```src/main.ts
+ import 'hammerjs';
```

これで使えるようになるのですが、hammerjsはデフォルトでは設定している要素のイベントを阻害します。例えば「`press`を設定してる要素の上でスワイプがきかなくなる」など、そういうことです。なので、それを可能にするために、Angularでイベントの設定をします。

`src/app/app.module.ts` に以下を追記します。

```src/app/app.module.ts
+ import { BrowserModule, HammerGestureConfig, HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';

+ @Injectable()
+ export class IonicGestureConfig extends HammerGestureConfig {
+   buildHammer(element: HTMLElement) {
+     const mc = new (<any>window).Hammer(element);
+     for (const eventName of Object.keys(this.overrides)) {
+       mc.get(eventName).set(this.overrides[eventName]);
+     }
+     return mc;
+   }
+ }

@NgModule({
.
.
.
  providers: [
+     { provide: HAMMER_GESTURE_CONFIG, useClass: IonicGestureConfig },
  ]
```

これで、v3同様に様々なGestureが使えるようになりました。

それでは、また。
tryと try! と &. （ぼっち演算子）の小さなサンプルメモ



```ruby:test.rb
require 'active_support'
require 'active_support/core_ext'

class Test
  def test
    p "this is test."
  end
end

test = Test.new
p test.try(:test) # => "this is test."
p test.try(:test2) # => nil
#p test.try!(:test2) # => NoMethodError
#p test&.test2 # => NoMethodError
p nil.try(:test) # => nil
p nil.try!(:test2) # => nil
p test&.test #=> "this is test."
p nil&.test2 # => nil
#p nil.test # => private method `test' called for nil:NilClass (NoMethodError)

```

## 参考
Rubyのぼっち演算子はRailsの`Object#try`より高速（翻訳） https://techracho.bpsinc.jp/hachi8833/2018_03_30/52987
[Python]試し割法で素因数分解する

#きっかけ
[前回](https://qiita.com/kageyasai2/items/9e4559abb2e54af45aae)、素数を求めるプログラムを書いている時に、素因数分解を解きたくなったからです。

#動作環境
Windows10 Pro
Python3.6.2

#素因数分解する
試し割り法を用いて素因数分解したいと思います。
[試し割り法 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A9%A6%E3%81%97%E5%89%B2%E3%82%8A%E6%B3%95)
簡単に処理の流れを説明

素因数分解したい数字をNとする
**①2から√Nまでの数字を一つずつ取り出す**
**②Nを取り出した数字(以下numとする)で割り切れなくなるまで割る**
**③割り切れたら素因数リストにnumを追加していく**
**④割り切れなくなったら次の数字を取り出す**

```python:trial_division.py
import math
#試し割法
def trial_division(n):
    #素因数を格納するリスト
    factor = []
    #2から√n以下の数字で割っていく
    tmp = int(math.sqrt(n)) + 1
    for num in range(2,tmp):
        while n % num == 0:
            n //= num
            factor.append(num)
    #リストが空ならそれは素数
    if not factor:
        return 'prime number'
    else:
        factor.append(n)
        return factor

def main():
    number = int(input("素因数分解したい数字を入力してください:"))
    print(trial_division(number))

if __name__ == "__main__":
    main()
```

実行結果

```
PS C:\Python\math> python .\trial_division.py
素因数分解したい数字を入力してください:100
[2, 2, 5, 5, 1]
```

行けてますね

今回はこれで終わりたいと思います。
ありがとうございました。
tensorflow-gpuでのエラー

久しぶりにtensorflow-gpuを使おうとしたらエラーでできなかった時の対処メモ

#参考
[tensorflow-gpuとCUDAのバージョン](https://omedstu.jimdo.com/2018/06/28/tensorflow-gpu%E3%81%A8cuda%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3/)
[TensorFlow > cuDNN v4.0のアンインストール / cuDNN v5.1のインストール](https://qiita.com/7of9/items/b10d92ebe3e1f79f31c2)
[cuDNNのバージョン確認](http://pandazx.hatenablog.com/entry/2017/03/21/144832)
[[NV] How to check CUDA and cuDNN version](https://medium.com/@changrongko/nv-how-to-check-cuda-and-cudnn-version-e05aa21daf6c)


#エラー
↓実行したらこんな感じのエラーが出てきた
`tensorflow/stream_executor/cuda/cuda_dnn.cc:222] Check failed: s.ok()`


#対処
tensorflow-gpu、cuda、cudnnが対応したバージョンではなかったようです
対応させるために対応するバージョンを[こちら](https://www.tensorflow.org/install/source#common_installation_problems)で確認し, 各バージョンを直します

##各バージョンの確認
・tensorflow-gpuのバージョン確認コマンド
`pip list`

```text:実行結果
Package                Version  
---------------------- ---------
bleach                 1.5.0    
enum34                 1.1.6    
h5py                   2.8.0    
...
tensorflow-gpu         1.0.0
```
 
 
・cudaのバージョン確認コマンド
`nvcc -V`

```text:実行結果
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
```


・cudnnのバージョン確認コマンド
`cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2`

```text:実行結果
#define CUDNN_MAJOR      6
#define CUDNN_MINOR      0
#define CUDNN_PATCHLEVEL 21
--
#define CUDNN_VERSION    (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"

```


以上のコマンドから今
>tensorflow-gpu == 1.0.0
>cuda == 8.0
>cudnn == 6

という状態であることがわかります
今回はtensorflowのバージョンを変えたくない場合だったので
[バージョン対応表](https://www.tensorflow.org/install/source#common_installation_problems)より
cudnnのバージョンを6から5.1に変えます

##cudnnのバージョン変更
まず、欲しいバージョンのcudnnをダウンロードしておく
ダウンロードは[こちら](https://developer.nvidia.com/cuda-toolkit-archive)から
※ダウンロードにはNVIDIAのアカウントが必要になります

次にすでに入っているcudnnを削除する
`sudo rm /usr/local/cuda/include/cudnn.h`
`ls /usr/local/cuda/lib64/libcudnn*`

```text:実行結果
(すでに入っているバージョンのlibとか出てくる)
```

`sudo rm /usr/local/cuda/lib64/libcudnn*`

削除完了！


最後に導入したいバージョンのcudnnをインストールする
最初にダウンロードしておいたcudnnがあるディレクトリに移動
`cd ~/ダウンロード`

インストール！
`tar xvzf cudnn-8.0-linux-x64-v5.1.tgz `

```text:実行結果
cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.5
cuda/lib64/libcudnn.so.5.1.3
cuda/lib64/libcudnn_static.a
```
なんかよくわかんないけどやるらしいやつ
`sudo cp cuda/include/cudnn.h /usr/local/cuda/include`
`sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64`
`sudo chmod a+r /usr/local/cuda/lib64/libcudnn*`

確認
`ls -l /usr/local/cuda/lib64/libcudnn*`





以上！！！
はじめてのPHP

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているです。tsuyoshi514です

#echoのについて
**echo**を使うことによって文字列や数値を出力することができます。ただ文末にセミコロンを入力しないと出力されないので注意をしましょう。

#変数について
この**PHPⅠ**ではプログラミング学習にとって重要な**変数**という概念を学びます。変数は最初に＄を入れて定義することができます。変数を使うことでデータに名前を付けることができてわかりやすくなり、複数のデータを入れることができ、修正のときには一か所の修正で済みます。そして変数は値を上書きすることができ、数値を足したり引いたりすることができます。数値の四則演算の際は省略することもできるので、覚えておくと便利です。

#if文について
if文はPHPにおいて重要な要素です。if文を使うことで条件を指定することができ、その条件によってその後の変化を分けることができます。そしてifと一緒に使うのがelseです。このelseはifの条件でfalseだった後の処理を行うことができます。そしてもう一つelseif文というものがあり、こちらを利用すると多分岐を行うことができます。

#switch文を用いた簡略化
if文によってだんだんややこしくなってきたらswitch文を使って簡略化することができます。caseと数値が一致した場合はそのブロックの処理を行うことができ、どれとも一致しなかった場合はdefaultの処理を行うことができます。そしてこの一つ一つのブロックはbreakで区切ります。breakで区切らないとその次のcaseも実行されてしまうので注意が必要です。

#for文、while文について
for文はループの処理を行うことができます。ループの条件を指定し、その条件に合わなくなるまでずっとループさせることが可能です。またwhile文でも同じ処理を行うことができますがただ、while文では変数の値が自動的に変化しないという違いがあります。

#関数について
ここでまた重要な概念である関数が出てきます。PHPには関数が存在していてそれを入力すればその関数の処理を行うことができます。また存在している関数以外にも自分で作ることができ、関数を定義づけ、名前を付けることで呼び出すことができます。

#最後に
このPHPは僕にとっては難しく正直理解が追い付いていません。なるべく復習してこれからも頑張ります！
Centos7でVNCserver構築



##使用環境
CentOS Linux release 7.6.1810 (Core)

＊CentOS 6.xの場合は[こちら](https://qiita.com/mecchi_99/items/a966b0609d4547359719)


##VNCserverパッケージのインストール
Root権限で行う。

```
# yum install tigervnc-server
```

##VNCserverの設定
インストール後、/lib/systemd/system/にあるvncserver@.serviceを/etc/systemd/systemにコピー

```
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
```

コピーした/etc/systemd/system/vncserver@:2.serviceを開いて、ユーザーの設定を行う（使用するユーザー名をhogeとする）。今回はvncserver@:2.serviceなのでポート番号は5902となる。vncserver@:3.serviceの場合は5903。

```
# vi /etc/systemd/system/vncserver@:2.service
```
＜USER＞となっている箇所をhogeにする。

```
[Service]
Type=forking

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l ＜USER＞ -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
```

画面サイズを変えたい場合はExecStartの箇所に-geometry ＜画面サイズ＞を足すことで変更できる。

```
ExecStart=/usr/sbin/runuser -l ＜USER＞ -c "/usr/bin/vncserver %i -geometry 1920x1200"
```

##VNCサーバのパスワード設定
hogeユーザーのVNCログイン用のパスワードを設定する。

```
# su hoge
$ vncpasswd
```
Root権限に戻ったら、systemctlコマンドを用いてVNCサーバーのサービスの有効化を行う。

```
# systemctl daemon-reload
# systemctl enable vncserver@:2
# systemctl restart vncserver@:2
```

##Firewallの設定

以下のコマンドを打ち、successと出れば問題無し（だと思う）。

```
# firewall-cmd --permanent --add-port=<ポート番号>/tcp
success
# firewall-cmd --permanent --zone=public --add-service=vnc-server
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: em1
...(略）
```

##接続確認
VNCviewerなどのVNCクライアントから、ポート番号を指定して、VNCサーバに接続できることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/285156/a1c54b06-8809-7a6e-6bfd-80262668e982.png)

パスワードを求められるので、先ほど設定したパスワードを入力すると、

![vnc.png](https://qiita-image-store.s3.amazonaws.com/0/285156/06731971-000c-c0d2-8cab-ff94594df5ce.png)

無事接続完了。

##エラーの場合　（実際に起きた事例だけ紹介）

①systemctl restart vncserver@:10.serviceとたたいた後に、以下のエラー出た時

Job for vncserver@:10.service failed because a configured resource limit was exceeded. See "systemctl status vncserver@:10.service" and "journalctl -xe" for details.

ひとまず、ps aux | grep <USER>でPIDを確認し、killしたのち、[こちら](https://www.ipentec.com/document/linux-centos-7-vncserver-disabled-startup-tigervncserver)に書かれていることを試したら直りました。
ただ、

```
vncserver -kill:(ディスプレイ番号)
```
これをやったら

```
(EE)
Fatal server error:
(EE) Unrecognized option: -kill:10
(EE)
```
となりできませんでした(笑)

②VNCviwerを立ち上げて接続しても画面が真っ暗なとき

```
# systemctl status vncserver@:10.service
```
これをやるとactive (running)になるのだが、なぜかつながらない・・。~/.vnc以下のログを見てみると、次のエラーが出ていた。

```
(process:10932): dconf-CRITICAL **: 10:32:58.773: unable to create file '/run/user/1000/dconf/user': Permission denied.  dconf will not work properly.

Wed May 22 10:33:00 2019
 ComparingUpdateTracker: 0 pixels in / 0 pixels out
 ComparingUpdateTracker: (1:-nan ratio)
Killing Xvnc process ID 10452
```


[こちら](https://www.ipentec.com/document/linux-error-unable-create-file-run-user-1000-dconf-user)のサイトに書かれているとおりにしたら解決しました。
【メモ】Goで多次元Sliceのappend

# Goで多次元Sliceのappend
1次元slice同士のappendと同じような感じでいける。

## 1次元Slice
### コード

```go
package main

import (
	"fmt"
)

func main() {
	s1 := []int{1, 2, 3, 4}
	s2 := []int{5, 6, 7, 8}

	s1 = append(s1, s2...)

	fmt.Printf("%#v", s1)
}

```

### 実行結果

```
[]int{1, 2, 3, 4, 5, 6, 7, 8}
```

## 2次元Slice

### コード

```go
package main

import (
	"fmt"
)

func main() {
	s1 := [][]int{{1, 1}, {1, 2}, {1, 3}, {1, 4}}
	s2 := [][]int{{2, 1}, {2, 2}, {2, 3}, {2, 4}}

	s1 = append(s1, s2...)

	fmt.Printf("%#v", s1)
}

```

### 実行結果

```
[][]int{[]int{1, 1}, []int{1, 2}, []int{1, 3}, []int{1, 4}, []int{2, 1}, []int{2, 2}, []int{2, 3}, []int{2, 4}}
```
無駄に壮大なじゃんけんアプリをつくった

#はじめに
初心者向けのプログラミングコースで、じゃんけんアプリを作る課題って良くありますよね。
ただし大抵クライアント側のみで実装してるので、結果を改ざんし放題です。
これを野放しにしておくわけにはいかん…！サーバーサイドでしっかり判定せなあかんやろ…！

というのは冗談で、最近Railsのようなバックエンドに全て任すような開発ばかりだったので、今回はAPIを用いたフロントエンドとバックエンドが分離されたアプリケーション開発の練習のため、作ってみました。

#成果物
[無駄に壮大なじゃんけんアプリ](https://janken-api.netlify.com/)
[<img width="757" alt="スクリーンショット 2019-02-05 13.42.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/104983/2239d04b-4bbd-5b0b-fd0a-dd823b3f5fd9.png">](https://janken-api.netlify.com/)


#構成
フロントエンド：React
バックエンド：AWS API Gateway, AWS Lambda(Node.js)

![janken.png](https://qiita-image-store.s3.amazonaws.com/0/104983/f35e6c8d-52ca-1103-eab2-82e40ef1437a.png)

API Gatewayに対して、選んだ手をボディに含めたPOSTリクエストを送信して、そのままLambda functionに流れます。Lambda側では、出す手をランダムに選択した上で、受け取った手と比較して勝敗を判定し、レスポンスを返します。

Reactアプリケーションはnetlifyでホスティングしてます。
GitHubにpushするだけで勝手にやってくれるので、便利すぎますね。

#ソースコード
https://github.com/Sinhalite/janken

#課題
・Reactのコンポーネント分割

#おわりに
「なんだこのしょうもないアプリ」と思ったそこのあなた…。
あなたがじゃんけんで出す手はすでにお見通しですよ…。
（ここで世にも奇妙な物語のBGMが流れる）
ghq get できなかったから get ghq した

# 環境
macOS mojave
ghq 0.8.0

# やろうとしたこと
`ghq get git@github.com:c7t1012/repo.git`
って長いので
`ghq get -p c7t1012/repo`
で簡単にgetしようとした

(`-p` はssh接続を指定するオプション)

# エラー
```
$ ghq get -p c7t1012/repo
     error Not a valid repository: ssh://git@github.com//c7t1012/repo
```
なんか知らんけどユーザ名の前の`/`が1つ多い

# 解決策
[getっていうツール](https://pocke.hatenablog.com/entry/2016/08/22/170516)を入れた

# インストール
### Goを入れる
`brew install go`など

### GOPATHを設定

fishの場合

```shell
set -x GOPATH $HOME/.go
set -x PATH $GOPATH/bin $PATH
```
### go getする
`go get github.com/pocke/get`

# 使い方
`get ghq user/repo`
【Ruby on Rails】Herokuへデプロイできない問題


Rails Tutorialを終え、さあ自作アプリを作るぞ！と意気込んで開発に臨みましたが、早速行き詰りました。

エラー内容
<img width="945" alt="2019-02-05.png" src="https://qiita-image-store.s3.amazonaws.com/0/272921/18cc7fe3-0c28-2c8c-1ec9-be038302584c.png">


とりあえず、書かれている通りheroku logs --tailをしてみるがさっぱり、、、

そういえば、Rails Tutorialで、developとtest環境はsqlite3で、production
はpostgreSqlって言ってたな、と思い、Gemfileを確認してみると、、、

やはり、gem 'pg'がなかった！


```Gemfile
group :production do
  gem 'pg'  
end
```

そしてbundle install !!!

しかし、またエラー、、、
なぜかpgのみインストールできず。

Rails Tutorialを読み返していると、

```
bundle install --without production
```

した後に通常のbundle installしないといけない模様。

なぜかは良くわからなかったが、
この後通常通り、コミットしてプッシュしてHerokuへデプロイしてHeroku run rails db:migrate したらうまくいった！

※あと忘れてはいけないのが、HerokuのアプリケーションのResourceにpostgresのAddonを追加すること！私はこれでさらに躓きました。
送信サイドからみたDMARC 

DMARCとは、なりすましメール対策として送信ドメインを認証する仕組みの1つです。2016年10月、米国のDHS(米国国土安全保障省)が政府機関からのメールを受け取る人および政府のWebサイトを訪れる人向けにセキュリティを強化すると発表し、具体的なプロトコルとして、なりすましメールの送信を防ぐDMARC、Webトラフィックを暗号化するHTTPSを義務付けた後、急速に普及されています。

昨年東京で開催された [JPAAWG 1st General Meeting](https://meetings.jpaawg.org) では、弊社チーフエンジニア平野善隆が「送信サイドからみたDMARC」というタイトルでセッション発表を行いました。その資料をこちらにも共有します。主な内容はDMARCをリスク最小限で導入するための設定、導入結果、注意点などです。

[![thumbnail](https://speakerd.s3.amazonaws.com/presentations/f9a404efec5a4b578a0fd0fc34da7e64/slide_0.jpg?11211314)](https://speakerdeck.com/hirachan/song-xin-ce-karajian-tadmarc)

DMARCについて詳しいことが知りたい方はコメントでご質問ください。回答コメントや別の記事でフィードバックします。
gremlin-consoleを入れたDockerイメージからNeptuneに接続する


昨年あたりから、はじめてグラフDBであるNeo4jを触った身としては、Neo4jのCypherQLは書きやすかった反面、gremlinは非常にとっつきにくいです（個人的に）

[リファレンス](http://tinkerpop.apache.org/docs/current/reference/)もありますが、どのような関数を使えば、どのように動くかは実際試してみるしかないと思っています。

ですので、今回Private SubnetにあるNeptuneに`gremlin-console`をいれたコンテナ内から接続したみたいと思います。

基本的な接続周りの設定は、過去に記事化した[Docker内からPrivateサブネットに配置したNeptuneに接続する](https://qiita.com/RyujiKawazoe/items/abc52fd11c49b0ae897d)とほぼ同じです。

大きく違う点は、設定ファイルの用意です。

用意するもの
---

* docker
* docker-compose
* SFSRootCAG2.pemファイル
	* https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/access-graph-gremlin-console.html

Dockerfileの用意
---

下記のようなDockerfileを用意します。

```
FROM openjdk:8-jre-stretch

RUN apt-get update -y && apt-get -y upgrade

RUN wget https://archive.apache.org/dist/tinkerpop/3.3.2/apache-tinkerpop-gremlin-console-3.3.2-bin.zip
RUN unzip apache-tinkerpop-gremlin-console-3.3.2-bin.zip

RUN apt-get install -y net-tools
RUN apt-get install -y openssh-server
RUN apt-get install autossh

RUN mkdir /root/.ssh

```


docker-compose.ymlの設定
---

足りないところは補完してください

```
  gremlin-console:
    build: さっきのDockerfileがあるところ
    volumes:
      - gremlin-consoleの設定ファイルがあるところ:/myconf
      - ~/.ssh:/root/.sshdummy
    extra_hosts:
      - "あなたのNeptuneクラスターエンドポイント:127.0.0.1"
    command: >
      /bin/bash -c "cp /root/.sshdummy/config /root/.ssh/ && 
      cp /root/.sshdummy/踏み台の鍵ファイル.pem /root/.ssh/ && 
      chmod 600 /root/.ssh/踏み台の鍵ファイル.pem &&
      autossh neptune -f -N &&
      /apache-tinkerpop-gremlin-console-3.3.2/bin/gremlin.sh"
     
```

接続周りの設定はほぼ同じです。→[Docker内からPrivateサブネットに配置したNeptuneに接続する](https://qiita.com/RyujiKawazoe/items/abc52fd11c49b0ae897d)

特筆すべきは `gremlin-consoleの設定ファイルがあるところ` の部分です。

今回用意するものは、

* neptune-remote.yml
* SFSRootCAG2.pem

この２つは、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/access-graph-gremlin-console.html)にもあるのでご一読ください。

実際に`neptune-remote.yml`今回の設定内容ですが、以下となります。

```
hosts: [あなたのNeptuneのクラスターエンドポイント]
port: 8182
connectionPool: { enableSsl: true, trustCertChainFile: "/myconf/SFSRootCAG2.pem"}
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
```


実際に起動してみる
---

以下をうつと

```
docker-compose run gremlin-console
```

![スクリーンショット 2019-02-05 13.29.00.png](https://qiita-image-store.s3.amazonaws.com/0/18331/d5960ece-2f84-65d1-8c13-f962c942727c.png "スクリーンショット 2019-02-05 13.29.00.png")

起動しました。

Neptuneと接続してみましょう。

```
:remote connect tinkerpop.server /myconf/neptune-remote.yaml

==>Configured あなたのクラスターエンドポイント/127.0.0.1:8182
```

```
:remote console

==>All scripts will now be sent to Gremlin Server - [あなたのクラスターエンドポイント/127.0.0.1:8182] - type ':remote console' to return to local mode
```

下記のコマンドで失敗するようであれば、接続に失敗しています。

```
g


==>neptunegraphtraversalsource[neptunegraph[org.apache.commons.configuration.PropertiesConfiguration@42a809b7], standard]
```


試しに頂点数のチェック

```
gremlin> g.V().count()
==>168721
```

オッケーですね。
RDSでmax_allowed_packetの値を変更する

大きなサイズのSQLを実行しようとしたとき

```
MySQL server has gone away
```

となってしまうことがありますが

この場合、`max_allowed_packet` の値を確認すると解決する場合があります。

```
mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
```

で現在の設定が確認できます。
私の環境では4MBになっていました。

例えばMySQL5.6であれば設定できる最大値は1GBですので、状況に応じて適切に設定してあげるとクエリが通せるようになると思います。

なおRDSの場合は、マネジメントコンソールからパラメータグループ内の設定を変更することになります。

タイプがDynamicになっていれば、インスタンスの再起動は不要です。

### 参考

[https://dev.mysql.com/doc/refman/5.6/ja/packet-too-large.html:embed:cite]
Spring Boot 1.5 から 2.1 に移行した時にハマったこと

SpringBoot 1.5 のサポートが2019年8月1日に終了するので移行しようとしたらすごくハマったので共有したい。

# Lombokでコンパイルができない
Lombbokが生成してくれるはずのメソッドやプロパティが見つからない場合はこれ。

* getter/setterがない
* `@AllArgsConstructor`つけてる場合はコンストラクタがない
* `@Slf4j`つけてる場合は`log`がない
* ...etc

##### 対策
gradleの5.x系ではLombokのコンパイルができない。
4.x系にダウングレードする。

```gradle-wrapper.properties
# distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-rc-1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
```

# Mainファイルが無いよって怒られる
```
Main class name has not been configured and it could not be resolved
```

マルチモジュールプロジェクトだとよく発生するかも。
`build.gradle`に`apply plugin: 'org.springframework.boot'`を書いてると発生。

##### 対策
実行可能jarにしたいモジュールの`build.gradle`にだけ書いてあげる。

**実行可能にしなくてよいmodule**

```build.gradle
// apply plugin: 'org.springframework.boot'
```

**実行可能jarのmodule**

```build.gradle
apply plugin: 'org.springframework.boot'

// なくなりました
//springBoot {
//	executable = true
//}

// 代わりにこっち
bootJar {
	launchScript()
}
```

# 起動時にLogbackの設定でエラー
```
ERROR in ch.qos.logback.core.joran.action.AppenderAction - Could not create an Appender of type [org.springframework.boot.logging.logback.LevelRemappingAppender]. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.springframework.boot.logging.logback.LevelRemappingAppender
```

`LevelRemappingAppender`がなくなったらしい。
ログのノイズを抑えるために、`ERROR`レベルから`WARN`に変えたりするアダプターのようです。

##### 対策
`LevelRemappingAppender`で検索してアダプター設定を削除する。
代替アダプターを探したが見つけられなかった。
ログのノイズ抑えるものであって、アプリケーションの動きに変わりはないので削除しても問題ないはず。

```logback.xml
<!--<appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">-->
	<!--<destinationLogger>org.springframework.boot</destinationLogger>-->
<!--</appender>-->
```

# Sessionにhash_mapを指定してエラー
ローカル開発環境やテスト時に使用していた`hash_map`がなくなりました。

##### 対策
`storetype=none`にして`@ConcurrentHashMap`のBeanを生成する

```SpringHttpSessionConfig.java
@EnableSpringHttpSession
@Configuration
public class SpringHttpSessionConfig {
  @Bean
  public MapSessionRepository sessionRepository() {
    return new MapSessionRepository(new ConcurrentHashMap<>());
  }
}
```

ただし、本番環境ではRedisを使っていて切り替える必要がある場合は上記のコードでは上手くいかなかった。
Dockerで簡単にRedis立ち上げられるので、最初からhash_map使わずに、Redisで開発するのが良いと思う。

# Thymeleafの属性指定でエラー
Thymeleaf2→3になった影響で書き方が変わった。

**before**

```html
<a href="#" th:onclick="'changeLocation(\'' + ${id} + '\');'" />
```

**after**

```html
<a href="#" th:attr="onclick='changeLocation(' + ${id} + ');'" />
```

# さいごに
上記以外にも色々ハマってます。(現在進行系)
順次追記していこうと思います。
仮想環境(Ubuntu)とホストOS(Windows)の共有フォルダ作成

##ホストOS

```
cd %userprofile%\vagrant\Ubuntu64_16
mkdir workspace
```
下記ファイルを編集
```
%userprofile%\vagrant\Ubuntu64_16\vagrantfile
```

```ruby
config.vm.synced_folder "./workspace","/home/vagrant/workspace"
config.vm.provider :virtualbox do |vb|
  vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//home/vagrant/workspace","1"]
end
```

###ついでにメモリ使用量も設定

```ruby
config.vm.provider :virtualbox do |vb|
  vb.memory = "1024"
end
```

###設定を反映させるためにVagrantを再起動
```
fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
vagrant reload --provision
```
【Egret無料ご相談室】テキストが中央揃えにならんのだけど

# ご質問

> いまいちテキストの中央揃えが反応してくれないかもです。
 
## 再現結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/35ff04ba-2fd2-9ba0-370e-d8aac040040d.png)


## 再現するコード
```ts
            const label:egret.TextField = new egret.TextField();
            this.addChild( label );
            label.text = "なんでやねん";
            label.textColor = 0x000000;
            label.textAlign = egret.HorizontalAlign.CENTER;
            label.verticalAlign = egret.VerticalAlign.MIDDLE;
            label.x = 0;
            label.y = 100;
```

# 回答

画面(Stage)全体に対してセンタリングしたいなら次のコードで

```ts
        {
            const label:egret.TextField = new egret.TextField();
            this.addChild( label );
            label.text = "うごくねん";
            label.textColor = 0x000000;
            label.textAlign = egret.HorizontalAlign.CENTER;
            label.verticalAlign = egret.VerticalAlign.MIDDLE;
            label.x = 0;
            label.width = this.stage.stageWidth;
            label.y = 0;
            label.height = this.stage.stageHeight;
        }
```

## こんな感じに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/482c8a12-d331-b3ad-143c-7a44c1fc4a19.png)

## 解説
`textAlign`や`verticalAlign `は、`egret.TextField`自体の領域の中で、`text`をどこに整列させるか決めるプロパティです。デフォルトの状態では、`egret.TextField`の領域は`text`にフィットしているので、`x`と`y`プロパティで指定した位置に表示されます。

だから、`egret.TextField`の領域を画面全体まで広げるように、領域の左上を画面の左上にして、高さと幅を画面いっぱいに広げれば、意図した動作になります。

# 別解

個人的には下記のように位置を自分で指定してあげるのがいいかと思います

```ts
        {
            const label:egret.TextField = new egret.TextField();
            this.addChild( label );
            label.text = "こっちがよくね？";
            label.textColor = 0xff0000;
            label.x = (this.stage.stageWidth-label.width) / 2;
            label.y = (this.stage.stageHeight - label.height) / 2;
        }
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/04d60235-0ae1-ff5b-1240-ea068b2f941e.png)
学びの記録　〜Progate PHP I 〜　

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回学んだ重要なポイントで他の言語とは違ってくるポイントをまとめておきたいと思います。

#PHPの書き方
PHPはHTMLに埋め込んで使います。<?php ?>の中に命令を書きます。

```index.php
<html>
<head></head>
<body>
 <?php 命令(echo~) ?>
</body>
</html>
```

#連想配列
これは「キー」と「値」を使った配列です。普通の配列との違いは配列ならばインデックス番号を使って値を保持しますが、連想配列は「キー」をと呼ばれる文字列などの値をインデックスとして使用します。

```index.php
$user = array (
 'name' => 'わんこ',
 'age' => '14',
 'gender' => 'male'
);
```

#foreach文
これは配列や連想配列を先頭のデータから順に取り出すループです。
![スクリーンショット 2019-02-05 12.14.47.png](https://qiita-image-store.s3.amazonaws.com/0/351843/18367ddc-35f8-d1e6-a91e-14a0bcddd8e6.png)

#セレクトボックスの値の渡し方
selectタグに名前を指定することで値を渡すことができます。
受け取り方は「$_POST」でname属性を指定するとvalue値を取得できます。
![スクリーンショット 2019-02-05 13.05.57.png](https://qiita-image-store.s3.amazonaws.com/0/351843/c53131f0-9959-a353-4aed-55e75cef8610.png)
XcodeからiTunes ConnectへのUploadで失敗した内容 2019

XcodeからiTunes ConnectへアプリをUploadした際に、Xcode上では**「Uploaded」**というステータスになっていたので、iTunes　Connectで反映されるのを待っていたけど、1時間経ってもアップロードされた気配がなかった。
アカウントのメールを確認したところ、以下のメッセージが届いていた。

> Please correct the following issues, then upload again.
Missing Purpose String in Info.plist File - Your app's code references one or more APIs that access sensitive user data. The app's Info.plist file should contain a NSPhotoLibraryUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data. Starting Spring 2019, all apps submitted to the App Store that access user data will be required to include a purpose string.If you're using external libraries or SDKs, they may reference APIs that require a purpose string. While your app might not use these APIs, a purpose string is still required. You can contact the developer of the library or SDK and request they release a version of their code that doesn't contain the APIs.

内容としてはだいたいこんな感じ。

```text
あなたのアプリはユーザーデータにアクセスするAPIを1つ以上参照しています。
2019年の春以降、アップルストアへ提出された全てのアプリケーションは、ユーザーデータにアクセスする場合は
Info.plistにて使用目的をはっきりと、なぜ必要かを明記する必要があります。
これは、外部のライブラリやSDKがユーザーデータにアクセスする場合も同様で、アプリ内でユーザーデータを
使用されない場合でも、記載する必要があります。
```

カメラは使っているけど、PhotoLibraryにはアクセスするアプリではない。
ライブラリは以下を使用していた。

```shell:pods_file
 pod 'SwiftRichString', :git => 'http://gitlab.gocco.co.jp/common/cocoapods/thirdparty/SwiftRichString'
  pod 'TinyConstraints', :git => 'http://gitlab.gocco.co.jp/common/cocoapods/thirdparty/TinyConstraints'
  pod 'Firebase/Core'
  pod 'Firebase/Database'
```

このライブラリのどこかでPhotoLibraryを扱うコードがあるのかどうか、ソース内を検索してみただけでは分からず。。。とりあえずplistに`NSPhotoLibraryUsageDescription`を追加して再度アップロードしてみたら、無事にiTunes Connectまでアップロードされた。

こういう症状は結構あるようだが、実際にアップロードして見るまでは分からない。。。
Go Windows10に環境構築する

環境構築なんて、初期しかしないから、再び設定の時には忘れてるから、メモしておく

##microsoft Windows版を任意のフォルダに下記からインストール
https://golang.org/dl/

動作確認

```
$ go version
go version go1.10 windows/amd6
```

##go専用作業スペース作成
goフォルダを作業スペースとして作成

```
C:\Users\jeenoishis\projectspace\go
```

上記で作成したgoフォルダ配下に下記３点のフォルダを作成
bin
pkg
src
※goのプロジェクトは、全てsrc内に設置するGOPATHの都合上ここで一括管理する（複数可能）


##システム環境変数を設定する
ここらへんを参考に追加する
http://www.wannko.net/windows10/etc/kankyo.html

変数名　　GOPATH
値　C:\Users\oishis\projectspace\go


##make コマンドを使えるように設定する
Complete package, except sources を下記から取得
http://gnuwin32.sourceforge.net/packages/make.htm


環境変数 path に下記を追加
環境変数　　PATH
値　　インストール先フォルダ\bin





##githubからプロジェクトをcloneする
 ~/projectspace/go/src

```
$ git clone https://github.com/xxxxx/goproject.git goproject
```

##GOPATHの確認
~/projectspace/go/src/goproject
にて確認する

```
$ echo $GOPATH
```
C:\Users\jeenoishis\projectspace\go

##bash_profileファイル作成
~/projectspace/go/src/goproject
にて、ファイル作成

```
$ vim ~/.bash_profile
```
下記をコピペして保存

```
export PATH=$PATH:$GOPATH/bin
```
##make allしてみる
~/projectspace/go/src/goproject
にて、

```
$ make all
```
make all したのちに、なんらかのエラーが表示されたら、それに従い修正を行えばほぼほぼいける。
新人エンジニアが先輩に質問・相談する時の伝え方

# TL;DL
未経験からIT業界に入った際、先輩方から質問・相談の聞き方が悪いと、しこたま怒られたので、自分のような新卒を生み出さないために、今まで教えてもらった伝わる聞き方を記します。

# 全体
以下の順序で話すと伝わりやすいです。

1. 質問・相談の概要
2. やりたいこと（目的）
3. やったこと（対応）
4. 結果どうなったか
5. 何が問題か
6. 他の解決策（自分で把握していたら）
7. 解決策のメリット・デメリット

いくつか例として会話形式も載せています。
**※会話の内容は超適当なのでご容赦くださいm(__)m**

# 1.質問・相談の概要
**悪い例**
新人( ´・ω・\`)「すみません、このコードの○○の部分の◇◇◇がｄ」
先輩(# ﾟ Дﾟ)「まず何の話か言えやあぁぁぁぁぁ！」
新人( ´；ω；｀)「すみません……」

---

兎にも角にもまず何についての話なのかを相手に伝えましょう。
これがないと何について話しているのか相手は分かりません。

更に相手が質問に答えられるかどうかを聞くとベストです。
概要を話した後だと、相手は答えるのにどれくらい時間がかかるかある程度分かることもありますので。


# 2.やりたいこと（目的）
**悪い例**
新人( ´・ω・\`)「この○○の部分の実装なんですが、ここがうまくいかなくて……」
先輩( ﾟ Дﾟ)「ほんならxxxっていう関数を使って、ここをこうしてこうしたら動くで」
新人(｀・ω・´)「ありがとうございます！」

～レビュー時～

先輩( ﾟ Дﾟ)「ん？ここ新人君がこの前聞いたところやな。何でこんな実装してるんや？」
新人(｀・ω・´)「あ、そこは○○という機能が必要だったので、その処理を書きました！」
先輩(＃ﾟ Дﾟ)「アホンダラァァァァァァァ！その機能でこの実装やと□□□や■■■の時にバグるやろがい！もっといいやり方があるわ修正せんかいボケェ！」
新人( ´；ω；｀)「す、すみません……」

---
先輩は実装時の細かなフローしか聞かれなかったため、ただフローを動かす方法を答えただけなので、↑のようなことが起きてしまいました。~~（「いやそこは先輩が何の機能なのか聞けよ」という話は無しでお願いします）~~
自分がやりたいことは、かならず伝えましょう。
自分がやりたいことを伝えることで、その後話す「やったこと」が間違っていたり、もっといい方法を教えてもらえるかもしれません。

# 3.やったこと（対応）
**悪い例**
新人( ´・ω・\`)「すみません、○○の件で■■の機能を作りたいんですが、エラーを吐いちゃってて」
先輩( ﾟ Дﾟ)「おう、それで？」
新人( ´・ω・\`)「え？いや、エラー内容がよく分からないから相談しｔ」
先輩(＃ﾟ Дﾟ)「お前の目の前の機械は飾りか調べろボケェェェェェェェェェェェェ！」

---

おそらく先輩が期待したのは「○○というエラーを吐いているけど、■■や△△△等を試してもだめだった」とか、最悪「○○というエラーを吐いているけど、ググっても怪しい部分がよく分からない」とか調べたこと前提の質問だったのに、ろくに調べもせず聞いてきたからキレたんですね。
上記の例でいうと、エラー文はググれば和訳があります。場合によっては解決策まで書いている人もいます。
特にエンジニアは調べたら分かるものを聞かれる事をとにかく嫌いますので、問題に直面したらまずは自分で調べる癖をつけましょう。
先輩によっては、ググり方等効率の良い調べ方まで教えてくれます。

# 5. 何が問題か
**悪い例なし（ここを端折る人はいないと思うので）**

はい、ここが肝ですね。
新卒や未経験プログラマは、とにかくこの部分を一番最初に話してしまうため、うまく伝わりません。
1~5を伝えてから、何が問題かを伝えましょう。

# 6.他の解決策（自分で把握していたら）
これは自分が解決策を思いついてはいるけど、本当にこの方法で良いのか不安な時に聞くといいでしょう。

# 7.解決策のメリット・デメリット
これは6あってのものです。
メリット・デメリットを伝えるということは、自分が思いついた方法でどんなことが起こるのかちゃんと把握しているという証左です。
6,7含めて伝えられるようになると、相手からの評価も上がると思います。

# 最後に
上記手順でのフローを見てみましょう。

新人( ´・ω・\`)「すみません、■■のプロジェクトのissue#50についてちょっと分からないことがありまして……質問大丈夫でしょうか？」(1)
先輩( ﾟ Дﾟ)「おうええで、今は大丈夫や」ｼﾝｼﾞﾝﾉｾｷｸﾙｰ
新人( ´・ω・\`)「ありがとうございます。このissueを対応するにあたって、○○の機能を実装したくて、xx1のモデルにメソッドを作ったんですが」(2)(3)
新人( ´・ω・\`)「このメソッドの30行目の部分でエラーを吐いちゃうんですよ」
新人( ´・ω・\`)「エラーの内容は調べたんですが、これを解決すると別の部分でエラー吐いちゃって……」(4)(5)
新人( ´・ω・\`)「これも調べてみると、モデルじゃなくてコントローラーにメソッドの中身を置くことで解決しそうなんですが、コントローラーが汚くなっちゃうんですよね……」(6)(7)
先輩( ﾟ Дﾟ)「そうやな、この場合はコントローラーに書くんやなくて、xx2のモデルに書くとええで。そんでxx1のモデルからうんたらかんたら」
新人(｀・ω・´)「あ、なるほどそうすれば良かったのか！」
先輩( ﾟ Дﾟ)「ちゃんと調べられてエライやないか。この調子で頑張りや！」
新人(｀・ω・´)「ありがとうございます！」


こうして新人君は怒られることなく問題を解決できました。
めでたしめでたし。

# 参考
もっとわかりやすく書いている人がいた

[IT業界でありがちな説明下手について](https://www.bunkei-programmer.net/entry/2015/10/24/222929)
オブジェクト指向の正しい基礎

#オブジェクト指向の要素

- オブジェクト
- 手続き関数
- 手続き処理開始関数(main関数、イベント)

#オブジェクト

- データ
- データに対しての処理

を一つの塊として定義したもの。(いわゆる『カプセル化』である。)
故に、『オブジェクト=カプセル化』であり、『オブジェクト指向＝カプセル化指向』と言ってもいい。
(オブジェクトなんて造語を作らず最初から『カプセル化指向』って言って欲しかった。)

上記から分かる通り、オブジェクト指向でオブジェクトは**『データと処理は１セット』**だ。
したがってオブジェクトとして作られたクラスは

- 必ずデータと処理が存在
- 処理はクラス内のデータに対して何かする形になる

という性質を持つ。

#手続き関数

オブジェクトと別の手続き関数を一定の手順に従って呼び出す関数。
なお、再帰などをする場合は自分自身を呼び出すこともある。

例：顧客情報画面で入力したデータを登録する。(『』：オブジェクト、【】：手続き関数)
１．『画面デザイン』から『顧客情報』を受け取る
２．【顧客情報の登録前チェック処理】に『顧客情報』を渡す。(異常なら終了)
３・『顧客情報』を【DB登録処理】へ渡す
４．【DB登録処理】から『DB登録結果』を受け取る
５．【登録結果メッセージ表示処理】に『DB登録結果』を渡す

手続き関数は

- クラス内にデータを持たない。
- オブジェクトではないので継承できない。(してはならない)

という性質を持つ。

上記の定義を見るとわかるが、手続き関数はクラス内にデータを持たない。
つまり手続き関数は**オブジェクトではない。**

オブジェクトではないから、『継承』とか『カプセル化』のような概念はない。(そもそも継承、カプセル化できるものがない。)
そのため、手続き関数を継承してはならない。

#手続き関数の開始関数(main関数、イベント)

処理を開始する起点となる関数。main処理、イベントなど
この関数は起点だけの為、手続き処理を１つ呼び出すだけの動作と例外処理のような呼び出し元で書く必要がある処理のみを記載するようにする。

#俺の知ってるオブジェクト指向の要素と違うんだけど？

多分これの事かな？

- カプセル化
- インタフェース(ポリモーフィズム、多態性)
- 継承

上記は、『オブジェクト』の３大要素だ。そのため、

- オブジェクト
- 手続き関数
- 手続き関数の開始関数

のうち、『オブジェクト』のみに該当する内容だ。
逆に言えば、手続き関数、手続き関数の開始関数に対しては該当しない。

#オブジェクト指向のコードと『共通化』『再利用性』『保守性』の関係
まず、
**「オブジェクト指向で書かれたコードは、『共通化』『再利用性』『保守性』が高いコードになる。」**
これは間違っていない。

しかし、この現象は『コードがオブジェクト指向で書かれている』ことが重要なんだ。
『コードがオブジェクト指向で書かれている』から**結果的に**『共通化』『再利用性』『保守性』を生み出している。
だから考えるべきは『オブジェクト指向のコード』であって『共通化』『再利用性』『保守性』の高いコードではないんだ。

だけど現場では上から下まで「『共通化』『再利用性』『保守性』の高いコードを書くべきだ！」と主張する。
そして皆がその声に従い、『共通化』『再利用性』『保守性』を考えてコードを書こうとしてしまう。
だけど『オブジェクト指向のコード』に対し『共通化』『再利用性』『保守性』の観点で書いたコードを入れれば、そのコードはオブジェクト指向ではなくなり、結果的に『共通化』『再利用性』『保守性』が失われてしまう。


例えば、下記のようなコードのことだ。

- 神フォームクラス

『共通化』したいコードをまとめまくり、巨大化したフォームクラス。
その下には小神フォームクラス、小々神フォームクラスと続き、人間がいかに矮小か思い知らされる。(そして神の考えは理解できない。)
え！？画面表示しないコンソールアプリケーションでも神フォームクラスが要るんですか！？流石神パネェっす！

- 巨大なユーティリティライブラリ

複数プロジェクトで『再利用』して使用したいコードをまとめた結果、どこに何があるのか分からないライブラリ。
ライブラリ内には同じ、または似ているが違う処理が複数存在し、更にプロジェクトメンバー全員が違う使い方をしている。
「みんなちがってみんないい」かな？ただし使わないという選択は怒られる模様。
　

オブジェクト指向を採用した場合、『コードがオブジェクト指向で書かれている』事だけを重要視しなければならない。
そうではないコードを書くなら必ず理由が必要であり、理由が説明できないなら間違っているということだ。