OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7 requireとincludeの違い

# 環境
実行環境は, 

WSLのubuntu

OS: VERSION="18.04 LTS (Bionic Beaver)"

PHP: PHP 7.2.5-0ubuntu0.18.04.1 (cli) (built: May  9 2018 17:21:02) ( NTS ) 

# requireとincludeの違い

requireとincludeは, 外部ファイルを読み込む際に使うものです.

いろんなサイトを見ていると, 使い分けの基準が書いてありました.

基準も大事ですが, 今回は, 実際の挙動だけ見ます.

困ったら, 公式ドキュメント[php.net](http://php.net/)を読もう.

[requireの項目](http://php.net/manual/en/function.require.php)を見ると,,,

>require is identical to include except upon failure it will also produce a fatal E_COMPILE_ERROR level error. In other words, it will halt the script whereas include only emits a warning (E_WARNING) which allows the script to continue.

外部ファイルを読み込む時に, エラーの出し方が違うということ.

requireの場合は, スクリプトを止めてしまいます.

includeの場合, warningを出すだけです.

正しく成功したときは, 挙動は全く一緒.

実験してみましょう.

`nothing.php`をあえて作らず, 以下の二つのphpスクリプトを実行してみましょう.

```php:test_include.php
<?php
echo "Include nothing.php", PHP_EOL;
include 'nothing.php';
echo "failed to include it", PHP_EOL;
```

```php:test_require.php
echo "Require nothing.php", PHP_EOL;
require 'nothing.php';
echo "failed to include it", PHP_EOL;
```

`php test_include.php`をたたくと,

```
Include nothing.php
PHP Warning:  include(nothing.php): failed to open stream: No such file or directory in /var/www/test/test_include.php on line 3
PHP Warning:  include(): Failed opening 'nothing.php' for inclusion (include_path='.:/usr/share/php') in /var/www/test/test_include.php on line 3
failed to include it 
```

`include`に失敗しても, 次の行の`echo "failed to include it", PHP_EOL;`は実行されています.

次に, 

`php test_require.php`をたたくと,

```
Require nothing.php
PHP Warning:  require(nothing.php): failed to open stream: No such file or directory in /var/www/test/test_require.php on line 3
PHP Fatal error:  require(): Failed opening required 'nothing.php' (include_path='.:/usr/share/php') in /var/www/test/test_require.php on line 3 
```

Fatal error(致命的なエラー)が, 起きて死にましたね.

`echo "failed to require it", PHP_EOL;`は実行されていません.

ということでした.

perlのように, 外部ファイルを読み込む方法がいくつかあり, それぞれ少し違うといったことはないようです.
AWS の支払いを請求書支払い(海外送金)に変更してみる

# ０．はじめに

諸事情あって、請求書支払い(海外送金)に変更しないといけなかったので、
その時の手続きなど、シェア。

因みに、
請求書支払い(海外送金)に変更するにはいくつか条件がある様なので、注意が必要です。

* 送金手数料はお客様負担
* 過去に一定金額(月平均で$2000)以上のご利用料がある
* 請求書払いをご利用の場合、ドル建てでのお支払いのみ

など

* ※参考：
    * [AWSの支払いをカードから請求書払いに変える \- aws memo](http://understeer.hatenablog.com/entry/2012/02/01/205912)

# １．AWS サポート(ウェブサポート)へ、請求書支払いへの変更の連絡を入れる。
1. AWS サポートのコンソールへアクセスし、ケースを作成し、請求書支払いへの変更を依頼します。
    * [AWS サポートダッシュボード](https://console.aws.amazon.com/support/home)
<br><br>
1. AWS サポートから、請求書支払いに変更する際に必要な情報の提供を求められるので、調べて返信します。
    * Company Name(会社名):
    * Contact Name(担当者名):
    * Contact Phone for Invoice(担当者電話番号):
    * Contact Email for Invoice(担当者メールアドレス):
    * Address to send Invoice to(インボイス送付先住所):
    * Zip(郵便番号):
    * <b><font color=red>※ 因みに、すべて半角英数字で記載する必要がありますので、注意!!</font></b>
<br><br>
1. AWS サポートから、変更完了と今後の手続きに関して案内が届きます。
    * <b><font color=green>※ 以降に記載する内容は、こちらに詳細な記載があります。</font></b>

# ２．請求書が発行されてから 30 日以内に、送金する。
1. AWS Billing のコンソールへアクセスし、確定した請求書を確認します。
    * [Billing Management Console](https://console.aws.amazon.com/billing/home?#/bills)
<br><br>
1. 送金先や金額を確認したら、任意の金融機関から海外送金します。手続きや窓口は、金融機関によって異なるみたいなので、事前に確認しておいた方が良いかもしれません。
    * あと、複数の請求書を一括でまとめて送金しても問題ないみたいです。

# ３．AWS の海外送金受領窓口(メール)へ、送金後の連絡を入れる。
1. 所定のファイルをダウンロードして、今回送金した請求に関する情報をファイルに記載します。
    * Customer name : 名前
    * Payment Day : 送金日
    * AWS Account ID : AWS のアカウント ID
    * Invoice Number & Amount : 今回送金した請求書 ID と金額
    * <b><font color=red>※ おそらく、すべて半角英数字で記載する必要があります。</font></b>
<br><br>
1. ファイルに必要な情報を記載したら、AWS の海外送金受領窓口宛へメールを送ります。
    * タイトル : Payment Notification – [Month] [Year] – Account [AWSアカウントID]
        * 例 : Payment Notification – June 2018 – Account ************
    * 本文
        * AWS Customer Name : 名前
        * AWS Account ID : AWS のアカウント ID
        * Email address : メールアドレス
        * The total amount : 送金金額
        * SWIFT Code : 送金元の金融機関の SWIFT コード
            * [日本の金融機関のSWIFTコード一覧 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E9%87%91%E8%9E%8D%E6%A9%9F%E9%96%A2%E3%81%AESWIFT%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7#%E5%9C%B0%E6%96%B9%E9%8A%80%E8%A1%8C_(0100%E7%95%AA%E5%8F%B0))
        * <b><font color=red>※ おそらく、すべて半角英数字で記載する必要があります。</font></b>
    * 添付ファイル
        * <b><font color=red>※ 作成したファイルを添付するのを忘れずに!!</font></b>

# ９９．ハマりポイント

* 基本的には、英語・ドルでのやりとりなので慣れておらず、本当にあっているのか不安になります…。
<br><br>
* また、海外送金などしたことがないので、どこで海外送金すれば良いのか戸惑いました。金融機関によっては、窓口が決まってたりするみたいですね。
<br><br>
* ただ、AWS サポートから手続きのやり方を全て教えて頂けるので、それ通りにやれば問題無く出来ると思います。

# ＸＸ．まとめ

とりあえず、
今回は諸事情あって請求書支払いをすることになりましたが、どう考えてもクレジット支払いの方が便利ですね。

因みに、
逆に、請求書支払いからクレジット支払いに変更する際は、AWS サポートからケースで依頼すればやってくれるみたいです。
TypeScriptでReactを書く際のReact.Component<>の<>に関して

# TypeScriptでReactを書く際のReact.Component<>の<>の中身
TypeScriptでReactを書いているコードを読んでいる時によく出会う
こんなコードの


```typescript:test.tsx
class Test extends React.Component<any, any> {
}
```

この中のこれ

```tsx
React.Component<any, any>
```

の

```tsx
<any, any>
```

ってなんやねんと思っていました。
ジェネリクスっぽい...と軽く思っていましたがReact.Componentにくっついてたらどういう意味があるの？と
ずっとモヤモヤしていた中[この記事](https://charleslbryant.gitbooks.io/hello-react-and-typescript/content/TypeScriptAndReact.html)に出会って解決したので書いておこうと思います。


# `<any, any>`はPropsとStateの型定義を示している！


```tsx
React.Component<any, any>
```

だったからわかりにくかったんです。
実際には第1引数はpropsの型、第2引数はstateの型を表しています。
`<any, any>`と書くと文字通り「propsもstateもどんな型でもいけるよ!」と表しているだけで

これは

```tsx
interface MyProps {
   value: string
}

interface MyState {
   somevalue: string
}

class test extends React.Component<MyProps, MyState> {
}
```

というような感じでインターフェイスを使って
PropsとStateの型付けをするために使えます。


何か間違いがありましたら教えていただけると嬉しいです！
Web制作をしていく上で役立ちそうなめも

# はじめまして
主に自分用のメモになります
Web製作を学習していく時に使ったもの・使いたいと思っている便利なサービスまとめ
他にもおすすめなものがあれば教えてくださると助かります。

## 共有系
###[CODEPEN](https://codepen.io/)
![CodePen.png](https://qiita-image-store.s3.amazonaws.com/0/244573/cd27dd37-2eab-d5d0-7d2c-1ddcace4653b.png)
オンラインテキストエディタですね。どこでも使えて気軽に編集、共有できるのがいいですね
私は自分用のスニペット集としてや、他の方のコードをみて参考になりそうなものを探すのに使ってます。

###[Qiita](https://qiita.com/)
![Qiita.PNG](https://qiita-image-store.s3.amazonaws.com/0/244573/cb79901f-c2a2-4b52-3695-8e9088b495c4.png)
ここですね。皆様のいろんな記事をみて勉強していこうと思ってます。

## ツール
###[Thimble](https://thimble.mozilla.org/ja/)
![Thimble.png](https://qiita-image-store.s3.amazonaws.com/0/244573/ba47562c-8e17-7fc2-e664-e13206972382.png)
オンラインテキストエディタです。シンプルで見やすく
レスポンシブプレビューやJavaScriptのオンオフがスイッチで切り替えられるのもいいですね。

###[Liveweave](https://liveweave.com/)
![Liveweave.png](https://qiita-image-store.s3.amazonaws.com/0/244573/1e1c8e78-e9bd-7b9f-03d6-a6fb9cdd6efa.png)
オンラインテキストエディタです。４分割された画面が特徴的で、
カラーパレットやベクター画像の生成もできるのが便利ですね。

###[STUDIO](https://studio.design/ja)
![STUDIO.PNG](https://qiita-image-store.s3.amazonaws.com/0/244573/7e695140-662b-fe21-6f17-2aef56aacd9e.png)
デザインツールです。ボックスを配置していくことで簡単にWebサイトのレイアウトを組むことができます。

###[Clippy](https://bennettfeely.com/clippy/)
![Clippy.png](https://qiita-image-store.s3.amazonaws.com/0/244573/2214f3b2-2430-9372-82f9-b4d458164d40.png)
CSSで好きな画像を自由自在に成型できるやつです。複雑な形もできるのでいじってるだけでも楽しいです。

###[CSSynth](http://bennettfeely.com/cssynth/)
![CSSynth.png](https://qiita-image-store.s3.amazonaws.com/0/244573/cddc2a67-9e02-815e-85dc-68c4e2398586.png)
アニメーションをオンラインで実行できるアプリケーションです。
実行結果のCSSをCODEPEN上に出力できるので複雑なアニメーションを手軽に実装するのに便利です。

## サイト
###[Webクリエイターボックス](https://www.webcreatorbox.com/)
web製作やってみようと思った時に一度は目にしたことがあると思われる
Twitter 人気つぶやきの記事が毎週楽しみです。

###[NxWorld](https://www.nxworld.net/)
サイトデザインに役立つ情報を発信してくれています
Monthly Bookmarksのコーナーがとても好きです。

###[コリス](https://coliss.com/)
フリーのフォントや写真素材等のこれ欲しかった！みたいなやつを更新頻度高めで紹介してくださっている。

###[note](https://note.mu/)
デザイナーさんの日記みたいなやつを読むのが好きです。
Function Computeで`TypeError: stream.on is not a function`

Function Computeのチュートリアルを実行している途中502 UnhandledInvocationErrorで詰まりました。

https://jp.alibabacloud.com/help/doc-detail/71229.htm

ログを見るとこんなエラーが出ていて、[raw-body](https://github.com/stream-utils/raw-body/blob/master/index.js)でコケているみたいです。

```
FC Invoke Start RequestId: c3c1871c-8a39-9acc-144e-7a9a20d0d4e2
2018-07-04T05:00:57.370Z c3c1871c-8a39-9acc-144e-7a9a20d0d4e2 [error] TypeError: stream.on is not a function
at readStream (/usr/local/lib/node_modules/raw-body/index.js:190:10)
at getRawBody (/usr/local/lib/node_modules/raw-body/index.js:108:12)
at module.exports.handler (/code/test_http.js:20:3)
FC Invoke End RequestId: c3c1871c-8a39-9acc-144e-7a9a20d0d4e2
```

さて、ではこの`request`を見てみましょう。handlerの先頭にconsole.logを仕込んでaliyunコンソールから実行してログを見ます。

```
2018-07-04T05:28:56.214Z e8d3fcb6-9a71-efc0-e7b6-a1722afda2eb [verbose] <Buffer 22 7b 5c 6e 20 20 5c 22 6b 65 79 5c 22 3a 20 5c 22 76 61 6c 75 65 5c 22 5c 6e 7d 22>
```

[HTTPトリガーインターフェイス](https://jp.alibabacloud.com/help/doc-detail/71229.htm?spm=a21mg.p38356.b99.33.fd9e328694PmRh#interface)のオブジェクトが欲しいのに、なんか違うのが入ってますね。

Bufferだったのでとりあえず`toString()`してみます。

```
2018-07-04T05:35:56.884Z 94236568-9921-16dc-9638-72e013488549 [verbose] "{\n \"key\": \"value\"\n}"
```

なんか出てきました。テスト用のイベントのJSONをStringifyしてBufferにしたものがrequestに入っているようです。

これはOSSをトリガーにした時と同じ形式ですね。。。

# 結論
HTTPトリガーの作成忘れでした。
Function Computeで`Error: invalid arguments: /fc/world. Function must be created under service`

Function Computeのチュートリアルを実行中に以下のエラーが出ました。

https://jp.alibabacloud.com/help/doc-detail/51783.html

```sh
function_compute > fcli shell
Welcome to the function compute world. Have fun!
>>> mkf world -h hello_world.handler -d code -t nodejs6
Error: invalid arguments: /fc/world. Function must be created under service
```

`cd demo`を実行し忘れていました。

```sh
function_compute > fcli shell
Welcome to the function compute world. Have fun!
>>> pwd
/fc
>>> cd demo
>>> mkf world -h hello_world.handler -d code -t nodejs6
>>> 
```

`mks`が`make service`、`mkf`が`make function`ですね。
アップルとGoogleのディベロッパー登録に必要な項目まとめ

iOSアプリやAndroidアプリをリリースするためには、ディベロッパー登録が必要です。今回は、登録に必要な情報を簡単にまとめました。

## アップル編

[Apple Developer Program](https://developer.apple.com/jp/programs/)

### 登録に必要なもの

- 2ファクタ認証を有効にしたApple ID（ディベロッパー登録用に、新しく責任者のIDを作成する）

- 担当者情報
名前
電話番号（国番号＋電話番号）・内線番号（なければ空白）
住所
郵便番号
- 担当者情報（ローマ字表記）
名前
住所
郵便番号

- クレジットカード

- D‑U‑N‑S番号

D‑U‑N‑S番号は、標準的な企業識別情報としてDun & Bradstreetによって割り当てられる9桁の固有の番号です。
[株式会社東京商工リサーチ［TSR］](http://www.tsr-net.co.jp)にD‑U‑N‑S Number検索サービスがあるので、こちらで取得ずみかどうかを検索することができます（自社の番号を検索する場合は無料ですが、他社の番号を検索するときは有料です）。
登録されていない場合は、アップルのディベロッパーサイトから申請して番号を取得できます（[株式会社東京商工リサーチ［TSR］](http://www.tsr-net.co.jp)が提供する有料の代行サービスもあります）。

- Webサイト

自社のWebサイトです。
アップルさんによる定義は以下の通りです。

> 組織を正しく表現するドメイン名を使い、一般に公開されているWebサイト。


- 法人のステータス

アップルさんと契約を締結できる法人である必要があるそうです。

> Apple Developer Programに登録するには、その組織がAppleと契約を締結できる法人である必要があります。DBA、架空事業名、商号、支店名では登録できません。法人名は、App StoreおよびMac App Storeで配信するアプリケーションの「販売元」として表示されます。例：「販売元：ABC株式会社」

- 法的拘束権

ディベロッパープログラムに登録する担当者は、誰でもいいわけではありません。権限がある人を担当者にしましょう。

> Apple Developer Programに組織を登録する担当者は、組織を代表して法的な契約を交わす権限を有している必要があります。また、その担当者は、組織の経営者／創立者、上級管理者、上級プロジェクトマネージャ、上級社員から法的権限を付与された人である必要があります。

### 参考

[【2016年最新版】わかりやすく徹底解説！Apple Developer Programへの登録手順（個人） - 夜更かし工房](http://unitynightowlgames.hatenablog.com/entry/2016/09/23/110949)

## Google編

[Google Play Console](https://play.google.com/apps/publish/signup/)

### 登録に必要なもの

- Googleアカウント（ディベロッパー登録用に、新しく責任者のIDを作成する）

- クレジットカード

- 電話番号

- ディベロッパープロフィール
ディベロッパー名
メールアドレス
ウェブサイト
電話番号

### 参考

[Google Playデベロッパー登録手順（2016年11月まとめ版） | ntの備忘録](https://blog.integrityworks.co.jp/2016/11/21/post-2631/)
Node-RED+Watson VR+ICOS連携補足資料 

補足資料。

IBM Cloud Object Straoge(ICOS)は資格情報のバインドでは正しくObjectStorageに保管できなかった。以下手順が必要。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/924aac06-a96a-2891-bfaf-d5ef1a2dee26.png)

インラインの構成パラメータの追加に必ず以下を入れる。

```json
{"HMAC":true}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/4172edf0-a34c-4b20-48c8-81c4148eeb7d.png)

資格情報の表示を行う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/4081a3c1-15c7-d82c-760d-98da4da354e8.png)

cos-putノードの編集をひらいて、
Bucket名は手動で入れる。WatsonStudioのObjectStorage領域を使う場合は、
ここでそのバケット名を入れる（自動生成のものはdonotdeleteと文字が入っている)

> 画像認識のために撮影した画像を学習素材として再ラーニングすることができるかは未調査


Storage-Configurationの横の鉛筆ボタンをクリックし、下記表を参考にJSONデータからデータの値を切り出してコピペする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/327e0012-616f-1b03-ba66-7f7d8456be8a.png)

|設定項目名|資格情報から取得する情報|
|:--|:--|
|Application Key ID|apikeyの中身|
|Service Instance ID|iam_serviceid_crnの、ServiceId-から始まる文字列|
|Use HMAC credentials|チェックをいれる|
|Access Key ID|cos_hmac_keys->access_key_idの中身|
|Access Key|cos_hmac_keys->secret_access_keyの中身|

上記表を参考にJSONデータからデータの値を切り出してコピペ刷る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/77da4848-ed64-be41-74fb-0aac1fd7f3d9.png)

------------
もろもろ補足を限定公開のつもりが、一般公開していることに気づきました（＠＠
とりあえずこのままにするか・・・
HTTPでFCM　Push通知送信方法（legacy http server protocol）

Firebase Cloud Messaging HTTP Protocol
https://firebase.google.com/docs/cloud-messaging/http-server-ref

PowershellでFCM　Push通知送信

```
$SERVER_KEY='abc...'
$DEVICE_TOKEN='123...'

$JSONBODY=@"
{
    "to": "${DEVICE_TOKEN}",
    "data": {
        "url": "https://yahoo.jp"
    },
    "notification": {
        "title": "a title",
        "body": "a test message"
    },
    "priority":10,
    "mutable_content":true
}
"@

$AuthHeader=@{'Authorization'="key=${SERVER_KEY}"}
$Url= 'https://fcm.googleapis.com/fcm/send'
$Response=Invoke-RestMethod -Verbose -Method Post -Uri $Url -Headers $AuthHeader -ContentType "application/json" -Body $JSONBODY

$Response
```
SQLで今日から半年前・半年後のDATETIMEを取得する

たまに条件として使うことがあるので、備忘録として。


##今日から半年前の00:00:00
```
CURDATE() - INTERVAL 6 month + INTERVAL 0 second;
```
例）今日が2018年07月04日の場合、**「2018-01-04 00:00:00」**

##今日から半年後の00:00:00
```
CURDATE() + INTERVAL 6 month + INTERVAL 0 second;
```
例）今日が2018年07月04日の場合、**「2019-01-04 00:00:00」**

##今日から半年後の23:59:59
```
CURDATE() + INTERVAL 6 month + INTERVAL 1 day - INTERVAL 1 second;
```
例）今日が2018年07月04日の場合、**「2019-01-04 23:59:59」**
LightGBM/XGBoostをAnaconda経由で簡単にインストールする方法

KaggleなどではやっているLightGBMやXGBoost。
公式の通りにインストールしようとしたけどうまくいかなかったので、
Anaconda経由でインストールしたら大分簡単だった件。

公式通りだとこちら↓
初心者だとよくわからないし面倒くさいですよね。
https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html

## **Anaconda経由でインストールする方法**

本題ですが、
コンソールにて以下コマンドを実行するだけ。
`conda install -c conda-forge lightgbm`
`conda install -c conda-forge xgboost`

確認が入るので`y`を押してEnter。
何の問題もなくインストールできました！
私はAnaconda Promptから実行しました。

MacでもWindowsでも同じ方法でいけます。

Anacondaが入っていない人はAnacondaを先にインストールしてくださいね。
他のライブラリも簡単にインストールできるので、機械学習をしたい人にはお勧めです。
During handling of the above exception, another exception occurredの対処法

以下のエラーがJupyterで出てしまった時の対処法

```
KeyError:
During handling of the above exception, another exception occurred:
```

AnacondaをインストールしたばかりのPCでは問題なく動作するコードに対し、
数か月前にインストールしたPCでは動かず...

色々ネットで調べたところ、Pandasのバージョンアップをすると解決するらしい。

というわけで、Anaconda経由でアップデートしてJupyter Notebookを再起動したら直りました。

Anacondaのアップデート方法はこちら↓

[Anacondaのアップデート方法 - Qiita](https://qiita.com/i_jp/items/7f1bc432b262b11ff8fc)
Anaconda経由でAnacondaやPandas、numpyなどのパッケージをアップデートする方法

以下のコマンドをコンソールから打つ。
私はAnaconda Promptを使ってます。

## **Anaconda自体のアップデート**

`$ conda update -n base conda`

## **Anacondaの全パッケージのアップデート**

`$ conda update --all`

## **Anacondaの特定のパッケージのアップデート**

`$ conda update pandas`

pandasの部分を任意のパッケージにすればOK
GitHub for Xcode9

##GitHubアカウント作成

[GitHub](https://github.com)にてアカウントの作成。
Sign up for GitHub ボタンを押し、ユーザ名とパスワードを設定、アカウントの作成を行う。

##ターミナルにてSSHを作成
~~~
$ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/名前/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/名前/.ssh/id_rsa.
Your public key has been saved in /Users/名前/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:####################### 名前@######.local
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
~~~
枠の中には謎の文字が入る。

##GitHubに公開鍵を登録する
~~~
$cd /Users/名前/.ssh
$cat id_rsa.pub
ssh-rsa AAAA#####################
~~~

>なぜか移動してからやりましたが、cat パス指定で大丈夫

ssh-rsaを含め出力された文字列をコピーしGitHubに移動、
右上のアイコン→Setting→Personal settings一覧のSSH and GPG keysを選択。
NewSSHkeyより公開鍵を登録。
その後メールが届くので確認をする。

##Xcodeにて
管理したいプロジェクトを開く(ViewControllerやStoryboardなどが出てる画面)
画面上部にあるXcodeからPreferences→Acounts→左下の＋からアカウントを登録

登録が完了したらSourceControlからCreate Git Repositoriesを選択。
リポジトリの登録が完了したら
![スクリーンショット 2018-07-04 13.57.03.png](https://qiita-image-store.s3.amazonaws.com/0/185455/ae3522cc-8683-e9a1-fd68-032b81a82672.png)
こんな四角マークのところにファイルが追加されている。

これをクリックして展開しRemotesを２本指タップ
![スクリーンショット 2018-07-04 13.59.00.png](https://qiita-image-store.s3.amazonaws.com/0/185455/eb70087d-402a-6774-8e52-30d84c1c9239.png)

gitに管理するリポジトリを作成するためCreate " " Remote on GitHub を選択
すでにリポジトリはある場合はその下のAdd Existing Remote を選択

これでリポジトリの作成までは完了

##残りはPushのみ
再びSourceControlからPushを選択(Commitはリポジトリ作成時に多分されているはず)
Push後確認をしてみる。

![スクリーンショット 2018-07-04 14.06.05.png](https://qiita-image-store.s3.amazonaws.com/0/185455/5c5833a8-b41b-0abb-625b-e6d123876727.png)

おし！
あとは修正のたびにcommitしてpushするいつもの流れなので楽です。
Xcode9からgitが使いやすくなった気がする。

何か間違え等ありましたらご指摘おねがいします。
以上です。。。
TwitterAPIとMeCabを使って「疲れ指数」測定器を作ってみる

# 1. 何をするの？
自分のツイートを解析して、「疲れ指数」を計算するような簡単なプログラムを作りながら、TwitterAPIとMeCabをサクッと試してみましょう。

・TwitterAPIで自分のツイートを取得
・MeCabでツイートを分かち書き（形態素ごとにリスト化）
・「疲」「しんどい」「眠」といった文字列がどれくらいあるかを出力する（「疲れ指数」）

ちなみに、MeCabを使わずともTwitter APIだけで似たようなものは作れます。ではなぜMeCabを使うのかというと、例えば
「疲れた疲れた疲れた」
といったようなツイート（少し心配になりますね）を単にstrとして受け取って「疲」が含まれているかどうかを判断すると、値として１を返すのですが、MeCabを使うと
「疲れた」「疲れた」「疲れた」といった風に分かち書きしてくれるので、カウントが3になり、より正確な「疲れ指数」を計算できるようになるのです。

~~また、MeCabを使うと「自然言語処理」をやったというなんとなくかっこいい体験をした気になれておすすめです。~~

# 2. Twitter APIとMeCabの準備
まずはTwitter APIとMeCabを使えるようにしましょう。
・Twitter APIはこちら
https://qiita.com/bakira/items/00743d10ec42993f85eb
・MeCabはこちら
https://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd

基本的にこちらの素晴らしい記事の通りに進めていただければ導入できると思います。私の環境は
MacOS High Sierra 10.13.5
Python 3.6.4
でした。

# 3. ソースコード

```tsukare_analysis.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json, config #標準のjsonモジュールとconfig.pyの読み込み
from requests_oauthlib import OAuth1Session
import pandas as pd
import sys
import MeCab

#config.pyにAPIキーを書いておく。
CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理

url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

#調べる対象
keywords = ["疲", "しんどい", "眠"]

params = {}

# OAuth で GET
twitter = OAuth1Session(CK, CS, AT, ATS)
res = twitter.get(url, params = params)


text_list = []

if res.status_code == 200: #正常通信出来た場合
    timelines = json.loads(res.text) #レスポンスからタイムラインリストを取得
    for line in timelines: #タイムラインリストをループ処理
        text_list.append(line['text'])
else: #正常通信出来なかった場合
    print("Failed: %d" % res.status_code)


print("最近のツイートを表示します。")
for text in text_list:
    print(text)

m = MeCab.Tagger("-Owakati") #分かち書きします
keitaiso_list = []
for text in text_list:
    keitaiso_list.extend(m.parse(text).split(" "))

number = 0
for keitaiso in keitaiso_list:
    for key in keywords:
        if key in keitaiso:
            number += 1

print("あなたの疲れ指数は:")
tsukare = number / len(text_list)
print(tsukare)
```

・Twitter APIの部分はほぼコピペです（）
・自分の直近のツイートを取得し、形態素で分かち書き
・「疲」「しんどい」「眠」というキーワードが総ツイート数に対しどれくらいあるかを計算します。
・つまり「疲れ指数」は１ツイートに平均どれくらい疲れてそうな言葉が入っているかを表します。１を超えたりするとやばそうです。

私の公開アカウント（@k_o2o_k)で何個かツイートして分析したところ、こうなりました。
<img width="612" alt="c75ec7fc049f4112522c4b3348fa9147.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/206583/c738f007-fae5-382a-bf84-dfbe5adee4c5.jpeg">


# 3. 発展・拡張

今回は「疲れ指数」を調べましたが、キーワードを「ビール」「焼酎」「飲み」「宴会」などとすれば、「飲み過ぎ指数」も計算できそうです。自分なりにカスタマイズしてみましょう。

```
keywords = ["ビール","焼酎","飲み","宴会","二日酔い"]
```

また、いくつかの指数を柔軟に調べられるようにプログラムを拡張することもできます。if構文を使ってkeywordsを変えられるようにしましょう。例えば冒頭にこういったコードを付け加えるといいと思います。

```
print("何について調べますか？→「疲れ」「飲み過ぎ」")
target = input(">>")
if target == "疲れ":
    keywords= ["疲", "しんどい", "眠"]
elif target == "飲み過ぎ":
    keywords = ["ビール","焼酎","飲み","宴会","二日酔い"]
else:
    print("「疲れ」「飲み過ぎ」の中から選んでください")
```

この場合は、最後の「あなたの○○指数は」の部分も変更できるようにしておくことを忘れずに。

あとは、疲れ指数の値によって、異なるコメントを返すなど、色々拡張できそうです。

次はこれをウェブ上で使えるようにしてみたいと思います！
Ansible | when で true / false を判定する

`boolean` の値をそのまま `when` に渡すだけで良い。
否定でマッチさせる場合は `not` を付ける。

ちなみに `is true` / `is false` などとは書かない。


# playbook の例

```yaml
- hosts: localhost
  tasks:
    - set_fact:
        true_variable: true
        false_variable: false

    - debug:
        msg: "when true"
      when: true_variable
    
    - debug:
        msg: "when not false"
      when: not false_variable
```


# 実行例

```bash
$ ansible-playbook -i ~/development playbooks/when.yml

TASK [set_fact] *********************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "when true"
}

TASK [debug] ************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "when not false"
}


```

# 環境

- ansible 2.6.0








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rust playground でライブラリを使う

https://play.rust-lang.org

では下記のいずれかの条件を満たした crate をインポートして使うことができます。

* crates.io で最もよくダウンロードされている上位100位 - https://crates.io/crates?sort=downloads
* rust-cookbook で使われいるクレート - https://rust-lang-nursery.github.io/rust-cookbook/
* それらの依存関係のクレート


futures + tokio_core を使った例です - https://play.rust-lang.org/?gist=9d639631527653dee35c1f4174497c62&version=stable&mode=debug&edition=2015

```rust
extern crate futures;
extern crate tokio_core;

use std::time::Duration;
use futures::prelude::*;
use tokio_core::reactor::Core;
use tokio_core::reactor::Timeout;

fn main() {
    println!("tokio_core");
    let mut core = Core::new().unwrap();
    let handle = core.handle();
    core.run(
        Timeout::new(Duration::from_secs(1), &handle).unwrap()
            .and_then(move |_|{
                println!("1");
                Timeout::new(Duration::from_secs(1), &handle).unwrap()
                    .and_then(move |_|{
                        println!("2");
                        Timeout::new(Duration::from_secs(1), &handle).unwrap()
                            .and_then(move |_|{
                                println!("3");
                                futures::future::ok(())
                            })
                    })
            })
            .map_err(|err| println!("{:?}", err) )
    ).unwrap();
    println!("end");
}
```

残念ながら [rust の非同期 IO ライブラリ tokio-core と tokio runtime と actix 0.5 と actix 0.6 でタイマーの比較](https://qiita.com/DUxCA/items/8ab8693e3ae3078fab24) で多様した mdo は含まれていないので↑のように手動でマクロ展開する必要があります。

 ~~すごいライブラリ作って上位100位に入って mdo を依存関係に入れれば使えるようになる~~ 

ace エディタがスマホから入力するのが辛い問題はありますが、ちょっとした挙動の検証に何かと便利なのではないでしょうか。

## 参考

* その他の情報はこの help ページで見れます - https://play.rust-lang.org/help
Goで本質的に並列な関数型言語つくった

# その名はCloe

## TL;DR

- 本質的に並列な関数型スクリプト言語を作った
- 計算の並列度を部分的に変更可
- データ競合は一切起こらない（副作用は例外）
- 開発言語はGo
- GILなんて要らなかった

## ソースコード・ドキュメンテーション

- [GitHub](https://github.com/cloe-lang/cloe) （いいねお願いします!）
- [Webサイト&ドキュメント](https://cloe-lang.org)

## 例

### Hello, world!

```clojure
#!/usr/bin/env cloe

(print "Hello, world!")
```

### HTTPサーバ

```clojure
#!/usr/bin/env cloe

(import "http")

(def (handler request)
  ((@ request "respond") "Hello, world!"))

(let requests (http.getRequests ":8080"))

..(map handler requests)
```

## 背景

世の中に色々なプログラミング言語がありますが、これぞ理想の言語！みたいなのは中々出会えません。理由としては、

- 設計がボトムアップ
    - 他の古い言語を改善することで新しい言語を作る
    - 例：機械語 -> アセンブリ -> C -> C++ -> Rust
- 理想の言語って何？
    - 考えることが多い：構文、セマンティクス、型システム、パラダイム（オブジェクト指向、関数型等）
    - そんなもの設計できたら苦労しない
- そもそもドメイン毎に最適なプログラミング言語が違う

ということで以下の点に注目してプログラミング言語を設計・実装しました。

- レスポンシブなプログラム（後述）が簡単に書けるようにする
- トップダウンで設計
    - 理想の言語について考えるのは諦める
    - 理想のプログラムのモデルを先に考える
    - それを実現する言語を設計
- 並列・並行処理もほぼ自動化
    - データ競合とか面倒なのもランタイムで隠したい
- 簡単な言語仕様

## 理想のプログラム

言語の設計をする前に、レスポンシブなプログラムとして理想的なモデルをまず先に考えました。

### レスポンシブ性

レスポンシブなプログラムとは応答性の良いプログラムを表します。プログラムがある時点である入力を与えられたとき、なるべく速く出力を返したいわけです。例でいうと、タイピングゲームでユーザがキーを押したとき瞬時に画面に結果を反映できれば、応答性が良いということになります。

### モデル

一言で言うと、プログラムの入力をプログラムが行う行動に変換する一つの関数としてプログラムを表現し、各行動を並列に評価することでレスポンシブなプログラムの実行を実現しています。より詳細な説明は[こちら](https://cloe-lang.org/overview/concept)。

## 実装・ランタイム

### ホスト言語

実装はGo言語で行いました。Goの良い点は、そこそこ速くて、並列処理が簡単に書けて、言語仕様が簡単なところです。ちょっとスクリプト言語実装しようかなみたいな場合にオススメです。

### ランタイム

ランタイムのベースはHaskellとその並列処理ライブラリです。関数型言語的な特徴としては、遅延評価で純粋関数を使ったプログラミングが基本となっており、ここもHaskellとよく似ています。ここでは詳しく書きませんが、アカデミックには並列グラフ簡約と呼ばれる方法でプログラムの実行を行っています。プログラムをDAGとして表現し、そのグラフの各部分を並列に評価することで本質的に並列なプログラムの実行が可能になります。データ競合は基本的にこの処理の中でしか起こらないので、プログラマは並列処理に関わるデータコラプションやデッドロック等に気を使うことがありません。

また、計算の並列度は`par`と`seq`という関数によって自由に変えられるようになっています。前者は引数を全て並列に評価し、後者は引数を順々に評価します。

## 型システム

基本的にJSONに関数が加わったような型システムで動的型付けです。静的型付けでないのは、自分が型推論の処理を書けないからです。関数の宣言の仕方や引数の渡し方はPythonを参考にしてあります。

## パフォーマンス

現在のところ、これについて書きたくないレベルで遅いです。1万件のクイックソートで約1.2秒かかっているので何とかしたい。ただ最適化の余地はかなり残っているので今後改善していく予定です。改善策としては、

- VM化
    - 現在はAST的なものを関数実行の度にトラバース
- ビルトイン関数をなるべくGoで書く
- 関数内での無駄なメモリ割当を防ぐ
    - 遅延処理をいいことに余計な関数まで呼んでいる
- その他ヒープ割当の削減
    - クイックソートのベンチマークを見てもGCでかなりの時間を取られている

等を考えています。

## 今後

流石にGoで開発していると色々自由が効かなくて困ったりします。Cでのユニオンはインターフェースで実現しないといけなかったり、最適化の点で様々な制限があります。本当はRustで書きたいのですが、Rustはまだ非同期プログラミングのサポートが弱いです。最近async/await構文がnightlyビルドにやっと入りましたが、メソッド等にはまだ使えません。Rustで書くとしてもおそらくそれらの機能が安定してからになると思います。

また、標準ライブラリももう少し充実させてスクリプト言語として常用できるレベルにはしたいです。JavaScriptのFlow的なものを作って静的型エラー解析できたら面白いかなーとも思います。前述したようにパフォーマンスも今後改善していく予定です。

## まとめ

- 並列・並行なプログラミング言語つくった
- 副作用を除きデータ競合無し
- ランタイムはHaskellを参考
- つくろうオレオレ言語

オレオレ言語自分も作りたい！みたいな人の参考になればと思います。
[Swift4] protocolでweak宣言が無視されている疑惑

Swift4.0でこんな実装をしていた。

```swift
protocol HogeView: class {
    weak var delegate: HogeViewDelegate? { get set }
}

protocol HogeViewDelegate: class {
    // delegate functions
}

class HogeViewController: UIViewController, HogeView {
    weak var delegate: HogeViewDelegate?

    // 以下VC実装
}
```

ところが、このプロジェクトをXcode9.4.1で開いたところ

`'weak' should not be applied to a property declaration in a protocol and will be disallowed in future versions`

という警告が出るように

調べてみると、
[[SE-0186] Remove ownership keyword support in protocols](https://github.com/apple/swift-evolution/blob/master/proposals/0186-remove-ownership-keyword-support-in-protocols.md)
ということで`protocol`で`weak`なプロパティが宣言できなくなる模様。

そこでちょっと気になったので
<details><summary>Swift4.0でこんなコードを書いてみた。</summary><div>

```swift
//: Playground - noun: a place where people can play

import Foundation

class A {}
extension A: CustomDebugStringConvertible {
    var debugDescription: String {
        return "A(\(Unmanaged.passUnretained(self).toOpaque()))"
    }
}

protocol P: class {
    weak var weakVar: A? { get set }
}

class B: P {
    weak var weakVar: A?
}
extension B: CustomDebugStringConvertible {
    var debugDescription: String {
        return "B(\(Unmanaged.passUnretained(self).toOpaque()))"
    }
}

var b: B = B()
print(b, b.weakVar.debugDescription)

b.weakVar = A()
print(b, b.weakVar.debugDescription)

print()

var p: P = B()
print(p, p.weakVar.debugDescription)

p.weakVar = A()
print(p, p.weakVar.debugDescription)
```

</div></details>

<details><summary>結果</summary><div>

```console
B(0x0000600000030600) nil
B(0x0000600000030600) nil

B(0x00006000000335c0) nil
B(0x00006000000335c0) Optional(A(0x0000600000008530)) <- !?
```
</div></details>

`P`型で宣言した変数の`weakVar`が`weak`になっていない...？

そう考えるとSwift4.1で`protocol`で`weak`宣言できなくなっても動きとしては変わらなそうだがはて... :thinking: 

# 追記

```swift
class A {
    deinit {
        print("deinit A")
    }
}

// 中略

var b: B = B()
print(b, b.weakVar.debugDescription)

b.weakVar = A()
print(b, b.weakVar.debugDescription)

print()

var obj: Any = b
if let p = obj as? P {
    print(p, p.weakVar.debugDescription)
    p.weakVar = A()
    print(p, p.weakVar.debugDescription)
}

print(b, b.weakVar.debugDescription)
```

<details><summary>結果</summary><div>

```console
B(0x00006000000273e0) nil
deinit A
B(0x00006000000273e0) nil

B(0x00006000000273e0) nil
B(0x00006000000273e0) Optional(A(0x0000604000003f10))
deinit A
B(0x00006000000273e0) nil
```
</div></details>

`protocol`でキャストしている間だけretainされている(スコープ抜けたらreleaseされてる)ようなので、循環参照問題は大丈夫と見ていいのかなー
[Atom] plantuml-viewer がうまく表示されない問題 [Mac]

リアルタイムで反映される PlantUML エディターとして Atom を使っているが、新しい Mac にインストールしたところ、うまく表示されなかった。
Atom を立ち上げて表示しようとした初回だけ、一瞬だけちらっと表示された後に消えるのだ。
解決策を調べたところ Java のバージョンを 8 にすれば問題なく表示されるとのこと。

`brew cask install java`

でインストールしていたので、

```
brew cask remove java
brew tap caskroom/versions
brew cask install java8
```

で Java のバージョンを 8 にすると表示されるようになった。

ただ悲しきかな[ER図](https://qiita.com/Tachy_Pochy/items/752ef6e3d38e970378f0)には対応していないようである。

追記: ↑ER図はこれでいける
[AtomのPlantUMLを最新化してみた備忘録](https://qiita.com/u4da3/items/658ea5eeb83c07ff201b#_reference-49093b743add6412a245)
kaminariで総ページ数を取得する場合は、total_pagesを使う。

以前、総ページ数を取得するメソッド名であった `num_pages` ですが、
`total_pages` に名前が変更されているようです。

`num_pages` が利用されている古い記事がわりと出てくるので注意が必要です。

参考：
https://obel.hatenablog.jp/entry/20170910/1505012432
https://github.com/kaminari/kaminari/issues/284
自作スクリプトでLAN内に不正接続する端末がないか監視する

# 概要

私は社内SEをしているのだが、

* 社内LANに管理外の端末が接続されていないかが不安だった
* ネットで探しても有料の製品しか見当たらなかった(調査不足の可能性はあり)

ということで、自作のスクリプトで管理外の端末が社内LANに入ってきていないか監視してみよう、と思い作ってみた。

# 監視スクリプトの作成

## 事前準備

管理PCのMACアドレスの一覧表があるのであれば、それを準備しておく。

## LXDでコンテナの起動

LXD上に監視スクリプトを動かすコンテナを作成する。
今回はUbuntu 18.04を`ARPMONITOR`という名前で作成。

作成後はコンテナに入る。

~~~
lxc launch ubuntu:18.04 ARPMONITOR
lxc exec ARPMONITOR /bin/bash
~~~

## 必要なパッケージのインストールと設定

以下はコンテナ上で作業する。
ARPの監視をするnetdiscoverと、メール通知のためのpostfixをインストール。
postfixは初期設定のままインストールを進める。

~~~
apt update && apt full-upgrade -y
apt install postfix netdiscover -y
~~~

各々の環境に応じて、postfixの設定ファイルを編集する。
私の環境ではGoogleのSMTPサーバを利用するようにした。
(`aspmx.l.google.com`はGmailまたはG Suite宛のみに送信可能)

~~~ /etc/postfix/main.cf(変更箇所)
relayhost = aspmx.l.google.com:25
~~~

設定ファイル編集後はpostfixのreloadを忘れずに。

~~~
systemctl reload postfix
~~~

## 監視スクリプトの作成

以下の内容のスクリプトを`/root/watch_arp.sh`として作成。
`NETWORK`に監視対象のネットワークを指定する。
その他、メールの差出人や宛先を各々の環境に応じて設定する。

~~~bash:watch_arp.sh
#!/bin/bash
IFACE="eth0"
NETWORK="192.168.10.0/24"
KNOWNMAC="/root/known_mac.txt"
FROM="postmaster@example.com"
TO="administrator@example.com"
TMP=`mktemp`
YYYYMMSSHHMMSS=`date "+%Y-%m-%d %H:%M:%S"`

if [ ! -f "${KNOWNMAC}" ]; then
  touch "${KNOWNMAC}"
fi

/usr/sbin/netdiscover -i ${IFACE} -r ${NETWORK} -P -N | uniq | while read i
do
  MAC=`echo ${i} | awk '{print $2}'`
  if [ "${#MAC}" -eq "17" ] ; then
    if ! `grep -q "${MAC}" ${KNOWNMAC}`; then
      echo ${i} >> ${TMP}
      echo ${i#* } ${YYYYMMSSHHMMSS} >> ${KNOWNMAC}
    fi
  fi
done

if [ -s ${TMP} ]; then
  /usr/sbin/sendmail -t << EOS
FROM: ${FROM}
TO: ${TO}
SUBJECT: ${NETWORK} NEW MAC ADDRESS FOUND - ${YYYYMMSSHHMMSS}

`cat ${TMP}`

EOS
fi

rm ${TMP}
~~~

このスクリプトの動作としては、`netdiscover`で取得したMACアドレスが、
既知のものかどうかを判定し、未知のものをメールで通知する、
という単純な動作をする。

事前準備の段階で、管理対象PCのMACアドレス一覧がある場合は、
あらかじめ`/root/known_mac.txt`に入れておけば、無駄にメールが送信されずに済む。
(netdiscoverと同じ書式になるように、MACアドレスの区切りにはコロン(:)、
大文字は小文字に変換しておく)

## crontabへの登録

あとはこの監視スクリプトが定期的に動作するように設定すればOK。

~~~
crontab -e
~~~

5分おきに起動する場合は下記。

~~~
*/5 * * * * /bin/bash /root/watch_arp.sh
~~~

# 動作例

新たなMACアドレスを持つ端末がLAN内で見つかると、
下記のような内容のメールが送信される。

一応、MACアドレスから得られるベンダー名も知らせるようにした。

~~~
20:c6:eb:0f:cb:23 PanasonicCorporationAVCNetworksCompany
~~~

# 注意点

管理対象PCと同じMACアドレスを持つように偽装された場合には検知できないのでご注意を。
ほかの不正端末検知製品でも同じだと思うけれど。
macOS 10.14 MojaveでVirtualBoxが動かなくて困った話

Mojaveのパブリックベータが公開されて、さっそくインストールしてダークモードを満喫してたのだけれど、VirtualBoxが動かなくて困った話。

macOS Mojaveもパブリックベータ公開。ダークモードが試せる！
https://www.gizmodo.jp/2018/06/mojave-pubbeta.html

## 追記

### 2018/10/24

@object1985 さんから「VirtualBox v5.2.14」をインストールすることで、macOS 10.14で動作するとコメントをいただきました。よかった^^

### 2018/09/26

Mojaveでインストールできる最新版がリリースされています。
検証はできていませんが、もしおハマりの方がいらっしゃれば、もしかしたら解決できるかもしれません。

Oracle、macOS 10.14 Mojaveでインストールできない問題を修正した「VirtualBox v5.2.14」をリリース。
https://applech2.com/archives/20180705-oracle-virtualbox-initial-support-macos-mojave.html


## 回避手順を試してみました


virtualbox.orgのフォーラムでも話題になってて、回避できる手順があったので、試してみた。

5.2.12 install fails on macOS Mojave (#17805)
https://forums.virtualbox.org/viewtopic.php?p=424309

5.2.12 install fails on macOS Mojave (#17805)
https://forums.virtualbox.org/viewtopic.php?p=424152

### macOS Ver

```sh
> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A314h
```

### 手順

#### SIPを無効化する

以下を参考にリカバリーモードに入ってターミナルから無効化する。

Mac OS X El CapiptanでSIPを無効化する
https://qiita.com/zaburo/items/c650cda45c858fe856a9

#### VirtualBox-5.2.13-123218をインストールする

以下投稿にリンクがあるのでダウンロードしてインストールする。
https://forums.virtualbox.org/viewtopic.php?p=424152#p424152


この時点で、インストールはされるけど、アプリ起動ができない。

<img width="422" alt="スクリーンショット 2018-07-04 12.41.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/bd43b2ed-4684-6671-165d-cc504923b1c5.png">

#### GUIを起動する

以下投稿にあるコマンドを叩くと無事にGUIが起動するはず。
https://forums.virtualbox.org/viewtopic.php?p=424309#p424309

<img width="750" alt="スクリーンショット 2018-07-04 12.45.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/6744bf36-78b7-a914-8e09-da9bbe0869a4.png">


GUI起動時に毎回、上記コマンドを実行しないといけないのが若干面倒だけど、現状だと仕方なし。

vagrantから利用する場合にはアプリをインストールした時点で上記コマンドを実行しなくても利用できるはず。
起動オプション付きショートカットを作成するバッチファイル

# 初投稿
　よろしくお願いします。こんな感じでよいのだろうか・・・

# 背景
　新しいマシンのteratermのインストール先変えちゃった！
　ショートカット作り直さないと、、、

# 仕様概要
　テキストファイル等にあるリストでショートカットを一括作成

# 使い方：
```
　1. shortcut.batをつくる
　2. テキストエディタで開いて下のソースコピペする
　3. コマンドプロンプト起動
　4. cd などでshortcut.batの場所へ移動
　5. shortcut.bat "test.lnk" "C:\Program Files (x86)\teraterm\ttermpro.exe" "192.168.1.101 /auth=passwd /user=sshuser /passwd=password" "C:\Program Files (x86)\teraterm"
　（バッチファイル名、ショートカット名、実行ファイルの場所、起動オプション、作業フォルダー）（※起動オプションとか不要な個所は "" で空としてください）
　みたいな感じで実行
```

# ソースコード
```js:shortcut.bat
@if(0)==(0) echo off
cscript.exe //nologo //E:JScript "%~f0" %*
goto :EOF
@end

// メイン処理
function main() {
    var shortcut = null;
    try {
        // ショートカットを作成する
        shortcut = new ShortcutCreater();
        shortcut.create();

        // 作成したショートカットをコンソールに出力する
        Console.println("ショートカットを作成しました");
        Console.println(shortcut);

    } catch (e) {

        // 例外原因をコンソールに出力する
        Console.println("[error occured]: " + e.description);
        Console.println("usage: shortcut.bat [filepath] [linkpath]");

        // 異常終了でコマンドを返す
        Console.back(e.number);

    } finally {

        // WSHオブジェクトを片付ける
        if (shortcut !== null)
            shortcut.cleanup();
    }

    // 正常終了でコマンドを返す
    Console.back(0);
}

// コンソール汎用クラス
var Console = ((function() {
    var constructor = function() {}
    constructor.println = echoConsole;
    constructor.back = exitScript;
    return constructor;
})())

// ショートカットを作るクラス
var ShortcutCreater = function() {
    var args = WScript.Arguments;
    validate(args);
    this.wshObj = openWsh();
    this.file = args(0);
    this.link = args(1);
    this.opt  = args(2);
    this.wd   = args(3);
    this.create = createShortcut;
    this.cleanup = closeWsh;
    this.toString = createrToString;
}

// ----- 以降関数群 -------

function validate(args) {
    if (args == null) {
        throw new Error(1, "args=null or undefined");
    }
    if (args.length !== 4) {
        var str = "args = ";
        for (i=0; i < args.length; i++)
            str += "[" + i + "]:" + args(i) + " ";
        throw new Error(2, str);
    }
}

function createShortcut() {
    var lnkFile = this.wshObj.CreateShortcut(this.file);
    lnkFile.TargetPath = this.link;
    lnkFile.Arguments  = this.opt;
    lnkFile.WorkingDirectory = this.wd;
    lnkFile.Save();
}

function createrToString() {
    return "file=\"" + this.file + "\", linkTo=\"" + this.link + "\"";
}

function openWsh() {
    return WScript.CreateObject("WScript.Shell");
}

function closeWsh() {
    this.wshObj = null;
}

function echoConsole(msg) {
    WScript.echo(msg);
}

function exitScript(errNum) {
    WScript.Quit(errNum);
}

// メイン処理呼び出し
main();
```

# 参考文献
　[y-takano様　ショートカットを作成するバッチファイル(ファイル単体, JScript混在)](https://qiita.com/y-takano/items/b94312abc17159dce8be)
　こちらのソースをもとにちょっとアレンジしただけです、とても助かりました。m(_ _)m
　なのでコードの内容はあまりわかってないです・・・
MacでFortranエラー: サブルーチンの実行が，遡って結果を変える

# プログラム概要
    main program
      use subroutines
      implicit none 
      integer, parameter :: n = ** 
      real*8 :: x(0:n)
      real*8 :: p_input_1, p_input_2, ...
      integer :: i
      
      do i = 1, **
        ! xに関する，計算
        write(*,*) i, ! 途中経過 (xの平均等) を表示
      end do

      call analyse(n,x,prm,***)
      
      stop
    end program
  

    module subroutines
      implicit none
    contains
      subroutine analyse(n,x,prm,***)
        implicit none
        integer, intent(in) :: n
        real*8,  intent(in) :: x(0:n)
        real*8,  intent(out) :: prm

        ! xに関する処理いろいろ

        return
      end subroutine analyse
    end module subroutines

# システム
- OS: maxOS High Sierra ver 10.13.5
- コンパイラ: gfortran (gcc ver 6.3.0)

# 問題点
あるサブルーチン (上記"analyse") を呼ぶか呼ばないかで, 計算の途中経過 (当然, 最終的な結果も)が変わってしまう. 

# 解決策
見えず
Cloud9のワークスペース共有がとてつもなく便利な件について

#Cloud9のワークスペース共有機能
*この記事はチーム開発の初心者向けの記事になっています。これまで一人で勉強していてそろそろチームで開発してみようかな？なんて方に向けた記事です。

みなんさんはチーム開発をする時の環境準備をするのが面倒だなと思ったことはありませんか？
GitHubなにそれ怖い、なんかややこしい、面倒。でもチーム開発はしたい。みんなで何か作ってみたい。

例えば２〜３人のチームでとりあえず簡単に開発してみたい！

けどgithubのオーガナイズからメンバー招待してブランチ切ってissue書いてアレしてコレしてなんて・・・・・・あーーーー面倒ですね。そこまでガチじゃない簡単にチームで開発したいんだ！

そんな時にオススメなのがCloud9のワークスペース共有機能です。
今回はCloud9の共有機能によるリアリタイム同時開発の利便性につて説明して行きたいと思います。

##Cloud9とは？
Cloud9とはAWSのサービスの一つでweb上で使える開発環境です。

クラウド上で仮装環境を作って作業ができます。
クラウドってなんだか時代の波に乗ってる感がしていいですね。

クラウド上に作成したワークスペースはAWS上のCloud9クラウドに保存されているのでもしあなたのPCが故障しても問題なくどのPCからでもCloud9のIDとPASSさえ覚えておけばワークスペースに入って開発ができます。
バックアップやローカル管理のリスクも減ります。

そして何より便利なのがワークスペースを作る時に選択できる環境が多い！
そしてワンクリックで環境ができてしまうこと！

以下に環境を列挙しておきます。
HTML5,Node.js,PHP,Python,Django,Ruby,C++,WordPress,RailsTutorial,Blank,Harvard's cs50

とりあえずなんでも揃ってますね。

今回の本筋はここではないのでCloud9の便利さはご自身で触ってみて体感してください。

##ワークスペース共有
###さて今回の本題のワークスペース共有機能についてです。
<img width="1440" alt="スクリーンショット 2018-07-04 12.32.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/226230/718f30e5-ba76-538a-89be-04604e224f2f.png">
上の写真はCloud9のワークスペースに入った時の画面です。
一般的なエディター画面がブラウザ上で利用できます。下の方はコマンドエリアです。

###Cloud9ではワークスペースを他人に共有する機能がついてます。
<img width="1440" alt="スクリーンショット 2018-07-04 12.35.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/226230/5b40f8ac-d2f2-15b1-12ab-a0413a0cd764.png">

コレによってどう便利になるの？？？？
ざっくりフローをご説明します。

①リードエンジニアがCloud9上でワークスペースを作って開発環境を作る。
②開発メンバーをワークスペースに招待します。
③開発スタート！！！

「なんて簡単なんだ！！」

かなりショートカットしましたが体感としてはこんな感じです。

開発メンバーは自分のPC上に新しい開発環境をいちいち構築しなくて済むのでバージョンを間違ってエラーなんてことも起きません。
しかもクラウド上に保存されているワークスペースですので各個人のPCによるバックアップも不要。

しかし・・・

ちょっと察しの良い方は気付かれたのでは？
全員が同時に一つの環境を一気に開発しちゃってもし大きな間違いをしたらどうするの？コンフリクト多発じゃね？
GitHubの方が安心なのでは？と。

そこもCloud9さん考えてくれています。

###ワークスペース内の一つ一つのファイルにはfilehistoryという機能がついています。
<img width="1440" alt="スクリーンショット 2018-07-04 12.39.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/226230/38eb40c4-2d43-4411-6284-bbce3f57c56a.png">

直訳「ファイルの歴史」
そう、ファイルが生まれてから最後に保存されたところまでの情報が残っています。誰かが間違って編集・保存してしまっても大丈夫。その前に保存されていたところまで戻ることができます。

さらに、どこを誰が編集したのかの情報も記録されています。
それがリアルタイムで保存されているので一々gitにプッシュもしなくていいし開発前にプルする必要もない。
とにかく簡単、そして慣れてしまえば想像以上の開発スピードを発揮することが可能です。

上記がCloud9の開発環境の利便性についての説明です。

使い方はとてもシンプル。
そして全員で同時に一つのファイルを編集した時に感じると思いますがリアルタイムに色々なファイルがどんどんコーディングされていく様子は圧巻ですよ。

ただし・・・

###この開発手法には一つ大きな欠点があります。
それは事前の開発内容の設計を細かく決めておくこと、そしてメンバー全員が開発の全体像をしっかりと把握しておくことです。
サーバーと連携してデータのやりとりをする時も同じです。
細かく事前に決めておくことが沢山あります。
変数名の命名ルールとかデータベースのテーブルのカラム名とか編集していい範囲とかとか。

ですのでCloud9のワークスペース共有開発の限界人数は５人だと思います。
これ以上になると逆にコミュニケーションコストの方が高くついてしまうと思います。

チーム開発でもっとも大切なのはメンバーと適切なコミュニケーションが取れていること。
認識の違いなどがあると後々大変なことになってしまいます。

ちょっとやってみようかなと思った方は下のリンクから早速登録して使ってみてください！
https://aws.amazon.com/jp/cloud9/?sc_channel=PS&sc_campaign=acquisition_JP&sc_publisher=google&sc_medium=cloud9_b&sc_content=cloud9_e&sc_detail=cloud9&sc_category=cloud9&sc_segment=241388691967&sc_matchtype=e&sc_country=JP&sc_brand=brand&ef_id=WfCIXwAAAHn@cI9p:20180220055135:s
baserJSでYouTubeのイベントAPIを使う

## YouTubeを埋め込む

### 基本

`data-id`にYouTubeの動画IDを設定します。

```html
<div class="youtube" data-id="FUgM105uN4c" data-width="1920" data-height="1080"></div>
```

```js
var $youtube = $('.youtube').bcYoutube();
```

### イベントを扱う

```js
// onメソッドを使ってイベントリスナーを登録できます。
baserJSYoutubeInstance.on(eventType, eventListner);
```

```js
// jQueryオブジェクトからYouTubeのAPIを扱うためのインスタンスを取り出します。
var yt = $youtube.data(baser.YouTube.className);

// イベントリスナーを登録します。
yt.on('playing', function () {
   console.log('再生中');
});
```

#### イベントの種類

基本的に本家APIのonStateChangeイベントのラッパーです。詳細は[公式のリファレンス](https://developers.google.com/youtube/iframe_api_reference?hl=ja#onStateChange)を参考にしてください。（※イベント名はアルファベットの小文字である必要があります）

それとは別に次のイベントが利用できます。

- `embeded`: プレイヤーが読み込まれAPIが利用できる状態
vimで保存時に自動コンパイル

### 対象
- vimが好き
- コンパイルが面倒
- シェルで作業してる人

### 概要
latexやsassなど主にコンパイルが面倒なものは自動コンパイルがそもそも実装されています。
latexであれば
`$ latexmk -pvc sample.tex`
sassであれば
`$ sass --watch sample.scss:sample.css`
ファイルの変更を自動で読み、コンパイル、エラー文を吐いてくれます。
しかし、毎回編集を行う前に打ち込むのは面倒。
今回はコンパイルを自動化していきます。

## vimでファイルタイプごとに設定を分ける。
vimには拡張子ごとに設定ファイルを分ける機能が標準装備されています。
filetypeを指定することによってそれが可能になります。
詳しく知りたい方は[公式リファレンス](http://vim-jp.org/vimdoc-ja/usr_43.html#filetype-plugin)をクリックしてみてください。試しにtexの例を見ていきます。

```vim:~/.vimrc
filetype plugin on
augroup fileTypeSet
    autocmd!
    autocmd BufNewFile,BufRead *.tex setfiletype tex
augroup END

let g:tex_flavor='latex'
```

vimのaugroup内でファイルを開いた時の設定を記述することができます。上記のようにすると拡張子がscssの場合、filetypeとしてscssを読み込む。という意味になります。
またtexをfiletypeとして指定するとき一つ注意点があり、texは元々vimのグローバル変数の設定からfiletypeを振り分けることができるようになっています。
だから新しく追記する代わりに変数に代入してやります。

vimはruntimepathに設定しているファイルを読みに行くのでここはおとなしく標準で設定されている~/.vim/ftplugin以下に拡張子ごとの設定ファイルを置いていきます。
ftpluginはなければ自分で作成します。

- ~/.vim/ftplugin/tex.vim

## 設定を記述する

vimではコマンドラインモードで:!を用いることによってシェルのコマンドを実行することができます。`:!latexmk %:p` でファイル保存時にlatexをオートでコンパイルするようにしました。%:pは編集ファイルのフルパスが入ります。

```~/.vim/ftplugin/tex.vim
autocmd BufWritePost * :!latexmk %:p
```

これはこれで動いたのですがここで僕はそもそもこんな少量でいいんだったらそのままvimrcにかけばよくね？となりました。

## 最終的な着地点

現在僕のvimrcはこのようになっています。
Rとlatexとc言語のコンパイルを行えるようにしています。

```vim:~/.vimrc
filetype plugin on
augroup setAutoCompile
    autocmd!
    autocmd BufWritePost *.tex :!latexmk %:p
    autocmd BufWritePost *.c :!gcc %:p
    autocmd BufWritePost *.cpp :!g++ -std=c++14 %:p
    autocmd BufWritePost *.R :!R -f %:p
augroup END
```

これでまたvimrcが強くなりましたね。

## メリット

- 保存時にエラー文が見れるので楽
- コンパイルする手間が省ける(競技プログラミングに強い)

## デメリット

- 壊れたコードのままうかつに保存すると大量のエラー文がでる(逆に言えばコンパイルできないコードの状態で保存しない癖がつく...??)
- 各コマンドはvimのカレントディレクトリにコンパイル後のファイルを吐き出すので、出力させたいディレクトリで作業する、または出力先を編集中ファイルのディレクトリにするようなオプション追加などが必要になります。
Ajax通信による画像と文字列登録処理の仕方

#筆者について

- 2018年4月G's Academy LAB5期に入学
- 初めてコード書き始めて、３ヶ月目。
- 対応可能言語:HTML, CSS, PHP, JS(jQuery), laravel

Twitter : https://twitter.com/yoheiyouhey
Instagram : https://www.instagram.com/yoheiyouhey/


#投稿の経緯

先日学内でPHP選手権があり、その際に作ったサービスで有難いことに4位入賞しました。
この際に、Ajax通信による画像登録と文字列の登録同時処理に少し苦労したので、
私の書いたコードと処理内容をシェアしたいと思います。

#Ajax通信処理コード

以下のような登録フォームを作りました。ここから、画像やデータの登録を行います。

![Screen Shot 2018-07-04 at 11.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/252687/d01f1699-21d7-3605-0edc-e229b762a1cb.png)


##変数へ画像データの挿入

![Screen_Shot_2018-07-04_at_11_18_20.png](https://qiita-image-store.s3.amazonaws.com/0/252687/1be02701-311e-b997-aba6-4b2f867550f2.png)
（↑jQuery内のAjax通信部分のコード）

Ajax通信による画像登録におけるポイント以下の二つです。

①"formdata"という変数を用意し、そこに"formタグ"につけたid="form"を参照して置き、


![Screen_Shot_2018-07-04_at_11_32_07.png](https://qiita-image-store.s3.amazonaws.com/0/252687/17a9538f-4bee-5ca3-4f87-cf403f42372a.png)
（↑HTML内のform部分のコード）

②"new FormData"という関数で、をformのデータ取得することです。

![Screen_Shot_2018-07-04_at_11_18_20-2.png](https://qiita-image-store.s3.amazonaws.com/0/252687/050eac2a-635d-f3f2-1978-19c45ca2bc91.png)


そうすることで、form内にある画像を"formdata"という変数に入れることができます。

## 文字列データを入れる方法

そのまま変数"formdata"を利用します。

"formdata.append(文字列データ)"とすることで、変数"formdata"に文字列データが入ってくれます。

![Screen_Shot_2018-07-04_at_11_18_20-3.png](https://qiita-image-store.s3.amazonaws.com/0/252687/a5e28278-6964-4f9a-cbd6-4c82f503552e.png)

たったこれだけ！

##Ajax通信コードを書く
![Screen_Shot_2018-07-04_at_11_18_20-4.png](https://qiita-image-store.s3.amazonaws.com/0/252687/5a8c3b8a-50c6-b688-971b-3e26d9df4605.png)

ただし、１つだけ注意点があります。
"data"の箇所に変数"formdata"とだけ書くことです。

普通の文字列のみのAjax通信でしたら、この箇所に、取ってきたデータを一つ一つ書くことが多いと思いますが、ここでは、すでに上で、変数"formdata"にデータを入れているので、不要となります。

以上が、登録フォームにおけるAjax通信の処理コードになります。


#PHP処理ファイルで情報の受け取りとデータベースへの登録処理

![Screen_Shot_2018-07-04_at_11_48_57.png](https://qiita-image-store.s3.amazonaws.com/0/252687/4df7b873-6c47-b466-c406-4acb48329da6.png)
(↑私はsetting_act.phpをいうファイルを用意しました。)

以上で、Ajax通信による画像と文字列登録処理は完了です。

#確認作業

![Screen Shot 2018-07-04 at 11.54.27.png](https://qiita-image-store.s3.amazonaws.com/0/252687/6092790b-b0c3-4e4c-1dd5-afd8424ad96d.png)

私自身のデータを登録して見ます。

![Screen_Shot_2018-07-04_at_11_55_35.png](https://qiita-image-store.s3.amazonaws.com/0/252687/c66625fb-12d4-4e67-4b5a-fc3f1f7963ae.png)

きちんと登録されていました！

#最後に
始めて、Qiitaに投稿しました。
至らない点も多いかと思いますが、これからも発信を少しずつしていけたらと思います。

アドバイスやご指摘等ありましたら非常に有難いです！
どうぞよろしくお願い致します。
Javascriptで、簡単なシャッフルアルゴリズムの実装

#フィッシャーイェーツのアルゴリズム　
ゲームを作る際に欠かせない、シャッフル機能。数ある実装法の中で恐らく最も有名で手軽な、フィッシャーイェーツのアルゴリズムを実装してみる。このアルゴリズムは、直前に入れ替わった値の1個前にある値（1周目は末尾の値）とランダムに選ばれた値を入れ替えることでシャッフルを実装していくが、一度選ばれた値を入れ替えの対象から除外することで、すべての値が入れ替えられるようになっている。

```javascript

                Array.prototype.shuffle = function () {
               //値を入れ替えるために、3つの変数を用意。tmpは一時変数の略
                    let i,j,tmp;
              //i--で、直前に入れ替わった値の1個前にある値を入れ替えの対象とする
                    for(i = this.length-1; i > 0 ;i--){
             //乱数を回し、入れ替える値を選ぶ
                        j = Math.floor(Math.random()*(i+1));
             //配列のi番目とj番目を入れ替える
                        tmp = this[i];
                        this[i] = this[j];
                        this[j] = tmp;
                    }
                    return this;
                }
       
              //while文の場合 *ES6で使用可能な入れ替え法を使用
                Array.prototype.shuffle = function () {
                    let i = this.length;
                    while (i) {
                        let j = Math.floor(Math.random() * i);
                        [this[i--],this[j]] = [this[j],this[i--]];
                    }
                    return this;
                }

```
1行目は、あらゆる配列でシャッフルアルゴリズムを使用可能にするために、Arryaオブジェクトにshuffleというメソッドを持たせるための記述（プロトタイププロパティにシャッフルの処理をする関数を格納する）。二つの変数の値を入れ替えるために、一時変数を用意して、入れ替えを実行する。ES6では、[this[i],this[j]] = [this[j],this[i]]　の記述で一時変数を用いなくても入れ替えが可能。
Elastic BeanstalkのACM切れの対応

ちょっと時間取られたので備忘録程度に残しておこうと思う


# 単純な環境の更新
## ACMの再発行
1. AWSでCertificate Managerを開きRequest Certificateから再発行を進める
2. 再発行後にARNをメモしておく

再発行時のドメインは期限切れのものと同じでOK

## ElasticBeanstalk(以降EB)の更新
1. 環境を選択し、左ナビからConfigurationを選択
2. Load balancerのmodifyを選択
3. Port443のSSL Certificateの部分を1でメモしたARNに更新

これでOK
あとは動作確認して、もう古いACMが使われていないなら削除するだけ

# 保存された設定を使ってデプロイしている場合
EBでは環境情報のテンプレートを作成しておいてそれをもとにデプロイを取るという方法があります
今回はこの方法でのACMの切り替えについて

## ACMの再発行
上に書いたことと同じなのでスキップ

## default-configurationの更新
1. S3を開き`elasticbeanstalk-｛リージョン｝-｛AWSアカウント番号｝`のバケットを探す
2. `resources/templates/{環境名}`というprefixの直下に`default-configuration`があるのでダウンロード
3. `default-configuration`のACMのARNが記載されている部分を再発行したACMのARNで上書きしS3にアップロード
4. デプロイを行う

EBでは環境情報のテンプレートをS3に保持し、バケットは`elasticbeanstalk-｛リージョン｝-｛AWSアカウント番号｝`

あとはブルー・グリーンの運用がされているならURLスワップして動作確認して古い環境やACMの削除を行えばOK