OmniAICreator/Qiita-1.07M huggingface dataset:
Meta-4,5,6章


![](https://ruby.tw/logo.gif)

## スケープゴートとは何か
* a
* b
 
## どのようにスコープを管理しているのか
* a
* b
 
## フラットスコープと共有スコープを使い、スコープを横断して束縛を見えるようにする方法
* a
* b

## オブジェクトのスコープでinstance_eval, instance_execを使ってコードを実行する方法、クリーンルームでコードを実行する方法
* a
* b

## ブロックとProcオブジェクトを相互に変換する方法
* a
* b

## メソッドとオブジェクト(Method, UnboundMethod)を相互に変換する方法
* a
* b

## 呼び出し可能オブジェクトBlock, Proc, Lambdaの違い、通常のメソッドとの違い
* a
* b

## 独自の小さなDSLの書き方
* a
* b

Meta-5章

![](https://ruby.tw/logo.gif)

## クラス定義がself(呼び出したメソッドのデフォルトのレシーバ)とcurrentクラス(定義したメソッドのデフォルトの居場所)に与える影響
* a
* b
 
## 特異メソッド(singular)や特異クラスで、オブジェクトモデル、メソッド探索
* a
* b
* 
## クラスインスタンス変数
* a
* b

## クラスマクロ
* a
* b

## Prepend　wrapper
* a
* b

## クラスに当てはまることはモジュールにも当てはまる
* a
* b

Meta-6章

![](https://ruby.tw/logo.gif)

## evalメソッドの問題
* a
* b
 
## evalメソッドの問題の回避策
* a
* b
* 
## フックメソッド
* a
* b
初心者向け 外付けハードディスクをフォーマットする方法(Mac用)


## 概要
バックアップを取る時など、Macで外付けハードディスクを使用する時は `Mac OS拡張(ジャーナリング)` にフォーマットする必要があります。

やり方がわからない方のために、写真を使ってわかりやすく説明します。


## 外付けハードディスクのフォーマット手順
- 外付けハードディスクを取り付けます。
- まずはLaunchpadを選択します。

![スクリーンショット 2017-03-25 18.36.31.png](https://qiita-image-store.s3.amazonaws.com/0/142810/b69b57e6-a524-064a-7ae1-fb3e72a8880a.png "スクリーンショット 2017-03-25 18.36.31.png")

- その他を選択します。

![スクリーンショット 2017-03-25 18.36.49.png](https://qiita-image-store.s3.amazonaws.com/0/142810/a18f7599-faaa-f93a-90f7-200de57f1b4e.png "スクリーンショット 2017-03-25 18.36.49.png")

- ディスクユーティリティを選択します。

![スクリーンショット 2017-03-25 18.37.04.png](https://qiita-image-store.s3.amazonaws.com/0/142810/52844466-08c0-bc16-c31e-32abee2c05a2.png "スクリーンショット 2017-03-25 18.37.04.png")

- 外付けハードディスクを選択し、「消去」とフォーマットを行います。

![スクリーンショット 2017-03-25 19.13.56.png](https://qiita-image-store.s3.amazonaws.com/0/142810/99e3be3a-9f79-c0c4-3f7f-6aa49a68cbd4.png "スクリーンショット 2017-03-25 19.13.56.png")

※ 間違ってもMacを選択しないで下さい。データが全消去されます。

- 以下の設定になっていることを確認し、「消去」します。

![008_DiskFormat01.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/d103764d-8bdd-8b5d-3fc9-fa364154f66e.jpeg "008_DiskFormat01.jpg")

- 次にハードディスクの消去とフォーマットを行います。

![010_DiskFormat02.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/dff6f689-3e50-a3f2-ba1b-d467fcfd551b.jpeg "010_DiskFormat02.jpg")

- 以上で、フォーマットできました。
- これで外付けハードディスクを使用することができます。
Kotlinのコールバックブロック付きのメソッドをJavaから呼ぶ

kotlinのコールバックブロック付きのメソッドをJavaコードから実行する時には、下記のようにする必要があった。
下記のような場合、Java側で
return Unit.INSTANCE;
がないとコンパイルエラーだが、
「ラムだ式の戻り値の型が不整合です」と言われるだけで、どうやればよいか悩んだので、投稿。

```kotlin:kotlin

class KotlinClass {

    fun loadItems(itemIds: List<String>,
                  complete: (isSuccess: Boolean, itemList: List<Item>) -> Unit) {
        /*  何かしらの処理 */
        complete(true, itemList)
    }
}

```

<br/>

``` java:java（呼び出し側）

kotlinClass.loadItems(itemIds, (isSuccess, items) -> {
                    /*  何かしらの処理 */

                    //注意：最後に Unit.INSTANCE を返す必要がある
                    return Unit.INSTANCE;
                })

```

##理由

kotlinでは、メソッドの戻り値がないときも、実際は、return Unit を省略しているという扱いになっていて、Javaでそれと互換性を保つために return Unit.INSTANCE; しないとならないらしい。

参考：http://stackoverflow.com/questions/37828790/why-do-i-have-to-return-unit-instance-when-implementing-in-java-a-kotlin-functio
紹介 Show default browser (updated for Win10) デフォルトブラウザを表示するVBSCRIP関数 WIN10用

[Show default browser (updated for Win10)](https://gallery.technet.microsoft.com/scriptcenter/Show-default-browser-b1f10e33#content)
##詳しいスクリプトはリンク先にて
面白いというかマメというか世界はレベルが高い。
まさかVBScriptをWindows 10 のためにアップデートするとは
次のプラットフォームで検証済み
***Windows 10 	はい***
Windows Server 2012 	いいえ
Windows Server 2012 R2 	いいえ
Windows Server 2008 R2 	はい
Windows Server 2008 	はい
Windows Server 2003 	いいえ
***Windows 8 	はい***
***Windows 7 	はい***
Windows Vista 	いいえ
Windows XP 	いいえ
Windows 2000 	いいえ 
WinXpやVistaは未検証というすごいスクリプト
The script uses the 'userchoice' registry key to find the web browser that is either the Windows standard or the chosen browser.
If no alternate browser has been installed the key is missing.
If an alternate browser is installed and selected as default, the key is created with values for Internet Explorer, Edge, Chrome, Firefox, Safari, Avant or Opera. Other browsers can be added to the script.
The search string for the Edge browser is preliminary, it can probably be shortened. I have access to only a few Windows 10 computers. Please report if there is problems with Edge detection.
'Userchoice' key is found in:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
The key is read only, it should never be modified manually!
Please tell in 'Q and A' if you know the signatures for other browsers so I can update the script.
このスクリプトはuserchoiceレジストリキーを使い、ウィンドウズの標準のブラウザかそうでないかを判定します。
代替ブラウザがなければキーはありません。
キーはIE,Edgde,Chrome,Firefox,Safari,Avant,Operaで造られます。
まだ未完成な部分があるので特にエッジの場合不具合があれば教えてください。なおこのキーは手動で書き換えできません。もしほかのブラウザとかあったらQAに乗せてください。更新しますよ。
ということ。
Wscript.Echoで関数をコールして呼び出す。この時配列を使ってブラウザの種類を設定している。違うブラウザがあれば、配列を変えないといけないので作者はこのように言っているようだ。
Raspberry PiにVirtualHereを導入する方法

# 前提条件
* VirtualHereがなんのソフトかは知っている
* ラズパイにOSは導入済みで、ネットワークにつながっている


# 環境
以下の環境では成功しています。

* Raspberry Pi：Raspberry Pi3 Model B
* OS:Raspbian jessei

# やり方

VirtualHereのサイトの[FAQ](http://www.virtualhere.com/oem_faq)にやり方がありました。

以下のコマンドを打つだけ！

```bash
wget https://www.virtualhere.com/sites/default/files/usbserver/vhusbdarm
sudo chmod +x ./vhusbdarm
sudo mv vhusbdarm /usr/sbin
wget http://www.virtualhere.com/sites/default/files/usbserver/scripts/vhusbdpin
sudo chmod +x ./vhusbdpin
sudo mv vhusbdpin /etc/init.d
sudo update-rc.d vhusbdpin defaults
sudo reboot
```

再起動後に以下のコマンドを打つとクライアント側で認識します。

```bash
sudo /usr/sbin/vhusbdarm
```

# 補足
コマンドの1行目の最後の「vhusbdarm」はVirtualHereのUSBサーバーの種類を表しています。
ここの記述を変えることで異なるUSBサーバーを取得できます（たぶん）
もしこのリンクで上手く取得できない場合はこちらの公式のページから適切なものを探してみてください
[Linux USB Server](https://www.virtualhere.com/usb_server_software)
ちなみにRaspberry Pi用のUSBServerもあるのですが、こちらはライセンスの購入が必要なので気をつけてください

# 参考
http://higehige4.blogspot.jp/2015/02/raspberry-pivirtual-hereusb-over-ip.html
http://www.virtualhere.com/oem_faq
postgreSQLでYesodのサンプルプログラムの実行まで

### 構築環境
-  装置スペック
 -  CPU : i5-4310M 2.70GHz
 -  RAM : 8.0GB
 -  OS : Microsoft Windows 10 Pro 64Bit

### Haskell Stackのインストール
- **[Download Haskell Stack](https://haskell-lang.org/get-started#why-not-haskell-platform)**
 - OSを選び、ダウンロード（windowsだと普通にダウンロード、macOSやLinuxだとwget・curlを使ってダウンロードできる）

- **Haskell Stack** の設置確認
 - HelloWorld.hsの作成

    ```Haskell
    #!/usr/bin/env stack
    -- stack --install-ghc runghc
    main :: IO ()
    main = putStrLn "Hello World"
    ```
 - terminalで```stack haskell```を入力し、「Hello World」の出力を確認

### プロジェクト作成
- scaffolded site templateのpostgreSQL版でpgcrudフォルダを作成

  ```text
  stack new pgcrud yesod-postgres
  stack build yesod-bin cabal-install --install-ghc
  stack build
  ```

- stack buildで ```pg_config.exe``` が見つけられないとエラーが出たら、postgreSQLのbinフォルダを環境変数に追加（```C:\Program Files\PostgreSQL\9.3\bin```）
 - ```Windows PowerShell```では```pg_config.exe```が取れないので、cmd上で実行すること

###   posrgreSQLでユーザとDBを作成（pgAdminⅢのlocal serverで実行）
- ユーザの生成：ログインロールを右クリックし、「新しいログインロール」でユーザを二つ追加する

    ```Text
    ロール名：kwon
    パスワード：kwon
    ```

- DBの生成：データベースを右クリックし、「新しいデータベース」で実際使うDBとテスト用のDBを作成する

    ```Text
    名前：yesod
    オーナー：kwon
    ```

###   Yesodでのデータベース接続設定
- [ここ](http://blog.livedoor.jp/rtabaladi_58/archives/58083990.html)ではプロジェクト名に合わせてユーザやDBを作成すると書いてあるが、実際は```config/settings.yml```でDBのsettingが普通にできる

    ```Text
    database:
          user:     "_env:PGUSER:kwon"
          password: "_env:PGPASS:kwon"
          host:     "_env:PGHOST:localhost"
          port:     "_env:PGPORT:5432"
          database: "_env:PGDATABASE:yesod"
          poolsize: "_env:PGPOOLSIZE:10"
    ```

- test用のDBも設定したいなら、```config/test-setting.yml```で他のDB（オーナーは同じく）だけを設定する。

    ```Text
    database:
          database: yesod_test
    ```

###   プログラム稼働
- ```stack exec -- yesod devel```
- これを実行すると、つなげたDBにサンプルデータのテーブルが生成される（comment, email, user）
- テストも実行してみたいなら、```stack test```で、設定した```yesod_test```DBにテーブルができたらOK
- [http://localhost:3000/](http://localhost:3000/) に接続し、Comment作成やユーザ登録などでDBが更新されるかを確認する。
- ここまで設定したら、他の作業はsqliteでのと同じなので **[ここ](http://qiita.com/erin/items/55e0109e4be6b3257bef)** などを参考し、次の実装をしてもOK

## 参考
- [Yesod のインストールとサンプルプログラムの実行](http://qiita.com/waddlaw/items/e47552cb26c1d58ece0b)
- [YesodでpostgreSQLを使う Haskell stack](http://blog.livedoor.jp/rtabaladi_58/archives/58083990.html)
- [Yesod 1.4でのCRUD処理およびメール送信（stackによる開発環境の構築からketerによるデプロイまで）](http://qiita.com/erin/items/55e0109e4be6b3257bef)
WPFメモ　ウィンドウ起動～終了時のイベント

# イベント発生順

| No. | イベント | 説明 |
|:-:|:--|:--|
|1|[**Initialized**<br/>(FrameworkElement)](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.initialized)|FrameworkElement初期化時|
|2| [**SourceInitialized**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.sourceinitialized.aspx)  | ウィンドウ初期化時 |
|3| [**Activated**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.activated.aspx)  | ウィンドウがフォアグラウンド ウィンドウになったとき<br/>※アクティブ化しないで表示する場合は発生しない  |
|4| [**Loaded**<br/>(FrameworkElement)](https://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.loaded.aspx)  | 要素のレイアウトやレンダリングが完了し、操作を受け入れる準備が整ったとき  |
|5|  [**ContentRendered**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.contentrendered.aspx) |  ウィンドウのコンテンツがレンダリングされた後<br/>※ウィンドウにコンテンツを含む場合に発生 |
|6| [**Closing**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.closing.aspx)  | Closeが呼び出された直後<br/>※ウィンドウを閉じるのをキャンセルできる  |
|7| [**Deactivated**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.deactivated.aspx)  | ウィンドウが背景ウィンドウになったとき  |
|8| [**Closed**<br/>(Window)](https://msdn.microsoft.com/ja-jp/library/system.windows.window.closed.aspx)  | ウィンドウが閉じるとき  |
|9|[**Unloaded**<br/>(FrameworkElement)](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.unloaded)||

# イベント発生順（非表示状態）

| No. | イベント |
|:-:|:--|:--|
|1|Initialized|
|2|Closing|
|3|Closed|


# 参考サイト

* [WPF ウィンドウの概要 - MSDN](https://msdn.microsoft.com/ja-jp/library/ms748948.aspx)
swift3.0でtabBar間でイベントを渡す

タブをタップしてイベントを拾う場合ではなく、View上のコントローラをタップした時に自動的にタブを移動してかつ移動した先の画面でイベントを発火させたい場合のメモです。

■環境
- swift3.0
- tabBarController
- tableView

■イメージ
![ず２.png](https://qiita-image-store.s3.amazonaws.com/0/172105/f9ddda89-6903-24e0-5fc8-fe4f018e7d8c.png)


```たぶ１ViewController.swift
// セルがタップされた時
func tableView(_ table:UITableView, didSelectRowAt indexPath:IndexPath) {
    // タブを切り替える
    self.tabBarController?.selectedIndex = 1
}
```


```tabBarController.swift
protocol TabBarDelegate {    
    func didSelectTab(tabBarController: UITabBarController)
}
class baseTabBarController: UITabBarController, UITabBarControllerDelegate {
    @IBOutlet weak var myTabBar: UITabBar!
    override var selectedIndex: Int{
        // タブ切り替え時に処理を行うため
        didSet {
            self.delegate?.tabBarController?(self, didSelect: self.viewControllers![selectedIndex])
        }
    }    
    override func viewDidLoad() {
        super.viewDidLoad()  
        self.delegate = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController is TabBarDelegate {
            let v = viewController as! TabBarDelegate
            v.didSelectTab(tabBarController: self)
        }
    }
}
```



```たぶ２ViewController.swift
    func didSelectTab(tabBarController: UITabBarController) {
        // 処理
    }
```
Bluemix Infrastructure VMware on Bare Metal Serverを構築する

Bluemix Infrastructureのベアメタルサーバを注文してセキュアなVMware環境を構築してみましょう。

構築する環境の構成図はこちらです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/3293c793-add0-da93-fcf6-8f7367da523c.png)

図中のvga01はVyatta Gateway Appliance（VGA）です。VGAを中心としたネットワークの構築は以下の記事を参照してください。
[Bluemix Infrastructure VGAでセキュアなネットワークを作る](http://qiita.com/Sawahashi/items/d5275db857e5f2b20696)

# ベアメタルサーバをオーダーする

VMware ESXを搭載したベアメタルサーバのオーダー方法は下記の記事を参照してください。

[仮想化ソフトを使用するには？](https://www.change-makers.jp/docs/softlayer-config-guide/10297)
[SoftLayerの時間課金ベアメタルサーバーでVMwareを試す](http://qiita.com/y_tama/items/c29ae9c05907356f5deb)

上記構成図上のIPアドレスやVLAN番号を使って説明します。
ベアメタルサーバをオーダーするとPrimary Private Network（VLAN979）にPrivate IPアドレス 10.28.191.108がアサインされて接続された状態でプロビジョニングされます。

SoftLayerのSSL VPNで接続したPCのブラウザでこのPCにアクセスすると、ESXの管理コンソールにアクセスできます。
vSphere Clientを使用するのであれば、その画面からダウンロードすることができます。
vSphere Clientで接続するESXのアドレスもこのアドレスです。ユーザーIDとパスワードはカスタマーポータルのデバイス一覧から確認することができます。

# VLANトランク設定を依頼する

VMware ESX導入済みのベアメタルサーバができたら、まずはVLANトランクの設定をカスタマーポータルからチケットで依頼します。これを行わないと、Portable VLAN 1130がESXのeth0インタフェースに届きません。
依頼方法はこちらの記事に記載しています。

[Bluemix Infrastructure VGAでセキュアなネットワークを作る - Tagged VLANをサーバに割り当てるよう依頼する](http://qiita.com/Sawahashi/items/d5275db857e5f2b20696#tagged-vlan%E3%82%92%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B%E3%82%88%E3%81%86%E4%BE%9D%E9%A0%BC%E3%81%99%E3%82%8B)

# VMwareでネットワークを構成する

vSphere ClientでVMwareのネットワーク構成を設定します。

vSphere Clientでホスト 10.28.191.108を選択し、画面上部のConfigurationタブをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/7c26d323-6f5e-2d18-2128-de3370b6822d.png)

画面左側のメニューからNetworkingをクリックすると、スイッチのイメージ図が表示されるので、図の上部にあるproperties...をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/3accf3c7-a8f4-89ae-b02d-7fa6644e43a1.png)

プロパティ画面でAdd..ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/971b4eae-28d5-e713-ce61-88e17d0456c5.png)

Virtual Machineにチェックがついている状態で、Nextボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/02b5a265-29f8-db4c-638a-fa6c92763257.png)

Network Labelにはわかりやすい名前を付けます。ここではpublic-vlan-1130という名前を付けます。
VLAN ID (Optional)にはVLAN IDを入力します。ここでは1130を入力します。

同様に、もう一つのポートを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/84eb9c3f-1c46-34cd-ed57-772b1046b0fd.png)

こちらのポートはVLAN 979に接続しますが、VLAN IDは0（ゼロ）としています。VLAN 979はPrimary VLANなので、VLAN IDでTaggingしなくてもNICまで到達しますのでゼロで良いのです。

２つのポートを追加した直後はこのような画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/b45ea773-2790-f50c-a864-5ba7b31f66b0.png)

public-vlan-1130とprivate-vlan-979の2つのポートが追加されています。この2つのポートは、今後作成する仮想マシンが使用します。

# 仮想マシンを作成する

ここまでのセットアップが完了していれば、あとは通常のVMwareの世界の話になります。
新規仮想マシン作成時に、Networkの構成を行う際、下図のように、先ほど作成した2つのポートを割り当てればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/f4055504-c5e4-8549-f7ae-4a16d94a219b.png)
PHPのhtmlspecialcharsについて

```php:
function h($s) {
		return htmlspecialchars($s, ENT_QUOTES,'UTF-8');
	}
```

上の`ENT_QUOTES `はシングルクオートとダブルクオートを共に変換するものだそうです。
知らずに使っていました。

`UTF-8`は定義するエンコーディングですね。
Macbook air(Sierra)でubuntuのデュアルブート

# Macbook(Sierra)にubuntuのデュアルブートを実現する
基本的にはインターネットに公開されている情報を元にインストールしました。
また、最後にトラブルあったので既出の内容に補足する形でやり方を記載していきます。

## 基本情報
基本的にはこちらのサイトを参考にインストールをしました。
http://ottan.xyz/el-capitan-ubuntu-dual-boot-4020/


トラブったのは次のポイント
1)と2)はubuntuのインストール中にトラブったところです。
3)と4) はインストール後にトラブったところです。

1) rEFIndのインストール。
2) ubuntuインストール後にrEFIndが上書きされている
3) サスペンドした後に液晶のバックライトがつかない
4) サスペンド後に勝手に起動してしまう

順番にこの４点について対処方法を記載していきます。

## 1) rEFIndのインストール。
rEFindはMACが起動した直後に動作し、ブートするOSを選べるようにするソフトウエアです。

Macを再起動して⌘+Rを押し続けてMacがリカバリーモードで起動したあと、rEFIndをダウンロードしたフォルダがアクセスできません。iCloudが悪さをしているのかな...

```
$ cd /Volumes/Macintosh\ HD/Users/ottan/Downloads/refind-0.10.2
$ ./refind-install
```
これは諦めて、予めUSBメモリにrEFIndをコピーしておき、USBメモリからインストールを行いました。USBメモリは問題なくマウントされてますので、
$df
コマンドでわかったマウントポジションにファイルがあり、そこかｒあインストールを行うことができました。

## 2) ubuntuインストール後にrEFIndが上書きされている
ubuntuインストール後に起動時にボタンを押さないとmacで起動しなくなってしまいました。
この対策として、強制的にmacを立ち上げ、改めてrEFIndをインストールしました。

・⌘ボタンを押してMACを起動してブートするハードディスクを選択
・mac起動後に⌘+Rを押し続けてMacをリカバリーモードで起動した後、再度rEFIndをインストールしました。これで、通常電源を投入した後にrEFIndが立ち上がり、立ち上げるOSを選択できるようになりました。

## 3) サスペンドした後に液晶のバックライトがつかない
サスペンドをするとバックライトがつかないという問題があるようです。再起動しなくなったと思い、焦りました。その対策用のパッチはこちらのgithubで公開されています。
https://github.com/patjak/mba6x_bl

実行することは次のとおりです。
```
git clone git://github.com/patjak/mba6x_bl
cd mba6x_bl
make
sudo make install
sudo depmod -a
```
## 4) サスペンド後に勝手に起動してしまう
3)により、suspendしたあとも画面表示されるようになったのですが、suspendしたつもりがしばらくすると起動してしまうという問題があり、対策を行いました。
/proc/acpi/wakeupの内容を確認
'''
MacBookAir:~$ cat /proc/acpi/wakeup 
Device	S-state	  Status   Sysfs node
PEG0	  S3	*disabled
EC	  S4	*disabled  platform:PNP0C09:00
HDEF	  S3	*disabled  pci:0000:00:1b.0
RP01	  S3	*disabled  pci:0000:00:1c.0
RP02	  S3	*disabled  pci:0000:00:1c.1
RP03	  S3	*disabled  pci:0000:00:1c.2
ARPT	  S4	*disabled  pci:0000:03:00.0
RP05	  S3	*disabled  pci:0000:00:1c.4
RP06	  S3	*disabled  pci:0000:00:1c.5
SPIT	  S3	*disabled
XHC1	  S3	*enabled   pci:0000:00:14.0
ADP1	  S4	*disabled  platform:ACPI0003:00
LID0	  S4	*enabled   platform:PNP0C0D:00
'''
LID0だけがenableの状態なら良いのですが、XHC1もenalbeになっていると起動してしまうそうです。root権限で設定の変更を行います。

'''
MacBookAir:~$ sudo su -
MacBookAir:~# echo XHC1 > /proc/acpi/wakeup
'''
確認をしてみると、XHC1もdisabledになりました。
```
naotaka@naotaka-MacBookAir:~$ cat /proc/acpi/wakeup 
Device	S-state	  Status   Sysfs node
PEG0	  S3	*disabled
EC	  S4	*disabled  platform:PNP0C09:00
HDEF	  S3	*disabled  pci:0000:00:1b.0
RP01	  S3	*disabled  pci:0000:00:1c.0
RP02	  S3	*disabled  pci:0000:00:1c.1
RP03	  S3	*disabled  pci:0000:00:1c.2
ARPT	  S4	*disabled  pci:0000:03:00.0
RP05	  S3	*disabled  pci:0000:00:1c.4
RP06	  S3	*disabled  pci:0000:00:1c.5
SPIT	  S3	*disabled
XHC1	  S3	*disabled  pci:0000:00:14.0
ADP1	  S4	*disabled  platform:ACPI0003:00
LID0	  S4	*enabled   platform:PNP0C0D:00
```
この設定変更が続くように、ruleのファイルを作成します。
/etc/udev/rules.d/90-xhc_sleep.rulesのファイルに次の２行を書き込みます。

```
# disable wake from S3 on XHC1
SUBSYSTEM=="pci", KERNEL=="0000:00:14.0", ATTR{device}=="0x9c31" RUN+="/bin/sh -c '/bin/echo disabled > /sys$env{DEVPATH}/power/wakeup'"
```

以上で完成です。
爆速で動作するubuntu、とっても快適です。MACOSを使わなくなってしまいました。
AndroidStudioでGoogleMapテンプレートをビルドしようとすると、Files\Java\jdkXXX\bin\java.exe'' finished with non-zero exit value 2と怒られる

###play-services 丸々コンパイルすることでエラーが発生しているので、必要なMap機能のみ読み込もう
```ruby:build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.google.android.gms:play-services-maps:9.4.0'
}

```
以下の記事を参考にしました。
http://stackoverflow.com/questions/38152192/android-studio-why-am-i-getting-multi-dex-error-on-brand-new-google-maps-api-pr

デフォルトテンプレートを使用したらエラー出るとか、GoogleさんドS過ぎると思う。
文系エンジニアが言語処理100本ノックやってみた in Python 02

今回は02番の問題です。
もっと定期的に勉強内容投稿しないとと思っています

>「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

言語処理100本ノック: [言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec01 "言語処理100本ノック")


```Python:02.py
a = u"パトカー"
b = u"タクシー"
c = ""
for i in range(len(a)):
    c = (c + a[i] +b[i])

print c
```

僕はこんな風なコードを書きました。
この記事を書いてる現在zipという便利なものの存在をしったのでそちらを利用するならば


```Python:02.py
char1 = u"パトカー"
char2 = u"タクシー"
print('' .join([char1 + char2 for char1, char2 in zip(a, b)]))
```

うん、こっちの方がスッキリしてていい。

zipは複数のシーケンスオブジェクトからリストをつくる時大変便利な関数です。
特にforぶんで複数のシーケンスオブジェクトの処理をするときにはよく使います。



もっとzip使いこなせるようになろう！
【JavaScript】ブラウザにスクロールボタンつける

スクロールバーまでマウスもっていくのが面倒なので

使い方
①javascript:~をコピー
②ブラウザのブックマークツールバーで右クリック→新規ブックマーク作成
③名前を↑↓とか▲▼とか、URLに①を設定して登録



■画面↑へ

```js
javascript:(function(d){
  var parent = d.body;
  if (parent.firstChild.id != "firstline"){
    var fl = d.createElement("a");
    fl.name="firstline";
    fl.id = "firstline";
    parent.insertBefore(fl, parent.firstChild);
  }
  location.hash = "#firstline";
})(document);
```

■画面↓へ

```js
javascript:(function(d){
  var parent = d.body;
  if (parent.lastChild.id != "lastline"){
    var ll = d.createElement("a");
    ll.name="lastline";
    ll.id = "lastline";
    parent.appendChild(ll);
  }
  location.hash = "#lastline";
})(document);
```

キーボードのhome end ボタンでやれって？だよね。。。

※03/25修正
画面下へのコールバックに引数渡してなかったです

```
function(){
↓
function(d){
```

※03/26追記
コメントにある通り
■画面↑へ

```
javascript:scrollTo(0,0)
```

■画面↓へ

```
javascript:scrollTo(0,document.body.offsetHeight)
```

で行けるみたいです。
[iOS][Swift]ビュー遷移時にタブバーを隠す方法

#問題
ViewControllerA → ViewControllerB → ViewControllerC 
と遷移する時に、
ViewControllerBでタブバーを非表示化したい。
ただし、
ナビゲーションバーの「戻る」ボタンで B から A に戻った時と
B から C に遷移した時はタブバーを再表示する。

#解決方法
navigationViewControllerにBをpushする前に、
AのViewControllerのhidesBottomBarWhenPushedをtrueに設定し、
push後にhidesBottomBarWhenPushedをfalseに設定する。

```swift:AからBに遷移するコード
self.hidesBottomBarWhenPushed = true
self.navigationController.pushViewController(viewControllerB, animated: true)
self.hidesBottomBarWhenPushed = false
```
macOSでPostgreSQL（brew）が起動しない場合の対処法

macOSで再起動後に自動起動設定済みのPostgreSQLが起動しなくなった。

- macOS 10.12.3
- PostgreSQL 9.6.2

PostgreSQLはbrew経由でインストールしています。
`brew services list`で確認すると、`started`というステータスなのにプロセスが確認できない状態でした。

そこで、以下のコマンドで起動すると`pid`ファイルが残っているというエラーメッセージが出ました。

```ruby
kntmrkm:~/Library/LaunchAgents $ postgres -D /usr/local/var/postgres
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 510) running in data directory "/usr/local/var/postgres"?
```

`pid`ファイルを削除すると無事起動することができました。


-----

**[Created with NOOTO](http://www.nooto.xyz/public/notes/wR5pO4AcJkZKkgAPozv-wP4WIiasJf2KdqEOBZdq)**
Redis Module から mruby を呼び出す

# Redis でモジュールとは

いろいろ Redis module の作り方が　[saidieさんの記事](http://qiita.com/saidie/items/06a14529006635a18b2f) や [redislabの記事](https://redislabs.com/blog/writing-redis-modules/)にまとまっているので参考にしてください。

# さっそく mruby を使ったモジュールを作ってみるまえにディレクトリ構成を決める

```
+ Makefile
+ mruby.c
+ redismodule.h 
+ vendor
  + mruby - github から mruby をもってくる
```

これだけのファイルでできるはず。

# mruby.c の中身
```
#include <stdlib.h>
#include "redismodule.h" 
#include "mruby.h"
#include "mruby/compile.h"
#include "mruby/string.h"

int MrubyEval_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
	// アリティのチェック
	if (argc < 2) return RedisModule_WrongArity(ctx);
	size_t len;
	const char *prefix = RedisModule_StringPtrLen(argv[1], &len);
	mrb_state* mrb;
	mrb_value value;
	char *result;

	mrb = mrb_open();

	value = mrb_load_string(mrb, prefix);
	result = (char *)mrb_string_value_ptr(mrb, value);
 	
	if (RedisModule_ReplyWithSimpleString(ctx, result) == REDISMODULE_ERR){
		mrb_close(mrb);
       return REDISMODULE_ERR;
	}
	
	mrb_close(mrb);

	return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
	// モジュールの初期化
	if (RedisModule_Init(ctx, "mruby", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
		return REDISMODULE_ERR;

	// hello.hoge コマンドの登録
	if (RedisModule_CreateCommand(ctx, "mruby.eval", MrubyEval_RedisCommand, "write deny-oom random fast", 1, 1, 1) == REDISMODULE_ERR)
		return REDISMODULE_ERR;

	return REDISMODULE_OK;
}
```
MrubyEval_RedisCommand で mruby.eval 引数 でわたされたrubyのプログラムを実行できるようにします。

Makefile

```
CFLAGS = -Ivendor/mruby/include

all: build libmruby.a mruby.o
        ld -o mruby.so mruby.o -bundle -undefined dynamic_lookup -lc vendor/mruby/build/host/lib/libmruby.a -lm

mruby.o:
        gcc -dynamic -fno-common -std=gnu99 -mmacosx-version-min=10.6 -c -Ivendor/mruby/include -o mruby.o mruby.c

libmruby.a: vendor/mruby
        cd vendor/mruby && ${MAKE}

vendor/mruby:
        mkdir -p vendor
        git clone https://github.com/mruby/mruby.git vendor/mruby
        cd vendor/mruby && git reset --hard && git clean -fdx

build:
        mkdir -p build

clean:
        rm -rf vendor
        rm -rf build
```

make で　mruby.so ができます。

redis-cli で
```
module load "実際のpath/mruby/mruby.so"
```

とするとモジュールが有効になります。

```
redis.eval "def a;1+1+1;end; a"
```
とすれば
```
3
```
が帰ってきます。

これから対応していきたいこと、 reids のコマンドを呼べるようにして lua script 相当にする
Windows10 に Electron をインストールする

Windows10 に Electron をインストールしたらいろいろはまったので手順をメモ。
流れは、以下だけ(なんだけど苦戦した。。。)

1. Node.js のインストール
2. npm 使って Electron のインストール

Node.js は v7.7.4 を使用

#Node.js のインストール

何はともあれ Node.js のインストール。
インストーラでやればいいのだけど、インストーラだとまずい環境もあるので zip からインストール

1. https://nodejs.org/en/download/current/ ここから Windows Binary(.zip) を選択してダウンロード。Bit は各自環境に合わせて
2. 適当な **ローカルディレクトリ** に展開。ローカルディレクトリがポイント。Samba などの共有ディレクトリなどに置くと、scandir 権限不足問題が解決できない。。
3. コマンドプロンプトを開いて以下コマンドを実行し、環境変数を設定

```
setx NODE_PATH c:\tmp\node\node_module
setx PATH %PATH%;c:\tmp\node
```

#Electron のインストール

1. **管理者権限でコマンドプロンプトを起動**。管理者権限じゃないと scandir が権限不足で失敗して、次に実行する npm が正常終了しない。grunt-cli はインストールできたので、Electron だけ?
2. 下記コマンドで Electron インストール

```
npm install -g electron
```

#その他
- Electron のインストールに失敗したら、Node.js のディレクトリ直下にできる electron, electron.cmd ファイルを削除してから再度 npm 実行
RDSのパラメーター変更方法（AWS）

#はじめに
RDSを利用する際のパラメータの変更方法を記載します。
初めて利用したときは、ぽちぽちで作成できてしまうので、見落としていました。。。

# 前提
- エンジン：MYSQL（MySQL5.6.27）


# 手順
1.AWSコンソールにログイン

2.RDSのエンジンを確認
> **パラメータの適用はエンジンごとになる**ので、最初に使用しているエンジンの確認をします。
> [サービス]→[RDS]→[インスタンス]→[対象のインスタンスにチェック]→[インスタンスの操作]→[詳細を表示]
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/a89e7161-1d2c-4749-72ac-9ae25e0d21fa.jpeg)

>今回のエンジンはMYSQLですね！
>併せて、現在適用されているパラメータグループを確認します。
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/81bcac29-02a1-56f4-455d-c2afafeafe53.jpeg)


3.パラメータグループの新規作成
>[サービス]→[RDS]→[パラメータグループ]→[パラメータグループの作成]
![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/63f7cc32-911b-8bf9-0958-f1560296ff21.jpeg)

4.パラメータグループの設定
>**パラメータグループファミリーの設定を、手順2.で確認したものに合わせましょう**
>[パラメータグループファミリー：mysql5.6]→[グループ名：test1]→[説明：test1]→[作成]
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/3efa0645-72ed-20bc-ad95-4ebcc2c0031c.jpeg)

5.パラメータの編集、保存
[作成したパラメータにチェック]→[パラメータの編集]→[変更の保存]
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/9ad62c32-7d9c-2886-298e-15c77226803a.jpeg)


今回は、```character-set-server```を```utf8```に設定してみました。
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/30b8b1f6-2475-cbba-59ff-424f69ecc720.jpeg)

6.パラメータグループの適用
>作成したパラメータグループの適用を行います。
>[サービス]→[RDS]→[インスタンス]→[対象のインスタンスにチェック]→[インスタンスの操作]→[変更]
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/13722488-d585-3b71-b7ae-e1810bdcd6c8.jpeg)

>[データベースの設定]欄にある、DBパラメータグループを作成したパラメータグループに変更し、画面下部の[次へ]押下し
>**RDSのエンジンと、作成したパラメータグループの[パラメータグループファミリー]を合わせないと、ここで選択するこができません・・・！**
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/421f410d-7e54-bb41-5c35-b46e3e8d18a9.jpeg)


7.変更内容を確認し適用します。
> 内容を確認し、[DBインスタンスの変更]押下
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/5f8a5516-321f-ca01-dd96-62859b4bf00c.jpeg)


#注意点！！！
**手順7.で[すぐに適用]が[はい]になっている場合、変更適用のためRDSが再起動してしまう可能性があります・・・！！！
デフォルトでは[いいえ]になっているはずですが、手順7.できちんと確認してください。。。**
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/8a501527-b2e8-691b-cc89-ebfae07427ae.jpeg)


###ちなみに、[すぐに適用]を[いいえ]にしたら？？？
RDSではメンテナンスを行なっています。
[いいえ]にした場合は、すぐに再起動は行わずに、次回のメンテナンスの際に一緒に適用させてしまうようです。


###余談
上記で、RDSのメンテナンスの話が出ましたが、メンテナンスの際は自動的に再起動されてしまうようです。。。
RDSを使用したサービスで、ダウンタイムの発生が許されない場合は、最初に構築する際にマルチAZ配置しておくことをお勧めします。（基本はこれをするのかな？？？）
GCPの課金データ取得のススメ

2017年3月にGoogle Cloud Platform (GCP) の価格改定があり、無料枠も広がりましたね。試しに使ってみている、という方も多いのではないでしょうか。

そんな方向けに、GCP課金データのエクスポート設定をしておくと良いですよ、という話を紹介します。しかも、今回の価格改定からはこの課金データの保存・取得が無料でできるようになっています[^1]。

[^1]: 無料で使えることに私が最近気付いただけで、以前から無料で使えたのかもしれません

# GCPの課金データ

ここで紹介するGCPの課金データというのは、自分が管理している全プロジェクトの日ごと・サービスごとの使用量と費用がわかるようなCSVファイルのことです。

具体的には、次のような情報が格納されています。

- 3/21の
- xxxプロジェクトの
- Datastore小規模オペレーションは
- 63924リクエストで
- 0円でした

このように課金額だけでなくサービスの利用量も記録されているので、無料ユーザーにとっても有用です。こうした情報の多くは管理画面上に表示されなかったり、表示されても翌日になると消えてしまったりするのですが、課金データを保存しておけば後からでも傾向を確認できたりします。

# 課金データの出力設定

課金データはGoogle Cloud Storage (GCS) かBigQueryかに出力することができます。2017年3月からGCSが無料（USリージョンのみ）になったので、これをありがたく使わせてもらいましょう。

## バケットの作成

2017年3月現在、GCSはUSリージョンであれば5GBまで無料ということになっています。課金データだけであれば1年間でも数MB程度ですから、気軽に保存できますね。

まずはus-westにGCSのバケットを作ってみましょう。GCPメニューの「Storage」「ブラウザ」から「バケットを作成」で新規バケットが作れます。

![gcs-create-bucket.png](https://qiita-image-store.s3.amazonaws.com/0/46856/e5f493b7-06f3-8207-a094-d9350daa0eb7.png)

注意点ですが、無料枠の適用はストレージクラス「Regional」のみです。デフォルトは「Multi-Regional」になっていますが、これを選ぶと課金されてしまうはずですので注意してください。

## 課金データのエクスポート設定

GCPメニュー「お支払い」「課金データのエクスポート」「ファイルのエクスポート」から課金ログのエクスポート設定ができます。

<img width="496" alt="billing-data-export.png" src="https://qiita-image-store.s3.amazonaws.com/0/46856/703cfe7f-fdb9-8b58-fa1e-b021dd3004b1.png">

「バケット名」には先ほど作成したバケット名を入力してください。「レポート接頭辞」は適当な文字列を設定しておけば良いでしょう。

# 課金データの例

上のように設定すると、「Storage」「ブラウザ」に1日に1回、だいたい日本時間の0時すぎに3日前の17時から前々日の17時（いずれも日本時間）までの課金データが作られます。もう少し早く取れるといいですね。

![gcs-file-lists.png](https://qiita-image-store.s3.amazonaws.com/0/46856/613f836e-83c9-bac0-b801-4546141cfebc.png)

ファイル名をクリックすればCSVがダウンロードできます。このデータを見れば、このCSVダウンロード自体が0円である、といったこともわかります。

<img width="805" alt="billing-report-example.png" src="https://qiita-image-store.s3.amazonaws.com/0/46856/9132951b-5d16-8f84-8ddf-b2d5da98813b.png">


意図しない課金が発生したような場合でも、こうしたデータを保存しておけば後から原因の特定ができて安心感が増します。個人的にはエクスポート設定していなかった頃のデータも見たいくらいです。

# まとめ

- GCPの課金データをCSVエクスポート設定しておくと便利
    - 各種リソースの利用量がプロジェクトごと日ごとで確認できる
    - GCSのバケットをUSリージョンに作れば無料

本当はBigQueryに保存した方が集計や可視化には便利なんでしょうけど、どれくらい活用するかわからない段階のうちからBigQueryにエクスポートするのは少しためらっちゃいますよね。そんな場合、何も考えずGCSに出力しておくという選択肢もありますよ、というご紹介でした。
npm linkの基本的な使い方まとめ

# はじめに

仕事で`npm link`機能をいろいろ試しながら導入したので備忘録も兼ねつつ、まとめます。

# リンクを貼る

基本的には[公式ドキュメント](https://docs.npmjs.com/cli/link)にあるとおりですが、実際に試した結果としてまとめます。
想定としては、
「*use-npm-link-A*から、まだnpmに公開していない*use-npm-link-B*と*use-npm-link-C*にリンクを貼って動作を調べたい」
といった感じです。実際にリンクを貼った状態が以下の図です。

![use-npm-link-a.png](https://qiita-image-store.s3.amazonaws.com/0/33347/2c252cf4-96ad-c69c-1b65-9c0f89c4c663.png)

リンクしたい*use-npm-link-B*と*use-npm-link-C*は以下の図のようになっています。

![use-npm-link-b.png](https://qiita-image-store.s3.amazonaws.com/0/33347/a95adba0-3544-45b3-78ee-018f630c36fc.png)

* ディレクトリ名 -> use-npm-link-B
* package.jsonのnameで指定された名前 -> use-npm-link-B

![use-npm-link-c.png](https://qiita-image-store.s3.amazonaws.com/0/33347/4b50b8b4-c141-ac5f-c1e3-2a9d2c650e73.png)

* ディレクトリ名 -> UseNpmLinkC
* package.jsonのnameで指定された名前 -> use-npm-link-C

## 方法1

1.リンクで引っ張らせたいライブラリ（use-npm-link-B）で、以下のコマンドを実行する。

```Bash
$ npm link
```

2.リンクを使いたいライブラリ（use-npm-link-A）で、以下のコマンドを実行する。

```Bash
$ npm link use-npm-link-B
```

これでシンボリックリンクが貼られます。

## 方法2

1.リンクを使いたいライブラリ（use-npm-link-A）で、以下のコマンドを実行する。

```Bash
$ npm link use-npm-link-B
```

これだけでシンボリックリンクを貼れます。
上のコマンドで実行されるのは、以下のコマンドと同様だそうです。

```Bash
$ cd ../use-npm-link-B; npm link
$ npm link use-npm-link-B
```

### 方法2の注意点

`cd ../use-npm-link-B`となっている通り、
***use-npm-link-Aと同階層に存在するuse-npm-link-Bという名前のディレクトリである必要***があります。  
つまり、以下のコードをたたいてもuse-npm-link-Cという名前のディレクトリがないので失敗します。

```Bash
$ npm link use-npm-link-C
```

ただし、少し異なる状況だと違う動きをします。
use-npm-link-Cというパッケージが既にnpmに公開されている場合は、公開されたパッケージを引っ張ってきます。
とはいえ、その場合はローカルのディレクトリにリンクを貼れるわけではないので、目的[^1]によってはリンクを貼られても意味をなさないと思います。

## 方法3

1.リンクを使いたいライブラリ（use-npm-link-A）で以下のコマンドを実行する。

```Bash
$ npm link ../UseNpmLinkC
```

方法2に似て、1行で終わるから楽だし、方法2と違って同階層じゃなくてもリンクを貼ることが出来ます。


# その他

## リンクはどこを参照しているのか

ローカルPC内のグローバルなnode_modules内です。
（`npm install hoge -g`みたいに`-g`つけて保存される場所）

上述の方法3で保存した場合も、一度グローバルにシンボリックリンクが貼られるようです。

## npmに公開されているパッケージをリンクで引っ張る場合のバージョン

特に指定しないとlatestタグで指定されたバージョンを引っ張っているのかなぁという感じです。
すみません。あまり検証してません。
ただ、latestじゃなくて、例えばbetaタグで指定されたバージョンを引っ張りたい場合は、以下のコマンドで引っ張れます。

```Bash
$ npm link hoge@beta
```

私の場合は仕事上npmに公開できないパッケージをプライベートなリポジトリ[^2]に公開していますが、何も指定しないとlatestで指定されたバージョンがnode_modules内に入っていました。

## `npm prune`に注意

よく考えれば当たり前かもしれませんが、私はやらかしたので。
`npm prune`コマンドを叩くと不要なパッケージを削除してくれますが、同じパッケージを参照していた場合に参照しているパッケージのnode_modulesから消えたりします。

少し具体的な例を出します。確か、以下のような状況だったと思います。

【前提】

* **Root**から**Child**をリンク。
* **Child**から**GrandChild**をリンク。
* **Child**では*fs-extra*を使用。
* **GrandChild**でも*fs-extra*を使用。

【発覚時の手順】

1. **Root**で`npm-prune`をたたく　-> **GrandChild**のnode_modules内から*fs-extra*が消える。
2. 気づかずに**Root**でgulpのテストを起動。
3. **GrandChild**の*fs-extra*を使用しているファイルでエラーが吐かれて怒られる。
4. 発覚

# おわりに

`npm link`の記事って日本語だとあまりない気がしたので、使う人が増えて「そんな便利な使い方が！」とか発見できるようになると嬉しいなと思いつつ書きました。
ご存じの方は教えていただけると幸いです。

# 参考
* [link | npm Documentation](https://docs.npmjs.com/cli/link)
* [特定のモジュールと強く依存するプロジェクトの開発を行うときのtips(「npm link」と「dependenciesにローカルフォルダを指定する」方法の比較 )](http://qiita.com/nyamogera/items/9f40ed2aa2767d351fce)
* [npm linkが意外と便利だった](https://tejitak.com/blog/?p=1535)

[^1]: 公開前に試したい、node_modulesから直接変更したい、とか。
[^2]: sinopiaとかverdaccio。私はverdaccioを使っています。
空のディレクトリを削除する方法

コマンドラインから以下を実行
for /f "delims=" %d in ('dir /ad /b /s') do rd "%d"

ディレクトリを指定する場合(e:\tmp配下のディレクトリ)
for /f "delims=" %d in ('dir e:\tmp /ad /b /s') do rd "%d"

参考
http://so-zou.jp/software/tool/system/command-prompt/command/rd.htm
【JavaScript】jQueryでツールチップ表示

画像にマウスを重ねると、alt属性のテキストをツールチップに表示する。
捨てるのもなんなのでチェック用にでも使ってください。


```js:jquery.tooltip.js
;(function($,undefined){
  $("img").each(function(){
    $(this)
      .off(".tooltip")
      .on("mouseenter.tooltip", function(e){
        var alt = $(this).attr("alt") || "...";
        var tip = $("<span>"+alt+"</span>");
        tip.css({
          position: "absolute",
          top : e.pageY-24,
          left: e.pageX,
          background: "white",
          color: "black",
          border: "1px outset #333"
        });
        $("body").append(tip);
        $(this).on("mouseleave.tooltip", function(e){
          tip.remove();
        });
      });
  });
})(jQuery);
```
【Laravel】取得時にリレーションのカウントでOrderByする方法

Laravelでは、WithCountメソッドでリレーションの数を取得できます。
https://readouble.com/laravel/6.x/ja/eloquent-relationships.html#counting-related-models

```php
// RecipeにFavoriteのHasManyリレーションがある場合
Recipe::withCount('favorites')
    ->orderBy('favorites_count', 'desc')
    ->limit(3)
    ->get();
```


内部ではサブクエリが発行されています。

```sql
"select `recipes`.*, (select count(*) from `recipe_favorites` where `recipes`.`id` = `recipe_favorites`.`recipe_id`) as `favorites_count` from `recipes` order by `favorites_count` desc limit 3"
```
Splatoonの全ブキの合計の塗ポイントをいい感じに表示するブックマークレット

# 概要
「[Splatoonの全ブキの合計の塗ポイントを出してくれるやつ](http://qiita.com/EafT/items/4dcd5e98476f11974f1d)」という記事に触発されて、もうちょっといい感じにポイントを表示し、かつブックマークレットに登録することで簡単に実行できるようにした。

こんな感じに、一番上に合計ポイントが表示される。

![splatoon.gif](https://qiita-image-store.s3.amazonaws.com/0/29000/28ca8da2-4eb6-220f-e07d-4961b28d62ae.gif)



# 使い方

* Chromeのブックマークレットに、以下のコードを登録する。

```JavaScript
javascript:(function(){var sum=0;$(".equip-painted-point-number").each(function(){sum+=Number($(this).text())});for(var sumStr=sum.toString(),sumDiv=$("<div>",{"class":"equip-painted-point-number"}).css("right","122px"),count=sumStr.length-1,i=count;i>=0;i--){var digit="digit-1"+"0".repeat(count-i),number="typography-number-white-"+sumStr[i];sumDiv.append($("<span>",{"class":digit+" "+number,text:sumStr[i]}))}var sumDOM=$("<li>",{"class":"equip-painted-data"});sumDOM.append($("<div>",{"class":"equip-paited-weapon"}),sumDiv,$("<div>",{"class":"equip-paited-point-unit"}).css("right","94px").append($("<span>",{"class":"typography-point",text:"p"}))),$(".equip-painted-rank").prepend(sumDOM);})()
```

* [イカリング](https://splatoon.nintendo.net/profile)にログインし、「そうび」ページに移動

* 登録したブックマークレットを叩く


# 整形コード

特に難しいことはしていないので、何をしているかはコードを読めば理解していただけると思う。
ポイントとしては、DOMのclassを動的に割り当て、CSSのbackground属性で指定されるSVGを変化させているところ。
`typography-number-white-X`クラスの`X`の数値に対応する文字画像が呼び出されるので、ループを回してここにそれぞれの桁の数字を入れている。

```JavaScript
javascript:(function() {
var sum = 0;
$(".equip-painted-point-number").each(function() {
  sum += Number($(this).text());
});

var sumStr = sum.toString();

var sumDiv = $("<div>", {class: "equip-painted-point-number"}).css("right", "122px");;
var count = sumStr.length - 1;
for (var i = count; i >= 0; i--) {
  var digit = "digit-1" + "0".repeat(count - i);
  var number = "typography-number-white-" + sumStr[i];

  sumDiv.append($("<span>", {class: digit + " " + number, text: sumStr[i]}));
}

var sumDOM = $("<li>", {class: "equip-painted-data"});
sumDOM.append(
  $("<div>", {class: "equip-paited-weapon"}),
  sumDiv,
  $("<div>", {class: "equip-paited-point-unit"})
    .css("right", "94px")
    .append(
      $("<span>", {class: "typography-point", text: "p"})
    )
);

$(".equip-painted-rank").prepend(sumDOM);
})()
```


# 余談

DOMの重複対策等は何もしていないので、連続で実行すると無限に追加されていってしまう。

![splatoon2.gif](https://qiita-image-store.s3.amazonaws.com/0/29000/cd3cfff1-ec8d-3948-1a08-f58e53612b71.gif)
長押しでコピー可能なUILabel


こんな感じで作れた。

```swift:swift

import UIKit

class CopyableLabel: UILabel {

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.copyableInit()
    }
    
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    	 // IB上の設定を引き継ぎたい場合はコメントアウト
        self.copyableInit()
    }
    
    func copyableInit() {
        self.userInteractionEnabled = true
        self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(CopyLabel.showContextMenu(_:))))
    }
    func showContextMenu(sender:AnyObject?) {
        self.becomeFirstResponder()
        let contextMenu = UIMenuController.sharedMenuController()
        if !contextMenu.menuVisible {
            contextMenu.setTargetRect(self.bounds, inView: self)
            contextMenu.setMenuVisible(true, animated: true)
        }
    }
    
    override func canBecomeFirstResponder() -> Bool {
        return true
    }
    
    override func copy(sender: AnyObject?) {
        let pasteBoard = UIPasteboard.generalPasteboard()
        pasteBoard.string = text
        let contextMenu = UIMenuController.sharedMenuController()
        contextMenu.setMenuVisible(false, animated: true)
    }
    
    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        if action == #selector(UIResponderStandardEditActions.copy(_:)) {
            return true
        }
        return false
    }
}

```
HoloLensアプリをMacでリリース

#はじめに

+ HoloLensのアプリをMacのハードウェア上でBootCampを使わずに**ビルド・申請・リリース**できましたので、情報を共有いたします。
+ 通常にビルドしたものをHoloLensで動作確認する情報については、以前Qiitaに投稿しました**[『HoloLensアプリをMac環境で開発・実機で動作確認』](http://qiita.com/drafts/64ae718fd0df45efd838/)**を参照ください。

##更新履歴

+ 補足に追記（2017.05.10）
+ 紹介動画追加（2017.04.02）
+ アプリのWindows Storeへのリンク修正（2017.03.16）

##リリースできたアプリ
![HoloAIR.png](https://qiita-image-store.s3.amazonaws.com/0/7900/8a5c61e8-cee6-587f-a0f9-e83a989888dd.png)

+ [**HoloAIR**](https://www.microsoft.com/ja-jp/store/p/holoair/9n1kk1m5gfdt)（OLYMPUSのデジタル一眼カメラ**AIR A01**の3D立体シミュレーター）
+ **機能：**AirTapするごとに、「分解」=>「結合」=>「色変更（カラフル・ブラック・ホワイト）」を繰り返します。
+ [紹介動画（YouTube）](https://youtu.be/hFQsi1DCSbo)
+ リリース日：2017.03.22

+ [![HoloAIR](https://www.youtube.com/watch?v=hFQsi1DCSbo/0.jpg)](https://www.youtube.com/watch?v=hFQsi1DCSbo)


##確認できたMacの環境

+ **MacBook Pro (Late2013)**
+ **macOS Sierra (10.12.3)**
+ **Parallels Desktop 12 for Mac Pro Edition (バージョン 12.1.3)** ： macOS Sierraにインストール
+ **Windows 10 Pro (64bit)** ： Parallels Desktopにインストール
+ **Visual Studio 2017 Community** ： Windows 10にインストール
+ **Unity Personal 5.5.2f1 (64bit)**： Windows 10にインストール


##失敗談

+ **Visual Studio 2015 Community**では、**Package.appxmanifest**の**ビジュアル資産**のアイコン画像設定でパスの問題で上手くいかず断念（やり方あるかも）
+ **Visual Studio**からパッケージの出力で色々上手くいかず試行錯誤

##補足

+ VisualStudioで開く.slnファイルの絶対パスの文字数が多いと、ビルド出来ないっぽい。
+ ３Dオブジェクトを拡大し過ぎると落ちることがあるらしいです。
+ アプリのアイコンは背景透過画像で登録したら、Windows Storeでブルーの背景を用意してくれてます（ストアのアイコン画像をダウンロードしてみると背景透明の画像でした）。

##役に立った情報

+ [WindowsストアにHoloLensアプリをリリースする手順まとめ](http://2vr.jp/2017/01/30/submitting-an-app-to-the-windows-store/)
+ [HoloLensアプリ「ENGLISH BIRD」をリリースするまで](http://noshipu.hateblo.jp/entry/2017/02/09/035458)
Windows環境でdocker-compose upしたとき、volumeのマウントに失敗するときの対応

まだDocker勉強中ですが情報の共有を。

## 困っていたこと

`docker-compose up`したときに以下のようなエラーが出て困っていました。
docker-compose.ymlでのvolumeのマウントに失敗しているようです。

```
ERROR: for browser  Cannot create container for service browser: invalid bind mount spec "C:\\Users\\xxx\\workspace\\eccube-codeception\\tests\\_support\\_downloads:/home/seluser/Downloads:rw": invalid volume specification: 'C:\Users\xxx\workspace\eccube-codeception\tests\_support\_downloads:/home/seluser/Downloads:rw'
ERROR: Encountered errors while bringing up the project.
```

## 解決方法
`.env`ファイルに次の行を追加するだけで解決できました。

```
COMPOSE_CONVERT_WINDOWS_PATHS=1
```

## 実行環境
Windows10
GitBash
Docker version 1.12.5, build 7392c3b
docker-machine version 0.8.2, build e18a919
VirtualBox バージョン 5.1.10

今回upしようとしていたのはこちらのコンテナ
https://github.com/EC-CUBE/eccube-codeception

## よくわかっていないところ

`COMPOSE_CONVERT_WINDOWS_PATHS=1`と`COMPOSE_CONVERT_WINDOWS_PATHS=0`のどちらでもupできました。
公式のドキュメントを見ると環境変数の値が「0」と「1」で意味が違うようなのだけど。。
https://docs.docker.com/compose/reference/envvars/
herokuにデプロイするメモ

# 事前準備(済んでいれば飛ばす)

- 環境
    - vagrant 
    - Ubuntu

## herokuに登録
https://signup.heroku.com/
上記リンクからまずは登録
(ここで言語設定をRubyにする)

## アプリケーションの作成
```
rails new heroku_sample

cd heroku_sample

rails generate controller home top

```

rootの変更

```config/routes.rb
get 'home#top'
```
　　　⬇︎

```config/routes.rb
root 'home#top'
```

## 公開手順

### 環境設定
#### DBの設定変更
デフォルトはおそらく'sqlite3'でherokuでは、'pg'を使用するため変更が必要

変更前

``` Gemfile
gem 'sqlite3'
```
変更後

``` Gemfile
gem 'sqlite3', group: :development
gem 'pg', group: :production
gem 'rails_12factor', group: :production

```

#### 本番環境でのdatabaseの設定を変更
ymlファイルのproduction部分を以下に変更

``` config/database.yml
production:
 <<: *default
 adapter: postgresql
 encoding: unicode
 pool: 5
```


のちにheroku run rake db:migrateでエラーが出るので回避するため以下の変更を加える
(bin/bundle)
変更前

```
#!/usr/bin/env ruby2.3
```
変更後

```
#!/usr/bin/env ruby
```
### heroku側でAppを作成する

heroku　コマンドを有効にする
```
wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
```
ここでheroku loginしていなかったらする

```
heroku create （herokuでのアプリケーション名） --buildpack heroku/ruby
```
重複できないのでユニークな名前を設定する
buildpack　でrubyを指定

#### デプロイする

```
git init
git add .
git commit -m "first commit"

git push heroku master
```

#### データベースの作成

```
heroku run rake db:migrate
```

#### URL等の確認

```
heroku info
```

### アクセスしてエラーが出たら. . .

```
heroku logs

heroku run rails c
```
上記どちらかで出るエラーを解決する
multiple な file_field の配列値を1対多のモデルでスマートに受け取る方法

`f.file_field(:avatar_files, multiple: true)` の配列値が `{:user => {:avatar_files => [...]}}` の形で返ってくるので、モデル側に用意した `avatar_files=` で受け取って隠れ属性の `avatars_attributes` に適切な形に変換して渡してあげるのがシンプルでいい気がします。コントローラー側で変換する手もありますが、モデルの担当にしておけばテストや seed.rb などが書きやすいです。

```sass:ビュー側
= form_for(user) do |f|
  = f.file_field(:avatar_files, multiple: true)
  = f.submit
```

```rb:モデル側
require "active_record"

ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")

ActiveRecord::Schema.define do
  create_table :users do |t|
  end
  create_table :avatars do |t|
    t.belongs_to :user
    t.string :file
  end
end

class User < ActiveRecord::Base
  has_many :avatars, inverse_of: :user, dependent: :destroy
  accepts_nested_attributes_for :avatars

  def avatar_files=(v)
    assign_attributes(avatars_attributes: v.collect { |e| {file: e} })
  end
end

class Avatar < ActiveRecord::Base
  belongs_to :user
end

user = User.create!(:avatar_files => ["a", "b"])
user.avatars.collect(&:file)    # => ["a", "b"]
```
ツイートボタンがないページでもツイート画面を開くブックマークレット

今見ているウェブページを共有するためのツイート画面を開くブックマークレットをつくりました。 
ブックマークレットの使用方法については、使用している端末やブラウザによって異なるので、各自でググってください。
各ブックマークレットのツイート内容は、`<タイトル> <URL>`です。

## ツイートダイアログを開く
```js:ブックマークレット
javascript:(function(){var w=550,h=420;window.open("https://twitter.com/intent/tweet?text="+encodeURIComponent(document.title)+" "+encodeURIComponent(location.href),"_blank","width="+w+",height="+h+",left="+(screen.width-w)/2+",top="+(screen.height-h)/2+",scrollbars=yes,resizable=yes,toolbar=no,location=yes")})()
```
ブックマークレットを実行すると、ツイートダイアログを開きます。
ツイートボタンとほぼ同じ動作です。

## 新規タブでツイート画面を開く
```js:ブックマークレット
javascript:window.open("https://twitter.com/intent/tweet?text="+encodeURIComponent(document.title)+" "+encodeURIComponent(location.href))
```
ブックマークレットを実行すると、新規タブでツイート画面を開きます。

## Twitterアプリのツイート画面を開く
```js:ブックマークレット
javascript:location.href="twitter://post?message="+encodeURIComponent(document.title)+" "+encodeURIComponent(location.href)
```
スマートフォン（iPhone、Android）でブックマークレットを実行すると、Twitterアプリのツイート画面を開きます。
URLスキームという仕組みで、通常は`http`や`https`などのプロトコルを指定するスキーム部に、`twitter`のようなアプリ固有のスキームを指定することで、そのアプリを開くことができます。
TwitterのURLスキームには複数のオプションがあり、今回はツイート画面を開く`post`を使用しています。
Fakerの出力データをrails consoleで試す

※2017年2月に、別のブログで書いた記事を移行したものです。

---

Fakerは、ダミーデータを作成するRubyのライブラリです。
gemでインストールして使います。

<strong>Faker::Internet.email</strong> を実行すると、ランダムなeメールを取得できるイメージですね。
例えば、RSpec + FactoryGirl + Fakerを使えば、
リアルなダミーデータでテストを実施できます。

しかし、このFaker、[公式ドキュメント](http://www.rubydoc.info/gems/faker)を読んでも、どのメソッド使えば良いかわかりづらい。。。

ということで、Fakerのメソッドを実際に実行して試す方法をまとめました。

今回使うrails consoleは、任意の環境でコードを実行できます（開発環境やテスト環境など）。

私の場合、Fakerはテスト環境にしか入れていないません。
<strong>bin/rails c -e test</strong> でテスト環境を指定してrails consoleを起動します。

```
$ bin/rails c -e test
Running via Spring preloader in process 10807
Loading test environment (Rails 5.0.0.1)
irb(main):001:0> Faker::Internet.email
=> "spencer@west.co"
```

ランダムなメールアドレスを取得できました。

次に人の名前を、
[公式ドキュメント](http://www.rubydoc.info/gems/faker)を見ながら試してみます。

```
irb(main):001:0> Faker::Name.name
=> "Jeremie Parker IV"
irb(main):002:0> Faker::Name.first_name
=> "Wyatt"
irb(main):003:0> Faker::Name.last_name
=> "Carter"
irb(main):004:0>
```

name, first_name, last_nameがそれぞれ取得できているのが分かるかと思います。
ぜひ、試してみてください。

## 参考

- [rails console まとめ - kzy52's blog](http://kzy52.com/entry/2014/11/28/235958)
Rails 開発でよく使うコマンド一覧

Rails 開発で、覚えていると便利な、使えるコマンドをメモします。

# 環境

- macOS Catalina 10.15.6
- Ruby 2.7.1
- Ruby on Rails 6.0

```sh
# DB
% bin/rails db:migrate       # 未実行のマイグレーションがあれば実行
% bin/rails db:reset         # DB を再作成 & シードデータ投入
% bin/rails db:migrate:reset # マイグレーションファイルの頭からマイグレーションを実行し直す
% bin/rails db:test:load     # 現在の schema.rb からテスト用 DB を再作成
% bin/rails db:seed          # シードデータ投入

# ルーティング確認
% bin/rails routes

# データベースクライアント起動
% bin/rails db
% bin/rails db:test # テスト用 DB

# Rails コンソール起動
% bin/rails c

# サーバー起動
% bin/rails s
$ bin/rails s p # Production モード
```
Windowsユーザー(新人エンジニア)が、Macに乗り換えた話

※2017年1月に、別のブログで書いた記事を移行したものです。

---

先日、MacBook Proを購入し、Macデビューしました。
Windowsユーザーだった私が、初めてMacを使う際に調べた、

- Mac特有の概念・名称
- インストールしたアプリ
- ショートカットキー

などについて書こうと思います。

ちなみに購入したのは、15インチでTouch Bar付きのやつです。
SSDも512MBに増やしました。

<!--more-->

![MacBook-Pro-box-1024x768.jpg](https://qiita-image-store.s3.amazonaws.com/0/102964/92042bb0-6c98-99c4-61a5-c5d0f3e0cb96.jpeg)

## Mac特有の概念・名称
### Finder
Windowsでいう、Explorerのこと
ファイル・フォルダをGUIで操作できる。
UNIXコマンドに慣れていれば、普段はTerminalで操作すればいい気もする。
### Dock
アプリのショートカットと、起動中のアプリを一覧表示する。
右クリックで、アプリをDockに追加したり、Dockから削除したりできる。
ちなみに、トラックパッドの場合、control + クリックで右クリックと同じことができる。
### Launchpad
アプリケーションフォルダの中身を展開する
Macでは、アプリケーションは全てアプリケーションフォルダに配置されるようだ。
### 操作スペース
Macには、操作スペースという概念がある。
仮想のデスクトップがいくつもある、というイメージだろうか。
指３本で左右にスワイプして、操作スペースを切り替えることができる。

操作スペースには、

- 最大化したウィンドウで、１つのアプリケーション
- ２分割したウィンドウで、２つのアプリケーション
- 最小化したウィンドウで、複数のアプリケーション

のいずれかを置くことができる。
上下にスワイプすることで、操作スペースを一覧で表示したり、入れ替えたりすることができる。

ウィンドウ分割といえば、Windowsでは、Window + ↑→↓← が便利だったはず。
Macに同じ機能はない。
代わりに、Split Viewでウィンドウを分割して作業できる。
以下を参照。

- [Split View で Mac の App を 2 つ並べて表示する \- Apple サポート](https://support.apple.com/ja-jp/HT204948)

## ショートカットキー
ショートカットキーについては、以下のサイトを参照した。
結局、公式のサポートサイトが一番良いかもしれない。

- [Mac のキーボードショートカット \- Apple サポート](https://support.apple.com/ja-jp/HT201236)
- [Chrome のキーボード ショートカット \- Chrome ヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)
- [Evernote for Mac のキーボードショートカットには何がありますか？ – Evernote ヘルプ＆参考情報](https://help.evernote.com/hc/ja/articles/208313358-Evernote-for-Mac-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%AB%E3%81%AF%E4%BD%95%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B-)

## インストールしたアプリケーション

- Google Chrome
- Evernote
- Clipy
  - Windowsで[Clibor](http://www.amunsnet.com/soft.html)を使っていたので、Macで使えるものを探したところ、見つけました。

## Rails開発に必要な環境を整える
### Terminal
Windowsでは、TeraTermを使っていたが、Macでは標準で入っているTerminalを使う。
AWS EC2へのSSH接続に関しては、下記参照。

- [【初心者向け】Amazon EC2にSSH接続する【Windows、Macintosh】 ｜ Developers\.IO](http://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/)

### ATOM
#### 入れたパッケージ

- japanese-menu
- linter
- linter-rubocop
- linter-erb
- linter-scss-lint

#### Rubyのインストール手順
linterを入れる為に、Rubyが必要。Macには標準でRubyが入っているが、
rbenv(Rubyのパッケージマネージャー)を使って、最新のRubyを入れた。

1. Xcodeのインストール
2. Command Line Tools for Xcodeのインストール
3. Homebrewのインストール
4. rbenv, ruby-buildのインストール
5. Rubyのインストール

それぞれ、

- Command Line Tools for Xcodeは、Homebrewを入れる為に必要。
- Homebrewは、Macのパッケージ管理システムで、rbenvを入れる為に必要。

ということみたいです。

**参考**

- [【macOS Sierra】Mac OSX 10\.12 macOS Sierra にRuby \+ Rails4 開発環境の構築 【初心者必見】 \- Qiita](http://qiita.com/keneo/items/e81bad87995fae566234)
- [【初心者向け】【Ruby】【シリーズ】MacでRubyを使えるように開発環境を作ってみよう！ \- morei blog](http://morei.hatenablog.jp/entry/2016/03/05/111627)

### Vagrant + VertualBox
Macでは、Homebrew Caskを使って、コマンドでインストールできる。下記を参照。

- [Rails開発のための仮想環境をvagrantでつくる \- Qiita](http://qiita.com/kawasin73/items/d3513465bbe38a9a9914)
- [Vagrantのインストール（macOS編） \- Qiita](http://qiita.com/shimitei/items/11c072383195e5830b6e)
- [Homebrew Cask](https://caskroom.github.io/)