OmniAICreator/Qiita-1.07M huggingface dataset:
add-apt-repositoryでModuleNotFoundError: No module named 'apt_pkg'

## 前置き

急に`add-apt-repository`が動かなくなった。

## エラーメッセージ

```
sudo apt-add-repository ppa:ansible/ansible -y
```

```
Traceback (most recent call last):
  File "/usr/bin/apt-add-repository", line 11, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 27, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "/usr/bin/apt-add-repository", line 11, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 27, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
```

* apt_pkgというモジュールが見つからなかった
* python3で動いている

ということがエラーメッセージからわかる。
また、ここから、「ちょっと前に入れたPython3.6が悪さをしてるのでは」という推測を立てた（当時のデフォルトはPython3.5）。

## apt_pkgモジュールの捜索

調べてみると、`/usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so`というファイルは存在していた。
`sys.path`にも`/usr/lib/python3/dist-packages/`は入っているみたいだし、`import apt_pkg`とすればこれが読み込まれるはず。
なぜ読み込まれないのか考えてみた。
`35m`という部分が気になった。
`Python3.5`を表してそう。

## Python3.6用に移植

ということで、`Python3.6`用の名前でシンボリックリンクを張ってみた。

```
cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
```

## 動いた

```
sudo apt-add-repository ppa:ansible/ansible -y
```

```
gpg: keyring `/tmp/tmpsynejl3d/secring.gpg' created
gpg: keyring `/tmp/tmpsynejl3d/pubring.gpg' created
gpg: requesting key 7BB9C367 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpsynejl3d/trustdb.gpg: trustdb created
gpg: key 7BB9C367: public key "Launchpad PPA for Ansible, Inc." imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
```

## エピローグ

```
/usr/bin/python -> /usr/bin/python3.6
/usr/bin/python3 -> /usr/bin/python3.6
```

になっていたので、

```
sudo rm -rf /usr/bin/python
sudo ln -s /usr/bin/python3.5 /usr/bin/python
```

かもしくは

```
sudo rm -rf /usr/bin/python3
sudo ln -s /usr/bin/python3.5 /usr/bin/python3
```

としても動きそう（未確認）。
powershellからHyper-Vを有効化してみる

現在使用中のOSがWindows10Proなので、折角だし *Hype-V* なるものを利用してみたいなと思い有効化してみました。~~そのあと無効化しましたが。~~
備忘録として残しておきます。

## 有効化 ##

管理者権限の `powershell` からコマンドで *Hyper-V* を有効化できます。

```powershell:powershell（管理者権限）
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```

上記のコマンド実行後、PCを再起動すれば有効になっているはずです。


### Hyper-V Administrators への登録 ###

Hyper-Vは管理者権限がないと操作できません。
一般アカウントを常用している身としては、いちいち管理者パスワードを入力するのが大変不便。
これを解決するために `Hyper-V Administrators` に普段使いのアカウントを登録しておきます。

1. `コントロールパネル` -> `システムとセキュリティ` -> `管理ツール` -> `コンピュータの管理`
1. `システムツール` -> `ローカルユーザーとグループ` -> `グループ`
1. `Hyper-V Administrators` を選択して右クリックメニューから `プロパティ` を開く
1. `追加` を選択
1. `オブジェクトの種類` から `ユーザー` のみにチェック
1. Hyper-Vを操作したいアカウント名を入力し、 `名前の確認`
1. `OK` -> `OK` と選び、確定させる
1. 一度ログアウトする

これで管理者権限のないアカウントからでも *Hyper-V* を操作できるようになりました。


## 無効化 ##

やっぱり仮想化ソフトには *VirtualBox* の方を使います、となったときなど。
*Hyper-V* を無効化するには管理者権限の `powershell` で次のコマンドを実行。

```powershell:powershell（管理者権限）
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```

上記のコマンド実行後、PCを再起動すれば無効化されます。

## 参考 ##

* [Windows 10 上に Hyper-V をインストールする | Microsoft.Doc](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)
* [Hyper-V に対しての "アクセス制御" について | Microsoft Technet](https://blogs.technet.microsoft.com/askcorejp/2016/01/27/hyper-v-4/)
Firebase Analyticsでログを取得する（iOS）

# ゴール

Firebase Analyticsを使ってログを取得できるようになる（2018/04/30現在）

# はじめに

- この資料はFirebase Analyticsでログを取得するにあたっての初期導入手順とログをどう落とせば良いかを書いた資料
- iOSでの手順を記載します
- Firebase Analyticsのドキュメントは[こちら](https://firebase.google.com/docs/analytics/)

# Firebaseの導入

- [導入手順ドキュメント](https://firebase.google.com/docs/ios/setup) を参考にアプリに導入

# ログの落とし方

- [アナリティクスのスタートガイド](https://firebase.google.com/docs/analytics/ios/start) を参考に初期化とログを落とすコードを書く

```swift
Analytics.logEvent(AnalyticsEventSelectContent, parameters: [
  AnalyticsParameterItemID: "id-\(title!)",
  AnalyticsParameterItemName: title!,
  AnalyticsParameterContentType: "cont"
  ])
```

## 自動で落ちるログ

- [こちらの資料](https://support.google.com/firebase/answer/6317485) から、画面遷移などは自動で収集してくれるので個人的には自分で設定する必要はないと思います。

## パラメータの利用方法

- `logEvent()`の第一引数`name`はイベント名なので、[推奨されるイベント](https://support.google.com/firebase/answer/6317498)を参考に粒度を決める
- `logEvent()`の第二引数`parameters`は同一のイベント内でのさらに細かくログを分割したい場合に活用する
    - 例) いろんなボタンのタップイベント`tap`を`name`に指定し、ボタンの種類を`type: xxx`のような形でどのボタンが1番押されているかを確認する
    - 例）フレンドリストに表示されている数を`count: 10`とかで落とし、どのくらい活用されているかなどを確認する
    - パラメータはFirebase Consoleで「パラメータレポートとして」パラメータのkey名毎に深掘りして集計することが可能
        - テキストパラメータで10個、数値パラメータで40個設定が可能

# デバッグ

- Firebase ConsoleにはDebugViewが存在し、直近30分間のログをほぼリアルタイムに収集できているかを確認することができる
- やりかたは
    - 「Edit Scheme > Run > Arguments」の「Arguments Passed on Launch」に「**-FIRAnalyticsDebugEnabled**」を追加する
- パラメータの集計はDebugViewでのリアルタイム確認はできない


# 参考資料

- [API Reference](https://firebase.google.com/docs/reference/swift/firebaseanalytics/api/reference/Classes/Analytics)
Ubuntu MATE 18.04でGitEyeが起動しないのを修正する

GitのGUIクライアントは[GitEye](https://www.collab.net/products/giteye)を使っている。
若干の使いづらさは慣れの問題。
Eclipseベースなのでクロスプラットフォームという利点はあれど、それに起因する問題は時々起きる。
これもそう。

Ubuntu MATE 18.04インストール後、GitEyeもダウンロード。
今回ダウンロードしたのは`GitEye-2.1.0-linux.x86_64.zip`だった。

javaも必要なのでとりあえず`default-jre`をaptでインストール。

```bash
sudo apt install default-jre
```
入るパッケージは`openjdk-11-jre`っぽい。
11？

```bash
$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
```
入ったもの自体は10っぽい。なぜこんなことに。

気を取り直して、GitEyeを適当なディレクトリに展開し、起動。
死ぬ。
![Selection_008.png](https://qiita-image-store.s3.amazonaws.com/0/148579/3cf425eb-1937-ee12-e06b-b6098b378505.png)

ログを見る。

```text
!SESSION 2018-04-29 18:40:11.604 -----------------------------------------------
eclipse.buildId=unknown
java.version=10.0.1
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64 -data @user.home/.giteye

!ENTRY org.eclipse.osgi 4 0 2018-04-29 18:40:16.713
!MESSAGE Application error
!STACK 1
org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct
        at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:410)
        at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:318)
        at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
        at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createDefaultHeadlessContext(E4Application.java:491)
（以下略）
```

ExceptionやErrorの名前でググる。

Bug 524629 - Fresh install of eclipse can't get it to work with Java 9
https://bugs.eclipse.org/bugs/show_bug.cgi?id=524629

Java9の話だが同じエラーだ。

> See https://waynebeaton.wordpress.com/2017/09/25/running-eclipse-ide-on-java-9/
> you need to adjust the -vmargs

Running Eclipse IDE on Java 9
https://waynebeaton.wordpress.com/2017/09/25/running-eclipse-ide-on-java-9/

```text
... 
-vmargs
--add-modules=ALL-SYSTEM
...
```
これを書き足せということか。

GitEyeの場合eclipse.iniに相当するのは、GitEye.ini。

```text:GitEye/GitEye.ini
-startup
plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.551.v20171108-1834
-data
@user.home/.giteye
-vmargs
--add-modules=ALL-SYSTEM　←この行を追加
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
```
![CollabNet GitEye _009.png](https://qiita-image-store.s3.amazonaws.com/0/148579/6467a035-0de7-e4c1-b434-e3fc48bc06cd.png)
無事起動。
x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ

# はじめに

x86_64のLinux上でQEMUを使ってarm用の実行ファイルを動かす方法は以前に書いたことがあるのですが、最近は「マルチプラットフォームのライブラリをビルドしたときにCIを回す」というユースケースが出てきたので再度まとめてみました。

題材とするソースコードはこれ。

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

int main()
{
	printf("Hello, world!\n");
}
```

Ubuntu 16.04 を使用しています。

# ネイティブのコンパイルと実行

```
$ gcc -o hello_native hello.c
$ file hello_native 
hello_native: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=ffce96d91ecac8524b1d8af9f37c9e719364df7e, not stripped
$ ./hello_native 
Hello, world!
```

# クロスコンパイラのインストール

```
sudo apt install g++-arm-linux-gnueabihf
```

gccしか必要なくても、あえてg++をインストールするのがコツです。そうするとクロスのlibcなど必要な物が全て芋づる式にインストールされます。


# クロスコンパイル

```
$ arm-linux-gnueabihf-gcc -o hello_arm hello.c 
$ file ./hello_arm 
./hello_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=9719544312d6cdfb69a31ca70a4655c12e5596d8, not stripped
```

```
$ ./hello_arm
-bash: ./hello_arm: cannot execute binary file: Exec format error
```
そのままではx86_64のUbuntuの上ではARM用の実行ファイルは実行することができません。

# QEMUのインストール

```
sudo apt install qemu-user-binfmt
```

これでスタティックリンクされたARMの実行ファイルならそのまま実行できるようになります。

```
$ arm-linux-gnueabihf-gcc -o hello_arm_static -static hello.c 
$ file ./hello_arm_static 
./hello_arm_static: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=72d599d8f0e385a6daa8ebe6216f8fbe8755bda2, not stripped
$ ./hello_arm_static 
Hello, world!
```

ダイナミックリンクされたARMの実行ファイルは以下のようにクロスのルートディレクトリをQEMUに明示的に指定すれば実行できるようになります。

```
$ qemu-arm -L /usr/arm-linux-gnueabihf/ ./hello_arm
Hello, world!
```

# ダイナミックリンクされたARMの実行ファイルもそのまま実行できるようにする

```
sudo ln -s /usr/arm-linux-gnueabihf/lib /lib/arm-linux-gnueabihf
sudo ln -s /lib/arm-linux-gnueabihf/ld-2.23.so /lib/ld-linux-armhf.so.3
```

```
$ ./hello_arm
Hello, world!
```

# arm64の場合

arm64のツールチェインの名前が違うだけで同様にできます。

```
sudo apt install g++-aarch64-linux-gnu qemu-user-binfmt
sudo ln -s /usr/aarch64-linux-gnu/lib/ /lib/aarch64-linux-gnu
sudo ln -s /lib/aarch64-linux-gnu/ld-2.23.so /lib/ld-linux-aarch64.so.1
```

```
$ aarch64-linux-gnu-gcc -o hello_arm64 hello.c
$ file ./hello_arm64 
./hello_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=776d40691c4192c0521c641f17b3754b37b73109, not stripped
$ ./hello_arm64 
Hello, world!
```

# 参考

[QEMUのもうひとつの使い方: ユーザーモードエミュレーションとbinfmtとchrootの組み合わせ](http://blog.kmckk.com/archives/2342452.html)
[Ubuntu 12.04LTS Beta2でMultiarchを試す](http://blog.kmckk.com/archives/4165115.html)
[Ubuntu 12.04LTS 正式版でMultiarchを試す](http://blog.kmckk.com/archives/4194926.html)
PM 午後2平成26年度 問1 システム開発における工数の見積もりとコントロールについて


問題文をフロー化してみた
青のオブジェクトが問題文から拾い上げたもの
赤の部分が問題文をさらに具体化(PMBOXや情報処理のテキストに載っている手法を書いている）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/4ad17a57-eaaa-0ce0-f1fe-9e1385fab670.png)
[WIP]Pythonの文法を学習する

100個くらいサンプル書いたら覚えられるかな
Jupyterに書きながら学習中。
Windows+Anaconda3(Jupyter)にて学習環境構築。
(VS2017入れなおしたときにPythonサポートを追加した。インストーラー便利だな)

TODO:PEP8 LINTする

# 001 ハローワールド
```q001.py
print("hello world")
```
# 002 コメントの書き方
```q002.py
#COMMENT GOES HERE
```

# 003 関数の後ろにコメント
```q003.py
print("hello world") #comment
```

# 004 ブロックコメント
```q004.py
'''
print("hello world1")
print("hello world2")
'''
```

# 005 文字列の行継続
```q005.py
print('''hello world1
hello world2
hello world3''')
```

# 006 printの終端を改行ではなく任意の文字にする
```q006.py
print("たこ",end="★")
print("いか")
```

# 007 カンマで区切ると 空白区切りになる
```q007.py
print("いぬ","さる","きじ")
```

# 008 文字列＋文字列＝文字列連結
```q008.py
hero = "メロス"
print(hero +"は走った")
```

# 009 数値と文字列を連結する場合はstr()
```q009.py
n=10
#print(n+"億円ほしい！！") #実行時エラー
print(str(n)+"億円ほしい！！")
```

# 010 乱数生成
```q010.py
import random
random.random()
n=random.randint(1, 100)
print("テストの点数は" + str(n) + "です。")
```

# 011 int+strはだめ
```q011.py
p=100+"円"
----
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```

#012 if文による条件分岐
- if/elseの行末のコロンが必要
- 処理はインデントさせて書く
- equal演算子は == とイコールを2回重ねて書く

```q012.py
number = 1
if number == 1:
    print( "one")	#条件式が成立したときの処理
else:
    print( "not one")	#条件式が成立しなかったときの処理
```

# 013 else + if =elif

```q013.py

if 条件式１:
    print( "c1")	#条件式1が成立したときの処理
elif 条件式２:
    print( "!c1 & c2")	#(条件式1が成立していない状態で)条件式2が成立したときの処理
else:
    print( "!c1 & !c2")	#条件式がどれも成立しなかったときの処理
```

# 014 比較演算子

```pep8_q014.py
if number == 5:
    print("5と等しい")

if number > 5:
    print("5より大きい")

if number < 5:
    print("5より小さい")

if number >= 5:
    print("5以上")

if number <= 5:
    print("5以下")

if number != 5:
    print("5と等しくない")
```
Atomでリモートサーバの開発をおこなう

# Atomでリモートサーバでの開発
こんにちは。突然ですがAtomでリモートサーバ側のファイルを変更して開発する時、どのようにしていますか？？
今回、僕がリモートサーバーでの開発しているときの設定を書いておきます。

## 環境
会社の開発環境ですがAWS上にサーバーを立てて、そこに修正をする感じになっています。
なので、SFTPでアクセスして修正しています。

## 設定
### Atom側
使用しているエディタはAtomでSFTPの「Remote-FTP」パッケージを入れています。
細かい設定は既に記事を書いて頂いているそちらを参考にして頂ければと思います。
https://qiita.com/otsukaaaa/items/8117055665af259bd9f2

ちなみに僕はファイルを更新してすぐにブラウザで確認するため、「Auto Upload On Save」は「Always」設定にしています。

取り敢えずこれで開発はできるようになるのですが、ファイルを開くときクリックしてサーバからデータを取得しないといけないし、ファイルのショートカットキーも使えない。。
特に下記２つのショートカットキーが使えないと効率がかなり下がります。

* 複数ファイルでの検索(cmd + shift + f)
* ファイル移動(cmd + t)

### ターミナル側
いちいちファイルをクリックして移動するのはめんどくさいので、rsyncコマンドで一旦サーバー側のファイルを全てローカルに持ってくるようにしています。
これでショートカットも使えます。
コマンド例は下記です。

```
rsync -ahv 同期元 同期先
```

ただ、gitでpullしたときやbranch切り替えしたときに忘れずにrsyncを実行しないといけないのがネックですね。。
Ubuntu 18.04のshutterのEditボタンを有効にする

スクリーンショットしてドキュメントを作ったりする場合、shutterが便利。
ウィンドウなり範囲指定なりして画像化、Editで赤枠囲みなどをして、
そこからすぐ他のアプリにドラッグ＆ドロップできる。

だが18.04だと、そのEditが無効になってしまっている。
![shutter.png](https://qiita-image-store.s3.amazonaws.com/0/148579/6e3f87ef-17c3-2c34-44d3-ebf43f0122a6.png)
非常に不便。

コンソールから起動してみると、こんなメッセージが。

```text
WARNING: gnome-web-photo is missing --> screenshots of websites will be disabled!

WARNING: Goo::Canvas/libgoo-canvas-perl is missing --> drawing tool will be disabled!

WARNING: Image::ExifTool is missing --> writing Exif information will be disabled!

WARNING: Gtk2::AppIndicator is missing --> there will be no icon showing up in the status bar when running Unity!


INFO: gathering system information... （以下略）
```
他にも不便はあるようだが、ひとまず`Goo::Canvas/libgoo-canvas-perl`を入れれば良さそう。

https://launchpad.net/ubuntu/bionic/+source/libgoo-canvas-perl
えええ。
![Selection_007.png](https://qiita-image-store.s3.amazonaws.com/0/148579/1209673b-ed23-ad9e-3f03-b73512443c9d.png)
無いとのこと。


調べると、とりあえずのQuick Fixの方法が見つかった。
http://ubuntuhandbook.org/index.php/2018/04/fix-edit-option-disabled-shutter-ubuntu-18-04/
コマンドだけでやりたければ、こう。

```bash
wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas-common_1.0.0-1_all.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas3_1.0.0-1_amd64.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb
sudo dpkg -i libgoocanvas-common_1.0.0-1_all.deb
sudo dpkg -i libgoocanvas3_1.0.0-1_amd64.deb
sudo apt-get -f install -y
sudo dpkg -i libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb
```
終わったらPCを再起動。
sudo ldconfigとshutterのプロセスの再起動とかでも大丈夫なんじゃないかという気もするけど
勢いでrebootしてしまったので未確認。

とりあえず、復活。
![shutter2.png](https://qiita-image-store.s3.amazonaws.com/0/148579/c81dd03d-5e3b-de32-b5b4-698c7ae08a62.png)
Windows10 PCで仮想Linux環境の構築手順～Railsのために～

Railsの開発環境を作ろうと思うのですが、僕はWindowsPCしか持っていないという残念なことに陥ってます。

そこで、Windows10から搭載された
【Bash On Ubuntu On Windows】
というソフトを使い、WindowsPCにLinuxの仮想環境を作りたいと思います！
（今更感あるけど、実は家にあるもう1台のノートPCには作成済み）

##環境
□OS:Windows10 home　64bit


##Bash On Ubuntu On Windowsインストール方法

####①仮想Linuxシステムを有効にする
コントロールパネル　
⇛プログラムのアンインストール
⇛Windowsの機能の有効化または無効化
⇛WIndows Subsystem for Linux(Beta) 
⇛チェックを入れてOKを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/e2292ca1-9107-2c55-607b-100a9326792c.png)

※「お待ちください」から画面が変わらない場合は、一度再起動をしてみてください。


⇛再起動を要請されるので、再起動しましょう


####②開発者モードを有効にする
Windowsの設定
⇛更新とセキュリティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/31aa8f0a-30bc-f1ac-81c1-cfd385d228b4.png)
⇛開発者向け
⇛開発者モードを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/5e3b37ae-4045-61e3-93e1-9aee99ca5b1f.png)

※注意を促すウィンドウが出ますが、「はい」を選択します。

少し時間が経つと、開発者モードに●が表示され、選択した状態になります。
これで、開発者モードが有効になっています。


####③bashのアプリケーションを取得

コマンドプロンプトでbashと打つと、インストールされていないというエラーメッセージと、インストール先のURLが表示されるので、そのURLをブラウザで入力し、Ubuntuをインストールします。

```
>bash
Windows Subsystem for Linux には、インストールされたディストリビューションがあり
ません。
ディストリビューションをインストールするには、次の Windows ストアを訪問してくだ
さい:
https://aka.ms/wslstore
続行するには何かキーを押してください...
```

URLを入力するとWindowsストアが立ち上がります。
そこで、Ubuntuを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/4351de37-7c07-026f-1128-59cc5d93473e.png)

⇛入手
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/18ab75a7-86c8-90e8-a558-c1efc8cc6e8f.png)

⇛（インストールが終わったら）起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/00046f29-325d-e71f-3cf1-a92213557225.png)

⇛少し待っているとユーザー名、パスワードを求められるので入力する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/a720bba6-a4e1-aba4-2ac9-72b6bc3e3575.png)

※パスワードを入力しても入力されたように見えないが、入力されているので大丈夫です。

ユーザー名、パスワードを2回入力し、エンターを押すことでUbuntuの設定完了です。


####③bashのインストール
再びコマンドプロンプトでbashと打ちます。


```
>bash
```

するとコマンドの先頭の文字が【>】⇛【$】に変わります。
これでbashのインストール、bashの起動が完了です。


Windowsも定期的にWindows Updateがありますが、bashも定期的に最新に更新をしてあげることを忘れずに。


```
$sudo apt-get update
[sudo]（ユーザ名）のパスワード:
$sudo apt-get upgrade
```
Gatsby+firebaseで独自ドメインのHTTPSサイトを作る（その１独自ドメインの取り方）

# はじめに

（ほぼ）無料で静的サイトを簡単に作れたらいいなと常々おもっていました。
最近は環境などそろってきたのでやってみます。

+ [Gatsby+firebaseで独自ドメインのHTTPSサイトを作る（その１独自ドメインの取り方）](https://qiita.com/kei0425/items/91af9616dcaf4326c251) ← 今回はここ
+ [Gatsby+firebaseで独自ドメインのHTTPSサイトを作る（その２ Firebaseの設定）](https://qiita.com/kei0425/items/a7da8d263e8833f7e837)
+ [Gatsby+firebaseで独自ドメインのHTTPSサイトを作る（その３ Gatsbyの設定）](https://qiita.com/kei0425/items/d5e42d3217278b30004e)

今回は「ドメイン取得」までです。

## 前提条件

+ Cloud9を使って作業
+ お名前.comにアカウントあり
+ Firebaseのアカウントあり

普段プアなPCで作業をしているのと、職場でこっそり作業をすることもあるということで、開発環境はCloud9を利用しています。
数クリックでまっさらな環境ができるので便利なのですが、awsに買収されてしまって新たにアカウントを作れなくなってしまいました。

## ドメイン取得

[お名前.com](https://www.onamae.com/)でドメインを取得します。
.workなら一年間1円しかかかりません。
しかも、[ハピタス](https://m.hapitas.jp/register?i=20318431&route=text)経由でとれば、今なら60円分ポイントが入るので、なんと作れば59円得してしまいます。

好きなドメインを入力して、「検索」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/d4123c28-b4da-817a-3316-9e5a657e1444.png)

希望するトップドメインにチェックをいれて、「お申込みへ進む」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/e4495117-d02e-b248-f496-1f61b7c35670.png)

すべてデフォルトのまま、「お名前ID」と「パスワード」を入力し、「ログイン」をクリックします。
※「初めてご登録の方」はそちらを選択してください。
※ サーバーはFirebaseを利用するので選択しないでください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/4b0ba111-7f8b-47e8-bec6-4d1a6293b837.png)

支払方法を選択して、「申し込む」をクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/9a667367-8338-8bc7-70cc-7ad2d3625109.png)

罠が仕掛けられていますが、「申し込まない」をクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/5225d5f3-b67f-2ea9-8a6f-713a28b7c941.png)

少し待ちます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/886a8283-b4a0-0a29-09b8-167eb39c1d69.png)

ドメイン取得完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/8b424e57-8646-614b-5bb0-eeb7fc800d9f.png)

このままだと自動更新がONになっているので変更します。

ページ下の「ドメインNaviTOPへ」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/4079db4b-8386-c2f9-a759-589bcdb3cea6.png)

ログイン画面が出たらログインし、「ドメイン設定」の「ドメイン自動更新設定」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/f9201081-7092-727b-a485-5659dbaf2c3e.png)

先ほど登録したドメインを選択し、「確認画面へ進む」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/9b9214d9-d0be-f79f-f1d5-2c533eced738.png)

「解除する」になっていることを確認して、「規約に同意し、上記内容を申し込む」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38676/531bcbd0-4582-5d6e-5bec-8c0976e7dc77.png)

お疲れさまでした。

これで、あなただけのドメインを取得できました。

[Gatsby+firebaseで独自ドメインのHTTPSサイトを作る（その２ Firebaseの設定）](https://qiita.com/kei0425/items/a7da8d263e8833f7e837)に続く
localhost MySQL 接続パケットをtcpdumpでキャプチャするのに詰まった件

##tl;dr
すでに知っている方も多いかもしれないが。
<font color="orange">tcpdump</font>で<font color="red">localhost</font>内のMySQLに
ターミナルで接続したときのパケットをキャプチャしようとしたら詰まったので書き残します。

##Method
mysqlコマンドでlocalhost MySQLサーバに接続する時に「<b><font color="red">-h</font></b>」を指定しないとキャプチャできない！
<b><font color="red">-h 127.0.0.1</font></b>が重要。

```bash
$ mysql -u root -h 127.0.0.1
```

以下だと<font color="red">キャプチャできない</font>

```bash
$ mysql -u root
```
Ubuntu MATE 18.04でdropboxのアイコンが正しく表示されないのを直す

Ubuntu Mate 18.04 をインストールした。
他PCとのファイル同期のためdropboxをインストールしたが、
インジケーターのアイコンがバグっている。
状況とかを見ようとしても、こう。
![shutter_corrupt.png](https://qiita-image-store.s3.amazonaws.com/0/148579/9be9791e-d32b-7bc4-9821-55404e18993e.png)
お話にならない。

一応、コンソールでこれを実行すると、一時的に正しくなる。

```bash:bash
$ dropbox stop && dbus-launch dropbox start
```
が、毎回いちいち実行するのも面倒なので、autostartのファイルを書き換えた。

```text:~/.config/autostart/dropbox.desktop
[Desktop Entry]
Name=Dropbox
GenericName=File Synchronizer
Comment=Sync your files across computers and to the web
# Exec=dropbox start -i
Exec=dbus-launch dropbox start
Terminal=false
Type=Application
Icon=dropbox
Categories=Network;FileTransfer;
StartupNotify=false
```
Execの行を修正してやる。

再起動して、正しく表示された！
![shutter_corrupt2.png](https://qiita-image-store.s3.amazonaws.com/0/148579/842d8b47-ff96-17b7-2742-e16e0e3346a6.png)


…と思いきや、次に再起動すると、またおかしくなる。
調べてみると、上で修正したdropbox.desktopが、戻ってしまっている。

挙動を細かく確認すると、どうやらdropboxを起動するたびに、自動的に書き戻してしまうようだ。
お話にならない。
その動きを切るオプションはぱっと見た限りにおいては見当たらない。

もう一度書き換えた後、力技で対処。
要は勝手に上書きできなくしてしまえばいいんだろう。

```bash:bash
$ sudo chown root:root ~/.config/autostart/dropbox.desktop
$ sudo chmod 644 ~/.config/autostart/dropbox.desktop
```
その後何度か再起動しているが、一応安定しているっぽい。
parallels desktopのlinuxのマウスが速すぎる時


### 現象

- parallels desktopのlinuxのマウスが速すぎる．特にスクロールが爆速．
    - （parallels desktop13, guestはHigh Sierra, hostはdebian9）

### 解決方法

- (parallels desktopのParallel toolsを再インストール)

- parallels desktopのコントロールセンターから対象OSの設定を開きマウスの設定をかえる．ゲームに最適化しないとする

### ソース
- <https://forum.parallels.com/threads/mouse-scroll-wheel-to-fast.340438/>

#### その後
- firefoxのスクロール速度はfirefoxの`about:config`からも直した．
- 例えば，<https://support.mozilla.org/ja/questions/1192972>を参考のこと
aftereffects スクリプトでレイヤースタイル（境界線）を適用する方法

#スクリプトではレイヤーに境界線を追加できない！？
作成したレイヤーにはレイヤースタイルは存在するのですが、デフォルトでは隠れている状態でプロパティが有効でない状態です。

プロパティが有効に出来るかは
canSetEnabledで確認出来ます。

```js

//例）
var check = app.project.activeItem.selectedLayers[0].property("ADBE Layer Styles").property("frameFX/enabled").canSetEnabled;
alert(check)
```

この場合falseが返ってきます。

##普通に考えればaddProperty()を使って・・・

```js
app.project.activeItem.selectedLayers[0].property("ADBE Layer Styles").addProperty("frameFX/enabled");
```
ですが、これを実行するとエラーが返ってきます。

エラーメッセージ
After Effects エラー
このpropertyGroupには「frameFX/enabled]***INDEXED_GROUPでもテキストアニメータープロパティグループでもありません。

#解決方法はこちら
そこで私はコマンドIDを使用する方法を取りました。
レイヤーにレイヤースタイルの境界線を適用するコマンド。

```js
app.executeCommand(9008);

//↓こんな感じで使います。
    var commentLay = myComp.layers.addText("コメント");
    commentLay.selected = true;
    app.executeCommand(9008);

```

これで選択しているレイヤーに境界線が適応されます。

ただAEのバージョンが変わるとコマンドIDも変わるような記事を見たので、そこだけが不安です。
現状私が使っているAEのバージョン15.1.1（Build 12）では動いています。

#IDがわからない。。。そんな時はこれ

```jsx
var ID = app.findMenuCommandId("光彩 (外側)");
alert(ID);
これでIDの番号が取れます。
```
光彩などの名前がわからないという方は
rd_gimmepropinfoなどのスクリプトを使ったら簡単に名前が取れます。

http://www.redefinery.com/ae/rd_scripts/
geometry > line | Polygon > 平面の頂点からnormalベクターを計算する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

http://geomalgorithms.com/a05-_intersect-1.html
Line, Polygonのintersectionの式ではPolygonのnormalベクターを使う。

Polygonの座標だけが与えられた場合、normalベクターの計算は下記に紹介されている。
http://kitchingroup.cheme.cmu.edu/blog/2015/01/18/Equation-of-a-plane-through-three-points/

試してみた。

```py:test_plane_eq_180430.ipynb
import numpy as np

DIST_VAL = 7
p1 = np.array([DIST_VAL, 0, 0])
p2 = np.array([0, DIST_VAL, 0])
p3 = np.array([DIST_VAL, DIST_VAL, DIST_VAL])

v1 = p3 - p1
v2 = p2 - p1
print(v1)
print(v2)
cp = np.cross(v1, v2)
a, b, c = cp

print(a,b,c)
```

3D Vector Plotterで確認。
https://academo.org/demos/3d-vector-plotter/

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bba7650f-f55d-8b9a-9cfc-617df48a7979.png)

normalベクターになっているようだ。

内向き、外向き、どちらのnormalベクターになるかは、頂点の取り方に依存する。
Pythonで世界地図(Mapnik版)

#####実行した環境
Linux Mint 18.2
Python 3.5.2

#####インストール
Mapnikのインストール
https://github.com/mapnik/mapnik/wiki/UbuntuInstallation

Ubuntu (16.04)のインストールのやり方でインストールしました。

```sh:
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update -y

エラー:1 http://packages.linuxmint-jp.net/linuxmint-ja ./ InRelease
  packages.linuxmint-jp.net:80 (219.94.251.202) へ接続できませんでした。 - connect (111: 接続を拒否されました)

sudo apt-get install -y gcc-6 g++-6 clang-3.8
export CXX="clang++-3.8" && export CC="clang-3.8"


git clone https://github.com/mapnik/mapnik mapnik-3.x --depth 10
cd mapnik-3.x
git submodule update --init
sudo apt-get install python zlib1g-dev clang make pkg-config curl
source bootstrap.sh
./configure CUSTOM_CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" CXX=${CXX} CC=${CC}
make
make test
sudo make install

sudo apt install python3.5-mapnik
```

インストールはスムーズに終わりましたが、サンプルプログラムがエラーなくできるまでは苦労しました。（古いPC（セレロンCPU）でインストールに1時間近くかかりました。）
サンプルプログラムはネットで検索するとたくさんヒットするのですが、エラーがでてうまく動作しないものが多いです。

```python:test.py
#!/usr/bin/python3

import  mapnik

map = mapnik.Map (600 ,300)
map.background = mapnik.Color('steelblue')
polygons = mapnik.PolygonSymbolizer ()
polygons.fill = mapnik.Color('lightgreen')

rules = mapnik.Rule()
rules.symbols.append(polygons)
style = mapnik.Style()
style.rules.append(rules)
map.append_style('Countries', style)
layer = mapnik.Layer('world')
layer.datasource = mapnik.Shapefile(file='/home/ty21ky/mapnik-3.x/test/data/shp/ne_110m_admin_0_countries.shp')
layer.styles.append('Countries')
map.layers.append(layer)
map.zoom_all ()

mapnik.render_to_file(map ,'world.png','png')
```

![world.png](https://qiita-image-store.s3.amazonaws.com/0/238800/cae8320a-a2e7-25aa-06ff-67ab9e7e88e6.png)
サブドメインでWordPressのテストサイトを作る方法（ロリポップの場合）

ロリポップでサブドメインを取得し、WordPressで作られたサイトのテストサイトを作成する方法をメモ。

#1、ロリポップでサブドメインを取得する

・ロリポップユーザー専用ページにログイン
・メニューバーにある「サーバーの管理・設定」を開く
・「サブドメイン設定をクリック」
・右下の「新規作成」をクリック
・「サブドメイン」と「公開フォルダ名」を入力

#2、WordPressをインストール

・ロリポップユーザー専用ページにログイン
・メニューバーにある「サイト作成ツール」をクリック
・「WordPress簡単インストール」をクリック
・先ほど作ったサブドメインを選択し、WordPressのログインIDやパスワードを新規作成し、入力

#3、Basic認証をつける
これを設定すると、ログインIDとパスワードを知っている人しかテストサイトにアクセスできなくなります。

・ロリポップユーザー専用ページにログイン
・メニューバーにある「セキュリティ」をクリック
・「アクセス制限」をクリック
・「新規作成」をクリック

「.htaccess設置ディレクトリ」
→　設定したドメインのディレクトリから入力できます。をクリックし、
Basic認証をつけたいサイトURLを選択

「認証フォームタイトル」
→ログインフォーム出現時のタイトル

「ユーザ１・アカウント名」
→ログインIDを新規作成し、入力

「パスワード」
→リンク「パスワード制による制限マニュアルはコチラ」から生成したパスワードを入力
Sympy > Polygon() > ValueError: Nonzero coordinates cannot be removed. > X-Y平面上にない時にエラー?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
Sympy v1.1.1
```

```py:test_sympy_3D_180430.ipynb
import sympy as sp

ERROR_COND = True

# Triangles to define the shape of the particle
DIST_POLY = 7
points = []
points += [sp.Point3D(0, DIST_POLY, 0)]
points += [sp.Point3D(DIST_POLY, DIST_POLY, 0)]
if ERROR_COND:
    points += [sp.Point3D(DIST_POLY, 0, DIST_POLY)]
else:
    points += [sp.Point3D(DIST_POLY, 0, 0)]

atpl = tuple(points)
symplys = sp.Polygon(*atpl)
print(symplys)

```

```txt:run
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-5b3dabb8b0c5> in <module>()
     14 
     15 atpl = tuple(points)
---> 16 symplys = sp.Polygon(*atpl)
     17 print(symplys)

/usr/local/lib/python3.5/dist-packages/sympy/geometry/polygon.py in __new__(cls, *args, **kwargs)
    124             return RegularPolygon(*args, **kwargs)
    125 
--> 126         vertices = [Point(a, dim=2, **kwargs) for a in args]
    127 
    128         # remove consecutive duplicates

/usr/local/lib/python3.5/dist-packages/sympy/geometry/polygon.py in <listcomp>(.0)
    124             return RegularPolygon(*args, **kwargs)
    125 
--> 126         vertices = [Point(a, dim=2, **kwargs) for a in args]
    127 
    128         # remove consecutive duplicates

/usr/local/lib/python3.5/dist-packages/sympy/geometry/point.py in __new__(cls, *args, **kwargs)
    155                         'warn' or 'ignore'.'''))
    156         if any(i for i in coords[dim:]):
--> 157             raise ValueError('Nonzero coordinates cannot be removed.')
    158         if any(a.is_number and im(a) for a in coords):
    159             raise ValueError('Imaginary coordinates are not permitted.')

ValueError: Nonzero coordinates cannot be removed.
```

上記のエラーが出る。

エラーが出ない条件としては、Z軸の値を０で合わせること。

傾いた平面ではエラーになるのだろうか。
（実装例なし）新人研修で辛い思いをしている僕たちへ送る，JavaによるMVCモデル2を適用したwebアプリの構成

# 注意事項
* 初心者向けです
    * というか私が初心者です
* 実装は載せていません
    * 概念的なものです
* アプリを作るに際して「今自分がどこを作っているのか？」という疑問を解決するため書きました
* クラスの関係性については諸事情により改善できませんごめんなさい

# 概要
* MVCモデル2の紹介
* Servlet+JSP+Java Beansを用いた実装を想定した，webアプリの構成の解説

# MVCモデル2

現在ではMVCモデルと呼ばれることが多い．デザインパターンの一種で，UIを持つアプリケーションを実装する際に用いることができる．MVCはModel View Controllerの略で，データの保持やビジネスロジックをModel，表示をView，それらを繋ぐ役をControllerが担っている．
![mvc.png](https://qiita-image-store.s3.amazonaws.com/0/193192/68a8a924-cf02-a532-5b3b-f4ff06bc40a7.png)


# MVCモデル2を適用したwebアプリ

今回はServletとJSPを用いるため，ControllerとViewはそれぞれServletとJSPに対応する．
![mvc-j.png](https://qiita-image-store.s3.amazonaws.com/0/193192/8a900084-2f89-b831-402a-70bfb849c8f0.png)


また，ServletとJSP間のデータの受け渡しはBeanを介して行う．BeanはデータクラスでありModelに含まれる．今後，アプリの目的のためにデータの操作を行うクラスはBusinessLogicと表す．
![mvc-j2.png](https://qiita-image-store.s3.amazonaws.com/0/193192/61f4e74e-38c4-fd35-9787-6a745cc2e462.png)


webアプリであるためユーザが存在する．また，ユーザはwebブラウザを介してアプリにアクセスする．ユーザからのリクエストはServletが受け，入力によって適切な処理をModelに命じる．Servletは，リクエストに対するレスポンスを返せる状態になったことを確認して，JSPに制御を渡す．JSPは渡されたデータをHTMLに整形する．
![mvc-u.png](https://qiita-image-store.s3.amazonaws.com/0/193192/6a40200a-4078-1fbb-a82c-5a4d13aeb22b.png)


ここで「適切な処理」とは，ユーザからの入力の妥当性確認も含まれる．ServletはFormBeanに妥当性確認を依頼し，ユーザからの入力が適切であれば，目的の操作（図のビジネスロジック部分）を行う．
![mvc-fb.png](https://qiita-image-store.s3.amazonaws.com/0/193192/a2003b4f-a5e4-c826-2710-26fbc76c54fd.png)


例えば，足し算アプリを作る場合は以下の手順で進む

* ServletはユーザからGETリクエストを受ける
* ユーザは，数値ボックス2つと送信ボタンがついたHTMLをServletから受け取る
* 数値ボックス2つはそれぞれ，ユーザから数字を入力される…はず
* ServletはユーザからPOSTリクエストを受ける
* FormBeanは，Servletからユーザのリクエストを受け取り，妥当性（空でないことなど）をチェックする
    * 妥当でない場合，エラーメッセージを表示するHTMLが，JSPによって生成される
* 妥当である場合，2つの数字を足す機能がServletから呼ばれ，送信用のBeanが返される
* 2つの数字の和はBeanとしてServletからJSPに送られる
* JSPで和を表示するHTMLが生成される

上記はDBを使わない例だったが，DBを使う場合はDAOを使用する．DAOはData Access Objectの略で，アプリからDBへの操作をラップする．DAOによりDBから抽出されたデータはDTO(Data Transfer Object)に格納されて渡される．DTOはデータ型であり，Java Beansの規約に従う．
![mvc-db.png](https://qiita-image-store.s3.amazonaws.com/0/193192/a165fe46-aa29-bb39-2d9b-3715c07c7724.png)
GCP上でWordPressを無料で構築したい

## WordPressでHPをやりたいがお金はない
今更ながらWordPressを使ってみたいと思い立ったが、自サーバを立てるお金も、レンタルサーバを借りるお金もない。
そこでGCPの無料枠を使ってできるという噂を聞いたのでやってみることに。

※GCPにはWordPress用のランチャがあるので、純粋にWordPressを立てるだけならそっちの方が良いのでしょう。

- [GCP(Google Cloud Platform)でWordPressスタート](https://qiita.com/sakkaonline/items/95daa42f97b9d55c345f)
  
## GCEでサーバを用意する
以下を参照しながら無料インスタンス作成。

- [GCP(Google Cloud Platform)での無料GCE(Google Compute Engine)インスタンス作成](https://qiita.com/FukuharaYohei/items/0614354d6a4eda32d521)
- [GCE の無料枠のサーバを立るときに、初見でハマりそうなところ](https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd)
 
## LAMPサーバとして設定を行う
作成したGCEにssh接続して、LAMPサーバとして使えるように設定していく。
※操作が必要なところについては、echoで説明しています。
### apacheのインストール
```sh:apache.sh
#Apacheをインストールします
sudo yum -y install httpd

#apacheを起動し、ついでに起動を自動化します
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
```
### mariaDBのインストール

```sh:mariaDB.sh
#MariaDBをインストールします
sudo yum -y install mariadb-server mariadb

#MariaDBにcharacterの設定を行います
sudo echo character-set-server=utf8 >> /etc/my.cnf

#Mariadbを起動し、ついでに起動を自動化します
sudo systemctl start mariadb
sudo systemctl enable mariadb

#MariaDBの初期設定を行います
echo "input:enter,y,password,y,y,y,y"
sudo mysql_secure_installation
```

### PHPのインストール
```sh:php.sh
#PHPおよび関連ソフトをインストールします
sudo yum -y install php php-mbstring php-gd php-mysql

#Apacheを再起動します
sudo systemctl restart httpd.service
```
### DBの準備
```sh:DBsetup.sh
#データベースを準備します
echo "Input like this..."
echo "Caution: You needs change *___*"
echo "1:Create database *db_name*;"
echo "2:grant all privileges on wpdb.* to \"*user_name*\"@\"localhost\" identified by \"*password*\";"
echo "3:flush privileges;"
echo "4:exit"

mysql -u root -p
```
これで最低限LAMPサーバとしての準備ができた。
この上にWordPressを構築していく。

##Wordpressのインストールを行う

###ダウンロードからインストールまで
```sh:wordpress.sh
#wordpress最新日本語版をダウンロード
curl -LO http://ja.wordpress.org/latest-ja.tar.gz

#ファイルを展開
tar zxf latest-ja.tar.gz

#htmlフォルダに移して、apacheで使用可能にする
sudo mv wordpress /var/www/html/wp
sudo chown -R apache:apache /var/www/html/wp

#展開元のファイルは消去
sudo rm latest-ja.tar.gz 

#config.phpをサンプルから本番に変更
sudo mv /var/www/html/wp/wp-config-sample.php /var/www/html/wp/wp-config.php
```
###設定を行う
```sh:settingWP.sh
echo "Change like this ..."
echo "database_name_here -> wpdb"
echo "username_here -> *username*"
echo "password_here -> *password*"
sudo vi wp-config.php

#設定終了したら、編集不可に設定
sudo chmod 400 wp-config.php

```

###SELinuxの設定
そのままだとSELinuxに引っかかってうまく動かないので設定を変更する。

```sh:settingSELinux
#SELinuxの設定をします
sudo setsebool -P httpd_can_network_connect_db 1
sudo setsebool -P httpd_tty_comm 1
sudo setsebool -P httpd_unified 1
sudo setsebool -P httpd_dbus_avahi 1
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html/wp"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp/wp-content(./*)?"
sudo restorecon -R -v /var/www/html/wp
```

## ドメインを取得
当然ここも無料で行きたいので、
- [無料のドメインを取得する](https://qiita.com/teekay/items/135dc67e39f24997019e)
を参考にドメイン取得。

Aレコードに www:(GCPの外部アドレス） で登録すれば使えるようになる。

## 完成
とりあえずこれでWordPressが使えるようになりました。
データベース接続エラーがたまに出て、そのときには手動で再起動が必要のようですが、とりあえずは問題なく動く感じ。
あまりアクセスが多くなるとGCPの無料枠で収まらなそうだけど、とりあえずはなんとかなるはず。
GeoPandas > Link > ShapelyのLineStringとPolygonからのGeoPandas型への変換

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

Shapelyのlineとpolygonのintersectionは条件によっては期待通りに動かない。
対策としてGeoPandasを使っている例がある。

その例においてShapelyのLineStringとPolygonからGeoPandas型への変換例がある。

https://gis.stackexchange.com/questions/246782/geopandas-line-polygon-intersection
の質問者のコードに例が記載されている。
Eclipse + STSにlombokをインストールする

LombokをEclipseにインストールしたときのメモ

Lombokがずっと使えていませんでしたが何とかインストールできたのでメモしておきます。

1.ダウンロード
https://projectlombok.org/download

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/24eebb06-d843-56e1-777b-ad08b08767a1.png)

2.インストール

(1)ダウンロードした「lombok.jar」をダブルクリックするのですが、このときに
「I can't find any IDEs on your computer」と出てきます。OKをクリックします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/25f85e9f-acf4-c0d7-33b3-8428221d2a98.png)

(2)手動でインストールしてみます

https://projectlombok.org/setup/eclipse

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/ce1df12c-2331-ecb0-3e70-faead2292568.png)

ですが、表示されている画面がこんな感じでつぶれてしまってました
画面の解像度などを変更するなどして試してみましたが、うまく表示できません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/d9bc3251-b5a9-6bb4-19b8-e0f49b52c616.png)

画像の下側に少しだけ見えているボタン２つがどうやらセットアップのためのボタンのようです。

左のボタン（おそらく「specify location」）をクリックして、Eclipseのインストールディレクトリを指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/f287f2f4-8472-72ea-31bb-07353e837ae3.png)

右のボタン（install/update）をクリックします。

反応がないですが、インストールできているようです。Eclipse.iniを見てみると、「-javaagent:C:\pleiades-4.7.2\pleiades\eclipse\lombok.jar」が最終行に追加されています。

```Eclipse.ini
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM
-Xms2g
-Xmx2g
XX:MaxPermSize=512m
-Xverify:none
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-javaagent:C:\pleiades-4.7.2\pleiades\eclipse\lombok.jar
```

(3)確認
適当なprivate 変数を持つクラスを作って試してみます。

```TestForm .java
import lombok.Data;
@Data
public class TestForm {
	private String aaa;
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/935e29e3-d89b-c6cb-e41a-7b8209316406.png)

setterを定義しなくても、setterを使えています。
clamAVについての個人的まとめ

#この記事について#
自分の備忘録として、Linuxのウィルス検知ソフトclamAVについて調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。

#ツールの概要#
コマンド発行でディレクトリチェックを行い、ウィルスデータベースと一致したら、教えてくれます。


#clamavをインストール-実行

`sudo yum install --enablerepo=epel clamav
cd /var/log/clamav/
sudo touch clamscan.log
sudo yum install clamav-update
freshclam
sudo clamscan --log=/var/log/clamav/clamscan.log /home/ec2-user/
`

#参考
[Amazon EC2でウィルス対策をする – ClamAV](https://dev.classmethod.jp/etc/amazon-ec2-virus-clamav/)
[【検証用メモ】インストールするもの](https://qiita.com/lawliteqed/items/0d1632eadd992f74343b)
MyBatisのSQLで不等号の比較演算子を使う

# 初めに
MyBatisはXMLファイルにSQL文を定義して使用するが、XMLなので<や>は使えない。
それに気づかずエラー吐いて、
なんでや！コンソールでこのSQL叩いたら正常に実行できたのに！と小一時間悩んだ。

## 実行環境
- MyBatis 3
- Java 8 

# エラーになる例
```xml
<select id="hoge" resultType="hoge">
    SELECT
        *
    FROM
        HOGE
    WHERE
        HOGE.HOGE_DATE < SYSDATE
</select>
```
不等号を使っているWHERE句がダメと怒られる。
## エラー内容
```
Cause: org.xml.sax.SAXParseException; lineNumber: XX; columnNumber: XX; 要素のコンテンツは、整形式の文字データまたはマークアップで構成されている必要があります。 
```
# 改善策①
不等号を使っている箇所を<![CDATA[・・・]]>で囲んでしまうという方法。  

```xml
<select id="hoge" resultType="hoge">
    SELECT
        *
    FROM
        HOGE
    WHERE
        HOGE_DATE <![CDATA[ < ]]> SYSDATE
</select>
```

# 改善策②
下の例のようにSELECT句全体を囲んでも良かった。
こっちのほうが可読性は高い。（気がする。）

```xml
<select id="hoge" resultType="hoge">
<![CDATA[ 
    SELECT
        *
    FROM
        HOGE
    WHERE
        HOGE_DATE < SYSDATE
]]>
</select>
```
# 改善策③
コメントにて教えていただいたエンティティ参照を使用する方法です。
少し調べたところ、以下の5種類があるようです。

| 文字 | エンティティ参照 |
|:-----------|:------------|
|<|\&lt;|
|>|\&gt;|
|&|\&amp;|
|'(シングルクォーテーション)|\&apos;|
|"(ダブルクォーテーション)|\&quot;|


エンティティ参照を使用して記載すると、下のようになります。

```xml
<select id="hoge" resultType="hoge">
    SELECT
        *
    FROM
        HOGE
    WHERE
        HOGE_DATE &lt; SYSDATE
</select>
```

# 終わりに
MyBatisに初めて触っているが、動作確認済のSQLをコピペして、呼び出すだけで使えるので便利。
MyBatis公式ドキュメントが日本語化されており、情報量も豊富なので使いやすい。
if、choose、foreachなどの動的SQLについても後日まとめる予定。

# 参考文献
[MyBatis – MyBatis 3 | Mapper XML ファイル](http://www.mybatis.org/mybatis-3/ja/sqlmap-xml.html)
[文字参照とエンティティ参照[XML標準]](https://msdn.microsoft.com/ja-jp/library/ms256190(v=vs.120).aspx)
Cordovaの音声読み上げプラグインは

Cordovaの音声読み上げプラグインは、ビルドすると非推奨のAPIとエラーが出ます。
私は、色々と調べて試しました。
今回、煮詰まったので、そのままビルドして実機でデバッグしました。

そしたら、正常に機能しました。

広告プラグインとの絡みや色々あって、土壺にはまっていました。
でも、思い切ってビルドしたら出来てので、よかったです。

googleストアで配信始まった後に、自分でストアからダウンロードして試しました。
正常に意図した通りに動いたので、安心しました。

このプラグインのお陰で、アプリを作ることができました。
https://github.com/vilic/cordova-plugin-tts

ビルドで非推奨のエラーが出ますが、ちゃんと配信できる状態でビルドできます。
IntelliJ上のNuxt.jsプロジェクトでPrettierとESLintを導入してコードを自動整形させる

おそらく現状のIntelliJのPrettierプラグインでは```.eslintrc.js```のRulesが反映されないのと```Ctrl + s```する度に自動整形を走らせて強制的にESLintのルール上に則ったコードにさせたかったので以下のような設定をしました。

## nodeモジュールを入れる

```bash
// vue-cliでNuxt.jsプロジェクトが入ってる前提です。
// 追加で以下をdevDependenciesにインストール
$ yarn add -D prettier eslint-config-prettier eslint-plugin-prettier
```

## .eslintrc.jsを設定

[#ESLint と Prettier -Nuxt.js](https://ja.nuxtjs.org/guide/development-tools/#eslint-%E3%81%A8-prettier)

上記のNuxt.js公式ドキュメントの通りに```.eslintrc.js```をしてください。ただ上記の通りだとダブルクオーテーションを使う設定になっているため```singleQuote: true```を追加しました。

```js:.eslintrc.js
module.exports = {
  // ~~~~~~~~~~~~~~~~
  rules: {
    'semi': [2, 'never'],
    'no-console': 'off',
    'vue/max-attributes-per-line': 'off',
    'prettier/prettier': ['error', { 'singleQuote': true, 'semi': false }]
  }
}
```

## IntelliJ or WebStormにFile Watchersプラグインを追加

追加してください。再起動後、設定→ツール→ファイル監視があればOKです。

## File Watchersの設定

<img width="1067" alt="スクリーンショット 2018-04-30 9.55.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/21909/3d35de7c-32f7-3af4-0609-0c6c1a64c70a.png">

<img width="1072" alt="スクリーンショット 2018-04-30 9.55.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/21909/2a93fe22-7adc-ee88-0f89-1b31ab5cbcde.png">

- プログラム： \$ProjectFileDir\$/node_modules/.bin/eslint
- 引数: --fix \$FilePath\$ --ignore-path \$ProjectFileDir\$/.gitignore \$ProjectFileDir\$/.
- リフレッシュする出力パス：　\$FilePath\$

上記のような感じで設定しました。```--ignore-path```の設定しないと```node_modules```とか```.nuxt```にも働きかけて死ぬので注意してください。
Angular 5でcookieを利用する


#動作確認した環境
```
PS > ng --version

    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/

Angular CLI: 1.7.4
Node: 8.11.1
OS: win32 x64
Angular: 5.2.10
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

@angular/cli: 1.7.4
@angular-devkit/build-optimizer: 0.3.2
@angular-devkit/core: 0.3.2
@angular-devkit/schematics: 0.3.2
@ngtools/json-schema: 1.2.0
@ngtools/webpack: 1.10.2
@schematics/angular: 0.3.2
@schematics/package-update: 0.3.2
typescript: 2.5.3
webpack: 3.11.0
```
上記とあわせ、Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）で動作を確認。

# 利用モジュール：ngx-cookie-service

- インストール

```
npm install ngx-cookie-service --save
```
# 利用方法
## 設定
- app.module.tsのproviderに設定を追加

```example
import { CookieService } from 'ngx-cookie-service';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpClientModule
  ],
  providers: [CookieService ],
  bootstrap: [AppComponent]
})
```


- 利用するコンポーネントでもインポート

```
import { CookieService } from 'ngx-cookie-service';

constructor(
    private cookieService: CookieService
 ) { }
```
## 操作
### cookieに保存
```
this.cookieService.set( 'test-key', 'test value' );
```
### cookieからの読み取り
```
cookieValue = this.cookieService.get('test-key');
```

### 全ての項目を読み取り
```
const allCookies: {} = cookieService.getAll();
```

### 全ての項目を削除
```
cookieService.deleteAll();
```
### Expires/Max-Age設定
- デフォルト（指定無しの場合）は、「1969-12-31T23:59:59.000Z」が設定される。 
    - ~~恐らく無期限~~では無さそう？
- 日数指定の場合は、numberを指定（例：3日間の場合）
    
```
this.cookieService.set( 'test-expire', 'test-value', 3 );
```
- 日時指定の場合は、Dateを指定（例：2018-05-04T23:59:59.000Zの場合）

```
const date: Date = new Date('2018-05-04T23:59:59.000Z');
this.cookieService.set( 'test-expire2', 'test-value2', date );
```
golangで配列を、分散してマージしたい

タイトルのとおり、なのですが、
コードを書いていて、以下みたいなマージをしたかったので、メモしておきます。

```golang:main.go
func main() {
	s1 := []int{1, 2, 3, 4, 5}
	s2 := []int{7, 8,9,10}
	s3 := MergeSlice.Mix(s1, s2)
	fmt.Println(s3)
}

// ->  [1 7 2 8 3 9 4 10 5]
```

 みたいな感じです。
なんでこれをやりたかったかというと、
2つの配列に入った処理を一定時間に按分して処理させたくて、
かつ、同じタイミングでそれぞれの処理が実行されたくなかったからです。

例えばgoroutineでそれぞれを並列実行すると
配列の数が同じだった場合は、実行タイミングが近くなりすぎてしまいました。

ライブラリがなかったので、作成しました。

```golang:MergeSlice.go
func Mix(slice1 []int, slice2 []int) []int {
	var resp []int
	// ゼロチェック、どちらかが0なら、もう一つが返却される
	if len(slice1) == 0 {
		return slice2
	} else if len(slice2) == 0 {
		return slice1
	}

	long, short, step := checkSlice(slice1, slice2)
	
	// 返却されるスライスは2つの合計値の値を持つ
	goal := len(long)+len(short)
	for i := 1; i <= goal; i++ {
		if i%(step+1) == 0 {
			if len(short) != 0 {
				resp = append(resp, short[0])
				short = short[1:]
			} else {
				resp = append(resp, long[0])
				long = long[1:]
			}
		} else {
			resp = append(resp, long[0])
			long = long[1:]
		}
	}
	return resp
}
func checkSlice(s1 []int, s2 []int) ([]int, []int, int) {
	// 大きい方の配列を判定し、大きい配列、小さい配列、小さい配列の間隔を返します。
	if len(s1) > len(s2) {
		return s1, s2, int(len(s1) / len(s2))
	} else {
		return s2, s1, int(len(s2) / len(s1))
	}
}

```

[GitHub](https://github.com/yutako0217/MergeSlice)にもアップしています。
Google Chrome, Excel VBA, Seleniumbasicを使ったスクレイピング

# 環境
* Windows 7
* Microsoft Excel2010
* Google Chrome 65.0.3325.181(Official Build)(64 ビット)
* Seleniumbasic v2.0.9.0
* ChromeDriver 2.38

# 準備

## Seleniumbasicのインストール
http://florentbr.github.io/SeleniumBasic/ からダウンロード、インストール。

## chromedriverの更新
https://sites.google.com/a/chromium.org/chromedriver/downloads からダウンロード。SeleniumBasicをインストールしたフォルダにあるchromedriver.exeをダウンロードしたもので置き換える。

# VBA作成
Excelを起動、Microsoft Visual Basic for Applicationsを開き(Alt+F11)、ツール→参照設定→Selenium Type Libraryにチェックを入れる。後は通常のVBA同様、コード作成、デバッグを行う。

オブジェクトブラウザ(F2)のクラスChromeDriverでメンバを確認することができる。基本的なコードは以下。

```vb
Sub openurl
  Dim driver As New ChromeDriver
  'WEBページを開く
  driver.Get "https://..."
  'やりたいことを記入
  '
  '
  '

  '終了
  driver.quit
End Sub
```

# (例) マネックス証券 FX PLUSの口座管理・設定ページから評価証拠金のデータを取得する

ポイントは、

* FX PLUSのページへのリンクをクリックすると新しいウインドウが開くので、ChromeDriverに新しいウィンドウのドキュメントを参照させるため、SwitchToNextWindowメソッドを実行する
* 取得したい情報がiframe内にあるときは、 そのiframe内のドキュメントを参照させるため、SwitchToFrameメソッドを実行する
* 操作したいオブジェクトや取得したい情報は、WEBページを表示した状態でデベロッパーツールを起動(Ctrl+Shift+I)し確認する
* Class, IDで取得するのが難しい(面倒な)ときは、inspectorを起動(Ctrl+Shift+C)し、オブジェクト、ドキュメントをクリック、対象のコードが選択状態になるので、右クリック→Copy→Copy selector or Copy XPathでコピー、FindElementByCssかFindElementByXPathで使う

```vb
Sub getData()
  Dim driver As New ChromeDriver
  
  'ログイン
  driver.Get "https://mxp1.monex.co.jp/pc/ITS/login/LoginIDPassword.jsp"
  driver.FindElementById("loginid").SendKeys "****"
  driver.FindElementById("passwd").SendKeys "****"
  driver.FindElementByCss("#contents > div > p.mb-20 > input").Click
  
  'FX PLUSのページに移動
  driver.FindElementByCss("#btnFx > a").Click
  driver.SwitchToNextWindow
  
  '口座管理・設定画面に移動
  driver.FindElementByCss("#gmenu8").Click
  driver.SwitchToFrame "main"

  'データの取得
  Dim selector As String
  selector = "#container > div.content > div.grid.clearFix.bottomMargin > div:nth-child(1) > table:nth-child(2) > tbody > tr:nth-child(1) > td.number > span > span"
  debug.print driver.FindElementByCss(selector).Text

  '終了
  driver.Quit
End Sub
```
atomを自分用にカスタマイズする mac


#atomのインストール方法
1.atomのサイトに行って、Downloadを押す
2.zipファイルを展開する

これでインストール終わり

#自分用にカスタマイズする
atomでは、テーマやパッケージをインストールすることで、自分用に色々カスタマイズすることができます。

##テーマを変更する

1.Atomで、メニューバーの「Atom」から「Preferences」を選択
2.「Install」を選択
3.好きなテーマをインストール　私の場合は「slack」にしました。
4.「Themes」を選択
5.「UI Themes」を先ほどインストールした「slack」に選択すると、テーマが変わります。


##便利パッケージ

パッケージはテーマと同じようにして、インストールできます。

・japanese-menu
atomを日本語対応にします。

・highlight-selected
選択したテキストと同じテキストがファイル内にあれば、それをハイライトしてくれます。

・autocomplete-plus
コードを打っていると、自動補完してくれます。

・autocomplete-paths
パスを打っていると、自動補完してくれます。

・bracket-matcher
対応してくれるタブをハイライトしてくれます。
初めのdivと終わりのdivがどれかわからんくなったりするから便利



あ、以上です。