OmniAICreator/Qiita-1.07M huggingface dataset:
Excelデータをインポートしてマイマップを作成

# はじめに

Excelデータをインポートして、GoogleMapのマイマップを作成する手順のメモ書き。
こうすればインポートエラーが発生するが、こうすれば発生しないという、摩訶不思議な挙動を発見。GoogleMapのバグか？その回避方法も公開。（懐疑的ではある・・・）

# Excelデータを作成

1. 次のようなExcelデータを作成した。拡張子は*xlsx*。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/ebb0ea83-e33a-c76c-b1a8-58ace4743a84.png)

# インポート

1.GoogleMapにログインする

2.左側のメニューの保存済みから、マイマップをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/c0bede37-6e77-4e9c-bd01-544b44408f3b.png)

3.マイマップを開きますをクリック。次の画面で赤色の新しい地図を作成ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/5da6a996-7c80-45c8-b3d2-c8fb6a227518.png)

4.このような画面が表示されるので、インポートをクリック。

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/94029/6b32f5ea-68e0-349e-ad53-c57d73ccc9f8.png)

5.画面の中央に、Excelファイルをドラック。

![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/94029/6512c35d-1532-fb2c-d4b8-b962286cef3b.png)

6.施設を選択して続行をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/75a5f2bb-42e3-a61f-2116-110def6ab7fa.png)

7.施設を選択して完了をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/c4ea511e-3424-1389-801f-5d0737798eae.png)

8.経度、緯度の順番にチェックを入れた後、デフォルトでチェックが入っている施設のチェックを外ずしてた後、続行をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/288c8891-9355-109c-131c-3095ebcc859f.png)

※注意！　先に施設のチェックを外した後に、経度、緯度の順でチェックを入れると、何故だがインポートエラーになる。何故かは不明。何故だ！何故だ！と思いながら同じ事を数回繰り返して気づいた事。

9.施設にチェックを入れて完了をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/9f1a794d-f21e-d225-0073-2e18c49f2167.png)

10.インポートに成功すれば、このように表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/a32cd68f-7818-c8fa-a1e7-538de0d00cc2.png)

11.スタイルの設定を変更。場所のグループ化方法を施設に、ラベルを設定を施設にそれぞれ変更。この方が見やすいから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/e26fe978-16ab-6cbd-0a17-f20745c9b487.png)

12.表示がこのように変更される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/d3580d59-7679-2193-3732-10bc77817018.png)

13.地図情報.xlsxと、無題の地図をクリックして、名称を瑞浪市の施設と変更。

14.GoogleMapでマイマップを再度表示させて、瑞浪市の施設が表示されていればOK。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/f0000033-ab4e-9f19-0a63-ce68a1289bbd.png)
Cognos Tabキーでの遷移順序指定サンプル

#Tabキー遷移順序指定
CognosでTabキーでハイライトの遷移を行う場合、デフォルトでは下図の黒数字の①～⑥の順に遷移します。
赤字の①～③のように、プロンプトのみを順番にTabキー遷移したい場合のHTMLアイテムでの実装です。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7bde2c22-686f-8a6b-7c3d-bb2774093fa1.jpeg)

```js
<SCRIPT LANGUAGE=""javascript""> 
getFormWarpRequest()._textEditBoxTB1.tabIndex = 1; 
getFormWarpRequest()._textEditBoxTB2.tabIndex = 2; 
getFormWarpRequest()._oLstChoicesDP1.tabIndex = 3; 
</SCRIPT> 
```

簡単ですが以上です。
Spine PhotoShopプラグインの設定と出力


SpineでPotoShopの書き出し用プラグインがSpineLayerToPNGからPhotoshopToSpineに変更になり描き出しとともにスキンセットする方法のメモ

旧pluginにはUse groups as skins というチェックボックスがありましたが現在のバージョン3.6.52にはありません。
結論から言うと、**コマンドタグをフォルダ名の頭**につけるでした。

以下PhotoshopToSpineのセットから解説です。

##Spineへの描き出し用PluginをPhotoShopにセットする。    
####**1**　Spine\scripts\photoshopにある**[PhotoshopToSpine.jsx]**をPhotoShopのScriptsフォルダにコピーする。
 ![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/8e188985-669b-05da-cc97-c186e74b73f4.jpeg)

---------------------------------------
####**2**　photoShopを再起動。**[ファイル]＞[スクリプト]＞[PhotoshopToSpine]**が組み込まれているのを確認。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/e707377d-9973-7c0d-4f6b-dc73ac024ddf.jpeg)

---------------------------------------
####**3**　各スキンの差分を作成しそれぞれグループ化する。

- この時フォルダ名の頭に**[skin]**とつける（例[skin]1P/[skin]2P)
- スキン化しない画像はフォルダー下に組み込まずに外に出しておく
- スキンパーツは同名にしてフォルダー分けする

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/c6c0ea25-f60e-4d95-3296-fb6775528a4e.jpeg)


---------------------------------------
####**4**　**[ファイル]>[スクリプト]>[PhotoshopToSpine]**を起動
アウトプット先を指定して**[OK]**ボタンを押す
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/459df96b-8ca7-7a22-07a6-8c7f947ece79.jpeg)

---------------------------------------
####**5**　spineの**[データインポート]**からPhotoShopより出力された**xx.json**ファイルを指定する
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/1540fe80-410e-a9ab-9845-524ebc11a8d0.jpeg)
---------------------------------------
読み込み直後はスキンセット自体がハイドされていることがあるのでスキンアイコン階層を展開してどれかスキンを表示される。
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/82e92b1d-683c-9cc5-1bb4-b7bc4ea23311.jpeg)

---------------------------------------

※フォルダ名の頭につける[skin]はコマンドタグになっているので**小文字であること**と**括弧がついていること**が重要。
※出力画像は指定フォルダの下階層にサブフォルダが作成されそれぞれ差分画像が格納されている

###■PhotoShopToSpineのコマンドタグ一覧
   - [bone]XX
    - グループ下にあったレイヤーデータ（スロット）の親にXXという名前のボーンをセット
   - [slot]xx
    - グループ下にあったレイヤー画像をxxという名前のスロット内に全て格納セット
   - [skin]xx
    - グループ下にあったレイヤー画像をxxという名前のスキンとしてセット
    -出力指定の下位にxxという名前のサブフォルダを作成して各レイヤーを出力。 
   - [merge]
    - グループ下にあった全レイヤーを一枚に統合して出力。
   - [folder]xx
    - 出力指定の下位にxxという名前のサブフォルダを作成して各レイヤーを出力。
   - [ignone]
    - グループ下にあるレイヤーを出力しない。（[ignone]のみレイヤー名にも対応）
react-native 0.55.2 で run-androidでdebuggerが起動しない(繋がらない)

# 困ったこと
react-native の最新版で`react-native init AwesomeProject`してプロジェクトを作成
↓
`react-native run-android`で起動してもデバッガーにつながらず、確認できない。。

# 回避策
https://stackoverflow.com/questions/40898934/unable-to-connect-with-remote-debugger

Run `adb reverse tcp:8081 tcp:8081`

Paste `http://localhost:8081/debugger-ui` into the address field of my Chrome browser. You should see the normal debugging screen but your app will still not be connected.
That should fix the problem. If not, you may need to take the following additional steps:

Close and uninstall the app from your Android device
Reinstall the app with react-native run-android
Enable remote debugging on your app.
Your app should now be connected to the debugger.
Python3のScrapyでアイテム数やページ数のカウントで停止させる

※ Scrapyは既にインストール済みの方向けです
# ScrapyのCrawlSpiderでの停止処理

CrawlSpiderでクローラーを作成した際、ウェブサイト全体をスクレイピングしていると時間がかかるため、途中で停止させたい。

標準ではDEPTH_LIMITで一定の階層まで探ると停止する設定がついている。
settings.pyで`DEPTH_LIMIT=2`のようにすれば最初のページで１回リンクを辿り、次の階層でもう一回リンクを辿るため、2階層辿るような設定になる。

しかし、サイトの構成やサイトマップを拾ったりフッターメニューが用意されている場合はDEPTH_LIMITを設定したとしても想定より多いページ数を拾ってくることになる可能性がある。


# CloseSpiderExtention

そこでウェブサイトの構成に関わらず一定の量を取得できるように、取得するページ数やアイテム数で制御できるようにしたい。
それがClose spider extentionというものを使用すると実現できるらしい。

settings.pyのコメントにされているEXTENSIONSにCloseSpiderを追加する。
CLOSESPIDER_TIMEOUT、CLOSESPIDER_ITEMCOUNT、CLOSESPIDER_PAGECOUNT、CLOSESPIDER_ERRORCOUNTが設定できるようになる。（デフォルト値は全て0）

CONCURRENT_REQUESTの設定でダウンロードの予約が行われている。
値が大きいとその分ダウンロードの予約が行われ、停止後もしばらくダウンロードし続ける。
気になる場合は1に設定しておくとよい。
（本来の役割は設定している数値分、複数のサイトのダウンロードを同時進行させるもの。）

```python:settings.py
CONCURRENT_REQUEST = 1

EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
    'scrapy.extensions.closespider.CloseSpider': 1,
}

CLOSESPIDER_TIMEOUT = 0
CLOSESPIDER_ITEMCOUNT = 0
CLOSESPIDER_PAGECOUNT = 0
CLOSESPIDER_ERRORCOUNT = 0
```

### 参考
https://doc.scrapy.org/en/latest/topics/extensions.html#module-scrapy.contrib.closespider
https://doc.scrapy.org/en/latest/topics/settings.html


[ 検索キーワード ]
`scrapy page count limit` `scrapy request count limit`
Realm「基礎」の「基礎以外」

# Realmでよく使うけどあんまり書かない集？
全くコアではないが必ず使うわけでもないくらいのものをメモしていこうと。
# ソート

```swift
realm = try! Realm()
var questions = realm.objects(Question.self)
//byKeyPathに並び替えたいものを入れる
var sortedQuestions = questions.sorted(byKeyPath: "registeredDay")
//逆順
var sortedQuestions = questions.sorted(byKeyPath: "registeredDay", ascending: false)
```

昇順(ascending)、降順のイメージ

| | | | | 
|:--|:--|:--|:--|
| 昇順（asc） | 1 | 2 | 3 |
| 降順（desc） | 3 | 2 | 1 |

# マイグレーション

```swift:AppDelegate.swift
// AppDelegate.swiftのapplication(application:didFinishLaunchingWithOptions:)の中に書く

let config = Realm.Configuration(
    // 新しいデータベース構造のバージョンを宣言。
    //バージョンは以前使っていたバージョンよりも大きいものにする(まだマイグレーションをしたことがないときのバージョンは0)
    schemaVersion: 1,
    // 新しいバージョンに書き換えらる時に自動的に呼ばれるブロックを引数に渡す
    migrationBlock: { migration, oldSchemaVersion in
        // まだマイグレーションをしたことがないのでoldSchemaVersion == 0
        if (oldSchemaVersion < 1) {
            //ここにマイグレーションする時のコードを書く
            migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
                // 昔のオブジェクトのカラムを用いて新しいオブジェクトのカラムを生成
                //　この場合firstNameとoldNameから一つのカラムにまとめている
                let firstName = oldObject!["firstName"] as! String
                let lastName = oldObject!["lastName"] as! String
                newObject!["fullName"] = "\(firstName) \(lastName)"
            }
        }
    })

// デフォルトで呼ばれるRealmに今回設定したバージョンのものを設定
Realm.Configuration.defaultConfiguration = config

// これでマイグレーションは完成したのでもうRealm()を呼べる
let realm = try! Realm()
```
Android Studio - AVD作成の手順

Android Studioで作成したプロジェクトを実行するためには実機、もしくはAVD(Android Virtual Device)が必要になります。
今回はAVDの作成をしていきたいと思います。

---
# AVDを作成する
## １．AVD Managerを起動する
起動するには二つの方法があります。

- ツールバーの [AVD Manager] ボタンをクリック ⇒ **AVD Managerの起動**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/249699/e028117d-0407-d0c7-aec5-7b529c87158d.png)

- [Tools]メニュー ⇒ [Android] ⇒ [AVD manager] ⇒ **AVD Managerの起動**

![2.png](https://qiita-image-store.s3.amazonaws.com/0/249699/fd14772b-0eec-f06d-d725-7db9bbbb3adb.png)

起動すると、下記の画面が表示されます。
何もAVDが作成されていない状態では、このような画面となります。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/249699/139ae3e8-cbc0-b425-6dfc-2340dcd57217.png)
**[Create Virtual Device] ボタンをクリック**し、AVDを作成していきます。

## ２．端末種類を選択する
下記のように”Select Hardware”画面が表示されるので、端末種類を選択します。
今回は、5インチ画面のNexus 5Xを選択します。
**[Phone] ⇒ [Nexus 5X] ⇒ [Next]**
![4.png](https://qiita-image-store.s3.amazonaws.com/0/249699/a3993caa-502a-2679-1702-5d2910571ec2.png)

## ３．システムイメージを選択する
下記のように”System Image”画面が表示されるので、システムイメージを選択します。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/249699/fa052c91-8ae3-89f5-625a-ddace539fd85.png)
[Recommended] タブでは選択できるものがないので、
**[x86 Images]タブ ⇒ [Oreo] ⇒ [Next]** を順番にクリックします。

※ システムイメージとは、AVDの動作に必要なものをまとめたファイルのことです。

## ４．詳細設定を確認する
下記のように”Android Virtual Device”画面が表示されます。
ここでは作成中のAVDの設定内容が確認できます。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/249699/32e6b334-6a86-8b77-69d9-8658ab218db9.png)
AVD名として「Nexus 5X API 26」が自動で記述されています。
AVD名は変更可能ですが、自動入力された名前のままで構いません。
※ グレーの四角に囲まれた、[Show Advanced Settings]ボタンをクリックすると、詳細設定が可能になります。

ここでは、
**[Enable Device Frame] チェックボックスのチェックを外す ⇒ [Finish]** の順番にクリックします。

すると、AVD Manager画面が下記のようになり、今作成したAVD(Nexus 5X API 26)がリスト表示されています。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/249699/162cb06d-db2d-8196-584d-76e813eabf7c.png)

---

以上で、AVDの作成は終了になります。

他の画面サイズやAPIレベルのAVDも同様の手順で作成可能です。
複数作成しておくことも可能です。
Setup Hshare(HSR) Wallet in AWS Ubuntu Server 16.04

# 1. Install
```
# cd ~/

# sudo apt-get install build-essential libssl-dev libdb++-dev libboost-all-dev  libqrencode-dev libminiupnpc-dev

# git clone https://github.com/HcashOrg/Hshare.git

# cd Hshare

# ./build.sh <---- The finally result was failed.

# cd src

# make -f makefile.unix   <---- You will find the "hshared" in src folder.
```

# 2. Add systemd
```
# sudo vim /lib/systemd/system/hshared.service
[Unit]
Description=Hshare Client

[Service]
Type=simple
ExecStart=/home/ubuntu/Hshare/src/hshared -datadir=/Your_Block_Data_Path
Restart=on-failure
User=ubuntu

[Install]
WantedBy=multi-user.target
:wq!
```

# 3. Enable systemd
```
# sudo systemctl enable hshared
```

# 4. Add hshare.conf
```
# sudo vim /Your_Block_Data_Path/hshare.conf
server=1
listen=1
enableaccounts=1
staking=0
rpcport=9487               <--- You can change it
rpcallowip=192.168.0.0/24  <--- You can change it
rpcuser=1qaz2wsx           <--- You can change it
rpcpassword=1q2w3e4r       <--- You can change it
:wq!
```

# 5. Start systemd
```
# sudo systemctl start hshared
```
ターミナルで(˘ω˘)をクルクルさせてみる

なんとなくやりたくなったのでやってみた(˘ω˘)

## (˘ω˘)
```bash:.bashrc
get_syala() {
	COUNT=`cat ~/syala`
	if [ ${COUNT} -lt 6 ] ; then
		echo $((COUNT++)) > /dev/null
		echo $((COUNT++)) > ~/syala
	else
		COUNT=1
		echo 1 > ~/syala
	fi

	case ${COUNT} in
		1 ) SYALA="( ˘ω˘ )" ;;
		2 ) SYALA="(  ˘ω˘)" ;;
		3 ) SYALA="(   ˘ω)" ;;
		4 ) SYALA="(    ˘)" ;;
		5 ) SYALA="(˘    )" ;;
		6 ) SYALA="(ω˘   )" ;;
		7 ) SYALA="(˘ω˘  )" ;;
	esac

	echo "${SYALA}"
}

export PS1='$(get_syala) $ '
```

```terminal:terminal
$ source ~/.bashrc
( ˘ω˘ ) $
(   ˘ω) $
(    ˘) $
(˘    ) $
(ω˘   ) $
(˘ω˘  ) $
( ˘ω˘ ) $
```

##終わりに
今回は(˘ω˘)の状態をテキストファイルに書き出して実現させたので、
複数ターミナルを開いていると(˘ω˘)の状態が飛んでしまうのでいつかなんとかしたい

もっとスマートな方法があれば誰か教えてください(˘ω˘)
Akka+AkkaHttp+SlickでTODOアプリAPI（その5）

# 始めに
ようやく最終回です。今回はエントリーポイントを定義し、DockerImage化を行います。

##これまで##
[その1](https://qiita.com/Mamoru-Izuka/items/59afdc09033327fce8da)
[その2](https://qiita.com/Mamoru-Izuka/items/04a97fe2022ea99453cf)
[その3](https://qiita.com/Mamoru-Izuka/items/035410231b3f24a994c2)
[その4](https://qiita.com/Mamoru-Izuka/items/03b97e6bb4343159b0cf)

##構成##
- IntelliJ 2018
- Scala 2.12.5
- sbt 1.1.4
- Akka 2.5.11
- AkkaHttp 10.1.0
- Slick 3.2.3
- Scalaz 7.2.19

##成果物##
https://github.com/lightstaff/scala-todo-api

# Entry Point
単純にこれまで作ってきた物を組み立てるだけです。
HttpAppのhostを「0.0.0.0」としているのはDocker経由でアクセスできるようにするためです。[Lightweight docker containers for Scala apps](https://medium.com/jeroen-rosenberg/lightweight-docker-containers-for-scala-apps-11b99cf1a666)を参考にしています。

```scala:Main.scala
package todo.api

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

import akka.actor.ActorSystem
import akka.util.Timeout
import slick.jdbc.H2Profile.api._

import todo.api.repository.{TodoRepository, TodoRepositoryImpl}

// メインエントリポイント
object Main extends App {

  import todo.api.actor._

  implicit val system: ActorSystem = ActorSystem("todo-api")
  implicit val executor: ExecutionContext = system.dispatcher
  implicit val timeout: Timeout = Timeout(5.seconds)

  // レポジトリ定義
  val db = Database.forConfig("todo-slick-db")
  val todoRepository: TodoRepository = TodoRepositoryImpl(db)

  // アクター定義
  val todoSupervisor = system.actorOf(TodoSupervisor.props(3, 30.seconds))
  todoSupervisor ! TodoSupervisor.RegistrationCommand(TodoActor.props(todoRepository))

  // ルート定義
  val todoRoutes = TodoRoutes(todoSupervisor)
  val todoAPIServer = TodoAPIServer(todoRoutes)

  todoAPIServer.startServer("0.0.0.0", 8000, system)
}
```

以上、実際にsbtでrunコマンドを実行してみて、curl等で動作確認できれば完成です。

# DockerImage化
`sbt docker:publishLocal`でtarget/docker/stage配下にDockerfileが作成され、ローカルのDockerにDockerImageが作成されます。

# 終わりに
全5回は長かった・・・。元も子もないこと言ってしまうと、このレベルのAPIとかならGoとかで書いた方がたぶん楽だとは思う。もっと複雑なものを書くのに使った方が良い。

以下もろもろの感想
##Scalaについて##
モナドを使った関数合成が綺麗に書けたりすると感動するが、オブジェクト指向的に扱う部分と関数型プログラミング的に扱う部分を上手いこと線引きせんと苦しくなる。
アプリを書こうと思ったら副作用とは切り離せない部分もあると思う。今のところは関数型で行けるとこは頑張って、無理そうならあっさり諦める感じで書いてる。

##Akkaについて##
アクターがメッセージ含めて型安全になれば完璧だと思う。DIの間にアクター（ActorRef）が挟まると不安になる。
トップレベルに近いアプリケーション層とかには最適だとは思う（Persistenceはまた別物）。

##AkkaHttpについて##
AkkaHttpには特に文句ない。その内、ストリームも挑戦したい。

##Slickについて##
ドキュメントが分かりづらいんですが・・・（自分だけでしょうか？）。
今回はH2に決め打ちして書いたけど、別のデータベースに切り替えられるようにドライバーを抽象化しようとすると割と面倒くさい。
HikariCPがたまに謎の警告を発したりするがまだよく分からん。
Vagrant 事始め 番外編 01 - Virtualbox が起動しない

Windows で Virtualbox が起動しないので、原因を調べたところ、Virtualbox は Hyper-V が有効になっていると、起動できないと言うことがわかりました。
正確に述べると、Virtualbox が利用する VT-X と  Hyper-V は共存できないということです。

```
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "a8bf9a84-7c2e-415d-8521-3ed9155b5499", "--type", "headless"]

Stderr: VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

## VT-X と Hyper-V は共存できない

* [hyper-v disables vt-x for other hypervisors](https://social.technet.microsoft.com/Forums/windows/en-US/118561b9-7155-46e3-a874-6a38b35c67fd/hyperv-disables-vtx-for-other-hypervisors?forum=w8itprogeneral)

> Because when hyper-V is installed on Windows 8 Pro, the hypervisor is running all the time underneath the host OS, and only one thing can control the VT hardware at a time for stability.  The hypervisor blocks all other calls to the VT hardware..

### Hyper-V の状態を確認する

<font color="red">管理者権限でコマンドプロンプトを起動</font>して、確認します。

```
> bcdedit
Windows ブート マネージャー
--------------------------------
...

Windows ブート ローダー
--------------------------------
...
hypervisorlaunchtype    Auto
```

`hypervisorlaunchtype Auto` となっており、Hyper-V が必要とされるときに自動的に有効化される設定になっています。

### Hyper-V を無効化する

管理者権限で起動したコマンドプロンプトで `bcdedit /set hypervisorlaunchtype off` を実行して、再起動をします。

```
> bcdedit /set hypervisorlaunchtype off
```

再起動をして、再度 Hyper-V の状態を確認すると無効化されています。

```
> bcdedit
Windows ブート マネージャー
--------------------------------
...

Windows ブート ローダー
--------------------------------
...
hypervisorlaunchtype    None
```

有効化する場合は `bcdedit /set hypervisorlaunchtype auto` (もしくは `bcdedit /set hypervisorlaunchtype on`) と実行した後に再起動をすれば、有効化されています。

**注: bcdedit コマンドで設定を変更した場合、ふたたび設定を変更するには同コマンドの実行が必要になります。**
(コントロールパネルや Powershell からでは変更が反映されないということ)

```
> bcdedit /set hypervisorlaunchtype auto
```

### Hyper-V が無効になっていると

Hyper-V が無効になっていると、ハイパーバイザーを利用するアプリケーションが利用できなくなります。

例えば、Docker とか。

![2018-04-12_15h20_50.png](https://qiita-image-store.s3.amazonaws.com/0/248967/744d38cb-a6e4-ffc1-628e-46baef3b312f.png)

Virtulbox と Docker を同時に利用することができませんが、回避策はあります。それは、Hyper-V が使用できない Windows 用の [Docker Toolbox for Windows](https://docs.docker.com/toolbox/toolbox_install_windows/) を利用すれば、同時に稼働はできると思います(未確認……)

* [Docker Toolbox for Windows](https://docs.docker.com/toolbox/toolbox_install_windows/)
coroutineとコールバック形式の非同期関数を連携する


この記事では既存のライブラリなどでコールバックやPromiseを使っている非同期関数が既にある場合に、awaitで結果を渡す方法について説明します。

async/awaitの説明で良くあるコードはこんな感じです。

```kotlin
    fun async1() = async(CommonPool) {
        delay(1000)
        return@async 1
    }

    fun async2() = async(CommonPool) {
        delay(1000)
        return@async 2
    }

    fun testAsync() = launch(UI) {
        val result1 = async1().await()
        info { "result1: $result1" }
        val result2 = async2().await()
        info { "result2: $result2" }
    }
```

このコードを実行すると期待通り、実行して1秒後に`result1: 1`が表示され、さらに1秒後に`result2: 2`が表示されます。
なんの問題もありません。

で、今回はfirestoreからデータ取得する部分でawait使えるようにしたかったので、こんな感じの関数を作りました。
`return@async 1`してる部分を,firestoreから取得したデータのインスタンスを返すイメージです。

```kotlin
    fun async1() = async(CommonPool) {
        firestore.document("/employees/1").get().addOnSuccessListener { documentSnapshot ->
            val employee = documentSnapshot.toObject(Employee::class.java)
            return@async employee
        }.addOnFailureListener {
            error { "fetch employee failed" }
            return@async null
        }
    }
```

すると `return@async employee` で `'return' is not allowed here` と怒られます。
確かにLambda式の中だから直接asyncのreturnができないのか。
でもどうすればいいのかわからずググっていたところ、`suspendCoroutine` なるキーワードを見つけました。

次のように使用します。期待する戻り値の型(`Employee`)をgenericsで指定して、`cont.resume(employee)`で結果を返します。Promiseのresolveやrxのobserver.nextのようなイメージですね。

```kotlin
    fun async1() = async(CommonPool) {
        val employee = suspendCoroutine<Employee> { cont ->
            firestore.document("/employees/1").get().addOnSuccessListener { documentSnapshot ->
                val employee = documentSnapshot.toObject(Employee::class.java)
                cont.resume(employee)
            }.addOnFailureListener {
                error { "fetch employee failed" }
                cont.resumeWithException(it)
            }
        }
        return@async employee
    }
```

呼び出し側はこんな感じ。

```kotlin
    fun testAsync() = launch(UI) {
        val employee = async1().await()
        info { "name: ${employee.name}" }
    }
```

Coroutinさわって数時間のビギナーなんで、もっといい方法があるのかも。
とりあえず動いた方法の紹介でした。

マサカリ歓迎。
CSSフレームワークBulmaのModifiersとは

# 本記事の内容
モダンなCSSフレームワークBULMAの「Modifiers」について解説します。

BULMAの概要記事については、[こちらの記事を参照して下さい](https://qiita.com/yampy/items/69a44f68f8d9a4b0d196)。


# Modifiers

Modifiersとは、Bulmaが用意した、HTML要素のスタイルを変更する為のクラスです。

## Syntax
ボタンの色、形を変更します。

ex) ベーシックなボタン

```
<a class="button">
  Button
</a>
```

![Screen Shot 2018-04-13 at 14.45.48.png](https://qiita-image-store.s3.amazonaws.com/0/172399/598872ff-9086-d281-c3db-9346094f36e8.png)


ex) Syntaxを用いたスタイルの変更

```
<a href="" class="button is-primary is-large">
  Button
</a>
<a href="" class="button is-info is-medium">
  Button
</a>
<a href="" class="button is-danger is-small">
  Button
</a>
```

![Screen Shot 2018-04-13 at 14.44.23.png](https://qiita-image-store.s3.amazonaws.com/0/172399/105fe450-4228-8e6c-5e28-e03e46c1660e.png)


## Helpers
要素の変更をするヘルパークラスです。

ex) Helpersの例
- `is-pulled-left` : エレメントを左へ移動
- `is-marginless` : マージンを無くす
- `is-radiusless` : 角丸のラジウスを無くす

## Responsive helpers
画面幅(viewport)によって表示/非表示切り替えを行います。
各種端末画面用のサイズ（mobile, tablet, desktop, widescreen, fullhd）の$breakpointに応じた切り替えが可能です。
例えば、mobileのみflex表示する場合は`is-flex-mobile`となります。このように、`is-$displayclasses-$breakpoint`と記載することで、各画面に合わせた表示切り替えが可能です。

ex)
- `is-flex-mobile-only` : mobile(~768px)のみflex
- `is-flex-toutch` : mobile, tablet(~768px, 769~1023px)のみflex
- `is-hidden-desktop` : desktop(1024px~1215px)のみ非表示

## Color helpers
9種類の色、9段階のグレーが選べます。

ex)
- `has-text-white` : 白 hsl(0, 0%, 100%)
- `has-text-success` : 緑 hsl(141, 71%, 48%)
- `has-text-grey` : グレー hsl(0, 0%, 48%)

## Typography helpers
テキストのサイズ、配置、簡易変換が可能です。

- Size
  `is-size-1`(3rem)から`is-size-7`(0.75rem)まで7つのサイズが選べます。

- Responsive size
  `is-size-4-touch`などとすることで、特定の画面サイズのみを対象にサイズを変えることが可能です。

- Alignment
  4種類の配置設定が可能です。
  - `has-text-centerd` : 中心
  - `has-text-justified` : 均等割
  - `has-text-left` : 左
  - `has-text-right` : 右

- Responsive Alignment
  `has-text-left-mobile`などとすることで、特定の画面サイズのみを対象に配置を変えることが可能です。 

- Text transformation
  4種類の文字変換が可能です。
  - `is-capitalized` : 最初の一文字のみ大文字に変換
  - `is-lowercase` : 全ての文字を小文字に変換
  - `is-uppercase` : 全ての文字を大文字に変換
  - `is-italic` : 全ての文字をイタリックに変換

- Text weight
  4種類の文字のウェイト変換が可能です。
  - `has-text-weight-light` : ウェイトを"light"に変換
  - `has-text-weight-normal` : ウェイトを"normal"に変換
  - `has-text-weight-semibold` : ウェイトを"semibold"に変換
  - `has-text-weight-bold` : ウェイトを"bold"に変換

# 参考
- [BULMA](https://bulma.io/documentation/modifiers/syntax/)
esa.io > shortcut > ? > キーボードショートカットを表示する

esa.io上でショートカットを使えれば作業効率が上がるだろう。

一方で、ショートカットを覚えるコストはある。
(Visual Studioの実装をした後で、C++ Builder実装をし、LinuxでPythonの実装をGeanyエディタでした後に、LinuxでSublimbe Textをし、、、（以下略))

https://docs.esa.io/posts/8

以下だけを覚える。

> | ?	| ショートカットのヘルプを表示 |どこでも |

覚えるコストは低い。

説明がWindows環境向けでない点は要改善。

下記のメッセージも表示して欲しいところ。

> ※ 表中の⌘キーは Ctrlキーで代用可能です

### link

ヘルプを参照しやすくする、というのは良いUIへの方法だと思われる。

- [Visual Studio > IDE > ショートカットを忘れたときの確認手順 > Ctrl+Q とキーワード入力](https://qiita.com/7of9/items/7c1187981158f09b5dc4)
browser-syncを使う

# 導入手順
* npmでbrowser-syncをインストール
* browser-syncのコンフィグ設定

# 事前に準備していた環境
* Mac
* node.jsはnodebrewでインストール済み

#導入
プロジェクトディレクトリに移動して

```
$ cd プロジェクトディレクトリ
```

npmでbrowser-syncを開発用でローカルインストール。 ＊npmを初期化していない場合は先に初期

```
$ npm install browser-sync --save-dev
```

インストールが終わってからbrowser-syncのコンフィグファイルを生成

```
$ npx browser-sync init
```

**bs-config.js**が作られる

```js:bs-config.js
/*
 |--------------------------------------------------------------------------
 | Browser-sync config file
 |--------------------------------------------------------------------------
 |
 | For up-to-date information about the options:
 |   http://www.browsersync.io/docs/options/
 |
 | There are more options than you see here, these are just the ones that are
 | set internally. See the website for more info.
 |
 |
 */
module.exports = {
    "ui": {
        "port": 3001
    },
    "files": false,
    "watchEvents": [
        "change"
    ],
    //~~~以下続く~~~
}
```

設定が大量に記述された**bs-config.js**が作られるので必要な設定のみ残してあとは削除。
今回は監視ファイルとプロキシの設定だけしたかったので以下のように書き換え

```js:bs-config.js
/*
 |--------------------------------------------------------------------------
 | Browser-sync config file
 |--------------------------------------------------------------------------
 |
 | For up-to-date information about the options:
 |   http://www.browsersync.io/docs/options/
 |
 | There are more options than you see here, these are just the ones that are
 | set internally. See the website for more info.
 |
 |
 */
module.exports = {
    "files": ["**/index.php", "css/*.css","js/**/*.js"], //phpファイルはindex.phpのみ、cssファイルとjsファイルは全て監視する
    "proxy": 'localhost:80', //ローカルホストのポートを指定、Vagrant環境などドメインやIPを指定する場合は'192.168.11.1:80'、'test.domain.com:80'などで指定する
};
```

最後に**package.json**にbrowser-syncを起動するコマンドを追加

```json:package.json
{
    "scripts": {
        "bs": "browser-sync start --config bs-config.js"
    }
}
```

これで設定完了！

```
$ npm run bs
```

npmでbrowser-syncを起動すれば監視ファイルを更新するたびにブラウザが再読み込みしてくれます。

**参考**
rowsersyncを利用してお手軽ブラウザ確認環境をつくろう - メドピア開発者ブログ [http://tech.medpeer.co.jp/entry/2015/06/09/071758]
IDEのThonnyで行数を表示する方法

<h1>方法</h1>
ググっても方法出てこなかったので、方法を書きます。
ググらなくても直感的に分かる人が多そうですが、ググって出てこなかったものを最初に書くという快感、みなさんなら分かってくれる。

thonny開きます
↓
Tools→Options...→Editor
↓
この中に「Show line numbers」があるので、これにチェックを入れて、OKを選択。

これで、行数が表示されるようになりました。
KORG nanoKONTROL2+openFrameworks

#開発環境
- osx sierra 10.12.6
- oF 0.9.8
- xcode 9.2
- KORG nanoKONTROL2(機材)

#Addonの用意
- ofxMidi
https://github.com/danomatika/ofxMidi

- nanoKONTROL2を受信するのに必要なソース 
https://github.com/JoshuaBatty/korgNanoKontrol2

#実行
1. nanoKONTROL2からkorg.cppとkorg.hを引っ張ってきてプロジェクトにadd.

 
![スクリーンショット 2018-04-12 15.27.13.png](https://qiita-image-store.s3.amazonaws.com/0/184790/bcea892f-3075-29af-19c2-340dfd9dec95.png)


2.コードを書いて行きます.

```ofApp.h
#pragma once
#include "ofMain.h"
#include "korg.h"
class ofApp : public ofBaseApp{
public:
    void setup();
    void update();
    void draw();
    
    Korg korg;
};
```

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofBackground(235, 235, 235);
    
    korg.setup();
}

//--------------------------------------------------------------
void ofApp::update(){
    korg.update();
}

//--------------------------------------------------------------
void ofApp::draw(){
    korg.draw();
}
```

3.結果
これでノブやらスライダーを動かすことで値が変動してくれるはずです.
![スクリーンショット 2018-04-12 15.31.49.png](https://qiita-image-store.s3.amazonaws.com/0/184790/60ac402b-6d4e-e5ed-57a5-e3b701157e46.png)

#補足
Korg.hに宣言されているKnob、slidersなどの入れるに値が入ってくるのでそこにアクセスすればすぐに値を取得できると思います.
JavaScript で if文の書き方

# JavaScriptでのif文

どの言語でもそうだと思いますが、if文というのは日本語にすると「もしパターンAの場合はA処理、パターンBの場合はB処理、それ以外の場合はC処理」というような場合に使う処理になります。

具体的な例を使って実際にコードを書くと以下の通りになります。

```
0〜9のうち、無作為に2つの数字を選びます。
1番目の数字が2番目の数字よりも大きい場合、「1番目の方が大きい」
2番目の数字が1番目の数字よりも大きい場合、「2番目の方が大きい」
同じ値だった場合は、「どちらも同じ」という文字列を出力されるようなシステムを作る。

```

```js
var N1 = 4;   //適当な数字を入力してください。これが1番目の数字になります。
var N2 = 5;   //適当な数字を入力してください。これが2番目の数字になります。

if(N1 > N2){
  console.log("1番目の方が大きい");
}else if(N1 < N2){
  console.log("2番目の方が大きい");
}else{
  console.log("どちらも同じ");
}

```

このようになります。
if(条件文){
  条件に満たしたときの処理
}
というのが基本処理になります。

上の例は、非常にシンプルなif文になります。
大抵の場合はfor文の中にif文を入れたり、リストとif文を併用したりなど、どんどん複雑になっていきますが、シンプルなコードに越したものはありません。

自分以外の人が修正する場合でも、既存のコードが何を意味しているのかがわかりやすいようにすることが良いエンジニアになるための一つの要素だと私は思います。
MacでPython環境を用意し、Jupyter Notebookを設定するメモ（2018年4月）

### macOS High SierraでJupyter Notebookを使えるようにしてみたので、メモ。Python環境をどうするかということでもある。

今後、ラズパイやRaspberry Pi Desktop for PC/Macにも導入予定。Windowsは、もしやるのならAnacondaで。（やる気ない）
最終的には、ラズパイでサーバーを建てて、ドキュメントを共有する。

## 設定するとどうなるか
結果として、こんな環境になります。

- Homebrewでパッケージ管理。
- 基本的にpython3/pipの最新版を使用。
- venvで環境設定／切り換え。pyenv使わない。
- （Xcodeコマンドラインツール使用）
- 自分のMacでJupyter Notebookサーバーが起動。

すでに先人たちが色々な設定方法を公開してくれていますが、なるべくシンプルに、というポリシーで整理してみました。色々やってみた結果、よくわからなくなって混乱したため。

基本方針

1. macOSのデフォルトで入っているPython2.7.10は、そっとしておく。システム自身、サードパーティ アプリがそこにあるものとして使っているため。
2. マイナーバージョン違いの使い分けは考えず、HomebrewでインストールしたPython3の最新版のみを使う。
3. pyenvを使わない。Python3に標準で入っているvenvで設定した環境を使う。もしPython2を使いたい場合は、標準環境で最低限、おとなしく。
4. pipで各種インストールするのは、各設定環境内に。

## Xcodeをインストール
App Storeからインストールするべし。

## Xcodeコマンドラインをインストール
Command Line Tools for Xcodeをインストール。以下のコマンドで。
```xcode-select --install```

## Homebrewをインストール
ホームページ（https://brew.sh/index_ja） にある、以下のワンラインを実行。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


## Homebrewの基本コマンド確認
    brew update
    brew upgrade
    brew doctor
    brew install xxxx

## Homebrewでpython3 (とpip) をインストール
    brew install python3
    python3 -V    # 最新はPython 3.6.5
    pip3 -V       # 最新はpip 9.0.3 (python 3.6)
    python -V     # Python 2.7.10

## pip自体のアップデート
    pip3 install --upgrade setuptools
    pip3 install --upgrade pip
    
## 環境を設定
    nao2gMBA:~ tsuji$ python3 -m venv env   # envディレクトリができる。
    nao2gMBA:~ tsuji$ . env/bin/activate    # env環境での作業に入る。
    (env) nao2gMBA:~ tsuji$                 # 先頭に(env)が付く。

コマンドのエイリアスをチェック

    python -V    # Python 3.6.5　を返す
    pip -V       # pip 9.0.3 (python 3.6) を返す


## env環境下での作業
### ライブラリのインストール
    # (env) nao2gMBA:~ tsuji$ pip -V というように、行先頭に(env)がついている事に注意。
    pip install --upgrade pip
    pip install --upgrade setuptools
    pip install numpy
    pip install scipy
    pip install scikit-learn
    pip install matplotlib
    pip install Pillow

### jupyterのインストール
    pip install jupyter



## Jupyter Notebookの起動
    mkdir jupyter-notebook
    jupyter notebook --notebook-dir=~/Documents/jupyter-notebook

ブラウザページが自動的に開きます。オプションなしだと、カレントディレクトリが使用されるので、ドキュメント用のディレクトリを作成しています。

## env環境から抜ける場合は、deactivateコマンドで。

    (env) nao2gMBA:~ tsuji$ deactivate
    nao2gMBA:~ tsuji$

## 2018-11-2 追記　環境のメンテ

しばらく使っていなかった環境の(env)状態にて、
jupyter_coreって何？　なんなら、pipって何？　まで荒廃していたのでメンテ。　
おそらく、Python3が3.7.0までアップデートしていたからか？

### pipの入れ直し
以前ダウンロードしてあったスクリプトを実行、pip復活。
（https://bootstrap.pypa.io/get-pip.py）

    python get-pip.py

### jupyterの入れ直し

    pip install jupyter

無事、復活。
compareToの整理

どうしても、compareToが自信がなくなるので、メモ

```
"1".compareTo("2");// 1 ＜ 2 → -1
"1".compareTo("1");// 1 ＝ 1 → 0
"1".compareTo("0");// 1 ＞ 0 →1
```
IDEで出てこないものかね？ｗ

こっちのほうが覚えやすいか？

```
a.compareTo(b) < 0;  // a ＜ b
a.compareTo(b) == 0; // a ＝ b
a.compareTo(b) > 0;  // a ＞ b
```
Jupyter NoteをDockerで動かす


Jupyter NoteをDockerで起動するスクリプトを作りました。

## 前提や注意点

- dockerを事前にインストール。(17.12.0-ceで動作確認してます）
- コンテナ消滅してもNotebookを維持したい
    - ローカルディレクトリ ```./work``` をボリュームマウントしてます。
    - work以外の場所は維持されないのでご注意。
- 本来は、初期生成Tokenでログインする所を、面倒なのでTokenなしで起動してます。
    - 「ご利用は、自己責任でお願いします」
- scipyのイメージが、でかい（約4GB）。
    - 他にも色々イメージが公開されている。https://hub.docker.com/u/jupyter/
    - お好きなイメージに変更してください（jupyter/minimal-notebookとか？）

# スクリプト（start.sh）

```$ sh start.sh``` てな感じでどうぞ。

```bash
#!/bin/bash -xe

# jupyter-note container

IMAGE_NAME=jupyter/scipy-notebook  # with scipy
CONTAINER_NAME=jupyter

# keep work directory
LOCAL_VOL=$(pwd)/work
mkdir -p $LOCAL_VOL
sudo chown 1000 $LOCAL_VOL # for container user(jovyan uid:1000)

# kill running container
for container_id in $( docker container ls --quiet --filter name=$CONTAINER_NAME); do
  docker container rm --force ${container_id}
done

docker run \
  --detach \
  --name=$CONTAINER_NAME \
  --rm \
  --publish 8888:8888 \
  -v $LOCAL_VOL:/home/jovyan/work \
  $IMAGE_NAME start-notebook.sh --NotebookApp.token=''  # set token to null (for no auth)
```
MySQLでDBデータを消してしまった際に、一部データだけでも復旧するための悪あがき

最近やらかした系の投稿ばっかりだな・・・
まあ失敗から学ぶのが人間さ！！
ということで、今回のお話は・・・

## むかーしむかしのお話じゃ。

むかーしむかし、**hoge**というDBと、**hoge_stg**というDBありました。
tentatsuどんは、**hoge_stg**に、**hoge**を上書きしましたとさ。
するとどうでしょう、本番で稼働していたDBは**hoge_stg**だったということです。

```
mysqldump -h dokoka_server -u user -p hoge > hoge.dump
mysql -h dokoka_server -u user -p hoge hoge_stg < hoge.dump
```

しかも、hogeはhoge_stgとは全く関係ないデータが入っておりましたとさ。
めでたくない、めでたくない。

これからが本当の地獄だ・・・

##悪あがき１、過去のdumpをとにかく探す。

探そう。とにかく探そう。
参考）10M以上のファイルを探す

```
find /home/ec2-user -size +10M -print 
```

今回はたまたま、これで1ヶ月前のダンプが出てきたので残り１ヶ月を埋める作業が始まりました。


##悪あがき２、バイナリファイルから復旧する
今回書きたかったことがここからです。

たまたまmaster-slave構成にしていたのでバイナリログが残っていました。
さらにポータルサイトのWordPressだったので登録、更新が少なかったことも幸いして、
いくつかの記事を復旧させるだけのお仕事になりました。

レプリケーションでmaster-slave構成にしていたため、更新のバイナリファイルがあり
それを使って普及する・・・という手段を取りました。

バイナリファイルを探す

```
ls -l /var/lib/mysql
-rw-rw---- 1 mysql mysql 538546587  4月 12 04:49 mysqld-bin.000001
```
あった！！！
ただし、中身は人間には読むことの出来ないバイナリ文字の世界。

ここで人間の読める形にするために、mysqlbinlogというコマンドが活躍。
--no-defaults無しでやると、エラーが出るので注意。
(mysqlbinlog: unknown variable 'default-character-set=utf8mb4' みたいな。)

```
mysqlbinlog  --no-defaults mysqld-bin.000001 > ~/mysql_bin.log
grep 11587, mysql_bin.log > mysql_bin_tmp.log  # 記事ID11587を復旧したい
```

あとは中を見ると関連する記事の登録、更新SQLが入っているはずなのでそれを見て復旧しましょう。
無かった場合は、他のバイナリログに含まれているかもしれないので諦めずに漁りまくりましょう。


## 教訓

よい子のみんなは、DBバックアップをちゃんとやろうね。
https://qiita.com/tentatsu/items/2b163af4a1ac1c897891



参考サイト）
https://hiroakis.com/blog/2013/03/26/mysql-%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AD%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA/
http://d.hatena.ne.jp/zankey/20081014/mysql
mysqlのDBをダンプしてS3にアップロードして１週間くらいで古いのを消す

ほとんどが、この記事の~~パクリ~~インスパイア。
https://qiita.com/taiko19xx/items/215b9943c8aa0d8edcf6


↑こちらでは全DBをわーっとdumpしてるけど、DB毎にやったほうが使い勝手がいいかなーと。

## AWS cli install

ここを参考にインストールしましょう。
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

もしくはpipが入ってればこれで一発。

```
sudo pip install awscli
```

## AWS cli cofigure

IAMでS3をフルアクセスできるユーザを作って、アクセスキー、シークレットをゲットします。
そしてconfigureの設定をしましょう。

```
aws configure
AWS Access Key ID [None]: KEEEEEYYYYYYYYY
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

## こんな感じのシェルを用意しましょう。

```
#!/bin/bash

BACKUP_PATH="/your/backup/dir/db_backup/"
S3_PATH="s3://hoge-aws-db-backup/"
FILE_NAME="mysql_dump_`date +%Y%m%d`.sql.gz"

AWS_CONFIG_FILE="/home/ec2-user/.aws/config"

ARRAY=(hoge_db fuga_db nyamo_db moga_db abeshi_db ohyo_db)

cd $BACKUP_PATH

for item in ${ARRAY[@]}; do
mysqldump --single-transaction -u user -ppassword $item | gzip > $item_$FILE_NAME
done

find $BACKUP_PATH -type f -name "*_mysql_dump_*.sql.gz"  -mtime +6 -daystart | xargs rm -rf

aws s3 sync $BACKUP_PATH $S3_PATH  --delete

```
ARRAYの中にバックアップしたいDB名を羅列します。

## 適当な時間にcron設定しましょう。

```
0 3 * * * /home/ec2-user/bin/db_backup.sh
```

いーじょー

参考記事）
https://qiita.com/taiko19xx/items/215b9943c8aa0d8edcf6
リーダブルコード=他の人が最短時間で理解できるコード

## 1. はじめに

＜**[リーダブルコード-より良いコードを書くためのシンプルで実践的なテクニック](https://www.oreilly.co.jp/books/9784873115658/)＞**
上記の書籍を読み、勉強になった点や共感した点をまとめます。

リーダブルコードの定義として、上記の書籍では
<font color="Red">**他の人が最短時間で理解できるコード**</font>と記載されています。
ここでいう他の人というのは「6ヶ月後の自分」であるかもしれません。


## 2. リーダブルコード

### 2-1. 名前の付け方

自分は名前(変数名、関数名、クラス名等)を決めるときかなり悩むことがあります。。。
最善の名前とは<font color="Red">**誤解されない名前**</font>となります。
<font color="Red">**誤解されない名前**</font>にするために、名前に情報を埋め込む必要があります。
(名前は短いコメントのようなもの、とよく耳にしますね。)


#### 2-1-1. ページを外部から読み込み取得するメソッド
```.java
// ■ 悪い例
Page GetPage()

// ■ 良い例
Page LoadPage()
```
Getは頻繁に使いがちですが、意味が汎用的すぎます。
メソッドの情報をイメージしやすい名前にするとよいです。


#### 2-1-2. 名前から人を検索するメソッド
```.java
// ■ 悪い例
List<Person> GetByName(string name)

// ■ 良い例
List<Person> FindByName(string name)
```
同上。


#### 2-1-3. ヒットしたインデックスのリストを返す際に使用する変数
```.java
// ■ 悪い例
List<int> result = new List<int>();

// ■ 良い例
List<int> matchedIndexes = new List<int>();
```
名前が思いつかないときなど、つい使ってしまいますが、resultは結果以外の何の意味ももちません。
変数の値を表すような名前を付けることで、変数が使いまわしやすくなります。


#### 2-1-4. ファイルのサイズをチェックするメソッド
```.java
// ■ 悪い例
bool isFileSizeOver(File file, int size)

// ■ 良い例
bool isFileSizeOver(File file, int size_kb)
```
名前からsizeの単位が読み取れず、不具合にもつながります。
プレフィックス/サフィックスを付けることで、情報を付加できます。


#### 2-1-5. 指定した文字列を含む要素を除外するメソッド
```.java
// ■ 悪い例
AllObjects.filter("year <= 2011")

// ■ 良い例
AllObjects.excludes("year <= 2011")
```
filterでは、
「year <= 2011」のオブジェクトに絞るのか、
「year <= 2011」のでないオブジェクトに絞るのか
名前から判断することができません。


### 2-2. コメント
コメントは、プログラムにとって不可欠なもので、
<font color="Red">**コードの意味を読み手に理解してもらう**</font>ことが重要になります。


#### 2-2-1. 価値のないコメントはしない
```.java
// ■ 悪い例
// プロフィールを取得する
Profile prof = getProfile(name)
```
新しい情報を提供するわけでもなく、読み手がコードを理解しやすくなるわけでもありません。
価値のないコメントとなるため、不要となります。
(こちらについては、賛否両論あるかもっ！！)


#### 2-2-2. 自分の考えを記録する
```.java
// ■ 良い例
// 当データの場合、ハッシュテーブルよりもバイナリツリーの方が40％程度早い
```
コメントから情報を得ることができるので、下手に最適化しようとするなど無駄に時間を使う必要がなくります。


#### 2-2-3. 欠陥についてのコメントを残す
```.java
// ■ 良い例
// TODO:
// 10000要素で5秒程度の時間がかかっているため
// もっと高速に処理できるように修正が必要
```
コードは絶えず進化する傾向にあるため、少なからず欠陥を生むことがあります。
欠陥を文書化することを恥ずかしがらず、改善が必要なときは上記のようなコメントを残すことが大事です。


#### 2-2-4. 代名詞を使わない
```.java
// ■ 悪い例
// データをキャッシュに入れる。ただし、先にそのサイズをチェックする

// ■ 良い例
// データをキャッシュに入れる。ただし、先にデータのサイズをチェックする
```
「その」が示しているのは、「データ」なのか「キャッシュ」なのか即座に判断できません。
読み手がイラッとするポイントの一つです。


#### 2-2-5. 関数の動作を正確に記述する
```.java
// ■ 悪い例
// このファイルに含まれる行数を返す
int CountLine(strig filePath) { 

// ■ 良い例
// このファイルに含まれる改行文字(¥n)を数える
int CountLine(strig filePath) { 
```
悪い例では、以下のケースはどうなるのかが曖昧となります。
　・""(空ファイル)は0行なのか1行なのか
　・"hello"は0行なのか1行なのか
　・"hello¥n"は1行なのか2行なのか
　・"hello¥n world"は1行なのか2行なのか
良い例のようなコメントに変更することで、コメントの量は変わらないのに、伝わる情報が格段に増えます。


#### 2-2-6. 実例で補足する
```.java
// ■ 良い例
// 平成和暦日付文字列を解析してDateとして返却する。
// 例：
//   "平成1年2月3日" はOK
//   "H.1.2.3" はOK
//   "H.1.2月3日" はNG
Date parseHeiseiWareki(String dateExpression)
```
複雑な関数や、間違った使われ方をされそうな関数等は、実例を定義すると分かりやすくなります。


## 3. おわりに
リーダブルコードに関しては正解がないため、個人個人の考えがあるかと思います。
また、自分との趣味が合わなくても、当然ですがコーディング規約に沿う前提にはなります。
上記は一例ですが、コーディングの際、少しでも参考になりますと幸いです。
MySQLの罠？ユーザー名指定しても匿名ユーザーログインになる

# 問題

久しぶりにMySQLをインストールしたときのことです。

インストールが終わり`admin`ユーザーを作りました。（※説明の都合上、パスワードをかけていません。）
`GRANT ALL PRIVILEGES ON *.* TO admin@'%' WITH GRANT OPTION;`

ログイン後、データベースを作ろうとしたときです。

```
mysql -u admin
CREATE DATABASE `sample` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
```

`ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'sample'`

あれ？
全権限与えたはずなのに？？
ユーザー`''@'localhost'`？？
adminで入ったよね？？？


adminユーザーちゃんと作れてなかったのかな？ってことで確認

```sql
rootアカウントで
mysql> SELECT Host, User, Password FROM mysql.user;
+-----------------------+-------+----------+
| Host                  | User  | Password |
+-----------------------+-------+----------+
| localhost             | root  |          |
| localhost.localdomain | root  |          |
| 127.0.0.1             | root  |          |
| ::1                   | root  |          |
| localhost             |       |          |
| localhost.localdomain |       |          |
| %                     | admin |          |
+-----------------------+-------+----------+
```

ありますねー。
なんでだろー。

・・・

# 原因

ログインで指定した情報と合致するアカウントが複数ある場合、ユーザー名よりホスト名の具体性が高いアカウントが優先して選択されるようです。

今回の場合、`mysql -u admin`の候補に `''@'localhost'` と `'admin'@'%'`があり、ホストの具体性が
`'localhost'(リテラル)` > `'%'(任意のホスト。最も具体性が低い)` だったのでadminアカウントで入れていなかった。
ということになります。

同じ権限の `'admin'@'localhost'` を追加するか、匿名ユーザーのアカウントを消せば解決しました。

# 参考

くわしく知りたい方はリンク先の公式リファレンス読んでね。

[6.3.2 ユーザーアカウントの追加](https://dev.mysql.com/doc/refman/5.6/ja/adding-users.html)
> localhost アカウントがない場合は、monty がローカルホストから接続する際に、mysql_install_db で作成された localhost の匿名ユーザーアカウントが優先されます。
> その結果、monty は匿名ユーザーとして処理されます。その理由は、匿名ユーザーアカウントが 'monty'@'%' アカウントよりも固有の Host カラム値を持っているため、
> user テーブルのソート順でより早く表示されるためです。(user テーブルのソートについては、セクション6.2.4「アクセス制御、ステージ 1: 接続の検証」で説明されています。)

[6.2.4 アクセス制御、ステージ 1: 接続の検証](https://dev.mysql.com/doc/refman/5.6/ja/connection-access.html)
> サーバーは、具体性がもっとも高い Host 値が先になるように行を並べるソートルールを使用します。リテラルのホスト名および IP アドレスは具体性がもっとも高くなります。
> パターン '%' は「任意のホスト」を意味するため、具体性はもっとも低くなります。
> 空の文字列 '' も「任意のホスト」を意味しますが、'%' のあとにソートされます。
> 同じ Host 値を持つ行は、もっとも具体的な User 値が最初になるよう並べられます (ブランクの User 値は 「任意のユーザー」を意味し、具体性がもっとも低くなります)。
社内向け学習（Python)

(学習用)

自己学習用のセッティングです。  
不足などは追加していきます。

学習対象URL : [Python-izm](https://www.python-izm.com/introduction/ "学習サイト")

---
## ＊事前作業＊
- GitHubへローカル環境からプッシュできる状態であること。  
  ※リポジトリの名称は python_study としてください。
  以下の構成みたいな感じで進捗が分かるように。  

>(github)
python_study/
　├ 入門編/
　│　└ タイトル
　│　　　└ モジュール/
　└ 基礎編/

#### 基本で入れるもの：

- python : [Python3](https://www.python.org/downloads/ "Python")
- Editor : [Atom](https://atom.io/ "Atom")
- RepositoryControl : [GitHub Desktop](https://desktop.github.com/ "desktoop")　

#### 追加であると便利なものたち：
Atomパッケージ：

~~- Script(ショートカットでpyファイルを実行)~~　文字化けするので。
- autocomplete-python(コード補完機能)

進捗の確認：

月1回？
Link > spam対策 > Stackoverflowの場合

https://meta.stackexchange.com/questions/2765/how-does-stack-overflow-handle-spam

[Stackoverflow の創始者であるJeff Atwood氏](https://blog.codinghorror.com/introducing-stackoverflow-com/)の回答にて実施内容が記載されている。

>answered Jul 6 '09 at 14:15
>Jeff Atwood

別の回答もある。

>answered Jul 6 '09 at 14:18
Alex Rozanski

予防的措置として、reCAPTCHAを使用。
moderatorsがおり、スパムを削除。
別ユーザがspamフラグを付け、moderatorsの注意を引く。
riot.js aceの記述errorヒントを検知する。

### 対象のタグをquerySelectorするのが影響が少ない。
```js
let isError=fn.q('.ace_error',ed.container);
```
同様にwaring等も検出できる。

### 全部
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.3.3/ace.js" type="text/javascript" charset="utf-8"></script>
<script src="//gnjo.github.io/riot.js"></script>
<ace></ace>
```
```js

let fn=this.fn||{};
fn.q=(s,doc=document)=>{return doc.querySelector(s)};
fn.ace=(el)=>{
 var ed= ace.edit(el,{
  maxLines: 30,
  wrap: true,
  autoScrollEditorIntoView: true,
 }) 
 ed.setTheme("ace/theme/xcode");
 ed.session.setMode("ace/mode/javascript");
 ed.setOptions({useSoftTabs: true, tabSize: 1})
 return ed;
}
riot.tag(
 `ace`
 ,`<pre ref="code" oninput={input}></pre>`
 ,function(opts){
  let ed=null;
  this.one('mount',function(){ ed=fn.ace(this.refs.code) })
  this.input=function(ev){ 
    let isError=fn.q('.ace_error',ed.container);
    console.log(isError)
  }
 })       
riot.mount('ace')
;
```
pandas.DataFrame備忘録

#DataFrameまとめ

## 作成

```python:qiita.py
import pandas as pd

# csv 読み込み
df = read_csv(
    import_filename,
    comment = '#' # '#'以降はcommentとしてエスケープする
    index_col = 0 # column '0' をindex columnとして設定（keyを設定すればそのcolumnがindexになる）
    )

df.to_csv(
    export_filename,
    index = None # Noneとすると頭のindexなしで出力（デフォルトではindexごと出る）
    )
```
## 追加
```python:qiita1.py
new_column = np.arange(10) # tuple, list, np.ndarrayなどが可能
df["new_column_name"] = new_column

```

## Sort
`df.sort_values`,`df.sort_index`で値、インデックスをもとにソートできる。

## Tips
- df["col"] = df["col"].astype(int) でint型に変換できる。
- DFの統計量を簡単に知るには、df.describe()がべんり。
VirtualBoxにKUSANAGI for VMware入れたらyum updateが404返す問題

前の記事で、```$ curl ifconfig.co```がグローバルIP返してくれるようになったものの、```$ yum update```がコケる、という問題が起きた。404が返ってきてるから、おそらくレポジトリサーバーが無いんだろうな、と踏む。

[VirtualBoxにKUSANAGI for VMWare入れたらネットワークから外に出られない問題 \- Qiita](https://qiita.com/kkotaro0111/items/b37feea24ac3f51e1960)

# 結論
```/etc/yum.repo.d/Centos-Base.repo``` を書き換える

```bash

$ sudo sed -i -e "s|mirror\.centos\.org/centos/\$releasever|vault\.centos\.org/7.2.1511|g" /etc/yum.repos.d/CentOS-Base.repo
$ sudo sed -i -e "s|#baseurl=|baseurl=|g" /etc/yum.repos.d/CentOS-Base.repo
$ sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-Base.repo
```

## 原因と対策
どうやら http://mirrorlist.centos.org/ には、すでにレポジトリのミラーが置かれていない模様。アクセスすると ```invalid release``` とか出てくる。
なので、mirrorの利用はやめて、baseurlで直接指定するようにする。
ただ、標準で書かれている http://mirror.centos.org/ もファイルが置かれていないので、 そこにあるreadmeに従い、 http://vault.centos.org/ を使うようにする。
この時、注意が必要なのが、 ```$relesever``` の扱い。repoファイル内では、これは ```7``` に展開されるのだが、 http://vault.centos.org には 7 のディレクトリがない。代わりに、KUSANAGI for VMWareで使われているCentOSのバージョンである 7.2.1511 があるので、直接この番号を記載する。

```bash

$ cat /etc/redhat-release

CentOS Linux release 7.2.1511 (Core)
```



# 参考
- [\[tips\]\[Linux\]旧バージョンCentOSでyum更新できなくなった時 \- Akira's Tech Notes](http://luozengbin.github.io/blog/2015-08-29-%5Btips%5D%5Blinux%5D%E6%97%A7%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3centos%E3%81%A7yum%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E6%99%82.html)
- [VirtualBoxにKUSANAGI for VMware入れたらネットワークから外に出られない問題 \- Qiita](https://qiita.com/kkotaro0111/items/b37feea24ac3f51e1960)
cordovaシュミレーション動いた

![センサー１.png](https://qiita-image-store.s3.amazonaws.com/0/20977/1ddbdfb1-c854-9fcf-acc3-bc27d850c375.png)
前回の記事で投稿したかったキャプチャ撮れました。

Cordovaシュミレーションとして動きました。

![センサー2.png](https://qiita-image-store.s3.amazonaws.com/0/20977/5f29afdf-fd23-8093-c543-1de782ae55ea.png)
モーションセンサーも、あります。
再生ボタンをクリックすると、センサーの値が動きます。

ちなみに、SC-04Eを使った実機デバッグも正常に出来るようになりました。

実機でセンサーの動きを確認できるので、助かります。

ちなみに、microUSBに接続して使えるハブを使って、SC-04Eを接続しています。

実機デバッグの際は、cordovaシュミレーションは、表示されません。
ブラウザのエミュレーションを使って、表示されました。
ATOM Editor で拡張子に言語を関連付ける

大昔の Web システムを（まともな設計書がないので）ソースコードから解析してるんだけど，言語が Perl なのね。んで，拡張子が `cgi` と `pl` なの（`cgi` って拡張子が懐かしいw）。これらのソースコードを [ATOM] で見ようとしてるんだけど，問題が2つ。

1. [ATOM] では拡張子 `cgi` は標準で Ruby に割り当てられている
2. [ATOM] 標準の [language-perl] では古いパッケージ区切り文字としてのシングルクォート（“`'`”）をうまく解釈できない 

1 については，拡張子 `cgi` のファイルに Ruby コードを書くことはないので Perl 専用にしてしまえばいいだろう。 2 については無理やり [Perl 6] と見なすことで何とかなりそうである。

というわけで，拡張子の関連付けを変更することにした。

拡張子の関連付けを変更するには，ホーム・ディレクトリにある `.atom/config.cson` を変更する。 `.atom/config.cson` を開くと他の設定に混じって `core` 項目がある。こんな感じ。

```cson:config.cson
"*":
  ...
  core:
    ...
  ...
```

この `core` 項目に `customFileTypes` 項目を追加する。こんな感じ。

```cson:config.cson
"*":
  core:
    customFileTypes:
      "source.perl6": [
        "pl"
        "cgi"
      ]
```

これで拡張子 `cgi` と `pl` のファイルを [Perl 6] のソースコードとして見ることができる。ふぃー。

[ATOM]: https://atom.io/
[language-perl]: https://atom.io/packages/language-perl
[Perl 6]: https://www.perl6.org/ "Perl 6 Programming Language"
HomebrewでMongoDBのインストール方法メモ

## 環境
- macOS High Sierra
- バージョン 10.13.4

## 前提条件
- Homebrewインストール済

参考：[Homebrew + nodebrewでNode.jsをインストール](https://qiita.com/ryochang/items/f65f4517575e50b48e6e)

## HomebrewでMongoDB本体をインストール
```terminal
$ brew install mongodb
```

## MongoDBを手動で起動する(デフォルトの設定)
```terminal
$ mongod --config /usr/local/etc/mongod.conf
```

### mongod.confの中身
```mongod.conf
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
   bindIp: 127.0.0.1
```

## MongoDBのシェルの操作
```terminal
$ mongo
```
参考：[MongoDBのシェルの操作方法メモ](https://qiita.com/yuiseki/items/1c656d6bab0307e1510c)
JavaScriptのリストの使い方、追加の仕方

# リストとは?
プログラミングを3ヶ月勉強している私が考えるリストは、差し替え式の色鉛筆を横にしたようなものってイメージですかね。（これ知ってるのは昭和世代らしい、、、平成なのだが、、）https://goo.gl/2mzm33


要は、いろんな色（データ）が一箇所に順番に並んでいる状態って感じですね。
新しい色を追加するのであれば、上の蓋を空けて追加する。だから新しい色（データ）は一番最後に追加される、という具合です。

## 具体的なイメージ

```js
var list = ["aaa","bbb","ccc"];
```
このようなリストがあったとします。このリストにdddという文字列を追加したいとします。つまりこういうこと


```js
var list = ["aaa","bbb","ccc"];
↓
var list = ["aaa","bbb","ccc","ddd"];
```

データはこのようにカンマ区切りで、追加されます。


## 追加（ .pushメソッド）
実際に、追加する方法は .pushメソッドを利用します。

```js
var list = ["aaa","bbb","ccc"];
list.push("ddd");
console.log(list);   //["aaa","bbb","ccc","ddd"]
```


## 要素の出し方
リストでは、何番目の要素を出力する！という処理を行うことができます。
例えば

```js
var list = ["aaa","bbb","ccc"];
console.log(list[2]); //cccが出力される
```

リストの対して、[]を使って番号を指定すれば、その番号に対応する要素が出力されます。
ただし、**要素の最初は0番目とカウントされるので注意しましょう**

いくつか例を記載するので、コツを掴んでください！

```js
var list = ["aaa","bbb","ccc"];
console.log(list[2]); //cccが出力される
```

```js
var list = ["aaa","bbb","ccc"];
console.log(list[0]); //aaaが出力される
```

```js
var colour = ["red","green","yellow","blue"];
console.log(colour[1]); //greenが出力される
```

```js
var chuka = ["nikuman","syoronnpo","gyoza"];
console.log(chuka[2]); //gyozaが出力される
```

```js
var city = ["tokyo","yokohama","kanazawa","fukuoka"];
console.log(city[3]); //fukuokaが出力される
```


```js
var city = ["tokyo","yokohama","kanazawa","fukuoka"];
console.log(city[5]); //undefinedが出力される = そんな要素ありませんよって意味
```
って感じです。
【CSS】bootstrapのスクロールする行

bootstrapのグリッドレイアウトにクラスを追加するだけ

```html
<style>
.row-scrollable{
  overflow-x: auto !important;
  white-space: nowrap !important;
}
.row-scrollable > .col-scrollable {
  display: inline-block !important;
  float: none !important;
}
</style>

<!--使用法-->
<div class="row row-scrollable">
  <div class="col-xs-4 col-scrollable">す</div>
  <div class="col-xs-4 col-scrollable">っ</div>
  <div class="col-xs-4 col-scrollable">ぺ</div>
  <div class="col-xs-4 col-scrollable">ら</div>
  <div class="col-xs-4 col-scrollable">ぴ</div>
  <div class="col-xs-4 col-scrollable">っ</div>
  <div class="col-xs-4 col-scrollable">ち</div>
  <div class="col-xs-4 col-scrollable">ょ</div>
  <div class="col-xs-4 col-scrollable">ん</div>
</div>

```
Watson Assitantで配列の特定の要素だけを抜き出す

#Watson AssistantでEntityの値のリストを取得したい
Watson Assistant(旧Conversation)では、SpEL([Spring Expression Language](https://docs.spring.io/spring/docs/4.3.11.RELEASE/spring-framework-reference/html/expressions.html))に従ってスクリプトを記述することができるのですが、使いこなせている人はあまりいないのではないでしょうか？
Entityで取得した複数の値をContextに格納したかったのですがその際に躓いたのでメモ。

#Collection Projectionを使用する
結論から言うと、Collection Projectionを用いるとうまく行きます。
書式は、
`![projectionExpression]`
です。

例えばYoubiというEntityを定義し、月曜日と火曜日を含むような文章を入力すると以下のようにentities.Youbiが認識されます。やりたいことは、

`[{"entity":"Youbi","location":[0,3],"value":"月曜日","confidence":1},{"entity":"Youbi","location":[4,7],"value":"火曜日","confidence":1}]`

これを
`entities.Youbi.![value]`
とすることで、以下のようにvalueの値の配列にすることができます。

["月曜日","火曜日"]