OmniAICreator/Qiita-1.07M huggingface dataset:
Evernote for Mac 6.5 Beta 1 (453071 Direct) でコードブロック登場


Evernoteの「環境設定」＞「ソフトウェアのアップデート」＞「ベータ版」＞「Enable code block」にチェック

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/101438/f9ea5916-0c7f-c06f-2a1c-54020406abf5.png "Preferences.png")


ノートのエディタ画面で「{ }」マークを選択

![note editor.png](https://qiita-image-store.s3.amazonaws.com/0/101438/b4480284-566b-78dc-169f-b2c75f1055c7.png "note editor.png")


カーソル位置にコードブロック登場
等幅フォントにより見た目がコードらしくなった

![code block.png](https://qiita-image-store.s3.amazonaws.com/0/101438/d9fffcb2-32b1-6223-e0e3-0414db7eed47.png "code block.png")


自動でシンタックスハイライトはされない
今後のバージョンアップに期待
Ethereum(geth)でプライベート・ネットワークを作る手順

以下に移行しました<br><a href="http://block-chain.jp/tech/ethereum-private-network/" title="Ethereum(geth)でプライベート・ネットワークを作る手順">Ethereum(geth)でプライベート・ネットワークを作る手順</a>
D言語で書く "イケメンなコード" ~ Base64エンコーダをワンライナーで書く ~

今回はワンライナーで`Base64`エンコーダを実装しようと思います。
発端は、「以前自分が書いたなんかよくわからないけどバグっていることだけはわかるD言語で書いた`Base64`エンコーダ」を見つけてしまい、しかもそのコードが汚かったので"イケメン"な感じで書いてみようと思って書いてみました。
`Wikipedia`の`Base64`の項に書かれている仕様をそのままコードに落としただけなので解説はしません。

では、以下にD言語での一般的なBase64エンコーダのコードを貼っておきます。


```d
import std.algorithm,
       std.string,
       std.ascii,
       std.range,
       std.conv;

R delegate(Args) Z(R, Args...)(R delegate(R delegate(Args), Args) f){
  return (Args args) => f(Z(f), args);
}

string encode(T)(T data) {
  return
    (convb =>
      (table =>
        (converted =>
          (binaries =>
            (bLen =>
              (prepared => 
                (pLen => 
                  (quotients => 
                    pLen % 4 == 0
                      ? quotients
                      : quotients ~ (remainds =>
                                      remainds.map!(remain =>
                                        table[remain]
                                      ).array.join ~ repeat("=", 4 - (pLen % 4)).join
                                    )(prepared[($ - (pLen % 4))..$])
                  )(
                    (pLen / 4).iota.map!(i =>
                      (j =>
                        4.iota.map!(k =>
                          table[prepared[j + k]]
                        ).array.join
                      )(i * 4)
                    ).array.join
                  )
                )(prepared.length)
              )(
                (quotients =>
                  bLen % 6 == 0
                    ? quotients
                    : quotients ~ (remainds =>
                                    remainds ~ repeat("0", 6 - remainds.length).join
                                  )(binaries[($ - (bLen % 6))..$])
                )((bLen / 6).iota.map!(i => binaries[(i * 6)..((i + 1) * 6)]).array)
              )
            )(binaries.length)
          )(converted.join)
        )(data.map!(i =>
          (e =>
            e.length == 8
              ? e
              : repeat("0", 8 - e.length).join ~ e
          )(convb(i, 2))).array
        )
      )((charset => 
        assocArray(
          zip(
            charset.length.iota.map!(i =>
              (e =>
                e.length == 6
                  ? e
                  : repeat("0", 6 - e.length).join ~ e
              )(convb(i, 2))),
            charset))
        )((uppercase ~ lowercase ~ digits ~ "+/").split(string.init))
      )
    )((ulong N, int base) =>
      (convbM =>
        convbM(N, N, [], base)
      )(Z((string delegate(ulong, ulong, ulong[], int base) convbM, ulong N, ulong tmp, ulong[] stack, int base) =>
          tmp ? convbM(N, tmp / base, stack ~ (tmp % base), base) : stack.reverse.map!(e => e.to!string).join)));
}
```
アプリの設定を変えずにポート番号を柔軟に変更する

ちょっと外向けにポート番号を変えたいけど元のアプリケーションは変更したくない場合、iptablesのネットワークアドレス変換機能(NAT)を使うと便利です。

例) TCPの8000番ポートで公開されているサービスを80番ポートでのアクセスも追加(元の8000番ポートでもアクセス可)

```shell-session
sudo iptables -t nat -I PREROUTING -p tcp       --dport 80 -j REDIRECT --to-ports 8000
sudo iptables -t nat -I OUTPUT     -p tcp -o lo --dport 80 -j REDIRECT --to-ports 8000
```

設定を表示するとこんな感じです。

```shell-session
% sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8000

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8000

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
```
ionicでanchorScrollを使う

ionicでアンカーを使ってion-contentをscrollさせる際にはまったのでメモ。

#1.$ionicScrollDelegateを使う
ionicではAngularJSの\$anchorScrollが使えないため、代わりに\$ionicScrollDelegateを使う。

```hoge-ctrl.js
$scope.scrollToAnchor = function(anchor) {
  $location.hash(anchor);
  $ionicScrollDelegate.anchorScroll(true);
};
```

#2.$anchorScrollの自動スクロールをオフにする
デフォルトでは、\$location.hash()でアンカーを操作した際に自動で\$anchorScrollが動いてしまうので、自動スクロールをオフにする。

```app.js
var application = angular.module('starter', ['ionic', 'starter.controllers']);
application.config(['$anchorScrollProvider', function($anchorScrollProvider) {
    $anchorScrollProvider.disableAutoScrolling();  // 自動スクロールをオフ
}]);
```

参考
https://forum.ionicframework.com/t/hashbang-scroll-cant-scroll-up-to-top-of-content-manually/633
http://knightso.hateblo.jp/entry/2014/10/23/093413
SikuliからMongoDBにアクセスする（その１）

# SikuliからMongoDBにアクセスする。

画像認識でPC操作の自動化ができるSikuli(正式にはSikuliXかもしれませんが、ここではSikuliで統一します)を、GUIテストの自動化なんかに使ってます。
SikuliのソースはPython(実態はJython)で書けるんで、JUnitとか使ってJenkinsから実行したりすれば基本的には満足なんですが、画像認識の弱点として予期せぬ表示状態になったりするとテストが失敗することがあります。
（分かりやすいところでは、勝手に表示されるWindows10への更新を促すダイアログとかね！）
なので、テストは画面イメージとか情報を多めに残しつつ動くようにしていますが、このログの扱いに困ります。

そこで、そういったログをMongoDBに登録する方法を試したいと思います。

|ソフト等|バージョン|備考|
|:------|:--------|:---|
|Windows 10 Pro||64ビット|
|Java 8|update 71|
|sikuli|1.1.1|20151126.001204-18(Jython2.7.0)|
|Java MongoDB Driver|3.0.4||

# Sikuliのインストール

Sikuliの日本語情報はあまり多くないのと、最近のJava8に入れた情報はないようなので、一応画面も残しておきます。

[ここ](http://www.sikulix.com/)からサポートされてるバージョンが落とせますが、今回は[nightly](http://nightly.sikuli.de/)から最新のsikulixsetup～.jarを落としてC:\sikuliXに配置し、実行しました。

![sikuli01.png](https://qiita-image-store.s3.amazonaws.com/0/111541/b4c96d0a-fda4-a9cb-b245-873e6cb07773.png)

Setupダイアログでは、1、2、3にチェックし、「Setup Now」。
（今回はOCR機能使わないから、3は要らないはずですが）

以後いくつかダイアログが出るので、全部「はい」で。

![sikuli02.png](https://qiita-image-store.s3.amazonaws.com/0/111541/addd4ddf-d2df-3e26-e02d-4b1905a8dc87.png)

インストールが終わると、c:\sikuliXの中にrunsikulix.cmdが出来てますので、これを実行すると次のようにSikuliのIDEが立ち上がります。

![sikuli04.png](https://qiita-image-store.s3.amazonaws.com/0/111541/3e98f163-5cc5-5222-f97f-a847fea82d04.png)

# SikuliでJava MongoDB Driverを使う。

SikuliからMongoDBにつなぐ公式ドライバはありませんが、Sikuliの実態はJythonなので[Java MongoDB Driver](https://docs.mongodb.org/ecosystem/drivers/java/)で試してみます。
（使ったのは「[mongo-java-driver](https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.0.4/mongo-java-driver-3.0.4.jar)」の方。「mongodb-driver」との違いは良く分かりません）

C:\mongoDB\mongo-java-driverフォルダに、落としたmongo-java-driver-3.0.4.jarを配置して、動作確認として簡単な検索を行ってみます。

```py:mongodb.sikuli
load("C:\mongoDB\mongo-java-driver\mongo-java-driver-3.0.4.jar")
import com.mongodb.MongoClient;

cli = com.mongodb.MongoClient( "s2016tp4" );
db = cli.getDB( "logs" );
coll = db.getCollection("os");
print("Count = %i" % coll.getCount())

d = coll.findOne();
print("TimeStamp = %s" % d.get('TimeStamp'))
print("ComputerName = %s" % d.get('ComputerName'))
```
赤枠部にコレクションのカウントや検索したデータが表示されました。
（つないでいるデータは、[PowerShellからMongoDBにアクセスする。](http://qiita.com/Helicobacter_pylori/items/a76b9d37f3bce259c990)で作ったPowerShellで登録しているデータです。）

![sikuli05.png](https://qiita-image-store.s3.amazonaws.com/0/111541/4d885236-15f6-fd49-ed3b-08f12d34e2db.png)

接続出来ることが確認できましたが、長くなったので今回はここまで。
登録（特に画像）はまた今度。

# 参考

Sikuliについては日本語情報があまりなく、以下の情報がこれまでの参考になりましたので挙げさせていただきます。

* [masuoのブログ](http://masuo.doorblog.jp/archives/cat_50052822.html)
* [[test][automation] sikuliを使ってGUI操作を自動化する](http://qiita.com/YHayama@github/items/483198cba0e7c4baa78c)
Rubyでヤマト運輸の荷物追跡

# はじめに
[Pythonでヤマト運輸の荷物追跡 - Qiita](http://qiita.com/OvKNyRgir3BuEJj/items/195c002663b3bfcccacb)
の二番煎じです。
# 利用 Web API
[[WebAPI]ヤマト運輸の配送状況を確認するAPIを作ってみた](http://nanoappli.com/blog/archives/603)
です。
なお、以下の注意に従って利用して下さい。
>##利用について

>- どなたでもご自由に使用していただいてかまいません。
- アクセスは毎秒1リクエストを超えないようにしてください。酷い場合はアクセス拒否やAPIの公開中止を行います。

# スクリプト
元のスクリプトよりも（若干ですが）高機能にしてあります。

- チェックディジットによる伝票番号確認
- 伝票未登録時でもエラーにならない

```rb:yamato.rb
#!/usr/bin/env ruby
# coding：utf-8

require 'open-uri'
require 'json'

def print_status(num_str)
  result = JSON.load(open("http://nanoappli.com/tracking/api/#{num_str}.json").read)
  puts "[最新状況]：#{result['status']}"
  puts "[配送物種別]：#{result['itemType']}" if result['result'] == 0
  puts "[配送物伝票番号]：#{result['slipNo']}"
  return unless result['statusList']
  result['statusList'].each do |info|
    puts "[時刻]：#{info['date']} #{info['time']} [状況]：#{info['status']} [位置]：#{info['placeName']} (#{info['placeCode']})"
  end
end

def digit_checker(num_str)
  return false unless num_str.to_i.to_s.size == 12
  source = num_str[0, 11].to_i
  check_digit = num_str[-1, 1].to_i
  source % 7 == check_digit
end

number = ARGV[0]
unless number
  puts "使い方： ruby yamato.rb [伝票番号]"
  exit
end
unless digit_checker(number)
  puts "この伝票番号は誤りです。"
  exit
end
print_status(number)
```
# 実行例
一部を伏せ字にしています。

```sh
$ ruby yamato.rb 123456789013
[最新状況]：伝票番号未登録
[配送物伝票番号]：123456789013
$ ruby yamato.rb 3350846W55XY
[最新状況]：配達完了
[配送物伝票番号]：3350846W55XY
[時刻]：12/27 16:33 [状況]：荷物受付 [位置]： (0X0X00)
[時刻]：12/27 16:33 [状況]：発送 [位置]：××物流システム支店 (0X0X00)
[時刻]：12/28 03:50 [状況]：作業店通過 [位置]： (0XXXX0)
[時刻]：12/28 13:05 [状況]：配達完了 [位置]：○○センター (0XX0X0)
```

# チェックディジットについて
Web API 提供者のこちらを参考にしました。
[ヤマト伝票番号の最終桁を求める計算式(CheckDigit)](http://nanoappli.com/blog/archives/369)
Let's Encrypt 証明書の有効期限を更新する

オープンβから Let's Encrypt を始めると、証明書の有効期限がそろそろ切れる時期になりました。
有効期限の更新方法を知りたい人のために書いておきます。
詳しくは、github 等自分で探して見てもらったほうがいいかなと思います。
今回は `certonly --standalone` の場合のみしか書かないので、適宜読み替えてもらいたいです。

### 方法 1

```bash
./letsencrypt-auto certonly --standalone -d <domain1> -d <domain2>
```

作成するときと同じです。
TUI で 1.今の証明書を使い続けるか、2.更新し置き換えるか、3.やめるかを聞かれます。
2 を選んで、更新してください。

![letsencrypt-renewal.jpg](https://qiita-image-store.s3.amazonaws.com/0/72490/c1373bef-aac9-9074-7443-413094542d25.jpeg)

### 方法 2

```bash
./letsencrypt-auto certonly --standalone --renew-by-default -d <domain1> -d <domain2>
```

方法 1 に `--renew-by-default` をつけると、TUI なしで更新することが可能です。
こちらだと cron でも使えそうですね。

以上
Railsから送った認証メールが迷惑メールフォルダに入ってしまう

Deviseの認証メールが迷惑メールに入ってしまう。
はいはい、よくありますねと思い対応したところ、ちょっとハマってしまったため備忘メモ

## 環境
・AWS EC2
・ドメインのDNSはお名前で管理
・メールはEC2からpostfixで送付




## 試したこと
過去のプロジェクトで、迷惑メールフォルダにはいることはよくあったので、諸々の設定ができてないんだなと思い、以下やっていきましたが撃沈

・postfixのmyhostnameとmydestinationにドメインを追加

```ruby:/etc/postfix/main.cf
myhostname = xxxx.com
mydestination = xxxx.com, localhost

```



・SPFレコード登録

```ruby:DNS
xxxx.com TXT 3600 “v=spf1 ip4:m.y.i.p include:outer-mail-service.com -all“
```

・AWSに逆引きDNS申請
　こちらが詳しいです。
　http://www.slideshare.net/AmazonWebServicesJapan/aws-42885668
　2,3日で登録してもらえます

・DKIM設定
　こちらが詳しいです。
　https://blog.apar.jp/linux/856/


しかし、相変わらず、メールは迷惑フォルダに吸い込まれていきました。。

## 解決したこと
・メールの件名を「アカウントの有効化について」→「ご登録ありがとうございます（サービス名）」に変えた

ここまで試して全部だめで、
うおーなんだこれgmail死ねとか思ってましたが、
よくよく迷惑メールフォルダに入ったメールを見てみると、
「このメッセージが [迷惑メール] に振り分けられた理由: Google の迷惑メール フィルタが検出したメッセージに類似しています。」
という記載があり、これをもとに、件名を変えてみたところ解決。

はじめからこのメッセージを真剣に読み解いていればもっと早く解決できたかもしれません。。orz
python に コマンド出力を読み込ませる

pythonからコマンドを呼ぶときには、
os.system(cmd)
を使ってたけど、結果を使う方法がないか、探したらありました。

subprocess.check_output(cmd)

コマンドに引数をつけるときには、リストにして渡す必要があるので要注意。
空白で区切ったコマンドを作って、↓こうやって呼び出すといいかも。

subprocess.check_output(cmd.split()).split('\n')

参考：
http://www.lifewithpython.com/2013/11/python-using-terminal-commands.html
http://takuya-1st.hatenablog.jp/entry/2014/08/23/022031
[Swift] [iOS] Segueによる画面転移

#目的
Navigation ControllerのRoot View Controller内のセルをタッチすると画面転移するように作成。
[HatenaBlogから移行](http://programming-touyu.hatenablog.com/entry/2015/10/19/005240)

#方法
##プロジェクトを作成
![20151018230852.png](https://qiita-image-store.s3.amazonaws.com/0/111677/d5c5c71c-78db-4fb4-0926-3dc7f8b9c82b.png)

##Navigation Controllerを追加
1. Navigation Controllerを追加
2. このままだと、View Controllerが先に起動してしまう。
3. Navigation Controller を先に起動させる必要があるので、Navigation Controllerを選択し、Is Initial View Controllerにチェックを入れる。矢印がNavigation Controllerへ変わり、先に起動するようになります。
![20151018231831.png](https://qiita-image-store.s3.amazonaws.com/0/111677/d891d5a3-9101-f0d3-68ef-4770a28cadb9.png)

##Segueによる画面転移
今回の、最大の目的であるSegueによる画面転移の方法です。
1. Root View Controllerで、Ctrlを押しながらView Controllerにドラッグし、
Segueで繋ぐ。
2. Action Segueは、showを選択。IdentifierにはToViewControllerを設定します。
![20151018233606.png](https://qiita-image-store.s3.amazonaws.com/0/111677/109b4133-8cc6-0bed-400e-f60cb6ea7343.png)

![20151018233610.png](https://qiita-image-store.s3.amazonaws.com/0/111677/148f6a6b-dc59-efae-7812-db143022f520.png)

3. さらに、Root View ControllerのPrototype Cellsの下を選択し、IdentifierにtableViewと設定する。
![20151018234743.png](https://qiita-image-store.s3.amazonaws.com/0/111677/61566802-2da1-63c9-e287-076b9548d7f3.png)

##ソースコードの作成
まず、TableViewController.swift, ViewController2.swiftを作成。

```swift:TableViewController.swift
import Foundation
import UIKit

class TableViewController: UITableViewController {
    
    // セクションの個数
    let section_num = 1
    // セクションあたりのセルの数
    let cell_num_section = 10

    
    // セクションの個数
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        
        return self.section_num
    }
    
    // セクションあたりのセルの個数
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return self.cell_num_section
    }

    // セル内部の設定
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCellWithIdentifier("tableView", forIndexPath: indexPath) as UITableViewCell
        return cell
    }
    
    // セルが選択された時の処理
    override func tableView(tableView: UITableView?, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
        performSegueWithIdentifier("ToViewController", sender: nil)
    }
}
```

```swift:ViewController2.swift
import UIKit

class ViewController2: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}
```

TableViewController.swift→Root View Controller

ViewController.swift→View Controller

にそれぞれセット。

これで画面転移ができる。
Gmailの新着メールをNode.jsを使って受信する

```js
"use strict";

const inbox = require('inbox');
const nodemailer = require('nodemailer');
const iconv = require('iconv');
const conv = new iconv.Iconv("UTF-8", "UTF-8");
const MailParser = require("mailparser").MailParser;
const mailparser = new MailParser();

const auth = {user: 'xxxx', pass: 'xxxx'};

var imap = inbox.createConnection(false, 'imap.gmail.com', {secureConnection: true, auth});

imap.on('connect', function() {
	console.log('connected');
	imap.openMailbox('INBOX', function(error) {
		if (error) throw error;
	});
});

imap.connect();

imap.on("new", function(message) { 
  	console.log('日時:' + message.date);
  	console.log('送信者:' + message.from.name + '-' + message.from.address);
  	console.log('タイトル:' + message.title);
  	
  	imap
  	.createMessageStream(message.UID)
	.pipe(mailparser)
  	.on("end", function(mail) {
  		console.log(mail);
	});
 
});
 
imap.on('new', function(message) {
/*
	var smtp = nodemailer.createTransport('SMTP', {
		port: 465,
		host: 'smtp.gmail.com',
		secureConnection: true,
		auth
	});
	smtp.sendMail({
		from: 'ぁゃぴぼっと<' + auth.user + '>',
		to: message.from.address,
		subject: "ぁりがと",
		text: "登録したょ"
	}, function(e, res) {
		console.log(e ? e.message : res.message);
		smtp.close();
	});
*/
});
```
Mac OS X でEPUBを手動でパッケージングする AppleScript

## はじめに

　Mac で EPUB ファイルを作るにはオーサリングツールを使う方法もあるのですが、手動で ZIP 圧縮する場合、Finder の圧縮では問題があるらしく、コマンドを複数入力する必要があってめんどうなようです。<br />
　ということを、はてなダイアリーの、この記事で知りました。

* Mac OS Xで手動でepubのパッケージングをする方法<br />
　http://d.hatena.ne.jp/gonoverdrive/20160131/1454222147

## 触発されて自動化するスクリプトを書いた

　上記の記事の文末に、自動化するスクリプトを誰か作っているかなとあったこともあり、AppleScript で書いて見ました。

　書いたまでは良いのですが、手元に EPUB3 の元となるデータがありませんので、テストをしておりません。デバッグなしの状態で公開しますので、人柱絶賛募集中です（笑）


```AppleScript:pack2epub3.scpt
-- EPUB3 のパッケージングを半自動化するスクリプトです。
-- Author: ynomura.com
set targetFolderName to POSIX path of (choose folder with prompt "パッケージ対象のフォルダーを選択してください")
display dialog " 出力するEPUBファイルの名称を入力" default answer "hoge.epub"
set outputEpubFileName to text returned of result

do shell script "cd " & targetFolderName
do shell script "cd .."
do shell script "zip -0 -X " & outputEpubFileName & " mimetype"
do shell script "zip -r " & outputEpubFileName & " " & targetFolderName
do shell script "zip -d */*.DS_Store"

display dialog "パッケージの内容を確認しますか？" buttons {"する", "しない"} default button "する"
if button returned of result = "する" then do shell script "unzip -l " & outputEpubFileName
```
angular　サンプルの実行

##サンプルを動かすための環境##
ネットやgithubに公開されているザンプルを動かす方法メモ

##お勧めの方法##

⓵まずはCordova環境をつくり、サンプルを動かす。
⓶次にyeomanでgenerator-angularかgenerator-angularjs-cordovaで環境をつくる。
⓷　⓵で作成したＷＷＷの内容をごっそり⓶のappにコピーして
grunt serveで動かす。

###勧めの理由###

cordovaのプロジェクトはyeomanよりシンプルです。ゲームでも、3Dでも直感的に構成できます。詳しいしくは後日。
作成したファイルの更新日時をテキストで取得する

###これは何？
実験で計測したデータファイルの作成日時を取得して、他のデータと同期させるために使ったもの

###サンプル

```cmd:get-time.bat
@echo off
for %%i in (%*) do echo %%~ti >> time.txt
rem 上書きモードじゃないと１行しかできない…
```

あとはこのバッチファイルに日時を取得したいファイルをドラッグアンドドロップするだけ
protractorでAzure AD ログインしてみる

protractor 実行下でAzure AD（以下、AAD）にログインしてみた。
※AADログイン画面へのURL生成手順等は割愛。

自アプリから画面遷移してAADでログインする際、
browser.driver.sleepを使用してProtractorのコード実行タイミングを調整。 

```js:test.spec.js
'use strict';

describe('My App', function() {

  // 認証情報
  var EMAIL = "test@test.onmicrosoft.com";
  var PASSWORD = "Abc1234567";

  // AngularJSを使用していないページでのテストを許可
  browser.ignoreSynchronization = true;

  // AADログイン画面へのURLなどを指定、遷移するページ
  var LOGIN_URL = "http://localhost:****/login";

  it('Azure Login', function() {

    // ログイン画面に遷移
    browser.get(LOGIN_URL);
    
    // 自アプリからAADログイン画面への遷移が完了するまで待機
    browser.sleep(10000);

    // メールアドレスを設定
    browser.findElement(By.id("cred_userid_inputtext")).sendKeys(EMAIL)

    // パスワードを設定
    browser.findElement(By.id("cred_password_inputtext")).sendKeys(PASSWORD);

    // Input入力直後に発生する Loading を待機
    browser.sleep(2000);

    // サインイン 実行
    browser.findElement(By.id("cred_sign_in_button")).click();

    // 自アプリのメインページ遷移完了までスリープ
    browser.sleep(10000);

    expect(element(by.id("loginuser")).getText()).toEqual("user name");

  });
});
```

protractor 1.7.0  
フォーム入力時に発生する Loading の最中は、サインインボタンがクリック無効になるっぽいのでsleepで回避した。
AngularJSを使用しないページで画面遷移やAjaxを待機するのに、sleepを使わない方法もあるみたい。
参考：
- [Protractor の Angular 同期と Angular アプリでないページのテストについて](http://qiita.com/shuhei/items/c0ae15c8625aac3d355d)
[PHP] 日時/日付/時間の差を計算する

**日数部分まで考慮したサンプルが見つからなかったので、日時の差を計算する関数を自作してみました。**

PHP5.3以降であれば、DateTimeクラスの`diff()`メソッド（または`date_diff()`関数）を利用しての差分計算もできます。
⇒ <a href="http://php.net/manual/ja/datetime.diff.php" target="_blank">PHP: DateTime::diff </a>

# ![](//goo.gl/tuSQrq) サンプルコード

```php:PHP
<?php
$from = strtotime("-3600 second"); // 現在から3600秒前（＝1時間前）
$to   = strtotime("now");          // 現在日時
echo time_diff($from, $to);
// 結果：0days 01:00:00

$from = strtotime("2016-01-01");  // 2016年元旦 (0時0分0秒)
$to   = strtotime("now");         // 現在日時
echo time_diff($from, $to);
// 結果：32days 12:34:56

$from = strtotime("2016-01-01 06:00:00"); // 2016年元旦 6時
$to   = strtotime("2017-01-01 15:00:00"); // 2017年元旦 15時
echo time_diff($from, $to);
// 結果：366days 09:00:00

//***************************************
// 日時の差を計算
//***************************************
function time_diff($time_from, $time_to) 
{
	// 日時差を秒数で取得
	$dif = $time_to - $time_from;
	// 時間単位の差
	$dif_time = date("H:i:s", $dif);
	// 日付単位の差
	$dif_days = (strtotime(date("Y-m-d", $dif)) - strtotime("1970-01-01")) / 86400;
	return "{$dif_days}days {$dif_time}";
}
?>
```
### <font color="red">～ 補足 ～</font>

- `strtotime("now")` は `time()` と同等です
- シンプルなサンプルなので、エラー処理等は考慮してません
- `$time_from < $time_to` の大小関係が入れ替わると計算結果がおかしくなってしまうのでご注意下さい（引き算の左右を入れ替えて、マイナス符号を付ければいけるかなと思います）

(･o･ゞ いじょー。
レスポンシブデザインを導入するときにつまずいた超初歩的なミス

#1. レスポンシブデザインを導入した時につまずいた…
　こんにちは、久しぶりの投稿です。
　またまたやらかしました。まだWebを触って１年なのですが、いままでデスクトップで動くことを前提としたアプリケーションばかり作っていました。
　この度、会社の仕事とは別件でサイトを作ることになり、レスポンシブデザインに対応しようと調べて、試行錯誤しながら作っていったわけです。
　どうもCSS側で

```css
@media screen and (min-width: 640px) {
}
```

　みたいなコードを書けば動くみたいだ！！と思って、書いたんですが玄人や初心者のかたでも「いやこれだけじゃ、動かないんだなー」と思っている方はその通り。これだけでは動かないんですね。
　実はhtml側でも、あるコードを挿入してやる必要があるみたいです。それを今回、備忘録的に書きます。
　動かなかったと書いていますが、もちろん全く動いていなかったわけではありません。サイトが思っていた挙動と異なる挙動を示したということです。
　どのような挙動になったか、具体的に写真を添付することが今のところできないのですが、デスクトップのサイトがそのままスマホでも表示されたので、重いし見難いという最悪なサイトが出来上がってしまったのです。


#2. 動かなかった原因
　動かなかった原因は、スマホのブラウザソフトに「僕のサイトは、あなたのデバイスの画面サイズに合わせるよー」と教えなかったことが原因です。

#3. じゃあ、どうするの？
　「僕のサイトは、あなたのデバイスの画面サイズに合わせるぞ！」ということを、どこで教えるかというとhtmlのhead要素で教えます。

```html
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1"> 
</head>
```

　これで何が変わるかというと、私のサイトのwidthはあなたのデバイスのサイズに合わせます。その初期の倍率（CSSで扱う1pxと画面のサイズにおける1pxの比率）は１ですよということを、デバイスのブラウザに教えてあげるのです。
　そうすることで、一生懸命書いたレスポンシブデザインに適応されるcssが読み取られます。

#4. おまけ
 viewportのcontentの中身は、様々なパラメータがあります。以下のサイトを参考にしてみてください！
http://blog.javierusobiaga.com/stop-using-the-viewport-tag-until-you-know-ho

#5. 参考サイト
http://blog.javierusobiaga.com/stop-using-the-viewport-tag-until-you-know-ho

#6. 質問やご意見などなど
　質問やご意見、「ここ間違ってるぞコラ！」みたいなのがあれば、以下のメールアドレスまでメールいただけると喜びます。
　この記事にコメントつけてもらってもOKです！
　よろしくお願いします。
　akira.kashihara@a-dawn.net

#7. 改訂記録
2016年2月2日 新規記入、タイトルのミスを修正（挿入→導入）
2016年2月4日 読者の方から頂いた修正を反映（コードの色を表示）
[Swift] 数値を画像に変換するライブラリを書いた


とてもニッチですが、必要に迫られたので作りました。
https://github.com/taketin/DieCast

## 使い方

README に書いていますが、`Carthage` もしくは `CocoaPods` で入ります。

`import DieCast` して、以下のようなコードを書くと


```swift
if let diecast = DieCast(material: 1234567890) {
    let diecastView = diecast.press()
    view.addSubview(diecastView)
}
```

![スクリーンショット 2016-02-01 23.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/4497/fe500159-093b-1864-998a-33adbc65813c.png "スクリーンショット 2016-02-01 23.56.02.png")

こんな感じで、数字が画像に変換されます。
今のところ用意している画像はスクショの1種類しかありませんが、以下の様に独自の画像を設定できます。

```swift
if let diecast = DieCast(material: 1234567890, type: IntCast.Custom, filenamePrefix: "your_image_prefix_") {
    let diecastView = diecast.press()
    view.addSubview(diecastView)
}
```

独自の画像を使用する際は、ファイル名を `your_image_prefix_[0-9].png` みたいにして、0 から 9 までの数字画像を用意して、Asset Catalog で利用してください。

リポジトリに Demo App が入っていますのでそちらもご覧ください。

### オプション

- もと画像サイズへの倍率、または `height` によるサイズの指定
- 画像間のマージン

が以下の様に設定できます。

```swift
if let diecast = DieCast(material: 1234567890) {
	// 倍率による指定
	diecast.magnification = 0.06

	// 高さによる指定 (magnification が設定されている場合はそちらが優先されます)
	diecast.height = 30.0

	// 画像間のマージン指定
	diecast.margin = 5.0

    let diecastView = diecast.press()
    view.addSubview(diecastView)
}
```

## おわりに
ニーズがあると嬉しいです :smiley:
リモートワークの種類を分別してみる

## 課題意識
+ リモートワークについての記事をいろいろと読んでみると、書いている方によって前提となる内容に差があるような気がした
+ どのようなタイプがあるのか、のメモ


## タイプ一覧
### Type1 : 組織に属し、オフィスがありながらも在宅で働くスタイルのリモートワーク
おそらく多くの人にとって一番イメージに近い形のスタイル。
企業によっては、週２回までを許可だったり、上長の承認を受ければOKだったり、最近部分的な導入も広まってきている印象。

組織によって受け入れ状況はまちまちだと思うが、リモートワークを前提としたワークフローを、執務室の中でも構築できているか、というところでうまくいく・いかないが分かれている気がする。
仕組みとして存在しても、全員がリモートワーク前提の意識で働いていないと、部分的な採用はうまく行かなそう。


### Type2 : いわゆるノマドなフリーランス的なリモートワーク
個人事業主、もしくはそれに準ずる規模の法人を運営していて、自分の好みの場所で仕事をしているパターン。基本的には、社外の人と業務委託なり協業なりをしている。

同じチームというのではなく、違う組織の人が集まっているという働き方なので、リモートワークという感覚も少ないかもしれない（リモートではあるのだが、協力会社への外注のように、そうであることが前提となっている印象）


### Type3 : 同じ社内で異なる拠点間でのリモートワーク
例えば、東京本社と福岡支店での共同Projectをやっている、といったタイプ。
自分もベトナム<>東京でこのタイプのリモートワークを経験したことがあるが、上記したType1の在宅ワークよりもリモートで働くことについて受け入れやすい（そもそもリモート以外の選択肢がないので）感じがした。

ツールの導入や、ワークフローをリモートワーク向きに改善していくことも進めやすい。


### Type4 : 異なる企業間のリモートワーク
同じプロジェクトを別の場所の別の企業と行っているパターン。”リモートワーク”とはいわない方が一般的かもしれない。

とはいえ、同じチームとして、リアルタイムに働けた方が効率的な場合があると思う。ただ、なかなか心理的な壁があり、効率的なリモートワークの進め方を導入できてないことが多い。
（自分が見た例だと、、チャットでなくメールでの連絡中心だったり、気軽なビデオチャットやスクリーンシェアに抵抗があったり、、ということがあった）

## まとめ
個人<->集団, 社内<->社外 というところが、働き方のイメージをだいぶ変えている。
「リモートワークの導入がうまくいかなくて〜」といった話があったときに、課題を切り分けて考えてみないと話がかみ合わないかも。
CoffeeScript 名前空間



Rails とかで JavaScript をメインに使っていて、CoffeScript を混ぜ始めると、JavaScript と同様にグローバルで関数などを作ろうとして、ハマりました。

CoffeeScript で

```coffee
method1 = (args) ->
  # do something
```

と書くと、自動的に

```javascript
(function() {
  var method1;

  method1 = function (args) {
    # do something
  };
})();
```

となり、グローバルではなく、ローカルで処理しようとするので、他のところで使えなくなってしまいます。

代わりに

```coffee
window.YourNamespace or= {}  # 既にある場合に再定義しないように
ns = window.YourNamespace

ns.method1 = (args) ->
  # do something
```

と名前空間に入れてあげると他のところ（他の JavaScript ファイルなど）でも使えるようになります。

#### 参考リンク

[Namespacing in coffeescript - Stack Overflow](http://stackoverflow.com/questions/8090998/namespacing-in-coffeescript)
Slack |  Ctrl + . でサイドバーの表示/非表示を切り替える | ショートカット

表題の通り。 ( . はドット )

## Windows

`Ctrl + .`

## Mac

`Command + .`

## 動作

出したり。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/04b76904-2841-ae4b-3847-ed18a3a6435a.png)

消したり。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/e2f716b7-dd9b-6472-40ab-411d433c7ee4.png)

また出したり。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/04b76904-2841-ae4b-3847-ed18a3a6435a.png)

地味に便利。

# 環境

- Slack Version 1.1.2 (Mac OS X)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
カーネルモジュールのコンソールへのログ出力抑制(printkのログレベル変更)

シリアル等で接続している時に、カーネルモジュールのログで画面が更新されて操作に支障があるときに使用する

```bash
echo 0 4 1 7 > /proc/sys/kernel/printk
```

# 参考
[linuxカーネルのログレベル | Dear プログラマー](http://w3c.digital-rc.sub.jp/?eid=30)
[障害発生時の金科玉条：第2回　PD思考法の基礎と情報収集（その2） (1/3) - ITmedia エンタープライズ](http://www.itmedia.co.jp/enterprise/articles/0512/15/news008.html)
[コンソールログレベル - Linuxの備忘録とか・・・(目次へ）](http://wiki.bit-hive.com/north/pg/%A5%B3%A5%F3%A5%BD%A1%BC%A5%EB%A5%ED%A5%B0%A5%EC%A5%D9%A5%EB)
VMWare vSphere 6へのアップグレードでのハマり事 1

VMWare vSphere環境を5.5から6へアップグレードしようとしたときにハマったこと。
ESXi数台とvCenter Appliance(vCSA)というありがちな構成。

流れとしてはvCSAを上げた後ESXiを上げる。

## まず絶対にアップグレード前のvCenter Applianceのスナップショットを取っておこう
スナップショットを取らないと後で詰むことがあるので、必ず取得しておく。

## 名前解決が出来る環境を作る
ESX5.5でも必要とされてるようなので、作成している人は多いと思うけど、ここがちゃんとしていないとこれまた詰む。
※hostsに書いてなんとかするとかできたみたいだった
DNSが無いとアップグレードができないので、仮想環境内にdnsmasqあたりでさくっと作成するのが吉。

なお、vCenterやESXiの名前についてはFQDN形式で付ける。
逆引きできるかも確認しておく。

## SSOのPW確認
vCSAの管理画面にログインして、[SSO]タブにある管理者PW設定のところでPWを設定しておく。
今後はこのPWを使うようになる。

## ホスト名がFQDNで書いてあるか確認
vCSAの管理画面にログインして、[Network]タブでホスト名がFQDNで書いてあるかを確認する。
書いていなかったら変更して、[admin]タブの「Certification regeneration」を有効にして「submit」を押す。
そして[System]タブでvCSAを再起動しよう。
再起動後VMWare HAがエラーを吐くので、VIClientでログイン後[VMWare HA用に再構成する]を押して再構成する。
再構成してもエラーがすべて消えない場合は、一度VMWare HAを無効にした後再度有効にする。
また、Web Clientでもログインして操作できるか確認しておこう。
最後に改めてvCSAの管理画面にログインして、[admin]タブの「Certification regeneration」を無効にして「submit」を押す。

## もう一回スナップショットを取る
ここでもスナップショットを取らないと後で詰むことがあるので、必ず取得しておく。

## vCSAのアップグレード
「vcsa-setup.html」をブラウザで開いてアップグレードをすすめるわけだが、これはIEじゃないとどうもうまくいかない。
クライアント統合なんてのもインストールしないとならないので、Windowsオンリーだしね。

### 不親切なところ
2番のターゲットサーバはvCSAがインストールされているESXiのこと。
3,4番のvCSAの指定はFQDNで設定しておこう。
4番で「Newly deployed appliance FQDN will be set to〜」という警告が表示されたら、FQDNでホストが設定されていない。
前の項目に戻って指定し直そう。
設定したはずが同じような文字列が出てきてしまう場合、hostsファイルに短い名前で記述がある可能性がある！
DNSを設定しているので、hostsを編集しよう。

## とここまでいろいろ書いてきたけど
結局うまくいかなくて新しいvCenterを立ててしまった自分がいる。
アップグレード自体は完了しても、その後Web Clientに接続できない状態…
VMWare HAとvMotionが使えればOKな環境だったので、新しいサーバでも問題無かったし…

なお、切り戻しとして一度vCenter 5.5に戻したとき、アップグレードの残骸では駄目でスナップショットに戻しましたので、スナップショットを取っておくのは大事！
多分残骸でうまく動かなかったのがアップグレード失敗の原因な気もする…

んでも、ここまでごちゃごちゃやっても仮想サーバの動作に影響を与えないってのがVMWareのいいところかも。

## vCenterはアップグレードしたけど
まだしばらく使うのでこの段階ではまだ切り替えてません。
ちゃんとアップグレードできてたら不要ですが…
vvvvからOSCでMayaを操作する

# VVVVからOSCでMayaを操作する

## MayaのOSC受付環境を作る
### pythonスクリプトのダウンロード
　MayaでOSCを受け付けるために以下のURLからスクリプトをダウンロードする
- OSC.py
- simpleOSC.py

　[OSC.pyのダウンロード](https://pypi.python.org/pypi/pyOSC/0.3.5b-5294)
　[simpleOSC.pyのダウンロード](http://www.ixi-software.net/content/body_backyard_python.html)

### pythonスクリプトをMayaのpythonフォルダに配置する
　Osc.pyとsimpleOSC.pyを以下の場所に配置する
　(アプリケーションのインストールフォルダ)\Autodesk\(Maya version)\Python\Lib\site-packages\maya

これで、以下のように記述することで、simpleOSCのメソッドを呼ぶことができ、MayaでOSCを操作することができるようになる

```python
import maya.simpleOSC

maya.simpleOSC.initOSCClient(ip='127.0.0.1', port=11112)

```

### Maya側の受付準備

1. cube（名前はpCube1）を作成する
2. scriptエディタで以下のソースを実行

```python
import maya.cmds
import maya.simpleOSC

def moveObj(addr, tags, data, source):
    print "%s\n" % data
    cmds.setAttr( 'pCube1.translateX', data[0] )

maya.simpleOSC.print_Test()

maya.simpleOSC.initOSCClient(ip='127.0.0.1', port=11112)
maya.simpleOSC.initOSCServer(ip='127.0.0.1', port=11111, mode=0)   
maya.simpleOSC.setOSCHandler('/vvvv', moveObj)

maya.simpleOSC.startOSCServer()
#maya.simpleOSC.closeOSC()

```

maya.simpleOSC.closeOSC()を実行することで接続を解除できる。
Handlerの修正をした際には一度接続を解除してから、再度接続するようにする。

## vvvvのOSC送信準備をする
　vvvvをダウンロードした際にサンプルコードも一緒に入っている。OSCのサンプルコードを開き、OSCを送信している箇所を参考にする
(vvv.exeがあるPath)/girlpower/IO/Networking/2_Advanced (OSC)/00_OSC_Examples_1.v4p
![sendOSC.png](https://qiita-image-store.s3.amazonaws.com/0/111261/ec18d5ce-293c-0dc2-442a-1d4deb557411.png)

　送信するPort番号をMayaと揃える。（今回はmaya.simpleOSC.initOSCServerをport=11111としているので、vvvvにも11111を設定する）
maya.simpleOSC.initOSCServer(ip='127.0.0.1', port=11111, mode=0)  

IPが違うPC同士で操作するのであれば、IPも設定する。（今回は自分のPCの中で操作するので、ip=127.0.0.1 or localhostに設定してある）

## vvvvでMayaを操作する

1. cubeのx座標を0にする![MayaControl01.png](https://qiita-image-store.s3.amazonaws.com/0/111261/b140a1df-c763-996b-fef0-46641bafdabc.png)
2. vvvvの値を変更しmayaのcubeのx座標を確認する![MayaControl02.png](https://qiita-image-store.s3.amazonaws.com/0/111261/00d21bea-a31b-38ff-2693-86f682c3156f.png)
WordPressでアイキャッチ画像の登録をphpから行う

いつも忘れてしまうので備忘録。
WordPressのアイキャッチ画像をプログラムで登録したい場合のコード。
サーバ上のどこかにアイキャッチにしたい画像がすでにある前提です。

＜手順＞
1. 画像のメタ情報を取得
2. アタッチメント登録
3. 該当のポストにアイキャッチとして登録

## サンプルコード
```php:functions.php
$upload_path = "upload_dir/path/filename.png"; // アイキャッチ画像のサーバ上のファイルパスを指定(※URLではない)

// ファイルメタ情報登録
$meta = getimagesize($upload_path);
$attachment = array(
  'post_mime_type' => image_type_to_mime_type($meta[2]),
  'post_title' => preg_replace('/\.[^.]+$/', '', $upload_path),
  'post_content' => '',
  'post_status'	=> 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $upload_path, $post_id );

if($attach_id) {
  require_once(ABSPATH . "wp-admin" . '/includes/image.php'); // これが必要
  $attach_data = wp_generate_attachment_metadata( $attach_id, $upload_path );
  wp_update_attachment_metadata( $attach_id,  $attach_data );

  // ファイル添付が完了したらアイキャッチとしてpost_metaを更新
  update_post_meta($post_id, '_thumbnail_id', $attach_id);
}
簡単に複数サイトでパスワードを使い分ける

OPEN IDが安定して使われるようになりました。しかし
複数サイトで同一パスワードを使いまわす問題は今でも残っています。

近年はIDがメールアドレスのサイトも多いです。
パスワードが同じだと個人情報を登録した先から漏洩すると
複数の登録先サイトでハックされる可能性があります
（善良なサイトではパスワードは一方向のハッシュという方法を使い
漏洩しても他のサイトで使えませんが、実装はサイトの判断です）。

こんな時、現在普及したユーザー環境を利用して
こんな安全なパスワードを作れ！

*仕組　①生成コード　+　②今使いまわしているあなたのコード*

②今使いまわされているあなたのコード。
uicu44w2とかqwertyというそれ。

①は、サイトのドメイン文字列を使います。
qiitaなら、最後のaは10進数の11です。
ドメインは0~zまで使える36進数と見立てられますよね。そこで
たった1つのマイルールでコンバートした10進数を①に入れます。

例　11 + uicu44w2 でパスワードは　11uicu44w2

*マイルールはたった1つでいいのです。ただし絶対的な1つ。*
上の例は、ドメインネームの最後の1文字を10進数にする。それだけ。

しかし*ドメイン文字列の最後の一文字だけのコンバートでは
あなただけのルールとはいえません。*

最後の2文字をコンバート
tは36進数の30番目
aは36進数の11番目ですね。　

足すと41　なら　41uicu44w2
引くと19（－になったら絶対値）なら19uicu44w2
掛ける330（数字が大きいので桁数を決める）なら330uicu44w2
割る3.272（桁数を決める。小数点削除）なら3272uicu44w2

決まった数　たとえば　45 を足したり
別のn進数　 にコンバートしてもいい。
ドメインの最初の4文字でもいいし、最後の1文字を2回使ってもいい。

一見複雑ですが、覚えるルールはたった1つでいいのです。
少し複雑なルールを1つ作るだけで、漏洩パスから他のサイトパスは
漏れません。アカデミックな観点からはもっとできますが、
現在の一般的ユーザーが九九程度のこの頭の体操を覚えておくだけで、どんどん怪しげなサイトに登録できます!

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
おまけ：Gmailを使うと.と＋を使ってメールアドレスがいくらでも
持てます。
yamada@gmail.comとya.ma.da@gmail.comとyamada+1@gmail.comは
すべてyamada@gmail.comに届きます。

* * *


参考：http://bloggingfrom.tv/wp/2013/08/26/11195
”パスワード管理術その2: サービスごと覚えやすいパスワードを作る”
IonicでAndroidの戻るボタンを無効化する

IonicでAndroidアプリを作る際に、メニューバーの戻るボタンを無効化する方法です。

```app.js
angular.module('starter', ['ionic', 'starter.controllers'])
.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    :
  });
  // androidの戻るキーを無効化
  $ionicPlatform.registerBackButtonAction(function(event){
    // 何もしない
	}, 100);

});
```
簡単にかっこいいメニューを実装したい！jQueryプラグイン　OffCanvasMenuEffects(sideslide)実装方法


##はじめに
いざ、プラグイン実装しようとしたときに調べて、はいできたー！と
なかなか上手くはいかないものです。（いつもどこかしら修正してる笑）

なので、今回修正した部分をログとして残し、同じ失敗をしないようにと思い書こうと思った所存です。


##ソースコード
###[OffCanvasMenuEffects](http://tympanus.net/codrops/2014/09/16/off-canvas-menu-effects/)からソースコードをダウンロード。


##使用するファイル
ダウンロードしたファイルを使うフォルダへ移動

**CSS**
　`OffCanvasMenuEffects/css/menu_sideslide.css`

**JavaScript**
　`OffCanvasMenuEffects/js/classie.js`
　`OffCanvasMenuEffects/js/main.js`

**HTML**
　`OffCanvasMenuEffects/sideslide.html`ファイルの一部

```sideslide.html　使用する部分
<div class="container">
  <div class="menu-wrap">
    <nav class="menu">
      <div class="icon-list">
        <a href="#"><i class="fa fa-fw fa-star-o"></i><span>Favorites</span></a>
        <a href="#"><i class="fa fa-fw fa-bell-o"></i><span>Alerts</span></a>
        <a href="#"><i class="fa fa-fw fa-envelope-o"></i><span>Messages</span></a>
        <a href="#"><i class="fa fa-fw fa-comment-o"></i><span>Comments</span></a>
        <a href="#"><i class="fa fa-fw fa-bar-chart-o"></i><span>Analytics</span></a>
        <a href="#"><i class="fa fa-fw fa-newspaper-o"></i><span>Reading List</span></a>
      </div>
    </nav>
    <button class="close-button" id="close-button">Close Menu</button>
  </div><!-- /menu-wrap-->
  <button class="menu-button" id="open-button">Open Menu</button>
  ...
  ...
</div><!-- /container -->
```


## ファイル修正

###HTML
sideslide.htmlにある`<div class="container">`のクラス名はよく使われていて競合する可能性がある。
自分で定義したものがあったり、bootstrapを使っていてmargin: 15pxってなに？
と時間をロスしてしまうかもしれないのでクラス名を変えておこう。

※例

```sideslide.html　変更箇所
<div class="container"> // 下のクラス名に変更
<div class="menu_container">
```

###CSS
sideslide.htmlの変更を終えたら、対応するmenu_sideslide.cssの中にあるコードから、
最初に使われていた`.container`を探して`.menu_container`に修正する。

```menu_sideslide.css　修正部分
html,
body,
.container, ←この部分
.content-wrap {
	overflow: hidden;
	width: 100%;
	height: 100%;
}

.container { ←この部分
	background: #373a47;
}
```
`←この部分`のコードを`menu_container`に変更する。

###JavaScript
一番やっかいだったのがこれ。

```main.js
(function() {
	...
	...
}
```
組み込む際にはDOM要素読み込みんでから動作して欲しいので、
$ を追加してあげる。
`$(function() {`に変更してあげて終わり。

#最後に
実装して使ってみると気持ちいいですね！
angular の勉強で一番困ったこと

環境の設定については、あふれるほど記事があるのに、又サンプルも豊富に紹介されている。が、しかし肝心なことが、(私だけだと思いますが)ほとんど書かれていない。どうして？
例えば、angularの開発環境はgeneratorを使って簡単に作成できる。しかし次のような簡単なサンプルをgeneratorで作成したプロジェクトで実行するにはどいしたら良いのだろう？

```html

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
</head>
<body ng-app ng-init="name = 'World'">

    <h1>Hello, {{name}}!</h1>

</body>
</html>
```

![app.JPG](https://qiita-image-store.s3.amazonaws.com/0/13811/00bcf35b-f8e0-02a8-bf02-45b23771a086.jpeg)

上のサンプルをappにコピーしても動かない。

##どうしたら動いたのか##

以前にCordova環境でangularとの組み合わせでthreejsなどをを動かしたことがある。
実はこのサンプルがgenerator-angular-cordovaやgenerator-angularですんなりと動いた。

そこでいったん***Cordovaで開発し、yeomanに持ってきて***動かした次第である。

なぜそのようなことができるのか、appは独自で動いているのか、app以外はどのような役割をもっているのか？

現時点では不明。
ionicでngDraggableを使う

AngularJSでドラッグ&ドロップをするためのライブラリ"ngDraggable"をIonicで使用する方法です。
少しはまったのでメモ。

#1.bowerでngDraggableをインストール
`bower install ngDraggable`

#2.ngDraggableをindexにセットする

```index.html
<script src="lib/ngDraggable/ngDraggable.js"></script>
```

#3.ドラッグするオブジェクトに各種ディレクティブを追加
```hoge.html
<div ng-drag="true" ng-drag-data="{obj}" ng-drag-success="onDragComplete($data,$event)" ng-center-anchor="true">
  Draggable div
</div>
```

#4.ドロップされるオブジェクトに各種ディレクティブを追加
```hoge.html
<div ng-drop="true" ng-drop-success="onDropComplete($data,$event)" >
  Drop area
</div>
```

#####drop成功時に実行するfunctionはcontrollerに記述する
```hoge-ctrl.js
app.controller('MainCtrl', function ($scope) {
    $scope.onDragComplete=function(data,evt){
       console.log("drag success, data:", data);
    }
    $scope.onDropComplete=function(data,evt){
        console.log("drop success, data:", data);
    }
 };
```

#5.data-tap-disabledをドラッグするオブジェクトに追加
Ionicでは通常のngDraggableの使い方だと動かないので、下記のディレクティブが必要。
`data-tap-disabled=“true”`

参考
https://forum.ionicframework.com/t/drag-and-drop-directive-not-in-list/4540
https://github.com/fatlinesofcode/ngDraggable
python3: リストに指定したものが入っているか確認する方法、どの方法が一番処理速度が早いのか

メソッドによってはリスト以外でも対応できるかもしれませんがここでは<a href="http://cs61a.org/proj/hog/" target="_blank">宿題として出されたプロジェクト</a>の一環として調べていただけなのであえてリストと指定した。

#リストに指定したものが含まれているか確認したい時
```
if myItem in list: #if myItem not in listも可
    # do something
```

```
myset = set()
myset.add(item)
```

理由はわかりませんがセットのほうがいいようです。恐らくリストの中身に入れる数の量やリストの順番と深く関係しているような気がしますが。

どうやらタプル、セット、ディクショナリに上手く適用できるようです。ちなみにstackoverflowのコメントによると`in`というのは`list.__contain__`というメソッドを呼んで動かしているらしいのでこれをクラスに応用できるんだとか。例はサイトより引用

```
>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>> 
```

#リストの中のストリング数字が全て数字か確かめて全て数字に変えたい。
`myList = [1,2,3,4,5,"apple", 9, "orange"]`みたいなのがあったときにどうやってリストが数字を含んでいるか確かめたい。

```
mynewlist = [s for s in mylist if s.isdigit()]
```

こういうやり方もあるようです。`str`としてではなく`int`として返ってきますが。

```
new_list = []
for value in mylist:
    try:
        new_list.append(int(value))
    except ValueError:
        continue
```

```
try: 
new_list.append(str(int(value)))
```

を足せば

[ここ](https://docs.python.org/2/library/stdtypes.html#str.isdigit)によると`var.isdigit()`はもし全てのストリング値の中身が数字で且つリストの中に1つ以上ストリンが入っていれば`True`を返しそうでないなら`False`を返す。

#結局どのやりかたが一番早いのか

詳しくは[ここ](http://stackoverflow.com/questions/7571635/fastest-way-to-check-if-a-value-exist-in-a-list)を参考に。

##3.8秒

```
a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"
```

##1.9秒

```
a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
Else:
    "Do something with variable b"
```

##2.74秒

```
a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)
```

ちなみにセットでやると処理速度が更に早くなるとか。

この文脈でいくなら結局`7 in a`が一番早いのではないかという結論に。

#参考にしたリンク
- [Is there a short contains function for lists in Python?](http://stackoverflow.com/questions/12934190/is-there-a-short-contains-function-for-lists-in-python)
- [The Python Standard Library](https://docs.python.org/2/library/stdtypes.html#str.isdigit)
- [Python check if list items are numbers](http://stackoverflow.com/questions/16908186/python-check-if-list-items-are-numbers)
- [check if a number already exist in a list in python](http://stackoverflow.com/questions/14667578/check-if-a-number-already-exist-in-a-list-in-python)
- [Fastest way to check if a value exist in a list](http://stackoverflow.com/questions/7571635/fastest-way-to-check-if-a-value-exist-in-a-list)
サーバーで使用しているmySQLのクエリを確認する方法

# 概要
ソースからクエリを探すのは面倒なので、実行されたクエリをファイルに保存する**クエリログ**を利用します。

# 方法

`c:\xampp\mysql\bin\my.ini`に次の記述を追加し、再起動します。
確認後は、元に戻します。

```:my.ini
[mysqld]
general_log = 1
general_log_file = "C:\xampp\mysql\data\query.log"
```

# 参考
http://www.puniokid.com/tips/mysql/88/
そのうち使いたい決済サービス

大学のサークル内チャットで話題になったもののまとめ

# [Komoju](https://www.degica.jp/products/komoju/)

- コンビニ決済やWebMoneyにも対応してて良さそう

# [WebPay](https://webpay.jp/)

- アドベントカレンダーもあって　情報が多そうなイメージ
- 手数料も安そう

# [PAY.jp](https://pay.jp/)

- 手数料安そう

# [FastPay](https://fastpay.yahoo.co.jp/)

- Yahooのやつ
- Yahooアカウント要求してて強気
- Tポイント対応してるみたいで面白い
git diff や git show で複数のエンコードのファイルを扱う

Shift-JIS のファイルの差分を見たくても、コンソールがUTF-8なので毎回文字化けして読めない。

diffのハイライトも表示したかったし、ページャも使いたかったから `git diff <file> | nkf -w | pygmentize -l diff | less -R` とかしてたけど、いちいち打つのがめんどくさいので普通の `git diff` で表示できるように設定したかった。

### 前提条件

* どのファイルが Shift-JIS のテキストファイルであるか指定できる
* 検証したのは Mac OS X

## `.gitattributes`

`.gitattributes` に色々記述することで、ファイルにgit上の属性値をつけることができる。

```:.gitattributes
*.txt diff=sjis
```

`*.txt` を扱うときには `diff=sjis` がセットされるようになるので、 `git config` 内のキーとして使える。

## `git config diff.<driver>.textconv`

`diff=<driver>` 属性が設定されたファイルに対してdiffを実行する前にテキスト化するコマンドを指定する、という設定項目。

有名なところだと `docx` や `xlsx` などをテキスト化して差分を見るなどがあるが、今回はこれを文字コード変換に使ってみる。

```
$ git config diff.sjis.textconv "iconv -f sjis"
```

こうしておけばShift-JISのファイルを一度 `iconv` コマンドで文字コード変換してからdiffを取るようになる。
属性のついていないファイルはいつもどおりのdiffになるので、 `git show` などで複数のファイルが表示される時も安心。

## 参考

[Git - Gitの属性](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7)
Scala.jsでローカルにあるファイルをテストに利用する

[Scala.js](http://www.scala-js.org/)メモ4つ目

# 環境
|ソフトウェア|バージョン|
|:---|:---|
|Scala|2.11.7|
|Scala.js|0.6.6|
|sbt-httpserver|0.3.1|

# 目的
Scala.jsでクライアント側の処理を書いている時，ローカルにあるファイルをテストに使いたいと思った．
本来データはWebサーバから取得するのだけど，テストのたびに本番サーバにアクセスする訳には行かない，真面目なテスティングサーバを用意するのは面倒でやりたくない，といった感じの状況．

そこで，`src/test/resources/`にhtmlファイル等を置き，そこへアクセスする事で，テストを書きつつ本番サーバへのアクセスをなくす，という戦略を考えた．

# sbt-httpserver プラグイン
調べたら具合の良いプラグイン([sbt-httpserver](https://github.com/wav/sbt-httpserver))が見つかったので試してみた．まず，`plugins.sbt`に

```scala
/* sbt-httpserver */
resolvers ++= Seq(
  Resolver.url("wav", url("https://dl.bintray.com/wav/maven"))(Resolver.ivyStylePatterns),
  "Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases") // scalaz-stream
addSbtPlugin("wav.devtools" % "sbt-httpserver" % "0.3.1")
```

と書いてpluginを追加し，`build.sbt`に以下のように書くと，

```scala
import wav.devtools.sbt.httpserver.{SbtHttpServerPlugin,FileServer}
import SbtHttpServerPlugin.autoImport._

enablePlugins(SbtHttpServerPlugin)
addHttpServices(
  _ += FileServer.service("test", (resourceDirectories in Test).value)
)
```

`sbt`起動中，`http://localhost:8083/test/`以下にアクセスする事で，リソースファイル(デフォルトでは`src/test/resources/`以下)へアクセスできる．

これで当初目的は大凡達成できたが，ファイルサーバとしての設定記述をしたので，`post`メソッドが利用できないのは問題として残っている．実際に処理をするのではなく，想定されているフロー通りに動くモックがあればいいので，是非どうにかしたい．
Scala.jsでのremoveEventListener等使用の注意点

[Scala.js](http://www.scala-js.org/)メモ3つ目

暗黙の型変換周りで躓いたのでメモ

# 環境
|ソフトウェア|バージョン|
|:---|:---|
|Scala|2.11.7|
|Scala.js|0.6.6|

# まとめ
* JSに登録するイベントハンドラの型は`js.Function1[dom.Event, Any]`にするべき

# 問題: `removeEventListener`が上手く動かない
Scala.jsで，`addEventListener`，`removeEventListener`を使ったソースコードを書いていた．
元のJavaScriptの仕様通り，Scala.jsでも無名関数だと`removeEventListener`は使えないので，削除するためには，変数にキャプチャする必要がある．というわけで，

```scala
import org.scalajs.dom

val callback = (e: dom.Event) => {
  println("called")
}
button.addEventListener("click", callback)
button.removeEventListener("click", callback)
```

というコードを書いてみたが，`removeEventListener`が働いてくれない．`button.click()`を呼び出すと，上のコードは，`called`とコンソールに出力してしまう．

これは，`addEventListener`，`removeEventListener`の呼び出しの際，第二引数が，`js.Function1[dom.Event, Any]`にキャストされていて，それぞれの呼び出しで`callback`が指すオブジェクトが異なっていたからのようだ．

# 解決方法
変数にキャプチャする時点でキャストすれば良いので，

```scala
import org.scalajs.dom
import scala.scalajs.js

val callback: js.Function1[dom.Event, Any] = (e: dom.Event) => {
  println("called")
}
button.addEventListener("click", callback)
button.removeEventListener("click", callback)
```

とすれば想定通りcallbackを削除してくれる．試してはいないが(動いて満足したので)，動作原理からいってjQueryの方も同様の問題(ないし仕様)が発生するのではないかと思う．
Vagrant upした際にこける Part.2


windows10の環境で、```vagrant up``` 時に、下記エラー発生

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "ipconfig", "VirtualBox Host-Only Ethernet Adapter", "--ip", "192.168.33.1", "--netmask", "255.255.255.0"]

Stderr: VBoxManage.exe: error: The host network interface with the given name could not be found
VBoxManage.exe: error: Details: code E_INVALIDARG (0x80070057), component HostWrap, interface IHost, callee IUnknown
VBoxManage.exe: error: Context: "FindHostNetworkInterfaceByName(Bstr(pszName).raw(), hif.asOutParam())" at line 205 of file VBoxManageHostonly.cpp
```

デバイスマネージャーを開いて、ネットワークアダプターの項目にある、
```VirtualBox Host-only Ethernet～``` の不要な物を削除したら無事起動。

vagrantとvirtualboxをUpdateしたので、その影響かな。。。

***
参考サイト

* [Virtualbox 5.0 と vagrant 1.7.4にした](http://koooge.hatenablog.com/entry/2015/07/25/111332)
SQLServerのインストールからCSVファイルの読み込みまで

##環境

Windows10 
Visual Studio 2015

##SQLServerの導入
[SQL Server 2014 Express のインストール](https://creativeweb.jp/fc/2014-express/)
を参考に2014のSQLServerと開発ツールのSQLServer Management Studio をインストールする。

Management Studioのインストールも普通のSQLServerのインストール画面と変わらなくて戸惑ったが、どうやらインストールできているみたい

最後の接続の手順がわからなかったからとりあえずスターとメニューからMicrosoft SQL Server Management Studioを起動してみる。

## CSVファイルのインポート

csvデータのインポートを[SQL Server で CSV ファイルからインポートする](http://freed411.doorblog.jp/archives/33977913.html)を参考にして行うが、元ファイルが怪しいのかエラーをはかれてしまう。おそらく書式が正しくないのだろう。

[【初級編③】Management Studio を使った SQL Server の基本的な操作方法(1/2)](http://kaya-soft.com/sqlserver2008-toranomaki/beginner/managementstudio/)
を参考に基本的な操作は実行できたので導入には成功しているみたい。

書式が正しくないのなら一度Excelを経由して取り込んでしまえ、ということで
[【SQL Server】エクセルをテーブルに取り込む方法](http://itdiary.info/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/post-792/)
を参考にしてやってみる。
途中で「’Microsoft.ACE.OLEDB.12.0’プロバイダーはローカルのコンピューターに登録されていません。」というエラーが出たが、上記参考サイトにあるように、
http://www.microsoft.com/ja-jp/download/details.aspx?id=23734
からAccessDatabaseEngine.exeをダウンロード・インストールしたら解決した。
php-fpm note


# Document?
`man php-fpm`

# Signals

- `SIGINT,SIGTERM`      immediate termination
- `SIGQUIT`             graceful stop
- `SIGUSR1`             re-open log file
- `SIGUSR2`             graceful reload of all workers + reload of fpm conf/binary

For logrotate, `SIGUSR1`
`SIGUSR2` to graceful reload ,but..
https://bugs.php.net/bug.php?id=60961
AWS lambda でgetObjectができなくてはまった

AWS lambdaでs3のgetObjectができなくてハマった。。。
結果はRoleがおかしいでおわった。

デフォルトでlambda_s3_exec_rollを選択するとリソースが以下のようになっている。

```json
"Resource": [
                "arn:aws:s3:::*"
            ]
```

たぶんこれが問題なのだと思う。バケットを指定したらうまく行った。
（おそらく、自分のアカウントの制限ではないかと思うけど確証はない。。。）
base hrefを指定してる時にIEだとJavaScriptの中でパスが違う問題



```html
<base href="http://localhost/mysite/">
```

みたいにしておくと、htmlの階層が違っても、cssとか画像とかの読み込みを同じ相対パスで書けるのでとても便利なのだが、
この状態でjavascript内に

```js
location.href = "members/list.php";
```


というようなパス付きの情報を書きこむとこれがIEとFireFoxで挙動が異なるんだ。

FireFoxの場合はbase hrefを反映するがIEは反映しないので、違うパスに飛んでいってしまう。

ということで、


```js
var base_href = $('base').attr('href');
location.href = base_href + "members/list.php";
```


として使うと良いかもしれない。
ScalaのOption#fold メソッドについて

scala初心者でfoldがよくわからなかったので調べてまとめたからメモ

foldには値が`None`だったときのデフォルト値を入れとくみたいなイメージ
そんでその後に値があるときの処理をする
### 定義
```
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
```
- 第一引数 (ifEmpty: => B) は、 None に対応する関数です。
- 第二引数 (f: (A) => B) は、 Some(A) に対応する関数です。

### こんな感じ
こういう関数があって↓

```
val message = maybeMoney.fold("お金もってないよ！") { money =>
  s"${money}円持ってるお"
}
```
#### 値があるとき

```
scala> val oyatsu: Option[Int] = Some(1000)
oyatsu: Option[Int] = Some(1000)

scala> val message = oyatsu.fold("おやつは持ってきちゃダメ！") { money =>
     |   s"おやつは${money}円までです"
     | }
message: String = おやつは1000円までです
```
#### 値がないとき

```
scala> val oyatsu: Option[Int] = None
oyatsu: Option[Int] = None

scala> val message = oyatsu.fold("おやつは持ってきちゃダメ！") { money =>
     |   s"おやつは${money}円までです"
     | }
message: String = おやつは持ってきちゃダメ！
```

なるほど

【参考】 
[【Scala】foldとfoldLeftの違いを知る](http://dev.classmethod.jp/server-side/scala-differece-between-fold-and-foldleft/)