OmniAICreator/Qiita-1.07M huggingface dataset:
td 要素の内側に border を引きたい

# 方法

`box-shadow` を使う。

```css
td.checked {
  box-shadow: 0 0 0 8px #e89a00 inset;
}
```

`border` だとはみ出てしまう。`box-sizing: border-box;` を指定しても結果は同じ。

```css
td.checked {
  border: solid 8px #e89a00; /* うまくいかない…。 */
}
```

![anime01.gif](https://qiita-image-store.s3.amazonaws.com/0/6697/735ccf52-8904-53d6-7063-0200769cf049.gif)

# デモ

<p data-height="265" data-theme-id="0" data-slug-hash="BPdwBL" data-default-tab="html,result" data-user="quanon" data-pen-title="inner borders in table cells" class="codepen">See the Pen <a href="https://codepen.io/quanon/pen/BPdwBL/">inner borders in table cells</a> by QUANON (<a href="https://codepen.io/quanon">@quanon</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
EC2で動かすDocker ComposeをCodeDeployでデプロイ

（ニッチすぎて需要がわからない…）

ある日--。
ローカルではdocker-composeで環境を作っている。
確認用の環境を作りたいけど、ECSはオーバースペックな気がする。

![s_AAの画像化.png](https://qiita-image-store.s3.amazonaws.com/0/221538/24c20961-c73e-8c69-5a3a-5967fd293a63.png)

そうだ、EC2で動かせばいいんだ。
ついでにCodeDeployでデプロイも簡単にしよう。

# IAMロールの作成

## CodeDeployからEC2にアクセスする用

- IAMのコンソールでロール -> ロールの作成

|||
|---|---|
| エンティティの種類 | AWSサービス |
| ロールを使用するサービス | CodeDeploy |
| ユースケース | CodeDeploy |
| アタッチするポリシー | AWSCodeDeployRole |
| 名称 | 適当 |

## EC2からS3にアクセスする用

- IAMのコンソールでロール -> ロールの作成

|||
|---|---|
| エンティティの種類 | AWSサービス |
| ロールを使用するサービス | EC2 |
| アタッチするポリシー | AmazonS3ReadOnlyAccess |
| 名称 | 適当 |

＃ ユーザーの作成

- IAMのコンソールでユーザー -> ユーザーの追加

|||
|---|---|
| ユーザー名 | 適当 |
| アクセスの種類 | プログラムによるアクセス |
| アクセス許可の設定 | 既存のポリシーを直接アタッチ |
| アタッチするポリシー | AmazonS3FullAccess, AWSCodeDeployFullAccess |

アクセスキーとシークレットキーを、ローカルのaws-cliに設定すること。

# EC2のインスタンスを作成

|||
|---|---|
| AMI | Amazon Linux 2 AMI |
| IAM ロール | 上で作成したEC2用のロール |
| タグ | Nameだけでも設定する |
| 他 | 適当 |

## 各種インストール

Docker、Docker Compose、CodeDeploy　Agentをインストールする。

```text
sudo yum update
sudo yum install docker
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo yum install ruby
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
chmod +x ./install
sudo ./install auto
```

# S3バケットを作成

バケットを作るだけ。
名前は控えておくこと。

# CodeDeployのアプリケーションを作成

|||
|---|---|
| アプリケーション名 | 適当、控えておくこと |
| コンピューティングプラットフォーム | EC2/オンプレミス |
| デプロイグループ名 | 適当、控えておくこと |
| デプロイタイプ | インプレースデプロイ |
| 環境設定 | EC2インスタンス -> 上で作成したインスタンス |
| サービスロール ARN | 上で作成したCodeDeploy用ロール |

# コード

```text
.
│  appspec.yml
│  docker-compose.yml
│
└─scripts
       start.sh
```

```yaml:appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /var/app
hooks:
  ApplicationStart:
    - location: scripts/start.sh
      runas: ec2-user
```

```shell:start.sh
#!/bin/sh

docker-compose -p project-name -f /var/app/docker-compose.yml down

docker-compose -p project-name -f /var/app/docker-compose.yml up -d
```

起動コマンドで、プロジェクト名とdocker-compose.ymlの場所を指定すること。

# デプロイ

ローカルのaws-cliを使う。

```text
aws deploy push \
  --application-name 上で作成したアプリケーション名 \
  --ignore-hidden-files \
  --s3-location s3://上で作成したバケット名/application.zip \
  --source . \
  --profile プロファイル名

aws deploy create-deployment \
  --application-name 上で作成したアプリケーション名 \
  --s3-location bucket=バケット名,key=application.zip,bundleType=zip,eTag=deployの戻り値にあるeTag \
  --deployment-group-name 上で作成したデプロイグループ名 \
  --file-exists-behavior OVERWRITE \
  --profile プロファイル名
```

ECSでいいんじゃないかという気がしてきた。
mysqlのユーザー関係コマンドの備忘録

mysqlのユーザー関係コマンドの備忘録

## ユーザー一覧の確認

```
mysql> select Host, User, Password from mysql.user;
```

## ユーザーの作成

```
CREATE USER < user名 > IDENTIFIED BY '< password >';
```

## ユーザーの削除

```
DROP USER < user名 >;
```

## ユーザーの権限の確認

```
SHOW GRANTS < user名 >;
```

## ユーザーの作成と権限設定

```
GRANTS <権限名> ON < DB名または'*' >.< TABLE名または'*'> TO <DBユーザー>@< Host名またはIPアドレスまたは'%' > IDENTIFIED BY '< password >';
# sample
GRANTS ALL ON sample_db.sambple_table TO db_user@192.168.0.1 IDENTIFIED BY 'password';
```

## ユーザーの権限削除

```
REVOKE <権限名> ON < DB名または'*' >.< TABLE名または'*'> FROM <DBユーザー>@< Host名またはIPアドレスまたは'%' >
```

## 権限一覧

| 権限 | 説明 |
|:-:|:-:|
| ALL  | 全ての権限 |
| ALTER | ALTER TABLEの実行権限 |
| CREATE | CREATE TABLEの実行権限 |
| CREATE USER | CREATE USERの実行権限 |
| DELETE | DELETEの実行権限 |
| DROP | DROP DATABASE, DROP TABLEの実行権限 |
| INDEX | CREATE INDEX, DROP INDEXの実行権限 |
| INSERT | INSERTの実行権限 |
| SELECT | SELECTの実行権限 |
| SHOW DATABASES | SHOW DATABASESの実行権限 |
| UPDATE | UPDATEの実行権限  |
developmentでassetsが上手く読み込まれない

[development環境下でprecompileすると，以降developmentでassetsが上手く読み込まれない - インターファーム開発部ブログ](http://interfirm.hatenablog.com/entry/2014/10/24/131503)
[Ruby on Rails - Railsのアセットパイプラインがうまく行かない(57244)｜teratail](https://teratail.com/questions/57244)

追記
[NoMethodError: undefined method 'silence' for Logger:... issue #376 · rails/sprockets-rails](https://github.com/rails/sprockets-rails/issues/376)
上記2つではなく、こちらでやってみました。
XcodeでBreakpointを設定したのに止まらない時の対処法

# 環境
| Xcode       |Version 9.4.1|
|:-----------------|:------------------|
|BuildConfigration|Release|

# 再現
Xcode -> EditScheme -> Run -> BuildConfigration
上記の設定がDebugの時はBreakpoint(ブレークポイント)が正常に動作したがReleaseに変えた時にBreakPointが動作しなくなった

#解決方法
ProjectのBuildSettings -> Optimization LevelをNo optimization[-Onone]に設定するとSchemeをRelease環境に設定した時も正常に動作するようになりました〜
![Screen Shot 2018-07-26 at 16.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/74248/7a82ca95-a4ae-c495-423e-e930e7e35f2d.png)

# 参考
https://stackoverflow.com/questions/49731369/breakpoints-not-hit-in-xcode-9-3?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
Pythonでスクレイピングしたいのでrequestsを入れる

# pythonでスクレイピングしたい
## とりあえずrequestsを入れる
pythonでスクレイピングする手法はいくつかあるらしい．でもそんなに難しくなくてサクッとできると嬉しい．とりあえず手順としてサイトから情報を取得する必要があるので`requests`を使えばいい感じにhtmlデータを取得できるらしいので`requests`をpipから入れる．

```python

pip install requests
```

## とりあえず取得してみる
URLのところに自分の取得したいサイトのURLを入れてやる．

```python

import requests

URL = 'https://twitter.com/_shuft'

response = requests.get(URL)
print(response.text)
```

この状態では取得したデータがテキストになって大量に吐き出されてしまうので，次の方法でデータを分けて取得する．

## データの取捨選択

ライブラリの仕様的に今回でいうと`response.text`の`text`にあたるところをいい感じに変えるといろいろとデータを取得できる．必要そうなものだけ列挙する．たぶん`content`が一番欲しいと思う．

```python

response.content 
response.cookies
response.headers
response.encoding
response.text
```

適宜beautifulsoupとかに投げて処理していきたい．また別で書くはず，ただほぼほぼ備忘録なのでｱﾚ
5分で分かる！ビッグデータ、機械学習、データマイニングの意味

元記事：https://www.octoparse.jp/blog/understanding-big-data-data-mining-and-machine-learning-in-5-minutes/

![big-data-octoparse.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/4bc511be-98f0-81ba-134e-0cc5019a39b0.jpeg)

近年のWeb、スマホ、アプリなどの発展により、以前とは比較にならないほど膨大な量の情報があふれています。このようなビッグデータを扱う需要が増えてきており、そのデータ分析を行う分野であるデータサイエンスに注目が集まっています。

そんな中、上司から唐突に「データマイニングを使って、このデータから業務改善に役立つような案を出してくれ」と言われ、困ったことはありませんか？データマイニングと似た言葉に、機械学習があります。よく耳にするこの「データマイニング」や「機械学習」とは、そもそもどのようなものなのでしょうか？

今回は、これらの言葉について、わかりやすく解説していきます。

 

#ビッグデータ

ビッグデータとは、インターネット上に溢れている大量のデータを意味する用語です。しかし、多くの場合、ビッグデータとは単に量が多いだけでなく、様々な種類・形式が含まれる非構造化データ・非定型的データであり、さらに、日々膨大に生成・記録される時系列性・リアルタイム性のあるようなものを指すことが多いです。データ量が膨大である場合、このデータはどの単一のコンピューターでも処理できないことは明らかです。たとえ10GBほどの大きなファイルを、すべてのWindowsシステムでクラッシュする前に開くことはできません。そのために、ビッグデータが開発されています。大きなファイルを小さく分割し、多数のコンピューターで処理できる特別なソフトウェアと考えることもできます。このようなデータを分割してコーミングするプロセスは、MapReduceと呼ばれています。このプロセスで最も一般的に使用されるフレームワークはHadoopです。 Hadoopは基本的な問題を解決し、Pig、Zookeeper、Hiveなどのツールとともに使用して、プロセスをさらに簡単にします。

 

#機械学習

機械学習とは、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことです。さき、データの処理方法にに言及しました。例えば、このデータには、購入した商品の合計数、各購入者が購入した商品数など、購入者の購入行動のが含まれていると仮定します。これは今までの単純な統計分析です。しかし、さまざまなタイプの顧客の間における相関関係を分析する場合、特定のタイプの顧客の好みを推定する場合、または顧客の性別や年齢を予測する場合でも、より多くの複雑なモデルが必要です。それはアルゴリズムと呼ばれています。ロジスティック回帰、決定木、協調フィルタリングなど、データマイニングの目的で開発されたさまざまな種類のアルゴリズムを機械学習として理解することができます。

 

#データマイニング

「データマイニング」とは、大量のデータについて統計学や人工知能などを駆使して、データ間の相関関係や隠れたパターンなどを見出すための手法です。機械学習アルゴリズムを適用することで、既存のデータを利用して未知数を予測することができます。これが、データマイニングが機械学習と深い関係がある理由です。それにもかかわらず、あらゆる機械学習アルゴリズムの強みは、大量のデータの供給に大きく依存します。アルゴリズムがどれほど洗練されているかに関係なく、数行のデータからインスピレーションを予測することはできません。ですから、データマイニングを行うために、まずは実際にデータを収集することが必要です。一般的には、元となるデータが多ければ多いほど、有益な情報をマイニングできる可能性が高まります。

  

**まとめると、ビッグデータ技術は機械学習の前提、機械学習を使用することで、既存のデータセットから貴重な情報を得ることはデータマイニングです。**



#ビッグデータ、データマイニングと機械学習は何ができますか？

要するに、それらの技術は予測の能力を私たちに与えます。

 

##1.私たちの生活はデジタル化された

今、私たちの毎日している多くのことが記録されます。すべてのクレジットカードの取引はデジタル化され、追跡可能です。私たちの公衆活動は、街の隅々まで監視されています。企業にとって、財務データや営業データの大部分は各種類のERPに保存されています。ウェアラブルデバイスの登場により、心拍や息がデジタル化され、使用可能なデータに保存されています。生活の多くがデジタル化されているように、コンピュータはこの世界をよりよく理解できるようになりました。

##2.パターンが変わらないなら、過去=未来

世の中にある物事は異なるパターンを示しています。例えば、仕事日には会社と家の往復する可能性が高く、休日に旅するか映画を見るか、このパターンがあまり変わりません。店舗の1日に、ピーク時間帯と暇時間帯があるというパターンはあまり変わりません。企業は年間数ヶ月のうちにより高い労働投入を要求するパターンはあまり変わりません。

ポイント1とポイント2をまとめると、過去のパターンが提供されている場合、コンピュータが未来を予測するのが非常に可能であると結論付けることができます。これらのパターンは長期間にわたって一貫している可能性が高いためです。

 
#まとめ
コンピュータが人々のライフスタイルを予測できるなら、プロモーションの展開がしやすい時期を正確にわかります。例えば、ある人は毎週の金曜日に洗車サービスを受ける場合、洗車キャンペーンを実施するか、ある人は毎年の3月に旅行に行く傾向がある場合、ホテルの宿泊にクーポンを配布するかなどのことを行います。ビジネス的には、コンピュータは店舗の1日中の売上を予測して、総収益を最大化するビジネス戦略を構築することができます。企業の場合、コンピュータは労働力を最も合理的に配置して、最高の運用計画を立てることもできます。


未来が予測可能になるとすぐに、私たちは早めに計画を立て、しっかり準備をすることができます。「マトリックス」のネオと同じように、弾丸がどこから来ているかを見られるので、弾丸を止めれます。「確率論に高度な把握、人間心理学に徹底的な理解、特定の個体に既知の傾向は、変数の数をかなり減らすことができる」とシャーロック・ホームズがそう言いました。言い換えれば、「ビッグデータは、未来を予測する力を私たちに与える」ということです。これはデータマイニングの力で、データマイニングはビッグデータと結びついています。ビッグデータは膨大なデータセットを可能し、すべての予測に基盤を提供しているからです。
Salesforceメモ（自分用）

#Salesforceの仕様の覚え書き
###インポート時の時間のズレ
Salesforceのデータベースでは、日付型、日付時間型項目のデータは内部的に全てGMT（グリニッジ標準時）に変換され格納される。 
データローダではSalesforceへ日付データをインポートする際、CSVに記載した日付の末尾に時間00:00が加えられる。 
この際データローダのタイムゾーン設定が考慮されるため、例えばAsia/Tokyo(GMT+9:00) に設定されている場合、前日15:00 と変換され登録される。 
回避策としては、以下4点のいずれかを行う。
-１日足した日付をインポートする: "2011-09-02" 
-９時間足した日時をインポートする： "2011-09-01T09:00:00" 
-GMT指定でインポートする： "2011-09-01T00:00:00.000Z" (※「Z」はGMTをあらわす) 
-データローダのタイムゾーンを（GMT）グリニッジ標準時に設定してインポートする

[参考] [データローダで日付データをインポートすると１日前の日付が登録される](https://help.salesforce.com/articleView?id=000047804&language=ja&type=1 )


###活動と行動とTODO
活動の記録と新規TODOは連動している
→オブジェクトはTODO
新規行動は連動していない
→同時に項目を変える必要がある

###個人取引先
・一度有効にすると元に戻せない
→目的、運用ルールを明確にしておく。
・オブジェクトは取引先で、項目に責任者のものも含まれるようになる
・取引先、取引先責任者との併用は可能
CSに問い合わせして進めていく
【Laravel】Logout後の遷移先を変更する。

**※ Laravel 5.6.27 以降の人は「loggedOut 関数を使う方法」まで読み飛ばして下さい。**

app\Http\Controllers\Auth\LoginController.php は
ほとんど隠蔽されていてどこを修正して良いかわからない。

logout時の遷移先も AuthenticatesUsers で定義されてしまっているので
LoginController を以下の様に修正して無理やり遷移先を変更する。

### AuthenticatesUsers.logout を別名 performLogout に変更
```php:app\Http\Controllers\Auth\LoginController.php
// use AuthenticatesUsers;
use AuthenticatesUsers {
    logout as performLogout;
}
```
これで、AuthenticatesUsers の logout は performLogout として呼び出すことになる。

### logout を作成する。
```php:app\Http\Controllers\Auth\LoginController.php
public function logout(Request $request)
{
    $this->performLogout($request);
    return redirect()->route('admin.index'); // ここを好きな遷移先に変更する。
}
```
これで外部からは logout が呼ばれ、内部で performLogout を呼び出すことになる。

### 使用する Request を明示する
```php:app\Http\Controllers\Auth\LoginController.php
use Illuminate\Http\Request;
```
定義されていないと思うので、先頭で logout に渡される Resuest を定義しておく。

# loggedOut 関数を使う方法
Laravel 5.6.27以降では、認証スキャフォールドの登録および認証されたメソッドに基づいて
loggedOut関数が追加されている。
なので logout 関数を無理やり置き換えなくても
loggedOut関数を追加すればログアウト後の遷移先が変更できる。
loggedOut関数を記述しなければ、そのまま / に遷移する。

```php:app\Http\Controllers\Auth\LoginController.php
  :
  class LoginController extends Controller
  {
      use AuthenticatesUsers;
      :
+     protected function loggedOut(Request $request)
+     {
+         return redirect(route('admin.index'));
+     }
      :
  }
```
参考：https://github.com/laravel/framework/commit/e4a00e87cfc383d9bdf8934985130801476fc242
情報提供：[mpywさん](mphttps://qiita.com/mpyw)(ありがとう)

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
ConohaのGitLabでメール送信できない問題をSESで解決した

# ConohaでGitLabイメージを使ってみた
Conohaには色んなアプリケーションのイメージがあります。
今回はその中の一つ、GitLabを試してみました。

![スクリーンショット 2018-07-26 15.05.08.png](https://qiita-image-store.s3.amazonaws.com/0/58437/0c8762c0-46eb-51e0-4f1a-4dc86573d195.png)
推奨が4GBらしいので、今回は4GBのプランで立てました

# ログインまではすごく簡単
![1.png](https://qiita-image-store.s3.amazonaws.com/0/58437/626a3c70-b274-ac09-0503-d86a41650e66.png)

サーバーを立てたら、上画像の矢印に記載されているIPアドレスに直接アクセスすると、初回はパスワードの変更を求められます。初期の管理者ユーザー名は「root」です。

# ユーザー登録をしてもメールが送ってこない
その後rootでログインして別のユーザーを追加したり、トップページから新規ユーザーの登録をしてもメールが送られてこない。

パスワードはメールに記載されているっぽいので、ログインができない。

# AWS SESのSMTPから送信するようにした
### やり方は公式にそのまま書いてました
https://docs.gitlab.com/omnibus/settings/smtp.html#amazon-ses


#### 前提
送信数の緩和やドメインの認証などは済んでいる前提です。
[SES設定方法(2016年2月)](https://qiita.com/stso/items/e8641281580d09a89540)

# IAMの作成をして認証情報をゲットしておく
メール送信専用にIAMを作成

![スクリーンショット 2018-07-26 15.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/58437/5b119013-b0de-f2d0-34b3-66a0153cac49.png)

SESのページ内にある「SMTP Settings」から「Create My SMTP Credentials」ボタンを押して、そのままナビゲートに従いつつIAMを作成しましょう。

最後に認証情報のダウンロードが出来るので、メモまたはダウンロードしておきます。

# サーバーに入って下記の作業をする
このファイルが設定ファイルのようなので、下記のように書き換えます。
`/etc/gitlab/gitlab.rb`


```ruby

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "email-smtp.region-1.amazonaws.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "IAMmailerKey"
gitlab_rails['smtp_password'] = "IAMmailerSecret"
gitlab_rails['smtp_domain'] = "yourdomain.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
```

```ruby

gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
```

書き換えたら次のコマンドを打って、終了。
`gitlab-ctl reconfigure`

# まとめ
イメージでの提供なので、てっきりpostfixなどのメールサーバー込みなのかと思ったのですが、そういうことでもないんですかね。

今回はAWS SESで解決しましたが、下記のドキュメントを見るとGmailでの設定などもありますので、お好きなものを参照ください。

https://docs.gitlab.com/omnibus/settings/smtp.html
Lightning コンポーネント開発 TIPS: コンポーネントの縦横比を固定する

今回は　Lighting コンポーネントの縦横比の固定方法についてです。
Lighting コンポーネントは通常、画面サイズの変更などにより、レスポンシブに横幅のみが伸縮し縦横比が変化してしまいます。
この縦横比を固定する事で高さも合わせて変化するようにしてやろうというのが今回の挑戦になります。

![ezgif-5-de7853b472.gif](https://qiita-image-store.s3.amazonaws.com/0/26378/99badcd4-4de2-91b2-3a68-f1ac678c4623.gif)




## サンプルコードと動作検証
んで、サクッと作ってみたのがこちら。

```html:FixedAspectRatio.cmp
<aura:component implements="flexipage:availableForAllPageTypes" access="global" >
    
    <!-- Global Attributes -->
    <aura:attribute name="ratio"  type="Double" access="global" default="1" />
    
    <!-- Private Attributes -->
    <aura:attribute name="height" type="Double" access="private" />
    
    <!-- User Interface -->
    <!-- 横幅の変化に合わせてコンポーネント全体の高さを変更したいので、-->
    <!-- 最上位の DOM エレメントに style を指定する -->
    <div aura:id="container" style="{!'height:' + v.height + 'px;'}">
        <div>高さ: {!v.height}px</div>
    </div>
    
</aura:component>
```
```js:FixedAspectRatioHelper.js
({
    resize : function(c, h) {
        const ratio = c.get("v.ratio");
        const width = c.find("container").getElement().clientWidth;
        c.set("v.height", width * ratio);
    },
})
```
```js:FixedAspectRatioRenderer.js
({
    afterRender: function (c, h) {
        this.superAfterRender();

        h.resize(c, h);
        window.addEventListener('resize', $A.getCallback(function (event) {
            h.resize(c, h);
        }));

        // コンソールでは左パネルの開閉時に window オブジェクトのリサイズイベントが発火しないので、タイマーを仕掛ける事もできる。
        // その際は、監視対象のエレメントが存在するか必ず確認する。
　       let prevWidth = 0;
        const resizeTimer = setInterval($A.getCallback(function(){
            if (c.find("container")){ // 監視対象のエレメントが存在するか確認
                const curWidth = c.find("container").getElement().clientWidth;
                if (prevWidth !== curWidth) {
                    c.set("v.height", curWidth　* c.get("v.ratio"));
                }
            } else {
                clearInterval(resizeTimer);
            }
        }), 500);
    },
})
```

![ezgif-5-0177f55f47.gif](https://qiita-image-store.s3.amazonaws.com/0/26378/94c12f2c-a681-cba4-868a-4fa85dd4708b.gif)

・・・イイじゃん、コレで！！！！！！



## 気をつけたいポイント
今回のコンポーネント作成において気をつけたのは以下の 2 つです。

**① javascript による直接的な DOM の変更を避ける**

- 上のコードでは、`height` 変数を作成して style 属性で利用しています。`height` はヘルパー関数から値を `set(...)` する事で、DOM の操作を避けています。
- これとは別に javascript から `element.style.height` に値を直接代入する事も出来ます。しかし、稀に Lightining コンポーネントのレンダリングサイクルに思わぬ影響を及ぼす場合があるのでオススメしません。

**② DOM が有効になってからリサイズ処理を行う**

- `getElement(...)` などで DOM にアクセスする必要がある際は、DOM が有効(描画が完了している)かを確認する必要があります。DOM の準備が整っていないと `getElement(...)` は `undefined` に対して実行されるためエラーとなります。
- `afterRender(...)` は DOM の描画が完了した時に呼ばれる関数なので、この中での DOM アクセスは安全です。そのため、リサイズ処理は、カスタムレンダラとして拡張した `afterRender` の中で実行します。
- カスタムレンダラについてはこちら: [カスタムレンダラの作成](https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/js_renderers.htm)
C > mistake > ++ > 1日(24*60*60秒)を超えない | 別のハマリ事象 (0..255のループ)

```txt:動作環境 
C (ideone gcc 6.3)
```

https://ideone.com/ZRI60q

```c
#include <stdio.h>
#include <stdint.h>

int main(void) {
	int16_t val = 32764;
	
	for(int loop=0; loop<10; loop++) {
		printf("%d\n", val);
		val++;
	}

	return 0;
}
```

```txt:実行結果
32764
32765
32766
32767
-32768
-32767
-32766
-32765
-32764
-32763
```

上記のvalに対して`if (val > (24 * 60 * 60)`の判定をしても成立することはない。
1日は86400秒。


### 関連

- [c++ builder > DWORDではまる > unsigned long型に対して負をとろうとしていた](https://qiita.com/7of9/items/f1ce86d91fe969ef42a2)
- [Grenning > たとえクロックが[ロールオーバー]しても(この場合、136年ごと)...](https://qiita.com/7of9/items/27b321cfdfe579f44b9a)
- [secureCoding > ラップアラウンドを発生させない](https://qiita.com/7of9/items/c22cf33acc62bcc39292)

### 教えていただいた事項
(追記 2018/07/26)

@tenmyo さんの[コメント](https://qiita.com/7of9/items/fce07594ee5f775dfc3b/#comment-cfc97725c4a3dfd8f94c)において別のハマリ事象を教えていただきました。

情報感謝です。
TortoiseGitで直前のコミットログを修正したい

コミットログを間違った場合、直前のログの場合には簡単に修正することが出来ます。

ただ、Tortoise SVNとは方法が違うので、この機会に覚えておきましょう。

##操作
1. 右クリックしてコミットウィンドウを開きます。
2. 「Amend Last Commit」にチェックを入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267148/dd26456b-362d-fde9-ef49-b92eccb011b9.png)

3. 直前のコミットログがメッセージボックスに表示されるので、編集してコミットします。
4. 変わっていることをログウィンドウで確認しましょう。

##それ以前のログを修正したい
こちらの場合にはRebase等の操作が必要になってきて、若干複雑になります。
こちらの手順は別途。
Windows2016へADDSインストールメモ


ざっくりADのインストール手順を知りたい方対象です
Azureなんかの無料枠をさっと使ってドメインコントローラたてて遊んでください

#インストール手順
##検証でAzure上のWin 2016にADDSを下記の手順でインストールしてみる

1. サーバマネージャを開く
2. [役割と機能の追加]からActive Directory Domain Servicesを選択 
3. 配置構成 [新しいフォレスト]を追加する
4. [ルートドメイン名]を入れる　例：adatum.com
5. [機能レベル]を選ぶ
機能レベルはこちらを参考<https://docs.microsoft.com/ja-jp/windows-server/identity/ad-ds/active-directory-functional-levels>
6. [DNSサーバ]を入力する
7. ディレクトリサービス復元モードの[パスワード]を入力する
8. [NetBIOSドメイン名:　古いタイプと互換性があるか検証する
9. ADDBを選択　Azure AD上にADのドメインサービス関連のデータをどこに格納する
10. オプションの確認
11. 前提条件のチェック終わったらインストールをクリック（時間かかります)
※DHCPなんかでIP-Addrを割り当てるVMがいると警告が出たりするので注意
Git+XamppでWindowsからShellとPHPをコマンド実行できるようにする

# やりたかったこと
linuxのshell+phpで動かせるツールを作成したが、それをwindows上でも動くようにしたい。
なお、社内ポリシー関係で別ツールの追加インストールはしたくない。

# 解決が必要なところ
windowsで基本的なlinuxコマンドが使えるようにしたい。

# Windows上にインストールしたGit Bashができること(<b>※ここがポイント</b>)
基本的なshellスクリプトをサポートしてくれる。

# xamppができること
php cliのサポート

ということで、Gitとxamppの機能を統合すればやりたいことができるのではないかと思い、試してみた。

# 結論
php用の環境変数を設定してから、git-bashを起動することで仕事完了。

```bat:usePhpShell.bat
@ECHO ON
REM phpコマンド用の環境変数をセットする
REM xamppのインストール先に既に環境変数セット用のbatファイルがあるため、それを利用する
REM xamppのパスはインストール先に合わせて指定
call C:\xampp\xampp_shell.bat setenv

REM git-bash.exeを起動する
REM Git Bashのインストール先により
start C:\Users\xxxxxxxx\AppData\Local\Programs\Git\git-bash.exe
REM pause
```
[React Router] ページ遷移が発生するよりも前に Redux のステートを更新したい

# 問題

`react-router-redux` の `@@router/LOCATION_CHANGE` イベントはページ遷移の**後**に実行される。

```js:sagas.js
import { LOCATION_CHANGE } from 'react-router-redux'

export default function *rootSaga() {
  while (true) {
    const action = yield take(LOCATION_CHANGE)
    // update current user using route parameter
  }
}
```

```jsx:App.js
import React, { Component } from 'react'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import createHistory from 'history/createBrowserHistory'
import Routes from './Routes'
import configure from './redux/store'

const { store, history } = configure()

store.runSaga()

const App = () => (
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <Routes />
    </ConnectedRouter>
  </Provider>
)

export default App
```

```jsx:Routes.js
import React from 'react'
import Timeline from './Timeline'

const Routes = (props) => (
  <Switch>
    <Route component={Timeline} exact path="/timeline" />
    {// ...}
  </Switch>
)

export default Routes
```


```js:Timeline.js
import React, { Component } from 'react'

export default class Timeline extends Component {

  componentDidMount() {
    this.props.fetchTimelineOfCurrentUser()
  }

  componentDidUpdate() {
    //
  }

  render() {
    //
  }

}
```

ここでもし `fetchTimelineOfCurrentUser()` がReduxのステートに依存しているとすると，前のルートに基づくステートをパラメータとして使ってデータフェッチが走ってしまうことになる。

新しいルートに基づいてReduxのステートを再構成した上で，それを使って`componentDidMount()`を実行させたい。どうすればいいか？

# 解決策

ステート更新に非同期処理が入ってくる場合は未解決だが，同期処理のみで済む場合はスマートな解決策がある。

`rootSaga` の処理は消した上で `StoreUpdater` というコンポーネントを作る。 `render` メソッドの返り値は常に `null` で問題ない。

```jsx:StoreUpdater.js
import React, { Component } from 'react'

export default class StoreUpdater extends Component {

  componentDidMount() {
    // do something synchronous store update here
  }

  componentDidUpdate(prevProps, prevState) {
    // do something synchronous store update here
  }

  render() {
    return null
  }

}
```

このコンポーネントを `Routes` の中に仕込む。`ConnectedRouter` は単一のノードしか受け入れないので `Fragment` でラップする。

```jsx:Routes.js
import React, { Fragment } from 'react'
import StoreUpdater from './StoreUpdater'
import Timeline from './Timeline'

const Routes = (props) => (
  <Switch>
    <Route component={Timeline} exact path="/timeline" />
    ...
  </Switch>
)

const FreshRoutes = (props) => (
  <Fragment>
    <StoreUpdater {...props} />
    <Routes {...props} />
  </Fragment>
)

export default Routes
```

これだけ。 **`StoreUpdater` のライフサイクルメソッドは必ず `Routes` より先に実行される**ので，同期処理のみの場合はこれで解決できる。いちいち全ページコンポーネントの `componentDidMount()` `componentDidUpdate()` に更新処理を書いたりする必要はない。

非同期処理の場合は…どうするんでしょうね？
EMRからSpark SQLでGlueのテーブルを参照するとInvalidInputExceptionが出ることがある

以下のようなエラーが出る

```
Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: s3://xxxx/xxxxx
```

これはGlueのパーティションに指定したs3のパスが存在しない場合に出るエラーだが、Kinesis Firehoseで出力したs3に対して数年分のパーティションを事前作成している場合は困る。特に検証環境とか・・・

エラーを出ないようにするには`spark.sql.hive.verifyPartitionPath`を設定する。

```scala
// EMR5.16.0で確認
val spark = SparkSession
  .builder()
  .config("spark.sql.hive.verifyPartitionPath", true)
  .getOrCreate()
```
アジャイル開発に関する質疑応答

先日会社で[株式会社アトラクタ](https://www.attractor.co.jp/index.html)のみなさんを講師に迎えたアジャイル開発研修を受ける機会に恵まれました。
質疑応答ではかなり素朴な疑問をぶつけてしまいましたが、講師の先生方に快く教えていただきました。以下、個人的に印象に残った質問と回答を紹介します。

### Q. プロダクトオーナーとスクラムマスターは既成概念であるディレクターやプロジェクトマネージャーと何が違うか

A. 責任範囲の違いがある。ざっくり言うとスクラムマスターは開発プロジェクトの円滑な進行に責任を持ち、プロダクトオーナーはビジネス上の成果に責任を持つ。ここがはっきりと分業される。
既成概念であるディレクターやプロジェクトマネージャーは、開発プロジェクトの進行とビジネス成果の両方に責任を持つケースが多い。そのため開発プロジェクトのボトルネック/単一障害点になり、休めなくなりがちである。アジャイルチームにおいては、プライマリ・ロールの責任を果たすことに全力を尽くす必要がある。結果として、プロダクトオーナー/スクラムマスターは稼働率が低くても構わない。また、プロダクトオーナー/スクラムマスターは両者ともに開発チームにタスクをアサインする権限も責任もないことに留意。

#### 参考動画
[Super Scrum Master - the power of scrum- 日本語字幕版](https://www.youtube.com/watch?v=NcWDx-XXISY)
[![Super Scrum Master - the power of scrum- 日本語字幕版](http://img.youtube.com/vi/NcWDx-XXISY/0.jpg)](http://www.youtube.com/watch?v=NcWDx-XXISY)

### Q. スクラムマスターは開発経験がなくてもできるのか
A.　開発経験は当然あると望ましいが、必須ではない。開発チームやプロダクトオーナーをサポートし、障害を取り除き、時には外部の妨害から守ることがスクラムマスターの役割である。その役割を達成するために開発やプログラミングの知識や技能が必要と感じるのであれば勉強すること。
<figure>
<figcaption>ラグビーでスクラムをサポートするのはナンバーエイト</figcaption>
![800px-ST_vs_Gloucester_-_Match_-_23.JPG](https://qiita-image-store.s3.amazonaws.com/0/119598/a661a5ea-9ba4-0711-0910-34bb62c108ef.jpeg)
</figure>
### Q. スプリントは何曜日にスタートするべきか
A. 一週間のスプリントを計画する場合、律儀にカレンダーに合わせて月曜日にスタートして金曜日に終わる必要はない。
日本では月曜日が振替休日になることが多く、月曜日始まりがうまく機能しない。実際に日本で一週間スプリントをしている組織では火曜日から木曜日をスタートとしているところが多い。また、金曜日にレビューを行っても良いが、金曜日に本番リリースまでを行ってしまうと、万が一バグが発見された際に週末が潰れてしまう危険がある。金曜日にレビューを通過したとしてもリリースは翌週に行うといった工夫をしよう。


### Q. 差し込み仕事への対処法
A. 最初から差し込み仕事に対応できるバッファを考えておこう。バッファの領域をホワイトボードに予め用意しておくと良い。
偉い人からの差し込みが多発して困っているときは差し込み依頼を見える化してみよう。差し込み仕事を依頼した回数に応じて偉い人のプリクラをホワイトボードに貼っていくといった可視化を行うと、不思議なことに差し込み依頼が減ってくる。
![SprintBacklog_0.png](https://qiita-image-store.s3.amazonaws.com/0/119598/b31f9aea-6a6f-e3f2-fc88-90ffa506de98.png)

### Q. 連休がある週のスプリント
A. ゴールデンウィークや年末年始など、稼働日が2日間とか3日間になってしまう週にはあえてスプリントをやらない選択肢もある。スプリントのリズムが一旦崩れると、立て直すのに却って労力がかかる場合があるからだ。

### Q. アジャイル開発を築城に例えると
A. アジャイル開発を城造りに例えることは可能だが、誤解してはいけない点がある。「初週に石垣を作って、2週目に二の丸を作って、3週目に天守閣を作って姫路城のような立派なお城を建てる」というプロジェクトの進め方はアジャイルではない。
アジャイルは「初週に柵を立てて最低限の防御力（MVP）を確保し、2週目には壕を作り、3週目には曲輪を広げ徐々に防御力を高めていく」ような野戦築城に例えられるだろう。
<figure>
<figcaption>アジャイルな城</figcaption>
![597px-Cheval_de_frise_petersburg_civil_war_02598.jpg](https://qiita-image-store.s3.amazonaws.com/0/119598/9d5386ab-67b9-473b-d42f-414895cb1c9c.jpeg)
</figure>
##
[180726]Gitlab の Merge Request から学ぶ

人のMR(PR)は勉強になると思う毎日。

今日もGitLabの気になった MR を見ていく！

# [Use limit parameter to retrieve Wikis from Gitaly](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20764/diffs)
## メソッド化
こういうのってコードの意図がわかっていいなと思う。
あと、テストでも `def` でメソッド定義して意図を明確にしとっていいなと思った。

`app/controllers/projects/wikis_controller.rb`

```diff
  def load_project_wiki
-   @project_wiki = ProjectWiki.new(@project, current_user)
+   @project_wiki = load_wiki

    # Call #wiki to make sure the Wiki Repo is initialized
    @project_wiki.wiki

    ...

+ def load_wiki
+   ProjectWiki.new(@project, current_user)
+ end
```
Railsテストコマンド

#背景
・テストコマンドがよくわからないが、デバッグを見つけたり独学においてエラーで時間を割きたくないのでテストコマンドを習得したいと思った
・しかし、テストコマンドをまとめてあるサイトが少なく、あっても素人目だとよくわからないor読みづらい構成になっているため、Railsテストコマンドを自分が読みやすい形にリファクタリングしていきたいと思った。
・本記事の目的は、Railsテストコマンドとその周辺知識についての内容を読みやすいようにまとめることである。

※備忘録を兼ねている為、アジャイル更新となっております。

#メソッド
##assert_templateメソッド
効果：assert_template後にあるURLがビューを描画しているかをテストする。

```rb

require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home' #該当ビューが正しくテストできているか
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end
end
```

このテストでassert_templateでエラーに引っかかるとき、static_pages/homeのURLテンプレートは表示されないため、テンプレートを作成していない等、テンプレートに原因があると推察できる。

##assert_selectメソッド
前提：英語でいうmakeやgetのように意味が多岐にわたる為、汎用性の高いメソッドゆえに定義がむずかしい。
効果1：アプリケーションのビューのテストの際、あるページで重要なHTML要素とその内容がレスポンスに含まれていることをアサーションすることができる

```rb

require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end
end
```

※随時更新中



#参考文献
[Ruby on Rails チュートリアル～実例を使ってRailsを学ぼう/第5章レイアウトを作成する](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-sass_and_the_asset_pipeline)
[Railsドキュメント](http://railsdoc.com/test)
https://railsguides.jp/testing.html
http://d.hatena.ne.jp/zariganitosh/20080405/1207455670
EC-CUBE4のログ出力について


# ログ出力方法

ログ出力のグローバル関数が用意されているのでどこからでも呼び出せる。

```php
log_info('ログメッセージ');
```

ログレベル別に関数がわかれているので適切な関数を利用すること。

```php
log_emergency()
log_alert()
log_critical()
log_error()
log_warning()
log_notice()
log_info()
log_debug()
```

関数の定義は以下

`{EC-CUBEのディレクトリ}/src/Eccube/Resource/functions/log.php`

# ログの出力先

`{EC-CUBEのディレクトリ}/var/log/` 配下に出力される。

環境に合わせてさらにディレクトリが別れる。
環境の設定は `.env` ファイルの `APP_ENV` で指定可能。

例えば

- 本番環境( `APP_ENV=prod` )のときは `{EC-CUBEのディレクトリ}/var/log/prod` 配下にログ出力される。
- 開発環境( `APP_ENV=dev` )のときは `{EC-CUBEのディレクトリ}/var/log/dev` 配下にログ出力される。

# ログの設定変更

環境ごとの設定ファイルを修正してログの設定変更が可能。

例えば

- 本番環境( `APP_ENV=prod` )の設定は `{EC-CUBEのディレクトリ}/app/config/eccube/packages/prod/monolog.yml` に記載されている。
- 開発環境( `APP_ENV=dev` )の設定は `{EC-CUBEのディレクトリ}/app/config/eccube/packages/dev/monolog.yml` に記載されている。

# 参考

- https://github.com/EC-CUBE/ec-cube/pull/2761
- https://github.com/EC-CUBE/ec-cube/pull/2766
- https://github.com/EC-CUBE/ec-cube/pull/2716
ag-grid + vue + webpacker でvueインスタンスが２つ混入する問題

# tl;dr
ag-gird + vue2.x + webpackerを利用した開発で、ブラウザコンソールに以下のような警告が表示されたので、解決に至るまでの試行錯誤の結果をメモしておく。

```console
[Vue warn]: $attrs is readonly.

found in

---> <AgGridVue>
       <App> at app/javascript/packs/common/ag_grid.vue
         <Root>
```
```console
[Vue warn]: $listeners is readonly.

found in

---> <AgGridVue>
       <App> at app/javascript/packs/common/ag_grid.vue
         <Root>
```
```console
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "hogehoge"

found in

---> <AgGridVue>
       <App> at app/javascript/packs/common/ag_grid.vue
         <Root>
```

警告なので動くには動くけど、そのままにするわけにも行かない。
よーく見ると、`ag-grid`の何かが悪さしてるっぽいのはわかる。



# 環境
Ruby: 2.5.1
Rails: 5.2.0
Webpacker: 3.5
Vue: 2.5
ag-grid: 18.1

# おおまかな説明
Railsアプリケーションを作成する際、jsの開発に`webpacker`というgemを利用した。

Vue2.x系では、Webpackerなどのバンドラ向けに、[２種類のVue.jsインスタンス](https://jp.vuejs.org/v2/guide/installation.html#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%93%E3%83%AB%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を用意している。

簡単に説明しておくと、

- `vue.esm.js`
  - コンパイラ＋ランタイムの両方を含んだ完全版
- `vue.runtime.esm.js`
  - ランタイムのみの軽量版

アプリケーションの都合で、今回は`vue.esm.js`を利用することにしていたのだが、なぜかブラウザには`vue.esm.js`と`vue.runtime.esm.js`の２つのインスタンスが渡されてしまっていて、競合を起こしていることが原因。
（ほぼ同じコードを２つ含んでいるので、フラグ変数（`isUpdatingChildComponent`）の操作がおかしなことになってる。）

`ag-grid`の内部コードで下記のような箇所があり、`vue.runtime.esm.js`が混入してるっぽい。

```js
import Vue from 'vue'
```





# 対処

すべてのvueインスタンスを`vue.esm.js`に固定すればよい。
※ag-grid内のソースを書き換えるわけには行かないので、`alias`を利用する。（後述）

## 1. 自前のコードを整備する

自プロジェクトのjsのimportの書き方を確認する。

### OKパターン

```js
import Vue from 'vue/dist/vue.esm.js'
```

### NGパターン

ファイル名を最後まで明記していないので、パス指定のファイルとして認識してもらえない（後述の`alias`とも衝突するのでNG）

```js
import Vue from 'vue/dist/vue.esm'
```

デフォルトの書き方なので`vue.runtime.esm.js`が選択されてしまう。（[デフォルトの動作](https://github.com/vuejs/vue/issues/2873)）

```js
import Vue from 'vue'
```

## 2. Webpackerの設定でaliasを設定する

`vue`はデフォルトでは`vue.runtime.esm.js`を選択してしまうので、Webpackerの`alias`を使って`vue`を`vue.esm.js`に置き換える。

### Webpackerの設定ファイルを新規追加

```js:config/webpack/custom.js
module.exports = {
  resolve: {
    alias: {
      vue: 'vue/dist/vue.esm.js',
    }
  }
}
```

### custom.jsを各モードの設定ファイルで取り込む

```js:config/webpack/development.js
process.env.NODE_ENV = process.env.NODE_ENV || 'development'

const environment = require('./environment')
const customConfig = require('./custom')      // ＊追加

environment.config.merge(customConfig)        // ＊追加

module.exports = environment.toWebpackConfig()

```

`test`、`production`などのファイルも同じように修正する。



上記対処をいれて、再起動すれば`Warn`は出なくなる。はず。
MacへのDjangoのインストール・起動方法

#はじめに
昨今の機械学習ブームでpythonが開発言語の主流になってきました。
Djangoはpythonで動くMVCフレームワークでとても直感的に使えます。

#目次
1.Anacondaをインストールしよう
2.djangoとspyderをインストールしよう
3.プロジェクトを作成しよう
4.localhostから立ち上げよう
5.Hello Django!!を表示させよう

#1.Anacondaをインストールしよう
まず下記からAnacondaをインストールします。

https://www.anaconda.com/download/#macos

![Screen Shot 2018-07-25 at 12.40.25 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/aeea068f-08fc-febc-6df4-f6a1c7775af3.png)

ひたすら次へボタン押下で問題ありません。

インストールされると「LaunchPad」上に「Anaconda−Navigator」が表示されます。
![Screen Shot 2018-07-25 at 12.52.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/49475a6d-6e9b-8502-5f2f-e25d1e7a1c79.png)

#2.仮想環境を立ち上げ、djangoとspyderをインストールしよう
次に仮想環境を作成します。
Anaconda−Navigatorを立ち上げて、「Environments」を押下。
「Create」から新しく仮想環境を作成します。

![Screen Shot 2018-07-25 at 12.52.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/1a03b99c-1214-0c78-4440-a544324d1b38.png)

![Screen Shot 2018-07-25 at 12.54.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/560fd966-f22d-4606-ee51-905bb18d61d6.png)

作成した仮想環境から、ターミナルと起動させます。

![Screen Shot 2018-07-25 at 12.56.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/a4f06ee5-1398-2103-8102-d300a971b687.png)

そして以下を実行。

```
pip install django
```

次に、Anaconda−Navigator上の「Home」に戻り、Spyderをインストールします。

![Screen Shot 2018-07-25 at 1.01.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/34e152a3-68c8-dc1b-4fa6-4eca12a3b039.png)
＊多少時間がかかります。


spyderは統合開発環境です。
こんな感じ↓

![Screen Shot 2018-07-25 at 1.05.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/4559b28b-176c-d5ff-79bf-2d250f439959.png)


#3.プロジェクトを作成しよう

spyderの画面からProjectを作成します。

![Screen Shot 2018-07-25 at 1.06.31 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/7a471af1-1d90-d719-d7d2-57a2e83b5b40.png)

![Screen Shot 2018-07-25 at 1.14.48 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/0faf575a-29c1-2068-3360-281dc2422289.png)

spyderでProjectを作成したら「Anaconda−Navigator」のターミナルから下記のコマンドを押下。


```
cd Desktop
```


```
django-admin startproject django_app
```

spyderからProjectが作成されていることを確認しましょう。

#4.localhostから立ち上げよう

以下のコマンドを実行。
```
　　　　cd django_app
```

```
python manage.py runserver
```

http://localhost:8000/からアクセス。

![Screen Shot 2018-07-25 at 1.17.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/bcc1a4ec-3478-e682-b337-2a71ce537a42.png)

#5.Hello Django!!を表示させよう

新しくProjectを作成します。
```
python manage.py startapp hello
```

views.pyを書き換えます。

```views.py
from __future__ import unicode_literals
from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello Django!!")
```

さらに、urls.pyを書き換えます。

```urls.py
from django.conf.urls import url
from django.contrib import admin
import hello.views as hello
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'hello/', hello.index)
]
```

```
python manage.py runserver
```

起動させます。

http://localhost:8000/helloからアクセス。

![Screen Shot 2018-07-25 at 1.24.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/7438d731-9f51-070b-1566-a1a7d01f73f8.png)

###おつかれまでした!!!
PyQt5で、画面Aから画面Bを複数のウィンドウに出力する

画面A
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/103457/75b2ae77-212a-8814-3d94-a54649b76d4b.png)

ボタンをクリックすると、画面Bに選んだコーヒーの特徴が出ます。
すると、画面Bを複数表示し、比較したくなりますよね。

ですが、ネット上にあるサンプルだと画面Bを一つしか出力できません。
いろいろ考えた結果、以下のようにすると複数出力できました。


```python:coffee.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel
import coffeeInfo


class App(QWidget):

    def __init__(self):
        super().__init__()

        self.title = "aa"
        self.setWindowTitle(self.title)
        self.setGeometry(300, 300, 300, 150)

        self.ex_list = []

        self.init_ui()
        self.show()

    def init_ui(self):
        button1 = QPushButton('コーヒーA', self)
        button1.clicked.connect(self.on_click)

        button2 = QPushButton('コーヒーB', self)
        button2.clicked.connect(self.on_click)

        button3 = QPushButton('コーヒーC', self)
        button3.clicked.connect(self.on_click)

        label = QLabel("好きなコーヒーを選んでください", self)

        hbox = QHBoxLayout()
        hbox.addWidget(button1)
        hbox.addWidget(button2)
        hbox.addWidget(button3)

        vbox = QVBoxLayout()
        vbox.addWidget(label)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

    def on_click(self):
        button = self.sender()
        self.ex_list.append(coffeeInfo.App(button.text()))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
```


```python:coffeeInfo.py
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout


class App(QWidget):

    def __init__(self, select):
        super().__init__()

        self.title = select
        self.setWindowTitle(self.title)
        self.setGeometry(650, 200, 300, 150)

        self.select = select

        self.ex_list = []

        self.init_ui()
        self.show()

    def init_ui(self):

        info = {"コーヒーA": "まったりとして、それでいてしつこくない",
                "コーヒーB": "アラビカとかロブスタですね",
                "コーヒーC": "女だ……女がいる!!!!"}

        label = QLabel(info[self.select], self)

        vbox = QVBoxLayout()
        vbox.addWidget(label)
        self.setLayout(vbox)
```


# 変えたところ

（前）self.ex = coffeeInfo.AppApp()
（後）self.ex_list.append(coffeeInfo.App())

リストに変更しています。

# 説明ッ！
self.ex = coffeeInfo.App()　は、Appクラスのオブジェクトを生成し、exという変数に入れています。
これだと、self.exには一つのオブジェクトしか入らないので、画面も一つしか作れません。

self.ex_list.append(coffeeInfo.App())　とすると、

- 最初に出力される画面Bは　self.ex_list[0]
- つぎに出力される画面Bは　self.ex_list[1]
- つぎに出力される画面Bは　self.ex_list[2]

と、別の変数に入るので、複数の画面が出力されます。
AE プロジェクトアイテムのコンポジション内の写真を非表示に

#コンポジション内の写真ファイルを一括で非表示にする
大量にあるコンポジションの中の写真を非表示にする必要がありました。
ただアイテムが静止画かどうか判定するのはあるんですが、レイヤーを判定する方法が見つかりませんでした。
とりあえずスマートではないですが、メモしておきます。

##考え方　（ファイル名とレイヤー名で判定する）
プロジェクトパネル内にある写真だけが入っているフォルダ「picsフォルダ」のファイル名を配列に入れ、その後コンポジションの中のレイヤーと一致するか調べて、picsフォルダにある写真のファイル名とレイヤーのファイル名が一致したら非表示という方法です。

```jsx
var projectLength = app.project.numItems;
$.writeln('projectLength'+projectLength);

var pics_item_No = ""
for (var i = 1; i < projectLength ; i ++){
    var fixName = 'pics' ;　//←これが写真に入ったフォルダ名の変数です。
    var temp = app.project.item(i).name;
    if (temp == fixName){
        pics_item_No = i;
    }
}

var picsfolderPath = app.project.item(pics_item_No);
$.writeln('picsfolderPath'+picsfolderPath.numItems)

var picsArray = [] ;
for (var i = 1; i < picsfolderPath.numItems ; i ++){
    var picsName = picsfolderPath.item(i).name;
    picsArray.push(picsName)
}

var target = app.project.selection;
app.beginUndoGroup("undo");

for ( var  i = 0 ; i< target.length ; i++){
    var tempComp = target[i];
    var tempLayers = tempComp.numLayers;
    
    for (var j = 1 ; j < tempLayers +1 ; j ++ ){
            var layerName = tempComp.layer(j);
        for(var k = 0 ; k < picsArray.length ; k++){
            if (layerName.name == picsArray[k]){　//ここで←名前を判定する
            layerName.enabled=false;
            }
        }
    }
}
app.endUndoGroup();
```
SAS Viyaによるテキストマイニングの始め方（R言語編）

SAS Viyaを使って機械学習を行う方法としてはStudioというWebアプリケーションで行う方法と、Python/Java/R/SASといった言語から操作する方法とがあります。

今回はR言語を使ったSAS Viyaのコントロール法についてまとめました。

## ライブラリの読み込み

まずSASライブラリを読み込みます。

```r
library('swat')
```

## セッションを開始する

サーバに繋ぎます。

```r
s <- CAS('localhost', port=5570, caslib="casuer")
```

## アクションセットを読み込む

処理によって異なるアクションセットを読み込みます。今回はテキストマイニングを行うtextMiningを指定します。

```r
loadActionSet(s, "textMining")
```

## データを読み込む

処理対象のデータを読み込みます。インポート先のテーブルも指定します。

```r
indata_dir <- 'data'
indata <- 'news'
indata2 <- 'engstop'
cas.table.loadTable(s, path = paste0(indata_dir, '/', indata, '.sas7bdat'), caslib = 'CASUSER(viyauser)', casOut = indata)
cas.table.loadTable(s, path = paste0(indata_dir, '/', indata2, '.sas7bdat'), caslib = 'CASUSER(viyauser)', casOut = indata2)
```

## テキストマイニングを実行

newsテーブルに入っているデータを対象にテキストマイニングを実行します。

```r
cas.textMining.tmMine(s,
  documents=list(name = "news"),
  stopList=list(name = "engstop"),
  docId="key",
  text="text",
  reduce=2,
  entities="STD",
  k=10,
  norm="DOC",
  u=list(name = "svdu", replace = T),
  terms=list(name = "terms", replace = T),
  parent=list(name = "parent", replace = T),
  parseConfig=list(name = "config", replace = T),
  docPro=list(name = "docpro", replace = T),
  topics=list(name = "topics", replace = T)  
)
```

## 結果を表示する

例えば topics テーブルの結果を表示します。

```
cas.table.fetch(s, table = 'topics')
```

| _Index_ | _TopicId_ | _Name_ | _TermCutOff_ |
|---------|---------|---------|---------|
| 1 | 1 | league, +defenseman, hockey, tampa, +draft pick | 0.021 |
| 2 | 2 | +keyboard, pc, +price, +mouse, +thumb | 0.021 |
| 3 | 3 | +flyer, amour, +goal, tommy, lindros | 0.020 |
| 4 | 4 | period, scorer g, scorer, power, pp | 0.021 |
| 5 | 5 | gif, +injury, +muscle, +keyboard, +condition | 0.020 |
| 6 | 6 | +tool, +break, +exercise, +type, +description | 0.022 |
| 7 | 7 | +cancer, +day, +bath, water, +eat | 0.022 |
| 8 | 8 | +versus, tor, mon, van, series | 0.023 |
| 9 | 9 | business, political, college, +event, dr. | 0.020 |
| 10 | 10 | +system, sgi, virtual, graphics, +reality | 0.024 |

## まとめ

Rで機械学習を分かりやすく書けるのがSAS Viyaの良いところです。他にもJava、Python、SASにも対応していますので、好きな言語でぜひお試しください！

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Sizeclassについて教えてください。

##仕様
xcode9
swift4

4ｓサイズに合わせてデザインすると、8plusサイズでデザインが崩れています。下の余白が増えます。どちらもwidth compact,heught regularです。iPadサイズはwRhRで、もっと崩れます。これを解決するにはどうすれば良いでしょうか。



![スクリーンショット 2018-07-26 12.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/26564/2b29db36-10a0-5f83-7d8b-ca9b7e7ba2f5.png)
![スクリーンショット 2018-07-26 12.14.59.png](https://qiita-image-store.s3.amazonaws.com/0/26564/9c09be93-c2f6-be7c-8ac4-22918e2ff40a.png)
![スクリーンショット 2018-07-26 12.17.51.png](https://qiita-image-store.s3.amazonaws.com/0/26564/b5f42b3d-bf27-7c25-e5f9-f66bec0a1f42.png)
mysqlが起動しない（The server quit without updating PID file）

## mysqlが起動しない
何もしてないのに壊れた・・
Sierraにアップデートしたところ、mysqlが起動しなくなってしまいました。
## 環境
Mac OS Sierra
mysql 5.6

下記、参考にさせて頂きましたm(__)m
[mysql起動で「The server quit without updating PID file」](https://qiita.com/yu-yan/items/6e693caf23054c6ba9a1)
["Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)." エラーの対処](http://tech-outlines.hateblo.jp/entry/2015/03/24/180940)

## PIDファイルがない？
```
$ mysql.server start
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/****.local.pid).
```
PIDファイルを手動で生成して見てもダメでした。
mysqlをアンインストールしてもダメ、 `/usr/local/`以下のmysqlに関するファイルを全て削除してもダメで、手詰まりに・・・。

## 解決方法
権限周りで落ちているとの情報を得たので、mysql以下のファイルの所有者をすべて_mysqlに変更し、プロセスを再起動したら動いた。

```
# プロセス確認（pidファイルあるじゃないか・・・）
$ ps x | grep mysql
13036 s000  S      0:00.04 /bin/sh /usr/local/Cellar/mysql/8.0.11/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/****.pid
13137 s000  S     11:33.62 /usr/local/Cellar/mysql/8.0.11/bin/mysqld --basedir=/usr/local/Cellar/mysql/8.0.11 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/8.0.11/lib/plugin --log-error=****.local.err --pid-file=/usr/local/var/mysql/****.local.pid
13167 s002  R+     0:00.00 grep mysql
# mysqlに関するプロセスをkillし、ちゃんと落ちていることを確認
$ pkill -9 mysql
$ ps x | grep mysql
13462 s002  U+     0:00.00 grep mysql
# 権限の変更
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql
# 動いた！！！
$ sudo mysql.server start
Starting MySQL
. SUCCESS! 
```

## まとめ
謎のエラーでしたがかなりハマりました。
調べてみると、様々な原因から上記のようなエラーになるようで、解決方法が一意でなかったためこちらに記しておきます。
正直なところちゃんと原因の切り分けができておらず、取り止めなのない記事ですみません。
余談ですが、一度プロセスkillすることを放念しており、ここでもハマりました・・w

unixは奥が深い（まとめ）
CloudFormationスタックセットでサンプルを動かしてみたメモ

# 前提
- 管理アカウント：aaaaaaaaaaaa
    - 	スタックセットを実行するアカウント
- ターゲットアカウント：bbbbbbbbbbbb
    - 	リソースが作成されるアカウント
- CloudTrailを有効化

# 手順メモ
## 権限準備
### 管理アカウント
`AWSCloudFormationStackSetAdministrationRole` の作成

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html?shortFooter=true
を参照してymlをDLし、CloudFormationで実行

### ターゲットアカウント
`AWSCloudFormationStackSetExecutionRole` の作成

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html?shortFooter=true
を参照してymlをDLし、CloudFormationで実行

## スタックセット実行

管理アカウントで実行
「AWS CloudTrail の有効化」を選択
すべてデフォルトでおｋ

# 参考
AWS CloudFormation StackSets の操作 - AWS CloudFormation https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html?shortFooter=true
react-nativeでreduxを使っているときのこと

※個人用の記録
※随時、更新

#reduxのcreateStoreは何をしているのか
```js:例えば、こんなやつ
import { createStore } from 'redux';
import reducer from './reducer.js';

︙

const store = createStore(reducer);
```
reducerで作った「引数で受け取ったActionとstateでstateの状態を変更する」役割をreduxのstoreに登録する。

##reducerでは何をするのか
```js:reducerの例
const initialState = {
    hello: "Hello World",
    dio: ""
}

export default function reducer(state = initialState,action) {
    switch(action.type) {
        case 'HELLO_WORLD':
            return {
                ...state,
                hello: action.hello
            };
        
        case 'THE_WORLD':
            return {
                ...state,
                dio: action.dio
            };
            
        default:
            return state
    }
}
```
- 第1引数→state
- 第2引数にaction

actionのtypeによって処理が分かれ、↑ではstateのオブジェクトにactionのオブジェクト値を代入する

#参考
[createStoreを実装してみたらReduxの理解が捗った
](https://qiita.com/miyarappo/items/30fff8d23704e92211b7)
Rails開発環境でmysqlを使っていて「SSL connection error: Unable to get certificate」がでたときの対応

あるときから（たぶんgemを更新したタイミング）開発環境を起動してアクセスすると「SSL connection error: Unable to get certificate」が発生するようになった。
（rails sは問題なく起動）


<b>対応方法</b>

database.ymlに、「sslverify: false」を追加。


```database.yml
省略

development:
  <<: *default
  sslverify: false
  database: database_name
  socket: /tmp/mysql.sock

省略
```
ejsでjsonを読み込みmeta情報を一括管理

# 編集ファイル

- gulpfile.js
- _head.ejs（パーシャル化）
- meta.json
- 各個別ページのejsファイル

先ず、gulpfile.jsに設定を記述する。
jsonファイルを読み込むのに必要な「fs（File System）」を記述。元々あるものなのでコマンドプロンプトなどでインストールする必要はない。
タスクの記述内に変数jsonにmeta.jsonを読み込んだJson.parseを代入し、pipeで変数jsonを読み込む。

```javascript:gulpfile.js
// gulp core
var gulp = require('gulp');
//fsファイルの読み込み
var fs = require( 'fs' );
var ejs = require("gulp-ejs");
var rename = require("gulp-rename");


gulp.task('ejs', function() {
  var json = JSON.parse(fs.readFileSync("../ejs/includes/meta.json","utf-8"));
  gulp.src(
      ["../ejs/**/*.ejs", '!' + "../ejs/**/_*.ejs"] 　//参照するディレクトリ、出力を除外するファイル
    )
    .pipe(ejs({json:json}))　//jsonの読み込み
    .pipe(rename({
      extname: ".html"
    })) //拡張子をhtmlに
    .pipe(gulp.dest("./"));
});
```

_head.ejsの頭に下記ソースを挿入。もし該当ページのmeta情報がなければdefaultの情報を入れるという記述。

```javascript:_head.ejs
<%
  var _default = json['default'];
  for ( var key in _default ) {
    if ( typeof page[key] === 'undefined' ) {
      page[key] = _default[key];
    }
  }
-%>
```
各meta要素のcontent部分に、<%= page['出力名'] %>といった記述を挿入。
descriptionやtitleといったjsonファイルで設定したものを載せる。

```html:_head.ejs

~省略~
<meta name="description" content="<%= page['description'] %>" />
<meta property="og:title" content="<%= page['title'] %><%= page['sitename'] %>">
<meta property="og:image" content="<%= page['ogp_img'] %>">
<meta property="og:description" content="<%= page['description'] %>">
<meta property="og:url" content="<%= page['url'] %>">
```

meta.jsonにオブジェクトを記述していく。

defaultというオブジェクトが基本的に記述されるmeta情報。
その下に続けて書いてあるtopやaboutがページごとに設定していく情報。
この場合トップページとアバウトページになる。

```json:meta.json
{
  "default": {
    "title": "ページタイトル",
    "description": "ディスクリプション！",
    "url":"サイトURL",
    "ogp_img": "ogp画像",
    "sitename": "配下ページタイトルの末尾に着けるサイト名（｜株式会社○○など）"
  },
  "top": {
    "sitename": ""
  },
  "about": {
    "title": "アバウト",
    "url":"https://exsample.com/about/"
  }
}
```
**※各オブジェクトの末尾はカンマをつけないこと。
jsonファイルは続けて記述する場合のみカンマをつける。でないとエラーがでる。**

```json:meta.json
{
  "default": {
    "title": "ページタイトル",
    "description": "ディスクリプション",
    "url":"サイトURL",
    "ogp_img": "ogp画像のパス",
    "sitename": "配下ページタイトルの末尾に着けるサイト名（｜株式会社○○など）", ←NG
  },
  "top": {
    "sitename": ""
  },
  "about": {
    "title": "アバウト",
    "url":"https://exsample.com/about/"
  }, ←NG
}
```

_head.ejsとmeta.jsonの設定が完了したら、あとはページごと個別にファイルを読み込んでいく。

```javascript:index.ejs(トップ)
<%-
  include('./includes/_head', {
    page: json['top']
  });
%>
```

```javascript:index.ejs（アバウト）
<%-
  include('../includes/_head', {
    page: json['about']
  });
%>
```

上記のように、ejsファイルの頭にjsonを読み込む記述を置く。
そうすると、対応したオブジェクト名の値が読み込まれ、meta情報が書き出される。

ここまで書いたら、あとはコンパイルするのみ。お疲れ様でした。
【PhpStorm】ctpファイルにシンタックスハイライトを適用する

[PhpStorm](https://www.jetbrains.com/phpstorm/)ではデフォルトでCakePHPのテンプレートファイル(.ctp)にはシンタックスハイライトが適用されず、このままでは読みにくいものとなってしまいます。
そこで.ctpにもシンタックスハイライトを適用する方法を書いておきます。

バージョンは以下のとおりです。

```
OS: macOS
PhpStorm: 2017.3.4
```

## 設定方法
1. Preferences > Editor > File Types
2. Recognized File TypesでPHPを選択
3. Registered Patternsで+ボタンをクリックし`*.ctp`を入力しOK
4. Applyをクリック
5. OKをクリック

<img width="1026" alt="スクリーンショット 2018-07-26 11.26.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/73490/858c62a0-eb59-5b7c-0dab-0c9b7b915a1b.png">

以上で完了です。なお、PhpStormの再起動は不要です。
Androidのlicencesのエラーを解決

```
Failed to install the following Android SDK packages as some licences have not been accepted.
   platforms;android-27 Android SDK Platform 27
   build-tools;27.0.3 Android SDK Build-Tools 27.0.3
```

```bash
cd ~/Library/Android/sdk/tools/bin
```

```bash
./sdkmanager --licenses
```
lazuriteでLチカ

#概要
lazurite sub-ghzが来たので、Lチカしてみた。

#写真
![CIMG2665.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/82da8002-a304-d0ed-8af5-95387448bd25.jpeg)


#サンプルコード

```
#include "led12_ide.h"		// Additional Header

void setup()
{
	led_init(25);
}
void loop()
{
	led(true);
	sleep(1000);
	led(false);
	sleep(1000);
}
```

#嵌りポイント
##usbドライバーが無い。
ide入れても、ドライバーは、無い。
FTDIからVCPドライバーをダウンロードする。

##ledは、１３じゃない。
オレンジが、２５
ブルーが、２６

以上。