OmniAICreator/Qiita-1.07M huggingface dataset:
macportsでiPythonをインストール

~~現実逃避に~~ボスに紹介してもらって、jupterでパッとInteractiveに操作して画が描けるの面白そうだなと思って、こつこつと触ってみることにした。

##参考URL
Jupyter Notebook（IPython）のインストールと始め方 - TASK NOTES http://www.task-notes.com/entry/20151129/1448794509
Macでpythonを使えるように｜KEI｜note https://note.mu/kei12/n/n1ff13bbbfbd4

##はじめに
そもそも、Jupyterに似たようなもの（という認識を僕はしていた）IPython （もしくはIPython Notebook）は何が違うのかというと、結論から言うと同じものらしい。
本来はPythonだけだったのだが、多言語に対応するようになり、Jupyterと呼ばれるようになったそうだ。
なので、Pythonを使う分には、JupyterもIpython Notebookも同じものという認識で間違いない（はず）

##手順
###1.macportsでpy-jupyterをインストールする。

```:terminal
$ sudo port install py-jupyter
（中略）
--->  Some of the ports you installed have notes:
  py27-ipython has the following notes:
    Please note that since version 4.0 IPython was refactored and splitted across several packages under new project named Jupyter.
    
    To make this the default IPython or IPython2 (i.e., the version run by the 'ipython' or 'ipython2' commands), run one or both of:
    
        sudo port select --set ipython py27-ipython
        sudo port select --set ipython2 py27-ipython
  py27-pygments has the following notes:
    To make the Python 2.7 version of Pygments the one that is run when you execute the commands without a version suffix, e.g. 'pygmentize', run:
    
    port select --set pygments py27-pygments

```
とこんなコメントが出てくる。（python2.7の場合）

###2.コメント通りデフォルトの設定をする。

```:terminal
$ sudo port select --set ipython py27-ipython
Password:
Selecting 'py27-ipython' for 'ipython' succeeded. 'py27-ipython' is now active.
$ sudo port select --set ipython2 py27-ipython
Selecting 'py27-ipython' for 'ipython2' succeeded. 'py27-ipython' is now active.
$ sudo  port select --set pygments py27-pygments
Selecting 'py27-pygments' for 'pygments' succeeded. 'py27-pygments' is now active.
```

###3.Ipython notebookを動かす

```:terminal
$ ipython notebook
[TerminalIPythonApp] WARNING | Subcommand `ipython notebook` is deprecated and will be removed in future versions.
[TerminalIPythonApp] WARNING | You likely want to use `jupyter notebook` in the future
(後略)
```
動いた。
jupyterに近い将来置き換わるってちゃんとコメントが。
プログラミング初心者のHTML&&CSS備忘録

#はじめに
この記事はHTML&&CSSに初めて触れたプログラミング初心者の記事です。
復習を兼ねてテキトーにつらつら書いていきます。
#メモ

・リンクの挿入
```
<a href="リンクURL">テキスト</a>
```
・画像の挿入
```
<img src="画像ファイル名.拡張子">
```
・改行
brタグ

・リスト
ulタグ

・連番
olタグ

・表の書き方
tableタグ
tr：行
th：セルの見出し
td：セル

〇例
```
<table>
　<tr>
  　<th>食べ物</th><th>種類</th>
  　 </tr>
 　 <tr>
   　 <td>イチゴ</td><td>果物</td>
 　 </tr>
 　 <tr>
  　  <td>ラーメン</td><td>麺類</td>
　</tr>
</table>
```でこうなる↓
<table>
　<tr>
    <th>食べ物</th><th>種類</th>
  </tr>
  <tr>
    <td>イチゴ</td><td>果物</td>
  </tr>
  <tr>
    <td>ラーメン</td><td>麺類</td>
  </tr>

</table>
（関係ないけどこの謎の空白が空いてしまうのはなんなんだろう・・・）
<br>
・ボックス構造
<img src="https://s3-ap-northeast-1.amazonaws.com/mash-jp/staging/uploads/3401/e81de1a5939d1f8df32f06d1e5357fff601096b4.3457.original.png?1488165207"width=50%>
1.border：枠線を指定できる
2.margin:ボックス外側の余白を指定できる
3.padding:ボックス内側の余白を指定できる
※それぞれ上下左右の幅を指定できる

###ここまでが復習###

#HTML&&CSSでサイトを実際に作る
**・まずサイト設計をする**
これを行わないと後でコードがぐちゃぐちゃになる
1.作る目的を明確に
2.具体的な内容を考え
3.デザインに落とし込む

・意識すること
1.誰が見ても分かるように
2.区切りを意識する
3.綺麗に見やすくする
　　→デバッグがしやすくなる
4.無駄なく（なぜそのコードを書いたのか）
Android ThingsのPeripheralManagerServiceは存在しなく、PeripheralManagerが正しい?

# Android ThingsでPeripheralManagerServiceが使えない？

Android Thingsが正式に公開されてから、若干しようが変わった部分があります。

今でも？、Android StudioでAndroid Thingsのプロジェクトを作成した時、デフォルトのMainActivityには、GPIO制御のためのスニペット例として書いてあります。

```
PeripheralManagerService service = new PeripheralManagerService();
mLedGpio = service.openGpio("BCM6");
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
mLedGpio.setValue(true);
 ```

的な感じのコードです。
しかし、実際にコードを書いてみると以下のようなエラーが出てしまいます。

<img width="602" alt="peripheralmanager-error.png" src="https://qiita-image-store.s3.amazonaws.com/0/143395/47518c90-6217-6d17-53a7-98b29fc50689.png">

importができない！！！
という状態になっています。
これを調べてみると、PeripheralManagerServiceはPreview7でPeripheralManagerに置き換わっていたようです。

なので、Android Studioでプロジェクトを生成した時に書いてあるスニペットのコードはアップデートされていないみたいです。

正しくは、

```
PeripheralManager manager = PeripheralManager.getInstance();
mLedGpio = manager.openGpio("BCM6");
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
mLedGpio.setValue(true);
```

というように置き換える必要があります。
Rails application templateを使う

Railsの公式でサポートされているアプリケーションテンプレートの機能を使って、Railsの初期化をします。

1. Macの方
2. Windowsの方


## 1.Macの方
```terminal
$ cd # アプリケーションを作りたいディレクトリ
$ rails new @app_name -m https://raw.githubusercontent.com/ttexan1/rails_template/master/template.rb
```
@app_nameを自分のアプリケーションの名前に変更してください


## 2.Windowsの方

```terminal
$ git clone https://github.com/ttexan1/rails_template.git
$ atom .
```

```template.rb
def get_remote(src, dest = nil)
  dest ||= src
  repo = '/Users/{your_directory}/rails_template/files/' <=ここを正しいパスに編集しなければいけない
  remote_file = repo + src
  remove_file dest
  get(remote_file, dest)
end

# アプリ名の取得
@app_name = app_name

# 以下略
```

```terminal
$ cd # アプリケーションを作りたいディレクトリ
$ rails new @app_name -m ~/{your_directory}/rails_template/template_windows.rb
```
Tubidy

Tubidy mobile started to be used as a music download service, many people started to prefer this service because of their ease of use. Tubidy continued to offer options to people by improving himself. He pointed out that he added video, downloading songs from video giant sites like YouTube. The most advanced option in this feature is that you can record in mp3 format by separating the audio and video in the videoları so you can record only the voices of your favorite smart devices in MP3 format by cutting the videos you want to listen. https://tubidy3.life & https://tubidy3.life/tubidy-mobi/ Another good news is that the system evolves to provide you with photo and game options, so you can easily download your phone by finding many photos in the system. There are over 10 thousand games in this area.
満足度が高い等身大ドール

<p>レベルが高いシミュレーションの人体肌は手触りがきめ細かくて、滑らかです。
<strong><a href="https://www.he-with-she.com/">ラブドール</a></strong>は毎日何回でも原寸大の美しいオンナ人形を裸に剥いて抱く。正直、もう、これからの男は、女とつきあったり、結婚とか必要ないでしょう。、リアルオンナを調達してくる必要がある無毒.いいえ、どのようなにおいでも。いいえ、人体へのどのような害でも！</p>
<p>抱きしめたときの女体感の満足度が高いですね。風俗などには行かずラブドールを性の対象にしたことについては「（<a href="https://www.he-with-she.com/125cm-rabu-doll.html">125cm等身大ドール</a>は）家庭を壊そうとはしないし、病気とかも安心。そういうのもあってこっちを選んだ.さらに安価モデルの手や足（着脱式）がバラバラと棚に積まれている。</p>
<p><a href="https://www.he-with-she.com/beauty-165cm-mail-order.html"><img src="https://www.he-with-she.com/images/165/show-pic-03.jpg" alt="ジェシカリアルドール送料無料"/></a></p>
<p>実体リアルドール内蔵する金属骨格は丈夫で長持ちで、形が変えな.ラブドールの写真集なんですが、ラブドールたちがまるで本物の女性のように見えて。すごいなと。本物の女性たちをラブドールに近づけたらどうなるんだろう、という逆の発想が始まりでした。<a href="https://www.he-with-she.com/kawaii-doll.html">カワイイ系ラブドール</a>に似せるため、メイクによって口を小さく、目と眉をたれ気味にみせるんです。</p>
Jetty embedded で recaptchaを実装してみる。

#はじめに
うちのサービス、https://mirm.jp にもreCAPTHCAを実装したいと思い、、、新規サーバー作成時にpostでごりごりアクセスされたら困るんでね。
備忘録なんで、かなり雑です。

#html上での実装
https://www.google.com/recaptcha/admin
まずはrecaptchaのキーをもらうために登録してくださいな。

```html
<head>
 。。。。。。

<script src='https://www.google.com/recaptcha/api.js'></script>

。。。。。。
</head>


フォーム内に混ぜてくださいな。

<div class="g-recaptcha" data-callback="clearcall" data-sitekey="ここにサイトキーをいれる"></div>
<input type="submit" value="作成！">
```

#Java側の実装
```java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;

import org.json.JSONException;
import org.json.JSONObject;

    public class getJsonFromWeb {

        private static String readAll(Reader rd) throws IOException {
            StringBuilder sb = new StringBuilder();
            int cp;
            while ((cp = rd.read()) != -1) {
                sb.append((char) cp);
            }
            return sb.toString();
        }

        public static JSONObject readJsonFromUrl(String url) {
            try (InputStream is = new URL(url).openStream()) {
                BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
                String jsonText = readAll(rd);
                return new JSONObject(jsonText);
            } catch (IOException | JSONException e1) {
                return new JSONObject("{\"success\": false,\"error-codes\": \"jsondecodeerror\"}");
            }

        }
}


クエリを出して。。。
//recapthca
                if (recaptchacode == null) {
                    result = create_recaptchaerror;
                    elog("[ReCapError1]"+ip+ua+"[srvid]"+srvid);
                    continue;
                }

                String secretKey = "きーーーーーーー";

                JSONObject jsoned = readJsonFromUrl("https://www.google.com/recaptcha/api/siteverify?secret="+secretKey+"&response="+recaptchacode);

                try {
                    if (!jsoned.getBoolean("success")) {
                        result = create_recaptchaerror;
                        continue;
                    }
                }catch (Exception e){
                    result = create_recaptchaerror;
                    continue;
                }
                //////////////

```

#まとめ
メモですけど、こんな感じ。

#参考
https://liapoc.com/recaptcha.html

https://stackoverflow.com/questions/4308554/simplest-way-to-read-json-from-a-url-in-java
Androidのバイブレーションの使い方


Androidアプリでバイブレーション（振動）を使いたかったのですが、インターフェイスがわかりにくかったので、調べてみました。

まず、対象にするAndroid OSバージョンによって使い方が異なります。

## 共通

AndroidManifest.xmlでバイブレーションを許可します。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.VIBRATE"/>
```

どのOS向けでも、まずは[Vibrator](https://developer.android.com/reference/android/os/Vibrator.html)を取得します。

```kotlin
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
```

## API level 26 (Android 8.0 Oreo) 未満の場合

### 1回だけ振動させる

> public void vibrate (long milliseconds)

鳴らす時間をミリ秒でセットします。

```kotlin
vibrator.vibrate(300)
```

### 2回以上振動させる

> public void vibrate (long[] pattern, int repeat)

まず、第一引数として、オン・オフにする時間をミリ秒の配列にしてセットします。配列の最初は待機時間、２つ目はオンになっている時間、３つ目はオフになっている時間・・・、という風に繰り返してセットします。

ずっと振動させ続ける場合は、第二引数に **繰り返しを開始する配列のインデックス** をセットします。繰り返し回数では無いので注意してください。繰り返し回数は設定できず、cancelするまで無限に繰り返されます。繰り返ししない場合は、-1をセットします。

「ツートントン」だったらこんなかんじ。

```kotlin
vibrator.vibrate(longArrayOf(0, 1000, 400, 200, 400, 200), -1)
```


「ツートントントントン・・・・」だったらこんなかんじ。


```kotlin
vibrator.vibrate(longArrayOf(0, 1000, 400, 200, 400, 200), 2)
```

このままだとアプリをキルするまで永遠に鳴り続けるので、cancelで止めます。

```kotlin
vibrator.cancel()
```
配列のなかみを説明します。

| インデックス |  値 |  振動    |
|:-----------|:----|:-----|
| 0          | 0   | 待機（ここでは待機なし）  |
| 1          | 1000| 1000ミリ秒鳴らす |
| 2          | 400 | 400ミリ秒待つ （★）  |
| 3          | 200 | 200ミリ秒鳴らす |
| 4          | 400 | 400ミリ秒待つ   |
| 5          | 200 | 200ミリ秒鳴らす |

（★）から配列の最後までをずーっと繰り返す設定です。

## API level 26 (Android 8.0 Oreo) 以上の場合

API level 26 以上では[VibrationEffect](https://developer.android.com/reference/android/os/VibrationEffect.html)を使います。

### 1回だけ振動させる

> public static VibrationEffect createOneShot (long milliseconds, int amplitude)

第一引数として、鳴らす時間をミリ秒でセットします。

第二引数は、振動の大きさを1〜255の間でセットします。デフォルト値は、`VibrationEffect.DEFAULT_AMPLITUDE`です。

```kotlin
val vibrationEffect = VibrationEffect.createOneShot(300, DEFAULT_AMPLITUDE)
vibrator.vibrate(vibrationEffect)
```

### 2回以上振動させる

> public static VibrationEffect createWaveform(long[] timings, int[] amplitudes, int repeat)

第一引数は、オン・オフにする時間をミリ秒の配列にしてセットします。最初はオフです。

第二引数は、振動の大きさの配列です。第一引数と第二引数の配列サイズはそろえる必要があります。

第三引数は、繰り返しを開始する配列インデックスです。

```kotlin
vibrationEffect = VibrationEffect.createWaveform(longArrayOf(300, 300), intArrayOf(0, DEFAULT_AMPLITUDE), -1)
```

こんなかんじだと思うのですが、API level 26 以上については実機が手元にないので試せていません…　実機で挙動がおかしかったら教えてください。

## どのOSにも対応する

Android OSに関係なく振動させる場合は次のようになります。

```kotlin

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
  val vibrationEffect = VibrationEffect.createOneShot(300, VDEFAULT_AMPLITUDE)
  vibrator.vibrate(vibrationEffect)
} else {
  vibrator.vibrate(300)
}
```



## 参考資料
* [Vibrator  |  Android Developers](https://developer.android.com/reference/android/os/Vibrator)
* [kotlinでAndroidのバイブレーション、振動を操作する方法](http://android.techblog.jp/archives/7976265.html)
bitcoin-rubyでsegwitアドレスのエンコードとデコード/ bech32

# 環境
[bitcoin-ruby](https://github.com/lian/bitcoin-ruby) v0.0.18
ruby v2.5

# こんな感じ

```ruby:bech32.rb
require 'bitcoin'
include Bitcoin
include Util

Bitcoin.network = :regtest
p Util.encode_segwit_address(0, '67c6df70223a3cfbf241e7551057001707d72af9')
# => "bcrt1qvlrd7upz8g70hujpua23q4cqzuraw2he97gtyc"
# encode_segwit_address('segwitのversion', 'pubkey-hash-20byte')
# pubkey-hash-20byte => ripemd160(sha256(pubkey))

p Util.decode_segwit_address('bcrt1qvlrd7upz8g70hujpua23q4cqzuraw2he97gtyc')
# =>[0, "67c6df70223a3cfbf241e7551057001707d72af9"]
```

# もっとくわしく！
[bitcoin-ruby](https://github.com/lian/bitcoin-ruby/blob/2d1f8f84b96623c160a96f435c8db155b028f201/lib/bitcoin.rb#L145)
[BIP173/ Bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)
[Segwitのアドレスフォーマットを定義したBIP-173](https://techmedia-think.hatenablog.com/entry/2017/05/09/182833)
php-master-changes 2018-08-03

# 2018-08-03
日記的に使うにはひょっとして Qiita そんなに向いてないのでは……？と思いはじめる

## sgolemon: Roll NEWS for 7.2.10
- https://github.com/php/php-src/commit/0ba49597b9d08d2e1bd416812037051f760f57be
- 7.2.10 向けの修正を入れられるよう NEWS を更新

## weltling: Cleanup unused items
- https://github.com/php/php-src/commit/9d7c510893b7e3648fceaa14620e7d9b04721c0f
- ext/gd、ext/sockets の不要コードを削除

## weltling: Fix callbacks
- https://github.com/php/php-src/commit/19592519c2803a42762e8fee18505083dc3474fc
- ext/com_dot_net で少なくとも PHP7 の頃からコールバックのシグネチャが zend_object_iterator_funcs の定義と一致していなかったのを修正したもよう

## carusogabriel: Remove superfluous checks of always available functions
- https://github.com/php/php-src/commit/0e0019f6940a252d5fa761b09e859a5d75b24545
- 必ずある関数の存在チェックを無駄に行っていた箇所の修正
- setlocale()、usleep()、mail()、date_default_timezone_set()、utf8_encode()、is_executable() のチェックを行っている箇所
- これダイジョブなのかな
    - utf8_encode() は XML パーサ拡張
    - 存在チェックを行っていたのは SOAP 拡張のテスト
    - どちらの拡張も libxml に依存してはいる
    - XML パーサと SOAP の拡張間に直接的な依存関係はなく、SOAP 拡張用意する時に常に utf8_encode() が存在するわけではないのでは……？
    - と、PHP マニュアル見ながらなんとなく思った
    - まあ半年 ROM ってから考えよう
- とか言ってたら utf8_encode() は [standard へ移動されてた](https://github.com/php/php-src/pull/2160)
- なるほどこれなら確かに常時存在する

## weltling: Improve cleanup
- https://github.com/php/php-src/commit/41c69766a4bcbd74779379129964cf0bf26b4217
- ext/pdo_sqlite のテストで DB ファイルの掃除をテスト本体でやっていた
- パーシステント接続でファイルをロックすると削除の邪魔になるかも、というので、--CLEAN-- セクションでの削除に修正となった

## weltling: Update maintainer info [skip ci]
- https://github.com/php/php-src/commit/7aca2bdbb1a5a2a972140a16b04d459853e40e4c
- fileinfo 拡張 / intl 拡張のメンテナに自分の名前を書き加えた

## weltling: Missing piece for the inliner cache
- https://github.com/php/php-src/commit/9d89cf95d3487bcfbf8661046c58c1a3cb407cfe
- 昨日の Inline Reader Cache の対応箇所で足りなかったところを追加

## cmb69: Update UPGRADING.INTERNALS wrt. Same Site Cookies
- https://github.com/php/php-src/commit/4faf135d903481cade30c7ade407a78b218f9eda
- 処理系内部 API 等の変更情報を書いておく UPGRADING.INTERNALS に、Same Site Cookies 対応によって php_setcookie() が追加の引数をとるようになったり、引数の順序が変わったむねを記載

## weltling: Use inliner cache also for non ext/sapi sources
- https://github.com/php/php-src/commit/df5e09c5a88fd225e72e35c2796cfec37678fb62
- Inline Reader Cache の対応箇所を ext/sapi 以外の部分へも更に増やした

## weltling: Remove asan incompatible options
- https://github.com/php/php-src/commit/2ea7222440c92561e9774bb5d32ff1135935ef93
- asan は [AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer) で、メモリエラーの検出器。asan と互換性がないコンパルオプションを Windows 版のビルドシステムから外した
wordpressをインストールした時にMAMPもインストールしたけど、MAMPって…？

HTMLとCSSを書き上げたのでPHPを書こうと思っていた矢先、エラーが発生。
解決しようとするも、wordpressがどのようにして作動しているのかということがわかっておらずお手上げ〜

今まではコピペしたコードを寄せ集めてなんとか形になってきていただけで、
エラーが発生してしまうと、どこをどう直せばいいのか、
また、解決策を見てもなぜそれで解決するのかもわからないのです。

今回発生したエラーは、なにやらデータベース接続にあるとのこと。

ということで、私があまりよくわからずなんとなく使用していたMAMPについて調べてみました！



#Wordpressを使うには
###1.wordpressのwebサイトから使う
これは私を始め、多くの方が想像する、あるいは、他の形で同じようなサービスを使ったことがあると思います。
例えば、オリジナルTシャツなどを作る時。
”スマホで撮った写真をTシャツにしよう！”みたいなサイトにアクセスして、
何種類かのサンプルの中から”こんな感じにしたいな〜”ってのを選んで、
Tシャツの色や素材、使いたい写真の位置やサイズを決めるだけで出来上がり。

wordpressも同じく、サイトにユーザー登録してログインすれば、
好みのレイアウトに合わせて、かつ、自分の好きなようにアレンジが出来る。

###2.wordpressを自分のパソコンにインストールして使う
この記事のメインとなるのがこちら。
上記のようにwebサイトから作ることも出来ますが、もっといろいろいじっちゃいたい！
って場合にはこちらではないでしょうか。

wordpressのソフトウェアをダウンロードし、インストールして使うのですが、
**インストールしただけでは使うことが出来ません。**
初心者の私でもダウンロードしてインストールはなんとなくわかる、
わかるんだけどなんでインストールしたのに使えないのかわかんない！

その答えは、
wordpressはPHPというプログラミング言語で開発されており、
**”PHPはある環境を用意してあげないと、使うことが出来ない”**
からです。

私はこのPHPが使える環境としてMAMPを使ってみることにしました！


#MAMPってなんのこと？
**M** *Macintosh（macOS）*
**A** *Apache(webサーバー)*
**M** *MySQL(データベース)*
**P** *php　(プログラミング言語)*
これらの頭文字を取ってMAMPという。
LAMPだったらLinuxなんだって〜


[WORDPRESS.ORG 日本語](https://ja.wordpress.org/download/)
こちらで無料でソフトウェアをダウンロード、インストールをしました。


##結局MAMPってなんですか？
ざっくり言うと**”PHPを作動させる環境”**のことです。
また、ここでいう環境とは**”ローカル環境”**を指しており、
インターネット上でwebサイトが表示されている環境を
自分のパソコンの中で仮想的に構築している環境のこと。

ポイントとなるのは**Apache(webサーバー)**と**MySQL(データベース)**です。

いろいろなサイトを閲覧、またはwebサービス(twitterやblogなど利用者のデータを反映することが出来るもの)を利用しているとき、
私の知らないところでwebサーバーとデータベースが頑張ってくれていたのでした！

###データベースとは
データを扱っている場所。
と言ってもデータって！？って感じです。
例えばtwitterで言うと、ユーザーIDや投稿する文章、画像、テーマカラーを変えるなどなど、
利用する人それぞれによって異なる情報です。
データの保管・更新・削除・検索…この操作をする言語をSQLと呼びます。
MySQLとはこう言った個人のデータを扱うことが出来るのです。
（MySQLはMAMPのphpMyAdiminでwebサーバー上でも操作することが出来ます）

しかし、このデーターベースに情報が入っているだけでは、インターネット上（webサイト）で閲覧することは出来ません。

###webサーバーとは
このwebサーバーが**データベースとwebサイトの間に入り情報伝達を行う**ことにより、
インターネット上でサイトを見ることが出来るのです！

例えば、ネットショッピングのサイトを見ていて気になる商品があったので、
商品詳細が知りたくなり、商品詳細へのリンクボタンを押す。
これがwebサイト上での操作。

そこにwebサーバーさんの登場。
「webサイトで商品詳細へのリンクが押されたよ！
データベース君、商品詳細のページを表示させてあげたいの！」

それに対しデータベース君は
「了解！すぐに商品詳細のページを君に渡すから、webサイトに表示させてあげてくれ！」

サーバーさん
「まぁなんて仕事が早いの！これでwebサイトに表示が出来て、閲覧者は画面に釘付けよ！」

なんて感じで、やりとりをしてくれていて、大忙しなのです。

参考
[【入門】MySQLとは？人気無料データベースの使い方を分かりやすく解説します](https://www.kagoya.jp/howto/webhomepage/mysql/)
[
Apacheとは？Webサーバーの仕組みと人気サーバーソフトを徹底解説](https://www.kagoya.jp/howto/rentalserver/apache/)

※厳密に言うとmacOSにはもともとApacheがインストールされているのですが、
もしそれを利用する場合にはまた個別にMySQLをインストールする必要があります。
そういった作業が面倒なので、MAMPなど必要な機能が１つにまとまったものをインストールして使うのが手軽だそうです。
参考
[MAMPのインストール for Mac](https://www.be-webdesigner.com/technotes/server/install/mamp.htm)


#まとめ
wordpressはPHPで開発されているため、wordpressのソフトウェアを使用する場合は、
開発環境としてデータベースとwebサーバーをインストールしなくてはならない。
また、この環境はローカル環境として構築することで、
実際にインターネット上で表示された環境と同じような環境を自分のパソコンの中に作ることが出来る。
この**ローカル環境を構築しているのがMAMP**です。
pyqtgraphのticksのラベルの更新方法

# まとめ
pyqtgraphのPlotItemの軸のラベルとticksのラベルを設定するには`AxisItem`を使う。   

# 背景
pyqtgraphを用いてグラフを描画したいとき、PlotItemを用意し、その中にグラフを描画することができる。
また、２次元データを表示する方法として`ImageItem`を与える方法があるが、デフォルトでは軸の値はデータ数に相当する。
この軸のticksに好きな値を設定したい。

# 方法
`pyqtgraph.AxsItem()`を使うことで、PlotItemの軸のラベルとticksのラベルをセットすることができる。
使い方は[Stack Overflow](https://stackoverflow.com/questions/42886849/how-to-add-custom-axisitem-to-existing-plotwidget)を参考に、次のようにする。

```python:
import pyqtgraph as pg

# レイアウトの用意
glw = pg.GraphicsLayoutWidget()

# 軸の用意。与えられるのはbottom, left, top, right
axBottom = pg.AxisItem(orientation="bottom")
# 軸のticksのラベルの用意。dict形式で与える
tickBottom = {0:-50, 50:0, 100:50}
# 軸のticksのラベルを設定する
axBottom.setTicks([tickBottom.items()])
# 軸のラベルの用意
labelBottom = "Value1"
# 軸のラベルを設定する
axBottom.setLabel(labelBottom)

# 別の軸を用意する
axLeft = pg.AxisItem(orientation="left")
# 以下、axBottomの場合と同様に設定する
...

# PlotItemの用意。PlotItemには後から軸を設定するメソッドがないようなので、この段階でPlotItemの軸を設定する。
p1 = glw.addPlot(
    axisItems={"bottom":axBottom, "left":axLeft}
)
...

# PlotItemに設定された軸のパラメータを後から更新する場合は、setLabelやsetTicksを利用する。
tickBottom_new = {0:-20, 50:30, 100:130}
ax.Bottom.setTicks([tickBottom_new.items()])
...
```

# 参考
* [python - How to add custom AxisItem to existing PlotWidget? - Stack Overflow](https://stackoverflow.com/questions/42886849/how-to-add-custom-axisitem-to-existing-plotwidget)
AWS S3 TIPS

AWSのS3について学習する中で覚えておいたほうがいいと感じたものを自分のために残しておきます。

#1.結果参照性

S3では複数のサーバにデータを保持することで可用性を高めている。
(これをCRR：クロスリージョンレプリケーションという。)
そのため、1つのサーバにPUTが完了した後に他のサーバへレプリケーションが発生する。
このレプリケーションが完了するまではPUTした情報を読み込んだ時に不安定な動作をする。
(レプリが完了していないサーバを参照する可能性があるため)
処理ごとの動作は下記のようになります。

- 新しいオブジェクトを書き込んだ場合
オブジェクトが見つからない可能性がある

- 既存のオブジェクトを更新した場合
更新前の古いオブジェクトを取得する可能性がある

- 既存のオブジェクトを削除した場合
削除したハズのオブジェクトが取得できる可能性がある

#2.バージョニング機能
デフォルトでは無効になっているが、バージョニング機能がある。
過去分も課金対象になるのでご利用は計画的に。

#3.ファイルの存在チェックはするべきではない
プログラムからアクセスしてファイル取得する際にセオリー通りなら
ファイルの存在チェック⇒取得となるが、
存在チェックするためのリクエストは課金対象となる。
存在チェックせずにファイル取得し、もし存在しなければexceptionをスローするのがベストプラクティス。

#4.署名付きURL
S3のオブジェクトやバケットは基本的にプライベートで他のユーザが参照したりファイルをアップロードすることはできない。
特定のユーザにファイル操作を許可したい場合はそのユーザにアクセス許可のロールを与える方法もあるが、署名付きURLを作成して提供することでも解決できる。
署名付きURLを作成するにはバケット名やオブジェクトキー、使用するHTTPメソッド(GET,PUT等)有効期間が必要。

#5.CORS
CORSとはクライアント側のアプリケーション(javascript等)が他のドメインに存在するリソースにアクセスできること。
S3ではCORSが設定可能なのでjavascriptからS3のリソースにアクセスができる。

#6.プレフィックスによるスループット向上
S3では複数のパーティションに分けてオブジェクトを管理している。
どのパーティションに保存されるかはオブジェクトキーの先頭の文字によって決定される。
よって同じもじから始まるオブジェクトキーばかり使っていると特定のパーティションにだけアクセスが集中してしまい、スループットが低下する。
なのでオブジェクトキーの先頭文字がランダムになるように設定するのがベストプラクティス。
GitLabでRepositoryを削除する方法

# はじめに
なかなかみつからなかったので、メモしておく。

# やったこと
ProjectのページでSettingsのGeneral選んで、AdvancedをExpandしたら出てきた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/a62138af-de7a-463a-6ab6-ffe61a0be165.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/ce0af70c-a49f-bd8d-5edc-72d1a16e7e62.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/a7100f12-26f9-2823-ee25-161d902888b3.png)

# 参考
[git - How to remove a Gitlab project? - Stack Overflow](https://stackoverflow.com/questions/24032232/how-to-remove-a-gitlab-project)
【WindowsServer】ドメイン参加後、AD登録ユーザーでRDP接続するための設定

WindowsServer自体のAdministrator権限で、サーバーとしての自身をドメインに参加させた後、
サインアウトしていざAD登録ユーザーでログインしようとすると以下画面になることがあります。

※AWS(Microsoft Windows Server 2012 R2 Base - ami-a73c5e4a)にて、英語デス


<img width="576" alt="スクリーンショット 2018-08-03 23.14.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/172282/e1edf467-2510-b9dd-5a46-6b189aeb4044.png">

■表示文

```
To sign in remotely, you need the right to sign in through Remote Desktop Services.
By default members of the Administrators group have this right. 
If the group you're in does not have the right, 
or if the right has been removed from the Administrators group, 
you need to be granted the right manually.
```

内容を見ると、ログインしようとしているユーザーはRDP接続権限を持っていない云々。これは以下にて解決可能。

1. ドメイン参加をさせたサーバー自身のAdministrator権限で再度ログイン
- 「サーバーマネージャー」を起動
- 左メニューから「ローカルサーバー」を選択
- 右画面に表示されているプロパティ内の「リモート デスクトップ」の「有効(もしくは無効)」をクリック
- 「システムのプロパティ」が表示されるので「リモート」タブをクリック
- 「リモートデスクトップ」より「このコンピューターへのリモート接続を許可する(L)」にチェックを入れ、「ユーザーの選択(S)」をクリック
- 自身が参加しているドメインより、RDP接続をさせたいユーザー(もしくはグループ)を追加する

　※ユーザー単体だと以降の追加が大変なので、グループ追加にして、
　　以降ユーザーが増えたらそのグループに追加していくと管理面でも楽かと思います

以上を実施後、再びAD登録ユーザーにてログインすると、無事にログインできるはず。
IFTTTでif `Google Assistant` then `Webhook`でBad Requestが発生したときの対応メモ

# 概要

`IFTTT`を利用して`Google Assistant`からの入力文字列を、Webhook経由でWebAPIへクエリストリングで渡すときに、HTTP Status 400(Bad Request)が出てハマったのでメモしておきます。

# 発生した環境と現象

下記経路の`ngrok`の呼び出し時にHTTP Status 400(Bad Request)になります。

__通信経路__

`Google Home` ⇒ `IFTTT( if Google Assistant then WebHooks )`(\*1) ⇒ `ngrok` ⇒ `WebAPI`(\*2)

__*1 IFTTT -> MyAppletの設定__

__Google Assistant(Say a phrase with a text ingradient)__

|項目|設定|
|---|---|
|What do you want to say?|ブラウザ検索 $|
|What's another way to say it?||
|And another way?||
|What do you want the Assistant to say in response?||
|Language|Japanese|

__Webhooks(Make a web request)__

|項目|設定|
|---|---|
|URL|https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<{{TextField}}>>|
|Method|GET|
|Content Type|text/plain|
|Body||

__*2 WebAPIのソース(nodejs)__

```javascript

const express = require('express');

let app = express();
app.listen(3000);

app.get("/api/ctl", async function (req, res, next) {
    console.log(req.query);
    ...
}

```

__IFTTTのActivityに表示されるエラー__
![error.png](https://qiita-image-store.s3.amazonaws.com/0/265837/53d9be27-19ae-3738-a3a3-7b870d55794d.png)

# 調べてみた

##1.`ngrok`を通さないときに、どんなリクエストが来るか確認してみる。

__URL__

```
https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<{{TextField}}>>
```

__レスポンス__
文字化けしています。エスケープも効いていません。

```json
{ c: 'search', v: '<<Æ¹È>>' }
```

##2.`<<<` `>>>`でのエスケープをダメ元で確認

Web上で検索すると`<<<` と `>>>` で囲むという記載も見受けられますのでまさかと思い、試してみました。

__URL__

```
https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<<{{TextField}}>>>
```

__レスポンス__

なんと・・・文字化けしていません。

```json
{ c: 'search', v: 'テスト' }
```

# 原因

`IFTTT`画面上のコメント間違いでした。実際は、`IFTTT`の`WebHook(Make a web request)`でのURLエンコードは`<<<` `>>>`が正しいようです。

# おまけ

2018/08/23時点ではescapeは`<<` `>>` と記載されていました。

![url.png](https://qiita-image-store.s3.amazonaws.com/0/265837/4e494014-7c90-b3ad-c6a6-8e7eb04520f2.png)
Spring SecurityでAlreadyBuiltExceptionが発生する問題の対処

Spring Security + Spring Bootで`AlreadyBuiltException`が発生してアプリケーションが起動できない問題にかなりハマってしまったので、その時の解決メモ。

# 事象
いろいろ省略はしていますが、以下のようなJava Configを作成していました。

```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> auds;

    @Bean
    public PreAuthenticatedAuthenticationProvider preAuthenticationProvider() {
        PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
        provider.setPreAuthenticatedUserDetailsService(auds);
        return provider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preAuthenticationProvider()).build();
    }
}
```

このような設定でアプリケーションを起動すると、以下のようなエラーが発生します。

```
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built
```

`springSecurityFilterChain`がすでにビルドされているよ、というエラーなのですが、この原因を特定するのに時間がかかりました。

# 原因
`SecurityConfig`クラスのconfigureメソッドでbuildを実行しているからでした。
buildを実行すると、`AuthenticationManager`を生成するらしいのですが、実は親クラスである`WebSecurityConfigurerAdapter`で実行してくれます。
今回は2回実行されてしまったせいで、このような問題が発生してしまったようです。

以下のようにすれば大丈夫です。

```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> auds;

    @Bean
    public PreAuthenticatedAuthenticationProvider preAuthenticationProvider() {
        PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
        provider.setPreAuthenticatedUserDetailsService(auds);
        return provider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preAuthenticationProvider());
    }
}
```

----
実際、ドキュメント等を確認しても、JavaConfigでbuildしていないんですよね。
でもBuilderクラスだし、buildメソッドが補完で出てきたらbuildしたくなるじゃないですか！

ちゃんとドキュメントは読まないといけないですね。すごく時間を無駄にしてしまった。
Raspberry PiにVisual Studio Codeをインストール

# はじめに
Emacs派だけど、モダンなエディタも使いたい派なので、ラズパイに何か入れようと検討中。
ラズパイ使ってる人にどのエディタ勧めるかも悩ましかったのでちょっと調べた。
（sshしてファイル編集するにはEmacsいい感じなんやけど。）

Atomを入れるのは、しんどそう。なかなか良さそうなのないなと思ってたけど、
偶然、Visual Studioがクロスプラットフォームで、なかなか人気があることを知った。
ラズパイにInstallできるかも調べたらあっさりできそう。
試してみる価値ありそう。

# インストール
Community buildsなるものがあったので、それでインストール。すんなり入った。
すんなり入ると好感度高くなる。
[Visual Studio Code for Chromebooks and Raspberry Pi](https://code.headmelted.com/)

```
sudo -s
. <( wget -O - https://code.headmelted.com/installers/apt.sh )
```

# 結果
```
code-oss
```
で開ける。

見た目もいい感じ。
補完もいい感じ。
モダンなエディタの素のEmacsじゃ到底叶わない親切さよ！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/93d199cd-6c6b-848f-8d79-a9718de948a9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/183e562a-8724-dad7-fe71-51abde379527.png)

# おわりに
モダンな感じが出てる。Windows感もすこし出てるけど。バーが青色やから？
もうちょい使ってよかったら、Windowsで使うエディタもVisual Studio Codeにしよかっな。EmacsもAtomも起動が遅くてそこそこストレスフルだから。


# 参考
[Visual Studio CodeがRaspbianでも簡単にインストールできるようになったらしい。 – osahns](https://osahns.wordpress.com/2017/06/15/visual-studio-code%E3%81%8Craspbian%E3%81%A7%E3%82%82%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA/)
[Raspberry PiのC++開発環境を Visual Studio Codeで構築 | ある計算機屋さんの手帳](http://my-web-site.iobb.net/~yuki/2018-03/soft-tool/pi-vscode/)
Nuxt.jsの動作環境をdockerで作る

# はじめに

Nuxt.jsを試すために環境を用意する。
まずはstarter-templateを表示してみる。

## 環境

Windows10 Pro
Docker for Windows

## コンテナ起動準備

node.js公式のイメージからvue-cliだけ入れたイメージを作る。

```dockerfile:Dockerfile
FROM node:10-alpine
RUN npm install -g vue-cli
WORKDIR /app
ENV HOST 0.0.0.0
EXPOSE 3000
```

```yml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    tty: true
    volumes:
      - "./../app:/app"
    ports:
      - "3000:3000"
```

## ビルドとコンテナ起動

```bash
$ docker-compose build
$ docker-compose up -d
```

## starter-templateの起動

```
$ docker-compose exec app sh
# vue init nuxt-community/starter-template
# yarn install
# yarn run dev
```

## ブラウザからアクセス

```
http://localhost:3000
```

スターターページが表示されればOK。
Rails: ActiveRecord::Baseメソッドのまとめ

#そもそも1： ActiveRecordとは

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

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

#そもそも2： ActiveRecord::Baseメソッドとは

・```ActiveRecord::Base```で定義されている「テーブルにアクセスして情報を取得するためのメソッド」のこと。
・モデルクラスはこの```ActiveRecord::Base```というクラスを継承しているが、クラスを継承した場合は継承元のクラス（親クラス）で定義されているメソッドを利用することができる。 そのため、モデルクラスは```ActiveRecord::Base```メソッドを用いて、テーブルにアクセスし情報を取得することができる。
・  例えば、```rails g model tweet```のコマンドを実行すると、モデルクラスであるTweetクラスが作成される（Tweetモデル）が、そのTweetクラスは```ActiveRecord::Base```を継承している。そのため、Tweetクラスのインスタンスに対して、ActiveRecord::Baseで定義されているメソッドを使用することができる。

```（例）app/models/tweet.rb
class Tweet < ActiveRecord::Base   
end
```

# ActiveRecord::Baseメソッドの具体例

上記の例のようにTweetクラスがある場合。

```.rb
Tweet.all
#Tweetモデルからすべてのインスタンス取得

Tweet.new(name: "John", text: "Hello!")
#Tweetモデルに新規インスタンスを作成

tweet.save
#作成したインスタンスを保存

Tweet.create(name: "John", text: "Hello!")
#newメソッドとsaveメソッドを一気に行うことと同じ

Tweet.find(3)  #=> <Tweet id:3, name: "John", text: "Hello!" >
#Tweetモデルからidが3のデータをインスタンスとして取得　※該当するものがない場合はエラーになる

Tweet.find_by(name: "John")
#条件に合うデータをidの若い順に1つだけ取得　※該当するものがない場合はnilを返す

Tweet.where(name: "John")
#条件に合うデータを複数取得

Tweet.limit(5)
#Tweetモデルからidの若い順に5つのデータを取得

Tweet.order("created_at DESC") 
#データの作成日時が新しい順にソート。DESCは降順（Descending）、ASCは昇順（Ascending）

tweet.destroy
#削除

tweet.update
#更新
```


#おまけ: ゲッター

ゲッターとは、インスタンス変数の値を取得するためのメソッド。
本来Rubyでは```@name```などのインスタンス変数の値はクラス内からしか取得出来ないため、
クラス外からインスタンス変数の値を取得するには、クラス内に定義する必要がある。

Ruby on Railsではゲッターが自動的に定義されるため、結果的に「インスタンス.カラム名」と書くことでそのインスタンスのカラムの値を取り出すことができる。

参考：　[【Ruby】「ゲッター」と「セッター」を理解する](https://qiita.com/k-penguin-sato/items/5b75be386be4c55e3abf)

```.rb
class Tweet
  def initialize(name, text)
    @name = name
    @text = text
  end

  def name  #これがゲッター
    @name
  end
  
  def text  #これがゲッター
    @text 
  end
end

tweet = Tweet.new("John", "Hello!")

puts tweet.name  #=> ”John”
puts tweet.text  #=> "Hello!"

```
RubyMineでpowで起動したアプリをデバッグする

RubyMineでpowで起動したアプリケーションのプロセスにアタッチしてデバッグする手順

# 手順まとめ

- アプリを作成する
- powで起動する
- gemをインストールする
- 設定ファイルを作成する
- RubyMineを設定する
- デバッグする

# 時間がない人のため

サンプルのアプリ雛形と必要な変更点はこちらから

https://github.com/ShoheiMitani/debug/pull/1/files

# アプリを作成する

```
rails new ...
```

# powで起動する

powderを使ってアプリを登録し、起動する

```
powder link
powder open
```

# gemをインストールする

Gemfileに以下を追記して、`bundle install`

```rb
group :development, :test do
  gem 'ruby-debug-ide'
  gem 'debase'
end
```

# 設定ファイルを記載する

プロジェクトルートに`.powenv`ファイルを作成

```
export RUBY_DEBUG_PORT=8090
export POW_WORKERS=1
```

ポート番号はお好みで

次に、`config/initializers/remote_debugger.rb`ファイルを作成

```rb
if ENV['RUBY_DEBUG_PORT']
  require 'ruby-debug-ide'
  Debugger.start_server nil, ENV['RUBY_DEBUG_PORT'].to_i
end
```

# RubyMineを設定する

ツールバーからRun → Edit Configurationsを開く

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/90680/045f1924-f03d-f7a8-a390-2a632814cb51.png" />

表示されたウィンドウの左上の+ボタンからRuby remote debugをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90680/b05bb45e-0a27-d43f-e59a-e10378a3465e.png)

以下の設定を記述してApplyボタンをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90680/f0f39026-39d1-14c7-4cb5-c8eaf1d32913.png)

|項目|指定する値|
|:---|:------|
|Name|好きな名前|
|Remote port|`.powenv`に指定したポート番号|
|Remote root folder|アプリケーションのルートパス|

# デバッグする

事前に`bundle install`を完了させておき、powを再起動する

```
powder restart
powder open
```

**powは一定時間アクセスがないと自動でプロセスが落ちる為、必ずデバッグ前に`powder open`でアプリを立ち上げる必要がある。**

デバッグしたい場所の行番号の横をクリックし、デバッグポイントをおく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90680/93af02f0-614d-9cf9-654a-edc39eb76bae.png)

ツールバーのRun → Debugをクリックする

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/90680/a232e0b5-c188-a51b-a3d2-b00d8bddac94.png" />

先ほど作成したデバッグ設定のNameで指定したやつをクリックする

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/90680/782db63a-db8f-3bec-18d0-fe1a116e0cec.png" />

クリックするとRubyMineの下部にデバッグコンソールが表示される。この状態でデバッグポインタをおいたページにアクセスするとデバッグができる。
【PHP】Eclipse4.8 デバッグに失敗したときの対処法

##PHPのEclipse4.8でWebアプリケーションでデバッグが失敗する
PHPのEclipse4.8でWebアプリケーションでデバッグを行うとエラーがでる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/a546c47c-b3bd-f683-62f0-86a9305a184f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/5ae21245-a29f-ff06-716a-d4358057f35a.png)

###対処法
ウィンドウ(W)　→　設定(P)　で設定を表示する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/6bcc42c0-4ad0-c436-6e38-0da11bbb4a83.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/5bf5725c-b691-31a2-f60d-715165740e09.png)

PHP　→　サーバー　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/5998da08-1b49-b170-68e3-1f324ff0bc5e.png)
Default PHP Web Serverを選択し、編集をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/916cd1e6-0635-2f52-c38b-9084f222f288.png)
デバッガーのタブを選択し、デバッガーを「Xdebug」を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/fe3a11fd-deb1-b418-908e-c47cac189bf5.png)

サーバーのタブに戻り、ベースURLに半角コロンを追加し、完了を押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/4fcfeaa2-4aea-a325-f5f4-7274a456ad6a.png)

###起動
対処法の処理を行った後に起動したいファイルを右クリックし、
デバッグ　→　PHP Web アプリケーション
でデバッグを開始できます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/992cbe18-dcb5-21c0-66b3-58e36236aec6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/4cf4258b-8a48-341a-0e90-5d6c28fb8230.png)
<br>
<br>
##上のやり方で失敗する
その場合は起動したいプロジェクトを右クリックし、プロパティを開いてください
PHP　→　デバッグ　でPHPサーバーをDefault PHP Web Serverに設定すればデバッグが行えると思います
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259764/aa29032b-2673-d05b-23e0-5e80ec78dafe.png)
AWS Private Link設定時に特定のサブネット（AZ）からアクセスできない状態に遭遇した

# やりたかったこと
AWS Private Link についてはこちらを参照ください
[AWS PrivateLinkのアップデート – お客様のアプリケーション&サービス向けのVPCエンドポイント
](https://aws.amazon.com/jp/blogs/news/aws-privatelink-update-vpc-endpoints-for-your-own-applications-services/)

一言で言うとSaaSサービスのような用途のエンドポイントを、インターネット介さずにAWS間のネットワークでセキュアにアクセスできるよ。ってやつです。

で、やりたかったのは以下のような構成です。
ほぼTerraformで構築した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75573/36d1b1c2-f1a8-f964-96dd-067555009bcb.png)

# ハマったこと
User AccountのSubnet Cからは、Endpoint経由でService AccountのEC2にアクセスできたけど、なぜか**Subnet A, Bからは　Service AccountのEC2にアクセスできない**

# 調べたこと
## 1. どこからならアクセス可能か
### Service AccountのEC2
localhostからアクセス可能
### Service AccountのEC2の横にあるインスタンス
Private IPでアクセス可能
且つ、NLBのDNS名でアクセス可能
### User AccountのSubnet AのEC2
Endpoint名でアクセス不可
### User AccountのSubnet BのEC2
Endpoint名でアクセス不可
### User AccountのSubnet CのEC2
Endpoint名でアクセス可能
### 結論
Endpoint -> Endpoint Service -> NLB -> EC2自体の `設定` は問題なさそう
ネットワーク周りが怪しい

## 2. セキュリティグループ
### Endpoint
Endpointにセキュリティグループが設定できるので確認した。
User AccountのVPC丸ごと開けていた
もちろんOutboundは制限なし

### Endpoint Service
セキュリティグループは設定できないので関係なし

### NLB
セキュリティグループは設定できないので関係なし

### EC2
NLBはクライアントIPをそのまま持ってくるため、User AccountのIPアドレスの開放が必要
User AccountのVPCとService AccountのVPCを丸ごと開けていた
もちろんOutboundは制限なし

### 結論
Subnet CのEC2からアクセスできていて、全てのSubnetを包括したCIDRで開けているから問題ないはず

## 3. NLBの設定しているSubnet
全てのSubnet(AZ)を設定済み

## 4. NACL
デフォなので特に制限無し

## 5. ルートテーブル
Subnet A, Bのルートテーブルがおかしいのか・・？と思い確認
どちらのアカウントもSubnet毎に分けているわけではないので差異は無し。

# その日は諦めました

# そして一日経過し判明
なんてことはない、NLBの `クロスゾーン負荷分散` がオフになっていました。
つまり、クロスゾーン負荷分散が有効では無い、且つEC2が無いので分散しない状態でした。
しかも、EC2の横から確認したインスタンスは同じゾーンだったのでNLB経由でも自ゾーン内で通信するため問題ありませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75573/af23eb89-cf15-8f73-5654-164700e93e1a.png)

そして `クロスゾーン負荷分散` を有効にするとこうなりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75573/4a07b8e2-2727-8cf1-a735-b241b46a5881.png)

# なぜクロスゾーン負荷分散を有効にしていなかったのか
そう。冒頭に申し上げましたが、私はTerraformでNLBを構築したのですが、
設定を明示していなかったため、デフォルトとなり無効状態となっていたようです。。

みなさん、 クロスゾーン負荷分散 は有効にしない理由がほぼ無いので、有効にしておきましょう。
気が向けばTerraformにPR投げておきます。

# 補足
今回でわかったことは、アカウント跨いでもゾーンが同じならやっぱりゾーン内で通信は解決してるのね。と言うことを身に沁みました。
Cloud9でphpMyAdminにログインするまで

超初心者がphp学習でcloud9を使ったらつまづいたので殴り書きメモ

エラーでたどり着く人がいるかもしれないのでフックとして。
こんな感じのエラーでた。

初期状態でsql起動した時のエラー

```
touch: cannot touch `/var/log/mysqld.log': Permission denied
chown: changing ownership of `/var/log/mysqld.log': Operation not permitted
chmod: changing permissions of `/var/log/mysqld.log': Operation not permitted
```

パスワード設定しようとしたらでたエラー

```
Unknown column 'password' in 'field list'
```

#前提
cloud9でワークスペース作成済み

#バージョンチェック

```console:console
$ php -v
$ mysql --version
```

バージョンが低い...

#バージョンアップ

```console:console
$ sudo service mysqld stop
$ sudo yum -y erase mysql-config mysql55-server mysql55-libs mysql55
$ sudo yum -y install mysql57-server mysql57
$ sudo service mysqld start
$ sudo yum -y install php71 php71-cli php71-common php71-devel php71-mysqlnd php71-pdo php71-xml php71-gd php71-intl php71-mbstring php71-mcrypt php71-opcache php71-pecl-apcu php71-pecl-imagick php71-pecl-memcached php71-pecl-redis php71-pecl-xdebug
$ sudo alternatives --set php /usr/bin/php-7.1
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/bin/composer
```

#phpMyAdmin導入

```console:console
$ wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.zip

$ unzip phpMyAdmin-4.8.3-all-languages.zip

```
phpMyAdminのリンク切れてたら以下のリンクからzipのurlとっておき変えてください
https://www.phpmyadmin.net/downloads/

#MySQLパスワード設定

```console:console
$ sudo service mysqld start
 mysql -u root -p
```
SQL起動
パスなしで二回エンターする

```console:console
 update mysql.user set authentication_string=password("ここにパスワード") where user='root'; 
```
Query OKとでたら

```console:console
 flush privileges;
 exit
$ sudo service mysqld restart
```
パスワードを設定して、sql再起動

あとはログインするだけ


#参考にさせていただいたサイト
[2018年AWS cloud9を利用したPHP/MySQLの環境構築　phpMyAdminのインストールまで](https://www.youtube.com/watch?v=7SWYt-zhGV4&t=303s)
[AWS Cloud9でLaravelの環境構築をする方法](http://kota20.com/page-945/)
[MySQL 5.7.6でroot用パスワードが変わらなくて困った話](https://qiita.com/gatchan0807/items/7323a5d2dd365308cb94)
AllowAmbiguousTypesはどこで使える機能なの？ 具体例編

# 今回の例: ScopedTypeVariables、TypeApplicationsとの組み合わせ

何か全然よくわからない、
そういえばHaskell初心者だった頃によくGHCサジェストされた気がする
`AllowAmbiguousTypes`プラグマですが、
初めて「お前を使わせてくれ！」っていう場面に遭遇しました。

こちらです :point_down:

- - -

```haskell
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

check :: forall a. (Group a, Eq a) => Bool
check = (empty :: a) <> empty == empty

main :: IO ()
main = do
  smallCheck 2 $ check @Sum
  smallCheck 2 $ check @RSum
```

```haskell
newtype Sum = Sum
  { unSum :: Int
  } deriving (Show, Eq, Num, Enum)

newtype RSum = RSum
  { unRSum :: Rational
  } deriving (Show, Eq, Num, Enum)

class Monoid a => Group a where
  inverse :: a -> a

instance Group Sum where
  inverse = negate

instance Group RSum where
  inverse = negate

instance Group () where
  inverse () = ()
```

# これは何？
最近は技術書典5で出す「矢澤にこ先輩といっしょに代数！」という本を書いているのですが :point_down:

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">技術書典5に当選しました🎉✨✨<br>にこちゃんがHaskellで数学を教えてくれる本を出します！<a href="https://twitter.com/hashtag/%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8?src=hash&amp;ref_src=twsrc%5Etfw">#技術書典</a><a href="https://twitter.com/hashtag/%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B85?src=hash&amp;ref_src=twsrc%5Etfw">#技術書典5</a><a href="https://t.co/Ev4BPQX1PT">https://t.co/Ev4BPQX1PT</a> <a href="https://t.co/SGQtFopgdD">pic.twitter.com/SGQtFopgdD</a></p>&mdash; あいや🤘🙄🤘技術書典5@か74 (@public_ai000ya) <a href="https://twitter.com/public_ai000ya/status/1025340175512043520?ref_src=twsrc%5Etfw">2018年8月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

群の章を書いているところで
「任意の群は`e * e = e`だっけ？」
という疑問に駆られたので、
その確認を行ったものです。

```haskell
check :: forall a. (Group a, Eq a) => Bool
check = (empty :: a) <> empty == empty

smallCheck 2 $ check @Sum
smallCheck 2 $ check @RSum
```

ここで`a`は引数に表れていないので`AllowAmbiguousTypes`が必要になり、
`ScopedTypeVariables`により`a`を文中で使用。
そして使用側でその群インスタンスの型を…
引数に依らず指定しています。

引数に依らないというところが、
`AllowAmbiguousTypes`が必要になる要点でした :dog2:

![1533346377850.jpg](https://qiita-image-store.s3.amazonaws.com/0/84945/3e508d68-3598-ccce-dd1f-3efd03ee4ab3.jpeg)


# 宣伝
技術書典5に出した後は、
Boothでの電子書籍での販売を予定しております :dog:

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">技術書典5に当選しました🎉✨✨<br>にこちゃんがHaskellで数学を教えてくれる本を出します！<a href="https://twitter.com/hashtag/%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8?src=hash&amp;ref_src=twsrc%5Etfw">#技術書典</a><a href="https://twitter.com/hashtag/%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B85?src=hash&amp;ref_src=twsrc%5Etfw">#技術書典5</a><a href="https://t.co/Ev4BPQX1PT">https://t.co/Ev4BPQX1PT</a> <a href="https://t.co/SGQtFopgdD">pic.twitter.com/SGQtFopgdD</a></p>&mdash; あいや🤘🙄🤘技術書典5@か74 (@public_ai000ya) <a href="https://twitter.com/public_ai000ya/status/1025340175512043520?ref_src=twsrc%5Etfw">2018年8月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

よろしくお願いします！
Raspberry PiにOctaveをインストール

# はじめに
MATLABを買うお金がもったいないので、Octaveで遊ぶことにした。
Raspberry Piが趣味用開発マシンになってきているので、Raspberry Piに入れてみた。

# インストール
こんな感じ。

```
sudo apt-get update
sudo apt-get install octave
```

エラー出た。

```
Processing triggers for libc-bin (2.24-11+deb9u1) ...
Errors were encountered while processing:
 ca-certificates-java
 openjdk-8-jre-headless:armhf
 default-jre-headless
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

よくわからんけど、ここを見て
[missing jvm server - Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?t=197824)
とりあえず、こんなん打ってみた。

```
sudo apt-get purge openjdk-8-jre-headless
sudo apt-get install openjdk-8-jre-headless
sudo apt-get install openjdk-8-jre
```

もう一度、インストールしようとすると、すでにあるって言われる。
なんやなんや？よくわからん。まあ、入ってるならいいか。

```
pi@raspberrypi:~ $ sudo apt-get install octave
Reading package lists... Done
Building dependency tree       
Reading state information... Done
octave is already the newest version (4.0.3-3).
The following packages were automatically installed and are no longer required:
  gyp libjs-inherits libjs-node-uuid libuv1 libuv1-dev node-abbrev node-ansi
  node-ansi-color-table node-archy node-async node-balanced-match node-block-stream
  node-brace-expansion node-builtin-modules node-combined-stream node-concat-map
  node-cookie-jar node-delayed-stream node-forever-agent node-form-data
  node-fs.realpath node-fstream node-fstream-ignore node-github-url-from-git
  node-glob node-graceful-fs node-gyp node-hosted-git-info node-inflight
  node-inherits node-ini node-is-builtin-module node-isexe node-json-stringify-safe
  node-lockfile node-lru-cache node-mime node-minimatch node-mkdirp
  node-mute-stream node-node-uuid node-nopt node-normalize-package-data node-npmlog
  node-once node-osenv node-path-is-absolute node-pseudomap node-qs node-read
  node-read-package-json node-request node-retry node-rimraf node-semver node-sha
  node-slide node-spdx-correct node-spdx-expression-parse node-spdx-license-ids
  node-tar node-tunnel-agent node-underscore node-validate-npm-package-license
  node-which node-wrappy node-yallist
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 247 not upgraded.
```

# 結果
こんな感じでプロットされた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/9f3512c1-0b17-f7ec-8fb1-21e8ca4db1df.png)

3Dのグラフもいい感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/75db5e58-c090-5aff-b8d3-61edea40ff9f.png)


# おわりに
VNCでつないでも、ちゃんとグラフ表示されたし、しばらくこの環境で遊んでみようと思う。

# 参考
[Raspberry Pi　に Octave をインストール - もふもふす～ぷ](http://iziznomemo.blog.fc2.com/blog-entry-8.html)
[GNU Octave: Three-Dimensional Plots](https://octave.org/doc/v4.2.0/Three_002dDimensional-Plots.html)
Snapchatのボタンみたいにタップ中に大きくなるUIButtonの作り方

SnapChatみたいにフォーカス中だけ大きくなるUIButtonができたのでシェアします。

![GIFイメージ-F5CC3A238CB3-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/85ce29fd-7093-d500-4f85-fa59839dd1f3.gif)

`.touchDown` で大きくして、`.touchUpInside, .touchUpOutside, .touchCancel` で小さくします。

IBActionでタップイベントを定義せずに、

```swift
button.setOnClickListener {[weak self] in
    self?.thinkUnique()
}
```

みたいな感じで使います。

```swift
import UIKit

class MicroInteractButton: UIButton {
    private var clickListener: (() -> Void)?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        setupAnimation()
        adjustsImageWhenHighlighted = false
    }
    
    func setOnClickListener(_ completion: (() -> Void)?) {
        clickListener = completion
    }
    
    private func setupAnimation(){
        addTarget(self, action: #selector(pressed), for: [.touchDown])
        addTarget(self, action: #selector(released), for: [.touchUpInside, .touchUpOutside, .touchCancel])
    }
    
    @objc private func pressed(){
        expandAnimation()
    }
    
    @objc private func released(){
        shrinkAnimation()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.clickListener?()
        }
    }
    
    private func expandAnimation() {
        let expand = CASpringAnimation(keyPath: "transform.scale")
        expand.duration = 0.2
        expand.fromValue = 1
        expand.toValue = 1.3
        expand.autoreverses = false
        expand.repeatCount = 1
        expand.initialVelocity = 0.8
        expand.damping = 1.0
        expand.fillMode = kCAFillModeForwards
        expand.isRemovedOnCompletion = false
        layer.bounds = self.bounds
        layer.contentsGravity = "center"
        layer.add(expand, forKey: "expand")
    }
    
    private func shrinkAnimation() {
        let shrink = CABasicAnimation(keyPath: "transform.scale")
        shrink.duration = 0.2
        shrink.fromValue = 1.3
        shrink.toValue = 1
        shrink.autoreverses = false
        shrink.repeatCount = 1
        shrink.fillMode = kCAFillModeForwards
        shrink.isRemovedOnCompletion = false
        layer.add(shrink, forKey: "shrink")
    }
}
```

gistにあげてます。
https://gist.github.com/kboy-silvergym/62de6540ee61d879ca584e707719e171
LAN内で使用されているIPアドレスを調べる

# 前置き
小規模ネットワーク（家庭内とか）でLinuxのコマンド実行を想定

# コマンド

```zsh:IPアドレスを確認
#> CentOS6 & etc
ifconfig | grep inet                                                  
#192.168.99.xxx

#> CentOS7
ip r
# もしくは
hostname -i

#default via 192.168.99.xxx


# → 第1〜3オクテットの数値がわかればOK
```

```zsh:LAN内で使用されているIPアドレスを表示
# 適宜、第1〜3オクテット（X）の値を変更して実行
#echo XXX.XXX.X.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl

echo 192.168.99.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
```

>
[LAN内で使われているIPアドレスを調べる6つの方法(Linux/Windows) | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/05/lan内で使われているipアドレスを調べる6つの方法linuxwindows/)

## 自分のPCのIPアドレスを確認
```zsh
ifconfig | grep "inet " | grep -v 127.0.0.1

# CentOS7 なら
ip r
# もしくは
hostname -i
```
>
[MacでIPアドレスを確認する 4つの方法 - wikiHow](https://www.wikihow.jp/MacでIPアドレスを確認する)