OmniAICreator/Qiita-1.07M huggingface dataset:
iOSで動画の上に画像を載せて回転アニメーションさせる方法

#動画編集で画像を載せて、それを回転アニメーションさせてみる

[動画編集について記事](https://qiita.com/drafts/225eb3c6aa864d950f65/edit)を記載していますが、編集動画に画像を載せてそれをアニメーションする例です。

```Swift
//画像のアニメーションレイヤの作成
    func makeImageAnimation() -> CALayer {
        //背景画像
        let imageLayer: CALayer = CALayer()
        let sampleImage: UIImage = UIImage(named: "sample")!  // 画像は別途assetに用意

        imageLayer.bounds = CGRect(x: 0, y: 0, width: 300, height: 400)
        imageLayer.position = CGPoint(x: 1000, y: 1080-600)  // 左下基準なので、y座標は動画の最大サイズから引くべし
        imageLayer.contents = sampleImage.cgImage
        imageLayer.shadowOpacity = 0.3  // 画像に影を付けてみる
        imageLayer.shadowOffset = CGSize(width:6,height:-6)  // 画像に影を付けてみる。右下に
        imageLayer.contentsGravity = kCAGravityResizeAspect  // アスペクト比はキープで
        imageLayer.opacity = 1.0
                
        //回転アニメーションをさせてみる
        let animRot = CABasicAnimation(keyPath: "transform.rotation")
        animRot.beginTime = 1.0  // 動画開始1秒後に回転開始
        animRot.duration = 3.0  // 3秒間で10度から-10度まで回転
        animRot.repeatCount = 3  // 3回繰り返し
        animRot.autoreverses = true
        animRot.fromValue = CGFloat(Double.pi/180*10)
        animRot.toValue = CGFloat(Double.pi/180*(-10))
        animRot.isRemovedOnCompletion = false
        animRot.fillMode = kCAFillModeForwards
        imageLayer.add(animRot, forKey: nil)
                
        return imageLayer
    }
```


使う側のコード

```Swift
        // 親レイヤを作成
        let parentLayer: CALayer = CALayer()
        parentLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)

        //画像レイヤの作成
        let imageLayer = self.makeImageAnimation()
        parentLayer.addSublayer(imageLayer)
        }
```

使う側はこんな感じです。いろいろ省略してますが、[動画編集について記事](https://qiita.com/drafts/225eb3c6aa864d950f65/edit)を参考に追加してみてください。

##解説
イメージレイヤをframeでなくて、boundsとpositionを使って大きさと場所を指定しているのがポイント。
別にframeで指定してもできますが、回転する場合は中心軸がどこになるかで回転の見え方が変わってくるので、positionで指定することにより、画像の中心位置を明示的に指示することができます。
回転するときはこの位置を中心に回転することになります。

CABasicAnimationにtransform.rotationを指定することにより、回転アニメーションができるようになります。
このkeypathに変化させたいものを入れることで、アニメーションできるようになります。
ただし、animatableなプロパティしか変化しないので、swiftの仕様書を良く読みましょう。
positionやboundsはアニメーションできるのですが、frameはアニメーションできないので注意です。
場所やサイズを変更したい時は、frameではなく、positionとboundsを変化させましょう。

fromValueとtoValueに値を入れると、それが"transform.rotation"に入って変化していくことになります。transform.rotationに入る型を入れるようにしましょう。この値を段階的に変化してアニメーションしていきます。瞬間的に値を変えたい場合はCAKeyFrameAnimationを使ってやることになります。

isRemovedOnCompletion = false これは必ず設定しましょう。動画編集で使う場合はtrueだと何も表示されなくなるはずです。view上に直接リアルタイムで表示する場合はtrueで上手くいくことがあるのですが、動画編集というリアルタイムでない場合はfalseでないとアニメーションが残らないみたいです。

あとは、CALayerは左下が(0,0)基準ということです。一般的な座標系は左上が(0,0)となっているので、デザイン画像の座標をPhotoShopとかで調べたあと、y座標はCALyaerの縦幅から引くようにするとうまくいきます。
ついでに言うと、1080-600など数字の計算式を多く入れると、コンパイル時間がやたらかかることがあるので注意。特に2 * 1.5 + 10 など小数が入るようなものは型変換が内部で起こるので、あらかじめ計算しておくか、型変換が起こらないように注意しておく必要ありです。"too complex"とか言われてコンパイルに失敗することもあります。
任意の配列n個の中身をループを回して１つずつ全通りの組合せを表示する。

## やったこと
任意の配列n個の中身をループを回して１つずつ全通りの組合せを表示する。

```python:narray.py
# coding:utf-8
import itertools

dim_num = 3
b = [chr(i) for i in range(65,65+dim_num)]

for b in itertools.product(range(3),repeat=dim_num):
    print(b)

```

実行結果

```
(0, 0, 0)
(0, 0, 1)
(0, 0, 2)
(0, 1, 0)
(0, 1, 1)
(0, 1, 2)
(0, 2, 0)
(0, 2, 1)
(0, 2, 2)
(1, 0, 0)
(1, 0, 1)
(1, 0, 2)
(1, 1, 0)
(1, 1, 1)
(1, 1, 2)
(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(2, 0, 0)
(2, 0, 1)
(2, 0, 2)
(2, 1, 0)
(2, 1, 1)
(2, 1, 2)
(2, 2, 0)
(2, 2, 1)
(2, 2, 2)
```

###こうとかもいける。

```python:narray.py
# coding:utf-8
import itertools
import numpy as np

dim_num = 3
b = [chr(i) for i in range(65,65+dim_num)]
array = np.array(([[[3,3],[2,1]],[[2,1],[3,2]]]))

for b in itertools.product(range(2),repeat=dim_num):
    print(array[b])

```

実行結果

```
[[[3 3]
  [2 1]]

 [[2 1]
  [3 2]]]
3
3
2
1
2
1
3
2
```

##参考文献
[アルファベットのリストを作る in python](http://hetapy.hatenablog.com/entry/2013/08/23/115537)
[itertools — 効率的なループ実行のためのイテレータ生成関数](https://docs.python.jp/3/library/itertools.html)
DockerのApacheで起動時に実行環境をセットする

## 概要
PHPのレガシーコードで環境判定にApacheの定数を使っていることがあるので、
Docker環境でもそのスクリプトがそのまま動くよう環境設定を行うことが
ときどきあるのでメモとして残しておきます。

## Dockerの設定
docker-compose.ymlの例を記載します。

**開発環境の例)**

```yaml:docker-compose.yml
version: '2'
services:
  httpd:
    image: httpd:2.4
    container_name: 'httpd'
    command: /usr/local/apache2/bin/httpd -DFOREGROUND -DDev
    ports:
      - '80:80'
      - '443:443' 
```
※ 開発以外の環境は、「 `-DDev` 」を「 `-DTest` 」や「 `-DProd` 」に変更する

## 環境判定
.htaccessで判定する例を記載しておきます。

```apacheconf:.htaccess
<IfDefine Dev>
  # 開発環境
  SetEnv APP_ENV development
</IfDefine>
<IfDefine Test>
  # テスト環境
  SetEnv APP_ENV testing
</IfDefine>
<IfDefine Prod>
  # 本番環境
  SetEnv APP_ENV Production
</IfDefine>
```

phpでの判定例を記載しておきます。

```php:environment.php
<?php

switch (getenv('APP_ENV')) {
  case 'development':
    echo '開発環境';
    break;

  case 'testing':
    echo 'テスト環境';
    break;

  case 'production':
    echo '本番環境';
    break;

  default:
    throw new ErrorException('環境を判定できません');
}
```

## 参考サイト
* [Apache コア機能](https://httpd.apache.org/docs/2.4/ja/mod/core.html)
Dockerコンテナのホスト名をセットする

## 概要
環境をホスト名で分岐しているレガシーコードを見かけることがあります。
Dockerコンテナ内でも正常に動くよう設定方法をメモしておきます。

## Dockerの設定
Dockerコンテナにホスト名をセットする

```yaml:docker-compose.yml
php:
  image: php:7.1-fpm
  hostname: 'php-dev'
```

## 環境分岐
ちょこちょこ見かけるPHPでの環境分岐のスクリプト例を記載しておきます。

```php:environment.php
<?php

/**
 * 実行環境の自動判定
 */
switch (php_uname('n')) {
  // 初期値 (不明)
  default:
    throw new ErrorException('実行環境の判定ができません');
    break;

  // 本番環境
  case 'php-prod':
    $env = 'production';	
    break;

  // テスト環境(Staging)
  case 'php-test':
    $env = 'testing'
    break;

  // 開発環境
  case 'php-dev':
    $env = 'development';
    break;

  // ローカル環境
  case 'php-local':
    $env = 'local';
    break;
}
define('APP_ENV', $env);

```

## 参考サイト
* [How Do I Set Hostname in Docker Compose?
](https://stackoverflow.com/questions/29924843/how-do-i-set-hostname-in-docker-compose)
21歳システムエンジニアが思うIT技術者の役割

# はじめに
はじめまして２１歳のyukiと申します。
私は、現在セキュリティ関係(SSO系)のシステム開発に携わっています。
基本的に、`Java`で開発をしたりしてます。(時々`bash`シェルとか、`powershell`とか、遊びで`python`も)
昨年(2017)は学習途上であったため、**素晴らしい**皆様の記事を読んで学習しておりましたが、
今年(2018)はROM専をやめて、**Output**も少しできたらと考えています。

---

# IT技術者の役割
## ITの分類
私が思うに、ITの分野には大きく**２つ**に分類できると考えています。
その分類とは、以下のようなものです。

|分類|実施者|説明|
|:--|:--|:--|
|定義・定理|研究者|研究者などが研究を行い、定義や定理などを確立する。|
|応用・開発|開発者|研究者が確立した定義・定理などを応用する。|

* １つ目は、**定義・定理**という、技術や方式・定義や定理などを確立する分類です。<br>
これは、研究者が行うものだと考えています。暗号方式を考えたり...難しそうだな~
* ２つ目は、**応用・開発**という、定義・定理を応用して開発を行う分類です。<br>
これは、開発者が行うものだと考えています。

### IT技術者の分類は?
上記(`ITの分類`)で２つの分類しましたが、IT技術者が**応用・開発**に分類されることは明白だと思います。
## IT技術者の役割
私たちIT技術者は、どのように技術・方式・定義・定理を応用して、**お客様の要望にマッチ**させるかということだと思います。
定義・定理の難しい内部のフローや方式を知ることも大事ですが、そこがMainではなく、それをどう応用するかだと思います。
### 役割にマッチした考え方・学習を...(自分に言い聞かせる用www)
技術が好きだからといってただ闇雲に学習すれば良いというものでもないと思います。
お客様からお金をいただく以上、どんな未熟者でも**プロ**ということらしいので、
常日頃からこの技術は、どうやって応用して、どのようにお客様の満足度を高めるかを考えないといけないんだなぁと思います。

時々、「とりあえずフレームワーク用いたら楽にできんじゃね？Springとか！！」と思ったりもしますが、ただ単純に、何も考慮せずに使用してしまうと、お客様が欲しているものではなく、**IT技術者のワンマンプレイ**になってしまうパターンもありそうなので、いろいろなことを考慮し、
お客様のヒアリングから要件化して、設計に映る段階でい〜〜っぱい考えないとダメ。
がんばらないと。。。(システムエンジニアって割と大変なんだなぁ〜ww)

---

## 最後に
この記事は、何かの技術を伝達するのではなく、ただただ自分が思うIT技術者の役割を述べただけでした。
こんな文字ばっかりで、つまらない記事を最後までご精読ありがとうございました。
今後をもうちょい技術的なこと書きたいな〜なんて...
不正アクセスにイライラする編

サーバを運用していると、不正アクセスに頻繁に遭遇します。

```
# last -f /var/log/btmp
```

こんな感じで、ログインに失敗したアクセスの一覧を見ることができます。件数を限定するために、 `| head` を付けると良いかもしれません。

```
# last -f /var/log/btmp | head
masayuki ssh:notty    114.200.199.45   Tue Jan  2 13:52    gone - no logout
masayuki ssh:notty    114.200.199.45   Tue Jan  2 13:52 - 13:52  (00:00)
centos   ssh:notty    c-67-168-83-230. Tue Jan  2 13:23 - 13:52  (00:28)
centos   ssh:notty    c-67-168-83-230. Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
root     ssh:notty    14.116.171.251   Tue Jan  2 13:23 - 13:23  (00:00)
```

リアルタイムにアタックをかけられている最中だと、なんとなくイライラします。

IPアドレスベースで見るためには、`-i` オプションを使います。

```
# last -i -f /var/log/btmp | awk '{print $3}' | sort | uniq -c | sort -rn | head
```

こんな感じにすると、過去の一覧をランキング形式で見ることができます。

```
# last -f /var/log/btmp | awk '{print $3}' | sort | uniq -c | sort -rn | head
 215737 58.242.83.34
 163529 58.242.83.17
 134798 58.242.83.18
 130636 58.242.83.38
 111747 58.242.83.27
 100762 58.242.83.36
  98506 58.242.83.24
  88019 42.7.26.15
  86996 182.100.67.120
  86298 113.195.145.80
```

左がログイン試行回数、右がアクセス元のIPアドレスです。
58.242.83.17～38が物凄いですね。悪の巣窟なんでしょうか。

どこのIPセグメントかは `whois` で見ることができます。（一部略）

```
# whois 58.242.83.17

% Information related to '58.242.81.0 - 58.242.86.255'

% Abuse contact for '58.242.81.0 - 58.242.86.255' is 'hqs-ipabuse@chinaunicom.cn'

inetnum:        58.242.81.0 - 58.242.86.255
netname:        HUAIBEIBASIP
country:        CN
```

ちなみに、不正アクセス元は9割近くが中国からです。続いてロシア。

iptablesを使っている場合は、特定のセグメントからのアクセスを遮断（パケットをドロップ）できます。

```
# vi /etc/sysconfig/iptables
```

```
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
(略)
-A INPUT -s 58.242.83.0/24 -j DROP
(略)
COMMIT
```

```
# systemctl restart iptables
```

で再読込。

```
# iptables -nL
```

で確認ができます。

まぁ、<font color=red>**sshのリッスンポートを22から他に移す**</font> のが、お手軽ですけどね。
Sketchがなぜかビットマップになりました。

もともとデザインしていた時は、ベクターだったのですが今見るとドットになっており拡大し続けるとビットマップ（ラスター？）になっています。検索したのですが、解決策が見つかりません。。

初歩的かとは存じますが、ご教授のほどよろしくお願いいたします。
[未解決]Wercker で dep を使った Golang のビルドが Wercker CLI の Local Mode では動くが、Wercker では動かない問題

背景
---

`dep` を使った Golang のビルドで同じ `wercker.yml` を使っているのに Wercker CLI の Local Mode では `wercker build` が通るのに、Wercker の Web 側では通らなかった。


調査
---

### エラーログ

`go build` の段階で失敗し、そのログは

```
go build
main.go:x:x: cannot find package "github.com/pkg/errors" in any of:
	/usr/local/go/src/github.com/pkg/errors (from $GOROOT)
	/go/src/github.com/pkg/errors (from $GOPATH)
make: *** [build] Error 1
```

と、パッケージが `GOROOT` および `GOPATH` で見つからないとのこと。

`dep` を使ってプロジェクトのルートフォルダに `vendor` ディレクトリで入れているので、上記パスにないのは当然。

プロジェクトルートフォルダを調べて見る。


### プロジェクトルートフォルダ

よい方法がわからなかったので、 `dep ensure` した次の step で `ls` する。

* ローカル

```
/go/src/<PATH_TO_PROJECT_ROOT>:
total 28
-rw-r--r-- 1 root root  259 Jan  2 05:08 main_test.go
-rw-r--r-- 1 root root  251 Jan  2 05:08 main.go
-rw-r--r-- 1 root root  121 Jan  2 05:08 Makefile
-rw-r--r-- 1 root root  604 Jan  2 05:08 Gopkg.toml
-rw-r--r-- 1 root root  429 Jan  2 05:08 Gopkg.lock
drwxr-xr-x 3 root root 4096 Jan  2 05:08 vendor
-rw-r--r-- 1 root root  653 Jan  2 05:08 wercker.yml
```

* Web

```
/go/src/<PATH_TO_PROJECT_ROOT>:
total 24
-rw-r--r--. 1 root root 251 Jan  2 04:53 main.go
-rw-r--r--. 1 root root 121 Jan  2 04:53 Makefile
-rw-r--r--. 1 root root 604 Jan  2 04:53 Gopkg.toml
-rw-r--r--. 1 root root 429 Jan  2 04:53 Gopkg.lock
-rw-r--r--. 1 root root 653 Jan  2 04:53 wercker.yml
-rw-r--r--. 1 root root 259 Jan  2 04:53 main_test.go
```

Web 側だと `vendor` ディレクトリがない。

調べてみると  `/go/src/github.com/golang/dep/vendor/github.com/pkg/errors` に入っていた。


### Wercker Web で作成しているコンテナを取得する

`dep` が Wercker Web 側で作成しているコンテナでの挙動が期待通りではないことがわかったので、Web 側で作成したコンテナを取得する。

* [werckerを使っていてローカルではテストが通るのにCIではコケる場合にデバッグする3つの方法](https://qiita.com/isuke/items/4259c659014016475639)

を参考にするが、GitHub 認証をしていると `wercker login` が通らず

* パスワード再発行
* `~/.wercker/token` に Personal Token を置く
    * ダメだったので `--auth-token` で直接 Personal Token を指定して認証は通ったが、今度は以下のエラーメッセージが出てダウンロードできない

```
ERROR No finished builds found for this application
FATAL Exiting.
```

よく読むと、参考にした記事でもこの方法は同じくできずで、DockerHub にイメージを Push する方法が紹介されていた。
BTCペアのオルトコインを日本円表記するにはどうするか

# BTCペアのオルトコインを日本円表記するにはどうするか

BTCペアのオルトコインを日本円表記するにはどうするか
これにはクロスレートと言う計算式がある
これはドルを基軸通貨として自国通貨とドル以外の通貨の価値を図る手段として使われている
暗号通貨の世界では現在はBTCが基軸通貨なのでBTCの各国通貨とのレートが手に入れば計算できる

# クロスレートの計算式

単純にBTCペアの値にBTC/JPYのレートをかける

```
MONA/BTC * BTC/JPY
```

MONA/BTCが0.001
BTC/JPYが1万円

```
0.001 * 10000 = 10
```

MONA/BTCが0.01
BTC/JPYが1万円

```
0.01 * 10000 = 100
```


MONA/BTCが0.001
BTC/JPYが100万円

```
0.001 * 1000000 = 1000
```

MONA/BTCが0.01
BTC/JPYが100万円

```
0.01 * 1000000 = 10000
```

# おまけ

暗号通貨が暴騰する理由はビットコイン価格が上がり、オルトコインの対ビットコインレートがあがると
対円では掛け算で上がっていく

暴落も同じでビットコイン価格が下がりオルトコインの対ビットコインレートが下がると
対円では掛け算で下がっていく

取引がすくない通貨や1サトシで動かない通貨に至っては対円ではビットコインと同じ価格上昇幅のようにみえる
CentOS 7 に python 3.6.4 をインストールしてみる

CentOS7にはデフォルトでpython2系のみがインストールされているので、python3系(現時点での最新版:3.6.4)をソースコードからインストールしてみます。
なお、同一環境内で複数のバージョンを使いたい場合は[pyenv](https://github.com/pyenv/pyenv)を活用する方がいいでしょう。

# 環境
- CentOS 7.4.1708 (on VMware player)

# インストール手順
### 1. ソースコードをダウンロード＆解凍
ここではバージョン3.6.4をインストールします。

```
$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
$ tar zxf Python-3.6.4.tgz
```

### 2. コンパイル＆インストール
ここでのインストール先は ***/usr/local*** 下にします。
指定しなければ、インストール先はシステム依存となります。
インストールはroot権限で行いますので、rootになるかsudoコマンドを使用しましょう。

```
$ cd Python-3.6.4
$ ./configure --prefix=/usr/local
$ make
# make install
```

これでpython3系のインストールは完了です！！

# 参考
- https://linuxconfig.org/compile-and-install-python-3-on-centos-7-linux-from-source
- https://qiita.com/a_yasui/items/5f453297855791ed648d
忘れがちなRuby

# ■ 標準出力
~~~ruby
val = 10
print("Hello\n")
print("Hello ", "World", "\n")
print(100 * 10, "\n")
print(val * 10, "\n")
puts("Hello")
puts(100 * 10)
puts(val * 10)                  
~~~

# ■ 繰り返し
## for
~~~ruby
cnt = 1
for cnt in 1..3
  print(cnt, "\n")
  cnt += 1
end               
~~~

~~~ruby
array = ["A", "B", "C"]
for  alphabet in array
  print(alphabet, "\n")
end
~~~

## while
~~~ruby
cnt = 0
while cnt < 10
  puts(cnt)
  cnt = cnt + 1
end               
~~~

## until
~~~ruby
cnt = 0
while cnt >= 10
  puts(cnt)
  cnt = cnt + 1
end 
~~~

# ■ 条件分岐
## if
~~~ruby
answer = 0
if answer == 0
  print("答えは0です\n")
elsif answer == 1             
  print("答えは1です\n")
else
  print("答えは0,1以外です\n")
end
~~~

## case
~~~ruby
answer
case answer
when 0
  print("答えは0です\n")
when 1
  print("答えは1です\n")
else
  print("答えは0,1以外です\n")
end
~~~

# ■ コメント
~~~ruby
# comment
print("Hello\n") # comment

=begin
comment                    
=end
~~~
Qiita API v2 を使って自身の全投稿をエクスポートするJavascriptを書いた

# きっかけ

[「Qiita」運営会社、スマホゲームのエイチームが買収 - ITmedia ビジネスオンライン](http://www.itmedia.co.jp/business/articles/1712/22/news108.html)
というニュースが昨年末駆け巡った。

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/94177/e3a558a9-b452-07cd-62fe-a3ab7f27a175.png)](https://qiitadon.com/@htomine/99216874302686683)
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/94177/dd0dc79d-4058-2010-f5ba-d72f445b4cd2.png)](https://qiitadon.com/@htomine/99216682584735231)

まあすぐQiitaがどうこうなったりはしないだろうが、なにごともバックアップは必要だ。そもそもみんなだいすきpixivだって新宿某所をゴジラに襲われたらデータ全ロスするわけで、我々が愛用するインフラなんて結構脆かったりする。

# 先行事例

[Qiita API v2 を使って自身の全投稿をエクスポートする Python スクリプトを書いた - Qiita](https://qiita.com/sta/items/5074df5fcb81d890897b)

なんて記事を見つけた。

# 問題

- Python 2である
- 画像のダウンロードをやってくれない
- 投稿数が100を超えて取得できない
- HTMLデータやコメントなどのMarkdown以外のデータを保存してくれない
- Pythonわからない

という不満があった。自分がよくわかってるのはC++かJavaScriptだ。しかしC++でHTTPS通信とか地獄すぎる。JavaScriptしかないやろ。しかも`async`/`await`がある。これはいい。

# つくった

[yumetodo/qiita_export_all: Qiitaの記事を画像とコメントも含めて全部DLする](https://github.com/yumetodo/qiita_export_all)

# 使い方

細かいことはREADMEをみてもらうとして、`git clone`して`npm start`すると

```plain
.
├── img
│   ├── 0_7.png
│   ├── 1_7.png
┊   ┊
├── items
│   ├── [ネタ]私のTLのみんながpure HTMLが何かを理解してくれない件
│   │   ├── comments
│   │   │   ├── 2017-02-02T145121+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T153542+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T160946+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   ├── 2017-02-02T173054+0900
│   │   │   │   ├── index.html
│   │   │   │   ├── info.json
│   │   │   │   └── README.md
│   │   │   └── 2017-02-02T181039+0900
│   │   │       ├── index.html
│   │   │       ├── info.json
│   │   │       └── README.md
│   │   ├── index.html
│   │   ├── info.json
│   │   └── README.md
┊   ┊
```

のようなものができる。

なんでこんなDirectory構造かというと、GitHubでは`README.md`はDirectoryを開いたときに下に表示してくれるのでこうしている。まああと、そっくりそのまま[GitBook](https://github.com/GitbookIO/gitbook)にしてしまうとかもできる気がする。

# 追記: 2020/03/06

v1.3.0をリリースしました。これによって、いちいちcloneしてこなくても`npx qiita_export_all`のように実行できるようになりました。
https://github.com/yumetodo/qiita_export_all/releases/tag/v1.3.0

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC_BY_icon.svg"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/46ac46ed-3b06-47bc-a4cb-1b8458c560f0.png" alt="CC-BY icon.svg" width="88px"></a>
AWS Certificate Manager で証明書を発行してALBに割り当てる

# 全体の流れ

1. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)
2. [ドメインにALBを割り当てる](https://qiita.com/NaokiIshimura/items/654f1f82adb039f1ad47)
3. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b) ←今回の投稿

# もくじ

1. 証明書を発行
2. セキュリティグループでHTTPSを許可
3. ALBでリスナーにHTTPSを追加
4. アクセス確認

# 前提条件

- ALB(Application Load Balancer)は事前に作成済み
- Route53でドメイン取得済み
- Route53でALBへのDNSレコードを設定済み

# 1. 証明書を発行

AWS Certificate Manager で証明書を発行します。

![https01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/a05f7729-764a-8bf2-7e07-65d0b9512b69.png)
![https02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/cc99d2aa-6563-5c7b-459e-a2998511a46e.png)
![https03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0693095b-ab6e-0971-f788-52c58cd27812.png)
![https04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/108faf7d-c069-b9f0-4b4a-10a1e916aafd.png)
![https05.png](https://qiita-image-store.s3.amazonaws.com/0/141934/130c9413-68b3-0aba-4dff-fef04585c9d7.png)
![https06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/a93d868e-e1c0-34c1-dcbe-998b65c3c9f0.png)
![https07.png](https://qiita-image-store.s3.amazonaws.com/0/141934/19dd6908-7b7f-e92b-0612-2bcbc5a65944.png)
![https08.png](https://qiita-image-store.s3.amazonaws.com/0/141934/7df47e56-ee11-9ec0-5bb8-a797ea64b394.png)
![https09.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ac46a01a-a3d9-5935-2a99-f2371b8ebe2e.png)

# 2. セキュリティグループでHTTPSを許可

ALBに割り当てているセキュリティグループでインバウンドのルールにHTTPSを許可する。

![https13.png](https://qiita-image-store.s3.amazonaws.com/0/141934/baab0ee5-4467-ed28-e65a-c674c1d541cb.png)
　　　　![https12.png](https://qiita-image-store.s3.amazonaws.com/0/141934/f5bfb3a5-1cac-6def-c4b5-d9906f0167d6.png)

# 3. ALBでリスナーにHTTPSを追加

ALBでリスナーにHTTPSを追加する。

![https10.png](https://qiita-image-store.s3.amazonaws.com/0/141934/17422859-8b48-10b7-ef77-f71614b43e6d.png)
![https11.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0f69f862-6ad7-99f3-19d2-db1afb63e7fb.png)

# 4. アクセス確認

ブラウザからHTTPS化したURLにアクセスする。

![https14.png](https://qiita-image-store.s3.amazonaws.com/0/141934/60a7d51c-73b3-5f7d-2a0c-aacdffd8b96a.png)
はじめてのあっとこーだー Python3編

[はじめてのあっとこーだー](https://language-test-201603.contest.atcoder.jp/tasks/practice_1)に、Python3のサンプルがなかったので、手探りで作成。

```python3
# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print(str(a+b+c) + " " + s)
```

# リンク切れてました
[practice contest](https://atcoder.jp/contests/practice/tasks/practice_1#Python3)
これは2020年12月13日に確認したリンクです。

```Python3
# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print("{} {}".format(a+b+c, s))
```

formatを使ってますね。
【MySQL】MySQL の基礎練習

コミュニケーション用の言語と同じ、MySQL を使いこなすためには、
基礎文法の繰り返し練習することが必要です。以下に基本操作をまとめます。

**・ MySQL の起動**
`$ mysql -u user_name -p`

**・ MySQL の終了**
`mysql> exit;`

**・ ユーザーの作成**
`mysql> CREATE USER user_name@localhost IDENTIFIED BY 'password';`

**・ ユーザー権限の設定**
`mysql> GRANT ALL ON database.tables TO user_name@localhost;`

**・ ユーザーパスワードの変更**
`mysql> SET PASSWORD FOR user_name@localhost=PASSWORD('new password'); `

**・ 既存データベースの確認**
`mysql> SHOW DATABASES;`

**・ 現時点でのユーザー確認**
`mysql> SELECT user FROM mysql.user;`

**・ データベースの作成**
`mysql> CREATE DATABASE db1;`

**・ 使用するデータベースを決める**
`mysql> USE database_name;`

**・ 現在使用中のデータベースを表示**
`mysql> SELECT DATABASE();`

**・ テーブルの作成**
`mysql> CREATE TABLE table_name(id VARCHAR(10), name VARCHAR(10), year INT);`

**・ 全てのテーブルを表示**
`mysql> SHOW TABLES;`

**・ テーブルのカラム構造を表示**
`mysql> DESC table_name;`

**・ テーブルにデータを挿入**
`mysql> INSERT INTO table_name VALUES('A101','Saito',40);`
`mysql> INSERT INTO table_name (id, name, year) values 
  ('A106','Tanaka',22),('A107','Nakata',33);`

**・ レコードの表示**
`mysql> SELECT * FROM table_name;`
`mysql> SELECT id, name FROM table_name;`

**・ テーブルのコピー**
`mysql> CREATE TABLE new_table SELECT * FROM old_table;`
`mysql> CREATE TABLE new_table SELECT id,name,year FROM old_table;`

**・ マルチコマンドの実行**
`mysql> SELECT * FROM tb1A; SELECT * FROM tb1B;`

**・ カラムのデータ型を変更**
`mysql> ALTER TABLE table_name MODIFY column_name VARCHAR(100);`

**・ カラムを追加**
`mysql> ALTER TABLE table_name ADD column_name DATETIME;`
`mysql> ALTER TABLE table_name ADD column_name DATETIME FIRST;`
`mysql> ALTER TABLE table_name ADD column_name DATETIME AFTER column_name1;`

**・ カラムの順を変更**
`mysql> ALTER TABLE table_name MODIFY column_name DATETIME AFTER column_name1;`



###**参考文献**###
「基礎からの MySQL 第三版」西沢夢路、SB Creative、2017
centos6.8にimagemagick6.9をインストールした時のメモ

#centos6.8にimagemagick6.9をインストールしたい
##結論
```
sudo yum install -y ImageMagick6 ImageMagick6-devel ImageMagick6-c++ ImageMagick6-c++-devel --enablerepo=remi
```
ImageMagick6とバージョンをつけてインストールすると6の最新版がインストールできた。

##前提状況
imagemagick6の最新版をローカル環境にインストールしたい。
まずは現状の古いバージョンを確認、削除
```
yum list installed | grep ImageMagick
sudo yum remove ImageMagick
```

次にyumでインストールする
```
sudo yum -y install ImageMagick
```

上記yumでインストールしたら脆弱性のある古いバージョンでインストールされたので再度削除コマンド実行。
```
sudo yum remove ImageMagick
```

remiのリポジトリにどんなバージョンが上がっているかを確認
```
yum --enablerepo=remi list | grep ImageMagick
```

結論のコマンドで6系の最新版をインストールできました。

##補足情報
6系をインストールしたのは現状の本番サーバが6系のコマンドを実行しており
権限がなく自分で7系にアップデートできない状況がありました。
また7系はコマンドの変更が結構あるとのことでそのあたりも
ローカルだけ7にするのは本番との乖離が生じ
弊害がありそうとの判断からこのような作業になっています。
[WindowsAPI]画面外にはみ出たウィンドウを強制的に画面内に移動する

帰省中です。実家で書いてます。

# はじめに

**画面外にはみ出たウィンドウがアプリケーションのメインウィンドウ（タスクバーに表示されるウィンドウ）の場合は、以下の手段でプログラムを書かずとも、手動で戻すことができます**。
例えば次のサイトをご覧ください。[Windowsで画面外に移動してしまったウィンドウを表示領域内に戻す：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/0312/06/news006.html)

# どんな状況だったのか

私が使っているあるアプリケーションは、ツールボックスが別ウィンドウで出てくるようになっている。またツールボックスの位置はアプリケーション終了時に保存されるようになっている。これを自宅だけで使っている（※ノートパソコンを大きなディスプレイに繋いで使っている）ときはよかったのだが、実家に持っていってノートパソコンのディスプレイだけで使うときに問題が起きた。
自宅で使っていたときに、ツールボックスのウィンドウを「ノートパソコンのディスプレイとしてはその外になる場所」で終了させていたため、実家に着いてからそのツールボックスが使えなくなってしまったのである。
![20180102-ウィンドウがディスプレイの外.png](https://qiita-image-store.s3.amazonaws.com/0/49715/749892f3-13d5-eca6-ae79-9e7e374376e6.png)
ここで、画面外にはみ出したウィンドウがアプリケーションのメインウィンドウなのであれば、[Windowsで画面外に移動してしまったウィンドウを表示領域内に戻す：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/0312/06/news006.html)にあるような方法で手動で動かせるのだがそれができない。
まず考えたのは、そのアプリケーションの設定を保存しているファイルないしレジストリを見つけて設定の値を書き換えるということだったのだが、調べてもわからなくて断念。
その後、Windows APIには「ウィンドウを列挙する」関数があることを思い出し、試行錯誤の結果

- `EnumWindows`関数で、現在立ち上がっているウィンドウ（※フォームに限らず、テキストボックスなど各種構成要素も含む）を手当たり次第列挙
- ウィンドウの名称を調べ（移動したかったツールボックスのタイトルバーには固定の名前が付いている）、それが所望のものであれば、`SetWindowPos`関数で移動する

という方法で解決したのであった。

# 具体的なコード

Visual Studio Community 2015で動かしました。C++を使っています。
`EnumWindows`関数の第一引数は、C++11で規格化されたラムダ式を用いています。

```C++
#include <windows.h>
#include <cstring>
#include <set>

const char * QUERY_WINDOW_NAME = "見つけたいウィンドウのタイトル";

std::set<HWND> FoundWindows;
// グローバルにしないとならなかった。
// 「ローカル変数として定義して、EnumWindowsの第一引数を[]でなく[&FoundWindows]にする」
// という方法では、EnumWindowsの部分でコンパイルエラーとなった。

int main(void) {
    for (;;) {
        BOOL enumresult = EnumWindows([](HWND hwnd, LPARAM lParam) {
            // 同じウィンドウが二度現れていた場合は終了
            if (FoundWindows.count(hwnd) > 0) {
                return FALSE;
            }
            FoundWindows.insert(hwnd);

            CHAR buf[100];
            GetWindowTextA(hwnd, buf, 100);
            if (std::strstr(buf, QUERY_WINDOW_NAME)) {
                // ウィンドウサイズは変更せず（SWP_NOSIZE）、位置を(0, 0)に移動する
                SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
                return FALSE;
            }
            return TRUE;
        }, 0);
        if (!enumresult) break;
    }
}
```
Pandasのクエリ

###はじめに
この記事はPandasのクエリの備忘録的なものです。
大したことは書いてありません。
あしからず。

###条件指定でクエリ
DataFrame.query("条件")みたいなやり方もあるけど、インデクシングでなんとかしたい。

米・ソ/露・欧・日・印・中の宇宙探査ミッションの整理を行ってたときに詰まったのでその例を使います。

```python3
import pandas as pd

mission_name = [(長いので省略)]
mission_year = [(同上)]
mission_destination = [(同上)]
mission_nation = ['USA']*73 + ['JP']*13 + ['Soviet/Russia']*82 + ['India']*2 + \
  ['China']*4 + ['ESA']*8

mission = pd.DataFrame({
                          'name': mission_name,
                          'year': mission_year,
                          'nation': mission_nation,
                          'destination': mission_destination
                       })
```

ミッション名、ミッションの年、打ち上げを行った国、目的地を入れた同じ長さのリストを作ってリストからDataFrameを作っています。

ここで、「打ち上げ国が'USA'のデータの打ち上げ年を取得したい」みたいになったら

```python3
mission[mission['nation'] == 'USA']['year']
```

と書きます。一個目のインデックス指定子`[]`の中で`mission['nation'] == 'USA'`となっていますがこの比較演算の返り値はbool型のpandas.Seriesになります。これを`mission`データフレームのインデックスにしていすることで`True`の部分だけが帰ってきます。このデータフレームに`['year']`コラムのインデックスを指定することで所望のデータが取得できます。

###条件指定が２つ以上になった時の注意点
条件指定が複数になった場合でも基本は同様なのですが少し注意が必要です。

例えば、「打ち上げ国が'USA'で目的地が'Moon'以外のデータの打ち上げ年を取得したい」と思った時に

```python3
mission[mission[mission['nation'] == 'USA']['destination'] != 'Moon']['year']
```

と書くと失敗します。

```python3
mission[mission['nation'] == 'USA']
```

で打ち上げ国が`USA`という条件指定をしたデータフレームを得ることができ、そのデータフレームに`['destination'] != 'Moon'`と条件指定することで目的地が月以外という条件をつけたbool型のpandas.Seriesが得られます。

しかし、これをmissionのインデックスとすると失敗します。というのも、

```python3
mission[mission['nation'] == 'USA']['destination'] != 'Moon'
```

として得られたbool型のSeriesの長さは`mission`データフレームのうち国名が'USA'にあてはまるデータ分でしかなく、missionのインデックスに使うには短くなってしまっているからです。

従って「打ち上げ国が'USA'で目的地が'Moon'以外のデータの打ち上げ年を取得したい」ならば以下のように記述する必要が有ります。

```python3
mission[mission['nation'] == 'USA'][mission[mission['nation'] == 'USA']['destination'] != 'Moon']['year']
```

頭が悪そうな書き方ですね。

###追記
コメントにて以下の記法を教えていただきました、感謝。

「打ち上げ国が'USA'で目的地が'Moon'以外のデータの打ち上げ年を取得」したいならば、

bool型Seriesの二項演算

```python3
mission[(mission['nation'] == 'USA') & (mission['destination'] != 'Moon')['year']
```
またはpipeメソッド

```python3
mission['nation' == 'USA'].pipe(lambda df: df[df['destination'] != 'Moon'])['year']
```

と書けるようです。二項演算はインターセクションを求めてからインデックスに使う方法の様ですね。pipeメソッドはUnix系の|と同じ要領でしょうか。
ライブリロードしたいけどGulpを使うまでもない。そんなときはBrowser Refreshを使おう。

タイトルの通りなんですが、ちょっとした確認でindex.html(php)を作ったが、いちいち 保存 → ブラウザリロード ってやるのはめんどくさい。

かといって、Gulpを入れて、ライブリロードするのもめんどくさい。。

そんなときは、 Browser Refresh を入れてサクッと保存→ブラウザリロードの環境を作ってしまいましょう。


## Browser Refresh
SublimeTextの Package Control から Package Control＞install Packageから "Browser Refresh" と入力し、インストール。

インストール後は念のため、SublimeTextを再起動。

これでデフォルトでは command + shift + r でブラウザリロードが有効になります。

## 設定をちょっといじる
このままだと、「保存のたびに」というところが実現できないので、設定を変更します。

上部メニューから、Preferences＞Package Settings＞Browser Reflesh＞key bindings-user を開き、以下を追加。

```
{
    "keys": ["super+s"], "command": "browser_refresh", "args": { // command + s に変更
      "auto_save": true,
      "delay": 0.0,
      "activate": false, // falseにすることで、保存のたびにブラウザがアクティブになるのをキャンセル
      "browsers" : ["chrome"]
    }
  }
```

これでGulpなどを使わなくてもライブリロードが実現できました。

確認用にサクッと実現できるので、よかったら使ってみてください。
Amazon Route53 でドメインにALBを割り当てる

# 全体の流れ

1. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)
2. [ドメインにALBを割り当てる](https://qiita.com/NaokiIshimura/items/654f1f82adb039f1ad47) ←今回の投稿
3. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)

# もくじ

1. ドメインにALBを割り当て
2. アクセス確認

# 参考
[ドメイン名を登録する方法 \- アマゾンウェブサービス](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)

# 前提条件

- ALB(Application Load Balancer)は事前に作成済み
- ドメインは事前に取得済み

# 1. ドメインにALBを割り当て

Route 53のコンソールでドメインにALBを割り当てます。

![elb01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/88c8016e-4bdb-95b1-6a94-858a187ad7ce.png)
![elb02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/2dd91709-de21-7696-781a-ce250082b20e.png)
![elb03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/4ab82c02-9295-70b9-59be-cbf0a1447d5e.png)

> 補足：
> **Alias Target**テキストボックスをクリックするとALBの一覧が表示される

![elb04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/dafb3baf-8b72-f6b7-4fe0-0b2595800c4f.png)

![elb05.png](https://qiita-image-store.s3.amazonaws.com/0/141934/46da10cc-2c09-12db-bb9c-825f42912554.png)


# 2. アクセス確認

ブラウザで登録したURLにアクセスする。

![elb06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c96c8da8-a28c-82e9-d9dc-5f751435be67.png)
WerckerからGAEにデプロイ

werckerからGAEにデプロイした時にハマったポイントを纏めてみました。

### 前提
Rails5.1でwerckerからGAEにデプロイするようにしています。
Rubyなので、フレキシブル環境になります。

ただ、Rails以外でも使える部分はあるのかな？って思います。

#### 最終的なwrecker.yml

```yaml
box: ruby:2.4.1
deploy:
  steps:
    - bundle-install:
        without: test,development
    - create-file:
        name: write credentials.json
        filename: .credentials.json
        overwrite: true
        hide-from-log: true
        content: $GCLOUD_CREDENTIALS
    - script:
        name: Install gcloud
        code: |
          curl https://sdk.cloud.google.com | bash
          source /root/google-cloud-sdk/completion.bash.inc
          source /root/google-cloud-sdk/path.bash.inc
    - script:
        name: deploy to google app engine
        code: |
          gcloud auth activate-service-account $GCLOUD_SERVICE_ACCOUNT --key-file .credentials.json --project $GCLOUD_PROJECT_ID
          gcloud app deploy

```

### 解説

#### bundle-install
```yaml
- bundle-install:
    without: test,development
```
これは、試していないけど、多分いらない

#### create-file
```yaml
- create-file:
    name: write credentials.json
    filename: .credentials.json
    overwrite: true
    hide-from-log: true
    content: $GCLOUD_CREDENTIALS
```

`$GCLOUD_CREDENTIALS`は、サービスアカウントの認証キーのjsonです。p12だとバイナリ？で、wercker管理画面から設定できないので、jsonにしています。

注意点は、jsonファイル中の改行文字`\n`はエスケープしてあげないと`\\n`ないとビルドが落ちます。

werckerがファイルつくるときに、`\n`を改行コードに変換してしまっているのではないかな？

#### Install gcloud
```yaml
- script:
    name: Install gcloud
    code: |
      curl https://sdk.cloud.google.com | bash
      source /root/google-cloud-sdk/completion.bash.inc
      source /root/google-cloud-sdk/path.bash.inc
```

boxを`google/cloud-sdk`にしている人は、不要だと思いますが、rubyにしている私は必要でした。 `gcloud`コマンド利用できるようにしています。

#### deploy to google app engine
```yaml
- script:
    name: deploy to google app engine
    code: |
      gcloud auth activate-service-account $GCLOUD_SERVICE_ACCOUNT --key-file .credentials.json --project $GCLOUD_PROJECT_ID
      gcloud app deploy
```

`$GCLOUD_SERVICE_ACCOUNT`はサービスアカウントのメールアドレス(`xxxxx@xxxxxx.iam.gserviceaccount.com`)
`$GCLOUD_PROJECT_ID`はProjectID

注意点は、サービスアカウントに権限がないと落ちます。
私の場合は、以下でした。
<img width="279" alt="スクリーンショット 2018-01-02 8.55.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/89696/29381ab0-8be9-65ef-6da8-1362746894b1.png">

以下は必須。
* App Engine 管理者（デプロイ担当者でも大丈夫かも）
* Cloud Container Builder(フレキシブル環境だから？)
* Cumpute Admin(フレキシブル環境だから？)

他は、CloudStorage、StackDriverとか利用するので、入れましたが、ないとダメなのか試していないです。
勉強会に行ったから、Scalaを触ってみる（１〜何で学ぶか、インストールからHello Worldまで〜）

#まえがき
先日、[【再増席】教養としてのScala ~ そろそろ始めてみたい2017冬 connpass](https://d-cube.connpass.com/event/74106/) という勉強会に行ってきました。
せっかくなので、少し触ってみたので、備忘録的に書いてみます。

#何で学ぶか
##勉強会で紹介されたリスト
###ドワンゴオリジナルの新卒エンジニア向けの研修資料
[ドワンゴオリジナルの新卒エンジニア向けの研修資料](http://dwango.github.io/scala_text/)
ドワンゴさんの社内用に作られた資料のようですが、すごく良くできている。
勉強会では、とりあえず以下２点をみれば、Scalaを分かった気になれる？的な話がありましたw

- コレクションライブラリ
- ケースクラスとパターンマッチング

###Scala 99
Scalaの問題が99問！これをやりきれれば、あなたも立派なスカラリスト？w
[Scala 99（英語）](http://aperiodic.net/phil/scala/s-99/)

###Scala Search
Scalaで出てくるよく分からない単語を調べるのにいいらしい。例えば、`？`とか。
[Scala Search（英語）](http://scala-search.org)

###やってみよう Scala！
Scalaを布教させよという時に良いと紹介されていました。
実によくまとめられていていると思われます。（まだ読んでない）
[やってみよう Scala！](https://qiita.com/f81@github/items/369d3ad97112b20d9bc5)

###ひしだま's 技術メモページ
ひしまださんは、Scalaの重鎮なのでしょうか？勉強会でも何度もお名前が出ていて、技術ページも紹介されていました。
Scala 99の挑戦時につまずいたら、チート的に使うといいようです。
[ひしだま's 技術メモページ](http://www.ne.jp/asahi/hishidama/home/tech/)

###先駆者に聞く
勉強会で先駆者の人たちも入門者や初学者が、どんなところでつまづくのかを知りたいらしいです。
もし、近くに聞ける人がいれば聞く。いなければ、思い切ってTwitter等で質問してみる。

###Scalaスケーラブルプログラミング
勉強会では、`Scalaスケーラブルプログラミング第3版`が紹介されていましたが、初学者がいきなりこれを読むと心が折れるそうです。
ドワンゴの研修資料読んで、Scala 99を何問か解いて、さらに深く知りたい時に手を出すといいようです。


##その他
###ググって見つけたサイト
役に立ちそうなサイトがいくつかあったので、紹介します。
[Scala入門時に役立つ情報まとめ](https://qiita.com/nesheep5/items/49019b9df4836d36ec1f)
[Scala勉強に役立つ書籍まとめ](https://qiita.com/yukinagae/items/0b19e1524983b879d0e4)

###Kindle本（Kindle unlimited）
無料で読めるし、参考程度に読み進めていこうと思うくらい。
[ゼロから学ぶScala Kindle版](https://www.amazon.co.jp/gp/product/B01HI7BCT0/ref=kinw_myk_ro_title)
[Guide to ScalaーScalaプログラミング入門 Kindle版](https://www.amazon.co.jp/gp/product/B00BOBYZTQ/ref=kinw_myk_ro_title)

#実際に触ってみる
##インストールから`Hello World`
###インストール
参考：[2014年こそScalaを始めよう](https://qiita.com/shoma2da/items/b131c53ffa958c9386f7)

```
#macだからこれだけw
$ brew install scala

#バージョン確認(2017/12/21 現在)
$ scala -version
Scala code runner version 2.12.4 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
```

###Hello World！
####Scalaに入る
```
$ scala
Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.
```

####Hello World！
```scala
scala> println("Hello World")
Hello World
```

##コンパイル
参考：[ゼロから学ぶScala Kindle版](https://www.amazon.co.jp/gp/product/B01HI7BCT0/ref=kinw_myk_ro_title)
以下を作成します。私は`myScala`というフォルダ配下に作成しました。

```Sample1.scala
object Sample1{
  def main(args:Array[String]){
    println("First Scala!")
    print("Second ")
    print("Scala!")
  }
}
```

terminalで`Scalac`を使い、コンパイルします。

```
$ cd myScala/
$ scalac Sample1.scala

#問題があればエラーが出ます。出なければ問題なし。
#コンパイルが終わると、object名のclassができています。
$ ls 
Sample01.scala	Sample1$.class	Sample1.class
```

classをscalaで実行。

```scala
$ sudo scala Sample1
First Scala!
Second Scala!
```
`println`は改行が文末に含まれるが、`print`は含まれない。


#あとがき
今日はここまでとして、後日続けて勉強していこうと思う。
ご覧いただき、ありがとうございました。
Amazon Route53 でドメインを取得する

# 全体の流れ

1. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e) ←今回の投稿
2. [ドメインにALBを割り当てる](https://qiita.com/NaokiIshimura/items/654f1f82adb039f1ad47)
3. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)

# もくじ

1. 取得するドメインを選択する
2. メールアドレスを認証する
3. ドメインが登録されたことを確認

# 参考
[ドメイン名を登録する方法 \- アマゾンウェブサービス](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)

# 1. 取得するドメインを選択する

Route53のコンソールで取得するドメインを選択して、連絡先情報を入力します。

![domain01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/d875ace3-333f-4bd4-dbfd-2877a83b202e.png)
![domain02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/efbb7713-01f5-b0c9-c499-660a9a5e36cc.png)
![domain03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/96bcaaab-113c-02ee-afc2-e26882689a6f.png)
![domain04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/cfc5055e-96a9-d887-cf54-842cf3ee3d16.png)
![domain05.png](https://qiita-image-store.s3.amazonaws.com/0/141934/9cb13aa8-c414-dea6-25ac-9dbeee0ff8e0.png)
![domain06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/69d0718c-2a5e-aa34-f654-72f7517cda5a.png)

> 補足：
> 選択したトップレベルドメインによっては追加で情報の入力を求められることがある

![domain07.png](https://qiita-image-store.s3.amazonaws.com/0/141934/50066221-0353-0997-a4ef-2cb33254d7f8.png)
![domain08.png](https://qiita-image-store.s3.amazonaws.com/0/141934/707eaec3-73a9-a270-60f0-0aa1522dff0d.png)
![domain09.png](https://qiita-image-store.s3.amazonaws.com/0/141934/4b3c3f07-f141-2980-1ff2-02b7ad2bd18a.png)

# 2. メールアドレスを認証する

連絡先で入力したメールアドレス宛に連絡先確認のメールが届くので、本文内のリンクをクリックして認証を完了させます。

![domain10.png](https://qiita-image-store.s3.amazonaws.com/0/141934/e3e7d860-8d2f-d742-c18e-122b88e6f98c.png)
![domain11.png](https://qiita-image-store.s3.amazonaws.com/0/141934/80837ea1-349a-ecb7-2f84-f912f0a25378.png)
![domain12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/006955f8-e071-66e6-f2aa-3d789966192c.png)



# 3. ドメインが登録されたことを確認

認証が完了すると、ドメインが**Pendingrequests**から**Registered domains**に移動されます。

![domain13.png](https://qiita-image-store.s3.amazonaws.com/0/141934/f5c3639a-0d1f-90d0-b875-ef7b3043a920.png)
![domain14.png](https://qiita-image-store.s3.amazonaws.com/0/141934/2f706aec-eb47-1c99-68c1-38d1d657d245.png)
[備忘録] ML色々 [工事中]

#### Dataset Repo
- [machine learning repository](https://archive.ics.uci.edu/ml/index.php)
- [open data 色々](https://qiita.com/tmp_llc/items/7296c5d6bb8769b18d24)

#### Articles
- [towards data science](https://towardsdatascience.com/)
DjangoでTwitterAPIを使う

[Djangoのチュートリアル](https://docs.djangoproject.com/ja/2.0/intro/)を終えて、
Djangoを使いこなせるように、
ゆくゆくはPythonで仕事がしたいといった状況です。

#目的
今回作りたいものは、TwitterAPIを利用して下のようなツイートを簡単にするツールです。

![スクリーンショット 2018-01-02 10.38.54.png](https://qiita-image-store.s3.amazonaws.com/0/188786/c67f9317-07e2-ef60-b7c5-5ffdc60d3f91.png)

これはMTGの大会成績のツイートで、
熱心なプレイヤーも、そうでないプレイヤーも、メモとしてこんなかんじでつぶやきます。
このつぶやきの手間を減らすツールを作って、
みんなに使ってもらって、
つぶやきのフォーマットが定まったところで
がばーっとデータ抜き出すってのをいつかやりたいです。

#前提
Python 3.6.3
Django 2.1 dev
twitter(パッケージ名) 1.18.0
Djangoのチュートリアル中に作成したプロジェクト配下を作業ディレクトリとします。


以降、間違いがありましたら優しく指摘していただけますと幸いです。
不明点がございましたら、お気軽にコメントしてください。

#手順

1. twitterのインストール

    python3 -m pip install twitter
    pipでインストールしたtwitterの情報を表示
    pip show twitter

2. Djangoに新規アプリを作成

    python3 manage.py startapp mtgrecords

3. モデルを作成
大会(event)と試合(Match)のモデルを作成します。

4. Adminのページの編集

5. 成績を入力

6. viewを編集
    下のviewが呼ばれたとき、大会の成績をツイートします。

    ```view.py
    class TweetView(generic.TemplateView):
        template_name = "mtgrecords/tweet.html"

        def get_context_data(self, **kwargs):
            t = Twitter(auth=OAuth(api.token, api.token_secret, api.consumer_key, api.consumer_secret))
            event = get_object_or_404(Event, pk=kwargs['pk'])
            t.statuses.update(
                status=event.date.strftime('%m/%d') + " " + event.event_type + "\n" +
                "使用デッキ" + event.deck + "\n")

            context = super().get_context_data(**kwargs)
            context['result'] = "ツイートしました！"
            return context
    ```


![スクリーンショット 2018-01-02 10.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/188786/49e67693-a35c-90c4-a55f-12aa864e878e.png)


#まとめ
とりあえず自分のアカウントで大会の成績をつぶやけるようになりました。
本当に作りたいものはMTGプレイヤーみんなが利用できるものなので
まだまだ道のりは長そうですが、はじめの一歩ということで。
Visual Studio Code でcshtmlファイルにhtmlのemmetを適用する

#はじめに
Angularの勉強を進めるにあたって、TypeScriptも一通り勉強しておきたいと思い始めた矢先に「TypeScript実践マスター」なる書籍が発刊されたので写経…。
途中、cshtmlファイルにhtmlタグを入力するシーンがあったのですが、emmetが適用されず、pタグ打つのすら億劫になっていたことに驚愕しました。
どうしたら適用されるのかわからずネットをさまよっていたら、解決方法を見つけたので
備忘録的に投稿。
しかも初投稿。

#設定
以下を追加するだけでした。
cshtmlはrazorで表現するんですね。

```json:settings.json
{
    "emmet.includeLanguages": {"razor":"html"}
}
```
#参考
https://stackoverflow.com/questions/46688631/can-visual-studio-code-use-emmet-completion-in-razor-cshtml-files
[備忘録] angular.js [工事中]

#### Course系
- [angular 5](https://codecraft.tv/courses/angular/)

#### Reference系
- [angularリファレンス](http://www.webcreativepark.net/angular/)
- [angular api](https://angular.io/api)

#### Tips系
- [angular4 tips](http://www.buildinsider.net/web/angulartips)

#### Maintenance系
- [angularスタイルガイド](https://angular.io/guide/styleguide)
- [TSLint - TSの静的解析ツール](https://palantir.github.io/tslint/)
- [TSLint Core Rules](https://palantir.github.io/tslint/rules/)

<hr />
#### Helper系

- [ベジェ曲線を簡単に作成できるサイト](http://cubic-bezier.com/#.17,.67,.83,.67)

<hr />
#### news系
- [angular 5? by ng-conf 2017](http://www.publickey1.jp/blog/17/angular_42018101angular_5ng-conf_2017.html)
Raspberry PI でYMF825を鳴らす

[YMF825](https://yamaha-webmusic.github.io/ymf825board/intro/)をRaspberry PI(PI 3 model B)につないて、サンプルプログラムを動作させてみました。YMF825はFM音源です。

## 接続
![setudzoku2.png](https://qiita-image-store.s3.amazonaws.com/0/58417/0383fa1e-1da4-7253-f7fd-8f04178b8a03.png)

3.3V でも動作するかと思ったのですが、今は5Vでないと動作しませんでした。

## サンプルプログラム
動作させたサンプルプログラムは[こちら](https://github.com/yamaha-webmusic/ymf825board/tree/master/sample2) です。

コンパイルするには、
1. common の下の全ファイル
2. raspi の下のfmsd1_raspi.c
3. main 関数 ( fm825test.cと名前を付けました。　)
4. [bcm2835 ライブラリ](http://www.airspayce.com/mikem/bcm2835/)
が必要です。1,2,3 は全部まとめて同じフォルダーにコピーしました。

### makefile
```makefile
OBJS= fmasgn.o fmif.o fmnote.o\
	fmpart.o fmtone.o fmvoice.o fmsd1_raspi.o\
	fm825test.o

fm825test: $(OBJS)
	gcc -o fm825test $(OBJS) -l bcm2835

fmasgn.o:	fmasgn.c fmasgn.h fmtype.h
fmif.o:		fmif.c fmif.h 
fmnote.o:	fmnote.c fmnote.h fmtype.h
fmpart.o:	fmpart.c fmpart.h fmtype.h
fmtone.o:	fmtone.c fmtone.h fmtype.h
fmvoice.o:	fmvoice.c fmvoice.h fmtype.h
fmsd1_raspi.o:	fmsd1_raspi.c
fm825test.o:	fm825test.c fmif.h fmsd1.h	

.c.o:
	gcc -c $<

```

### Main 関数
```fm825test.c
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>	
#include <bcm2835.h>

#include "fmif.h"
#include "fmsd1.h"

int main()
{
	int note=0x3c;

	if (!bcm2835_init()) return 1;

	initSPI();
	initSD1();
	Fmdriver_init();

	while(1){
		Fmdriver_sendMidi(0x90);
		Fmdriver_sendMidi(note);
		Fmdriver_sendMidi(0x7f);
		sleep(2);

		Fmdriver_sendMidi(0x80);
		Fmdriver_sendMidi(note);
		Fmdriver_sendMidi(0x7f);
		sleep(2);

		note++;
		if(note>0x48){ note=0x3c; }
	}
}
```

### fmsd1_raspi.cにコード追加
一行だけ、fmsd1_raspi.cにプログラムを追加しました。Reset にGPIO 16（36番ピン）がアサインされていますが、GPIO 16 を出力モードにセットする、という行がないと動作しませんでした。

```fmsd1_raspi.c

void initSD1( void )
{
	//	set Output Mode
	bcm2835_gpio_fsel(RST,BCM2835_GPIO_FSEL_OUTP);　// <- 追加

```

### バグかも
fmtone.cの中の、void Tone_sendTone( void )の中で、以下コメントアウトした行は、

```
		riPtr[0] = (td->voiceCommon & 0x60)>>5;
//		riPtr[1] = ((td->voiceCommon & 0xc0)>>3) | (td->voiceCommon & 0x07);
		riPtr[1] = ((td->voiceCommon & 0x18)<<3) | (td->voiceCommon & 0x07);

		for ( j=0; j<MAX_FM_OPERATOR; j++ ){
//			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+0] = (td->opPrm[j][3] << 4) | (td->opPrm[j][0] & 0x08) | ((td->opPrm[j][0] & 0x01)<<2);
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+0] = (td->opPrm[j][3] << 4) | (td->opPrm[j][0] & 0x08) | ((td->opPrm[j][0] & 0x04)>>2);
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+1] = (td->opPrm[j][4] << 4) | td->opPrm[j][2];
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+2] = (td->opPrm[j][1] << 4) | td->opPrm[j][5];
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+3] = (td->opPrm[j][6] << 2) | (td->opPrm[j][0] & 0x03);
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+4] = td->opPrm[j][7];
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+5] = ((td->opPrm[j][8] & 0x0f) << 4) | ((td->opPrm[j][8] & 0xf0) >> 4);
			riPtr[MAX_ELEMENT_PRM+OPERATOR_PRM_REG_SZ*j+6] = (td->opPrm[j][9] << 3) | ((td->opPrm[j][0] & 0x70) >> 4);
		}
```

だと思われます。
Git でコミットした .DS_Store を消したい

間にスペースある時の対策。

```shell-session
$ git ls-files | fgrep .DS | xargs git rm --cached
fatal: not removing 'iTunes/iTunes' recursively without -r
$ git ls-files | fgrep .DS | xargs -I{} git rm --cached "{}"
rm '.DS_Store'
rm 'iTunes/.DS_Store'
rm 'iTunes/iTunes Media/.DS_Store'
rm 'iTunes/iTunes Media/Music/.DS_Store'
rm 'iTunes/iTunes/.DS_Store'
```
kerasでbackend その２

#概要

kerasのbackendだけで、学習して分類してみた。

#写真
![backend11.png](https://qiita-image-store.s3.amazonaws.com/0/18104/8286d0e5-770c-c099-d57f-6a833ce3bbb2.png)

#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch
tensorflow-1.3

#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt

dx, dy = [], []
dx.append([0.0, 0.0])
dx.append([0.0, 1.0])
dx.append([1.0, 0.0])
dx.append([1.0, 1.0])
dy.append(0.0)
dy.append(1.0)
dy.append(1.0)
dy.append(0.0)
input_dim = 2
output_dim = 1
hidden_dim = 8
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = SGD()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [loss], updates = updates)
for ep in range(1000):
	for i in range(4):
		c3 = train([[dx[i]], [[dy[i]]]])
	if ep % 100 == 0:
		print (ep, c3[0])
pred = K.function(inputs = [x], outputs = [ypred])

sample = 4
xps, yps = [], []
for i in range(sample):
	if dy[i] < 0.5:
		xps.append(dx[i][0])
		yps.append(dx[i][1])
xns, yns = [], []
for i in range(sample):
	if dy[i] >= 0.5:
		xns.append(dx[i][0])
		yns.append(dx[i][1])
ticks = 40
a = []
b = []
for ix in range(ticks):
	for iy in range(ticks):
		po = [ix * 2.0 / ticks - 0.5, iy * 2.0 / ticks - 0.5]
		a.append(po)
		preds = pred([[po]])
		b.append(preds)
p = np.array(a)
r = np.array(b)
thresh = 0.5
xp, yp = [], []
for i in range(ticks ** 2):
	if r[i]< thresh:
		xp.append(p[i][0])
		yp.append(p[i][1])
plt.scatter(xp, yp, c = "cyan", marker = ".")
xn, yn = [], []
for i in range(ticks ** 2):
	if r[i] >= thresh:
		xn.append(p[i][0])
		yn.append(p[i][1])
plt.scatter(xn, yn, c = "magenta", marker = ".")
plt.scatter(xps, yps, c = "blue", marker = "o", s = 100)
plt.scatter(xns, yns, c = "red", marker = "o", s = 200)
plt.savefig("backend11.png")
plt.show()



```

以上。
Unity Documentation Version: 2017.3 GIFでまとめていく

気が向いたら、実行したサンプルをGIFでまとめていきまーす。

# Classes
## [LineRenderer.SetPosition](https://docs.unity3d.com/ScriptReference/LineRenderer.SetPosition.html)

![LineRenderer.SetPosition.gif](https://qiita-image-store.s3.amazonaws.com/0/63863/65fb7da0-4fd9-4710-dd62-4a836f4a60ae.gif)

## [WWW](https://docs.unity3d.com/ScriptReference/WWW.html)
![WWW.png](https://qiita-image-store.s3.amazonaws.com/0/63863/e473cd4a-5481-3030-fd73-f9b17cbf00b9.png)
環境変数を使ってPythonからPostgresSQLに接続する

久しぶりにやって時間を費やしてしまったのでメモ✍️

手順:
1. 環境変数を.bash_profile に設定
2. Pythonのプログラムを作成
3. Pythonを実行

# 1. 環境変数を.bash_profile に設定
以下のルールに従って記述

```$HOME/.bash_profile
export DATABASE_URL="postgres://username:password@hostname:5432/database"
```
具体例

```$HOME/.bash_profile
export DATABASE_URL="postgres://hiroaki:password123@my-database.abc123defg.us-east-1.rds.amazonaws.com:5432/postgres"
```

# 2.Pythonのプログラムを作成
こんな感じのソースになります

```getConn.py
import os
import psycopg2
import urllib.parse


def getConn():
    urllib.parse.uses_netloc.append("postgres")
    url = urllib.parse.urlparse(os.environ["DATABASE_URL"])
    conn = psycopg2.connect(
        database=url.path[1:],
        user=url.username,
        password=url.password,
        host=url.hostname,
        port=url.port
    )
    return conn
```

# 3. Pythonを実行
.bash_profileを編集する前から開いてたターミナルで作業するときは、

```
$ source ~/.bash_profile
```
を忘れずに。