OmniAICreator/Qiita-1.07M huggingface dataset:
エクセルを使って指定したURLへ自動的にジャンプ

仕事で必要になったので忘れないように書いておきます。
サンプルは他のサイトにもたくさんあるので、ひとつの参考にどうぞ。

## 作成の経緯
例えば、30個のURLをいちいちブラウザに入力して遷移するというのは非常に面倒くさい。
そこで、エクセルに指定したURLを順々に新しいタブで開いていくプログラムを作った。

## 動作環境
- Windows10
- IE11
- Excel2013
- ExcelVBA

## 事前準備
1．エクセルシートを作成します。
「Sheet1」シートB7セルから下へURLを入力します（1セルに対し1URL）。
次に、メニュー→「開発」タブ→挿入→ActiveXコントロール→コマンドボタンを選択し、適当なところに設置します。
そのボタンを右クリックし、プロパティを開きます。
「オブジェクト名」「Caption」にそれぞれ「GoToURL」を入力します。
もう一度そのボタンを右クリックし「コードの表示」を選択します。

2．エクセルVBAの参照設定を行う必要があります。
VBAのコード編集画面の「メニュー」→「ツール」→「参照設定」を選択して、
- Microsoft HTML Object Library
- Microsoft Internet Controls
にチェックを入れてください。



## コード
以下のコードを入力します。

```
Private Sub GoToURL_Click()
  Dim objIE As InternetExplorer

  'IE(InternetExplorer)のオブジェクトを作成する
  Set objIE = CreateObject("InternetExplorer.Application")

  'IE(InternetExplorer)を表示する
  objIE.Visible = True

  '指定したURLのページを表示する
  objIE.Navigate Cells(7, 2).Value
  i = 8
  Do While Cells(i, 2).Value <> Empty
    '完全にページが表示されるまで待機する
     Do While objIE.Busy = True Or objIE.ReadyState <> 4
       DoEvents
     Loop
         
     '新しいタブで開く(2048はnavOpenInNewTab)
     objIE.Navigate2 Cells(i, 2).Value, 2048
     i = i + 1
  Loop

End Sub

```
エクセルシート画面まで戻り設置したボタンを押下すると、
自動的にIEが起動し、エクセルで指定したURLのページを表示します。

## 解説
B7セルに入力されたURLは初期表示のため、新しいタブで開かずそのまま遷移させます。
B8セル以降はセルの値が空でないことを確認し、新しいタブで開いて遷移させています。
個人的にハマったのは、新しいタブを開くためのプロパティが2048だと気づくまでに時間がかかったことです。
（英語のサイトですが、参考になったサイトを載せておきます。）

以上

## 参考
ExcelVBAなんて普段書かない私みたいな人に
[Excel VBA 入門講座][link-1]

ここのサイトをベースにしました
[Navigateメソッドを利用して指定したURLをIEで起動させる][link-2]

次に参考にさせて頂いたサイト
[リンクを新しいタブで開いて操作する][link-3]

ハマってたら出会えたサイト
[Internet Explorer automation not working with IE11][link-4]

[link-1]:http://excelvba.pc-users.net/
[link-2]:http://www.vba-ie.net/ie/navigate.html
[link-3]:http://vba-code.net/ie/open-link-in-new-tab/
[link-4]:http://www.vbaexpress.com/forum/archive/index.php/t-50564.html
UILabel 複数行のフォントサイズ自動調整

1行の場合に限り以下のコードでフォントサイズが収縮されます。

```swift
label.minimumScaleFactor = 0.3
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 1
```


複数行だったらどうでしょう:question:

![demo](https://raw.githubusercontent.com/ShingoFukuyama/UILabel-FontSizeToFit/master/fontSizeToFit.gif)

アニメーションGIFのように文字が長くなるに連れてフォントサイズが小さくなり、フレームにフィットしているのがわかるかと思います。

後々使うかもしれないのでUILabelの拡張(extension)もしくはカテゴリ(category)として書いておきました。Swift版、Objective-C版あり。iOS 7.0以降対応。

:octocat: [ShingoFukuyama / UILabel-FontSizeToFit](https://github.com/ShingoFukuyama/UILabel-FontSizeToFit)

## 使い方

### Swift
+ :octocat: [UILabel+FontSizeToFit.swift](https://github.com/ShingoFukuyama/UILabel-FontSizeToFit/blob/master/Swift/UILabel_FontSizeToFit/UILabel%2BFontSizeToFit.swift)をプロジェクトに入れます。
UILabelのframeやfont設定後に以下を実行します。

```swift
label.fontSizeToFit()
```

### Objective-C
+ :octocat: [UILabel+FontSizeToFit.h](https://github.com/ShingoFukuyama/UILabel-FontSizeToFit/blob/master/Objective-C/UILabel_FontSizeToFitObjC/UILabel%2BFontSizeToFit.h)
+ :octocat: [UILabel+FontSizeToFit.m](https://github.com/ShingoFukuyama/UILabel-FontSizeToFit/blob/master/Objective-C/UILabel_FontSizeToFitObjC/UILabel%2BFontSizeToFit.m)

上記2つをプロジェクトに入れます。

ヘッダーファイルを読み込みます。
`#import "UILabel+FontSizeToFit.h"`

UILabelのframeやfont設定後に以下を実行します。

```objc
[label fontSizeToFit];
```
IntelliJでartisanコマンドを実行する

IntelliJ 15 上でartisanコマンドを実行するよ
多分PhpStormでも同じだよ

### 準備

```php:artisan
require __DIR__.'/bootstrap/autoload.php';
```
の前に

```php:artisan
if (isset($argv[1], $argv[2]) &&
    $argv[1] === 'list' &&
    $argv[2] === '--xml'
) {
    $argv[2] = '--format=xml';
    $_SERVER['argv'] = $argv;
}
require __DIR__.'/bootstrap/autoload.php';
```

って感じに追加。

cf: [[L5.1] Artisan Not working in Command Line Tool - PhpStorm](https://laracasts.com/discuss/channels/general-discussion/l51-artisan-not-working-in-command-line-tool-phpstorm)

### IDEの設定
Preference > Plugins 
```Command Line Tool Support``` ってプラグインをインストール

Preference > Tools > Command Line Tool Support
プラグインの設定から、+でコマンドを追加
「Choose tool」は「Tool based on Symfony Console」を選択
「Visiblity」は「project」
![スクリーンショット 2016-02-23 1.52.27.png](https://qiita-image-store.s3.amazonaws.com/0/2866/e3b232a3-26b0-f4db-a3b1-b0d13c92d57e.png)
次はartisanの実行ファイルを指定。さっき編集したのを選べば良い。
![スクリーンショット 2016-02-23 1.52.53.png](https://qiita-image-store.s3.amazonaws.com/0/2866/5e379627-edc2-6951-9fec-fa8e3835c9d2.png)

### つかう
Tools > Run Command...
もしくはショートカットで呼び出す。
![スクリーンショット 2016-02-23 1.56.04.png](https://qiita-image-store.s3.amazonaws.com/0/2866/abffe052-43e2-59a0-6493-1f10b8f4151b.png)
「artisan」まで入れれば候補が出るよ！やったね！
Rubyにおける正規表現のチェック

Rubyにおける正規表現のチェックをする。
以下の例では、trueとなり、ifの中に入ります。

```rb
//2000〜2099に一致するか確認
check = "2015"
if /[012][0][0-9][0-9]/ =~ check
end
```
セキュアなSSHサーバの作成

#AWSでのセキュアなSSHサーバの作成

前回、AWSでEC2を作成したが、SSHまわりをデフォルトのまま使用するのは危ない気がするので若干の修正を加える。

##ssh-2 rsaの鍵を作成
[putty key generator](http://www.chiark.greenend.org.uk/~sgtatham/putty/)を使用してkeyを作成します。

ssh-2rsaを選択しbit数を「4096」にします。
「generate」ボタンを押下してkeyの四角の囲みの中でマウスをランダムに動かします。
それによりランダムなキーが作成されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/40d9c1c1-6658-2d10-30e4-04204ecdf6e1.png)


生成が終了すると下記のようにpublic keyができるのでこれを全選択してコピーしておきます。
また、秘密鍵を保存しておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/456020ef-dc08-e84b-b096-2a277e83f920.png)

##ec2に接続し下記ファイルを編集します。
`$ vi .ssh/authorized_keys`

既に１行キーが記載されているのでその次の行に先ほどコピーした公開鍵を貼り付け保存します。

##puttyで接続します。
先ほど保存した秘密鍵を使用して接続できることを確認しておきます。

##port変更
デフォルトのSSHポート22番だと攻撃が沢山くるのでとりあえず変更しておきましょう。
前回作成した[EC2](http://qiita.com/kite_999/items/f4560a29dc8befa291d6)が紐づいているセキュリティグループを開き、インバウンドタブで編集を押下します。
すると下記のようなウインドウが出るので「ルールの追加」を押下し
適当なポート（1024番以降）を登録しておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/ed6a7729-5af6-eaf8-70b7-69d07f917e1f.png)

##sshサーバの設定変更
sshサーバの設定を変更する
protocol 1も可能になっているのでprotocol 2だけに。

`# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org`

`# vi /etc/ssh/sshd_config`
下記のように編集

```lang:sshd_config
#Port 22
Port 21202

#Protocol 2
Protocol 2

#LoginGraceTime 2m
LoginGraceTime 1m

#StrictModes yes
StrictModes yes

#MaxAuthTries 6
MaxAuthTries 3

#PermitEmptyPasswords no
PermitEmptyPasswords no

#PasswordAuthentication yes
PasswordAuthentication no

#UseDNS yes
UseDNS no

```

`# /etc/init.d/sshd restart`

UsePAM noにしたかったがnoにするとamazon linuxではエラーになってしまうのでyesのままにしておく。

ポートを「21202」、秘密鍵を先ほど作成した物にして接続できるかをテストする。
接続できたら

`$ vi .ssh/authorized_keys`

で一行目のデフォルトの物を削除しておく。

##セキュリティグループにて22番ポートを閉じる

22番ポートを削除しておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/e80cfd73-722d-c9f8-a1dd-7b49640d84bc.png)

以上。
インスタンスをUnsafeMutablePointerに変換して扱う

`CTRunDelegateRef`を扱う上でインスタンスを`UnsafeMutablePointer`にする必要がある部分がでてきたので、下記の方法だとアプリもクラッシュせずエラーも出ずに動いたので書き残します。

```swift
let originalView = UIView()
print(originalView) //"UIView: 0x7fcd29f031a0"

//UnsafeMutablePointerに変換
let pointer = UnsafeMutablePointer<UIView>(Unmanaged.passRetained(originalView).toOpaque())

//UIView取得
let takeValue = Unmanaged<UIView>.fromOpaque(COpaquePointer(pointer)).takeRetainedValue()

print(takeValue) //"UIView: 0x7fcd29f031a0"
```

```swift:Sample
extension UIView {
    class func view(pointer pointer: UnsafeMutablePointer<Void>) -> UIView {
        return Unmanaged<UIView>.fromOpaque(COpaquePointer(pointer)).takeRetainedValue()
    }
}

class HogeView: UIView {
    func  createWidthCallback() -> CTRunDelegateGetWidthCallback {
        return {
            let view = UIView.view(pointer: $0)
            return view.bounds.size.width
        }
    }
}
```

`CTRunDelegateGetWidthCallback`などの`typealias`で`@convention(c)`が付加されているものでも、`static`なメソッドで`pointer`から自身を取得するようにすればエラーは起こらなくなります。
逆に`self`にアクセスするとエラーが起こります。
L-02CのIMEIをRaspberry Piで調べる



```
$ sudo apt-get install cu
$ lsusb
Bus 001 Device 004: ID 1004:61dd LG Electronics, Inc.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ eject sr0
$ lsusb
Bus 001 Device 005: ID 1004:618f LG Electronics, Inc. Ally/Optimus One
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ sudo modprobe usbserial vendor=0x1004 product=618f
$ ls -lart|grep -i usb
crw-rw----  1 root dialout 188,   2 Feb 23 00:56 ttyUSB2
crw-rw----  1 root dialout 188,   1 Feb 23 00:56 ttyUSB1
crw-rw----  1 root dialout 188,   0 Feb 23 00:56 ttyUSB0
crw-rw----  1 root dialout 188,   3 Feb 23 00:56 ttyUSB3
$ cu -l /dev/ttyUSB2
Connected.
ATI
NTT DOCOMO, INC.

OK
AT+CGSN
35*************

OK
```

# 参考資料

- [[L-02C取扱説明書](http://nw-restriction.nttdocomo.co.jp/top.php)](https://www.nttdocomo.co.jp/binary/pdf/support/trouble/manual/download/L-02C_J_All.pdf)
- [ネットワーク利用制限携帯電話機確認サイト](http://nw-restriction.nttdocomo.co.jp/top.php) (docomo)
「2016年、C言語はどう書くべきか」をちょっと分析してみる (building編)

# Overview

原典は、https://matt.sh/howto-c (日本語訳を作ってくださっている方のページは http://postd.cc/how-to-c-in-2016-1/ )を、分析してみるシリーズです。

前回は、[「2016年、C言語はどう書くべきか」をちょっと分析してみる (warning編)](http://qiita.com/hidenorly/items/12f5b5de0a9741ad4e5a)は、warning編でしたが、今回は、building編です。

# Link Time Optimization

gcc, clang共に、-fltoでサポートされるLink Time Optimizationについて、見てみます。

* LLVM : http://llvm.org/docs/LinkTimeOptimization.html
* gcc : https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html

が、公式のドキュメントです。

link時点で、使われないことがわかった不要なコードを排除するような最適化をしようというのが、LTOということのようです。

LLVMのサイトには、

```
The LLVM Link Time Optimizer provides complete transparency, while doing intermodular optimization, in the compiler tool chain. Its main goal is to let the developer take advantage of intermodular optimizations without making any significant changes to the developer’s makefiles or build system. This is achieved through tight integration with the linker. In this model, the linker treates LLVM bitcode files like native object files and allows mixing and matching among them. The linker uses libLTO, a shared object, to handle LLVM bitcode files. This tight integration between the linker and LLVM optimizer helps to do optimizations that are not possible in other models. The linker input allows the optimizer to avoid relying on conservative escape analysis.
```

抄訳は、LLVM Link Time Optimizeは、compiler tool chainとして、モジュール間の最適化を行うときに、完全に透過性を提供します。メインゴールは、開発者に、makefileやbuild systemに、どんな大きな変更もなしに、module間最適化の恩恵を受けられるようにすることです。これは、linkerと密結合されることで実現します。このモデルにおいてlinkerは、LLVM bit codeファイルをnative object fileのように扱い、それらの間でmatchingやmixingを許します。liknerは、LLVM bit codeのファイルを扱うために、shared objectであるlibLTOを使います。このlinkerとLLVM optimizerの密結合によって、他のモデルでは実現できない最適化を実現します。そのlinkerの入力が、optimizerに、保守的で逃げ的な分析に頼ることを避けるようにします。

実際には、
http://llvm.org/docs/GoldPlugin.html
のとおり、

```
export CC="$PREFIX/bin/clang -flto"
export CXX="$PREFIX/bin/clang++ -flto"
export AR="$PREFIX/bin/ar"
export NM="$PREFIX/bin/nm"
export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a
```
のように、compilerに-fltoをoptionとして渡しておくことと、
http://llvm.org/docs/GoldPlugin.html#lto-how-to-build
のとおり、

```
$ /usr/bin/ld -v
@(#)PROGRAM:ld  PROJECT:ld64-253.9
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
LTO support using: Apple LLVM 7.0.2 (clang-700.1.81)
```

LTO supportと、Macだと出るようなので、大丈夫かな?

```
$  clang -flto
clang: error: no input files
```

のように認識もしてくれていますので。

なお、

```
LTO still needs some babysitting though. Sometimes, if your program has code not used directly but used by additional libraries, LTO can evict functions or code because it detects, globally when linking, some code is unused/unreachable and doesn't need to be included in the final linked result.
```

とも書かれており、link時に最適化された結果、不要と判断された実装などがなくなるので、それはそれで気をつけないといけなそうです。まだまだbaby sittingとも書かれていますので^^;

[つづく](http://qiita.com/hidenorly/items/6a5f234ada98aa538c47)。
pythonファイルを自動で実行

#概要
　Pythonをいじっているとたまに自動でpythonを実行したい時などがあると思います。そこでpythonファイルを自動で実行する方法を備忘録作成がてら紹介したいと思います。主な方法はWindowsなら**.batファイルを作成し実行**・Macなら**ShellScriptの作成し実行**です。どちらも特別なソフトのインストールなどの必要はないので気軽にできます。もしこれらの方法より良い方法を知ってる方がいらっしゃいましたらコメントしていただけると非常に助かります。


##目次
1.自動で実行
 1.1. Windows編
 1.2. Mac(Linux系)編
1.3 Windowsおまけ編
参考


##1.自動で実行
###1.1. Windows編
 Windowsの場合は.batファイルを作成します。`test_1.py`および`test_2.py`のpythonファイルを自動実行したい場合は以下のようにbatファイルを作成します。batファイルの作成方法は、適当なテキストエディタを使って以下のコードを書き、最後に拡張子を.batにして変えるだけです。

```lang:hoge.bat
python test_1.py
python test_2.py
```

batファイルができたら`hoge.bat`をクリックすれば自動的にコマンドプロンプトが立ち上がって実行してくれます。ただし、実行がコマンドプロンプトの場合は処理が終わると勝手に閉じてしまいますので注意してください。ログを吐き出させるようにしておくことをおすすめします。
いつもPowerShellを使っている人はPowerShellにドラッグしEnterキーを押すだけでできます。


###1.2. Mac(Linux系)編
　MacもWindowsでいうbatファイルを作成することと同じことをします。ただMacではbatファイルとは言わずにshファイルになります。
 windows編と同じように`test_1.py`および`test_2.py`のpythonファイルを自動実行したいとします。Macの場合は以下のshファイルを作成します。shファイルの作成なのですが、適当なテキストエディタを使って以下のコードを書き、拡張子を.shに変えるだけでできます。

```lang:hoge.sh
python test_1.py
python test_2.py
```

Macの場合、shファイルの実行はターミナルから行います。ターミナルを開いて今作成したshファイルのあるディレクトリまでいき`sh hoge.sh`と叩くと実行できます。他にも同じディレクトリ内で`chmod w+x hoge.sh`で権限を与えると`./hoge.sh`でshファイルの実行ができます。




###1.3 Windowsおまけ編
　最後は非常にスマートではないやり方です。しかし複雑なGUI操作＋pythonファイルの実行などには強い(?)と思います。これには[UWSC](http://www.uwsc.info/)というソフトを使います。無料版でかまいません。uwscをダウンロードし、起動すると下のようになると思います。
![uwsc.PNG](https://qiita-image-store.s3.amazonaws.com/0/90668/791ffab7-24ad-2396-b033-a6ed852f0954.png)

このソフトは、GUIでの操作を記録しそのまま実行してくれる便利なソフトです。右から二番目の録画ボタンを押すまたはALTキー＋F3を押すと録画がはじまります。録画した操作を再生したい場合はALTキー＋F1を押すと記録した処理を実行できます。
また、記憶した操作をuwsファイルとして保存できるので複雑なGUI操作＋pythonファイルの実行を行いたい場合には便利ではないでしょうか。

## 参考
[バッチファイルの基本的な使い方](http://www.atmarkit.co.jp/ait/articles/1506/26/news026.html)
[シェルスクリプト・リファレンス](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231019/)
[UWSCダウンロードと使い方](http://www.game-rev.com/review/gameut/uwsc.html)
C++ iterator

# 自作オブジェクトのvectoerをiterator

```
struct pdata {
public:
    ofVec3f pos, ipos, r, angle, s;
};

for(auto itr = points.begin(); itr != points.end(); ++itr) {
    pdata* p = &(*itr);
    
    p->pos.x = p->ipos.x + p->r.x * sin( p->angle.x * PI/180 );
    p->pos.x = p->ipos.x + p->r.x * sin( p->angle.x * PI/180 );
    
    p->angle.x += p->s.x;
    p->angle.y += p->s.y;
}
```
Excelの表からRedmineのWiki向けに表を作る

# メモとして
記事を書くなんてことは普段しないので、とりあえずメモ帳として使うことにしました。ページ名は自分が検索するであろうワードに合わせてます。
まぁ、自分が使うときでもそうですけど、サンプル探してる時は結論以外大体読んでないです。

# Excel→Redmine
とりあえずソース。間違ってたら適当に直します。vbaだけどそれっぽくなるvb.netでシンタックスハイライト？

```vbnet
Sub Excel2Redmine()
' 選択範囲をRedmineの記法に合わせてクリップボードにコピーするマクロ
    Dim cell As Range
    Dim wiki As String
    Dim sepa As String

    For Each cell In Selection
        ' 一番上の行はヘッダ行に見せる
        If cell.Row = Selection(1).Row then
            sepa = "|_. "
        Else
            sepa = "|"
        End If
        wiki = wiki & sepa & cell.Value

        ' 末列は改行
        If cell.Column = Selection.Columns.Count then
            wiki = wiki & "|" vbCrLf
        End If
    Next cell

    ' クリップボードに格納
    Dim clipboard As New DataObject
    clipboard.set wiki
    clipboard.PutInClipboard    
End Sub
```
こんな感じ。シンプルに装飾なしの表。

# 色をつけてみる
背景色と文字色くらいは付与したいと思うので適当に書いてみます。
VBAのcolorオブジェクトご存知かもしれないけどRGBの並べ替えが必要。組み込み関数でもできそうだけど、知らないので適当に組んでみます。

```vbnet
Sub ExcelColor2RedmineColor(excelColor)
' 色変換を行う。
    Dim a As Long, b As Long, c As Long
    Dim num As Long, buf As long

    num = 256 * 256 ' なんとなく格納する。
    a = excel \ num ' ホントは￥の半角。
    buf = excel Mod num ' あまり。
    b = buf \ 256
    c = buf Mod 256

    ExcelColor2RedmineColor = (c * num) + (b * 256) + (a)
End Sub
```

で、組み合わせる。

```vbnet
Sub Excel2Redmine()
' 選択範囲をRedmineの記法に合わせてクリップボードにコピーするマクロ
    Dim cell As Range
    Dim wiki As String
    Dim sepa As String
    Dim deco As String

    For Each cell In Selection
        ' 一番上の行はヘッダ行に見せる
        If cell.Row = Selection(1).Row then
            sepa = "|_"
        Else
            sepa = "|"
        End If

        ' 文字装飾をリセット
        deco = ""
        wiki = wiki & sepa

        ' 装飾を付与。文字色以外にもいろいろできる。背景色はinteriorを使う。
        deco = "color:#" & HEX(ExcelColor2RedmineColor(cell.font.color)) & ";"

        deco = "{" & deco & "}"
        wiki = wiki & deco & ". " & cell.Value

        ' 末列は改行
        If cell.Column = Selection.Columns.Count then
            wiki = wiki & "|" vbCrLf
        End If
    Next cell

    ' クリップボードに格納
    Dim clipboard As New DataObject
    clipboard.set wiki
    clipboard.PutInClipboard    
End Sub

Sub ExcelColor2RedmineColor(excelColor)
' 色変換を行う。
    Dim a As Long, b As Long, c As Long
    Dim num As Long, buf As long

    num = 256 * 256
    a = excel \ num
    buf = excel Mod num
    b = buf \ 256
    c = buf Mod 256

    ExcelColor2RedmineColor = (c * num) + (b * 256) + (a)
End Sub
```

そのまま使うと文字装飾がとんでもない量になるので、基本色(文字なら`0`、背景色なら`&HFFFFFF`)と同じ場合は文字装飾をつけないなどすると編集画面が見やすくなると思います。
セルの結合は今回は対応してません。時間があったらやるかも。￥と数値＋.でできるらしいです。

VBEは比較的簡単にGUIが作れるので、チェックボックスを活用して、フォントを適用するかしないかをGUIから指定できるようにしたりすると便利かもしれないです。
DataObjectはUserFormを一度追加すると参照ライブラリとして登録されますが、デフォルトではおそらく参照ライブラリになっていないと思います。

# マクロをリボンに登録
昔はVBAでリボンに関するオブジェクトを呼び出して登録処理を書く必要があったと思います。便利になってよかったネ。

# ほげほげ
昔作ったPHPのWiki向けにExcelの表を加工するマクロを思い出しながら書いてみました。
思いつくのはフォント系(ボールド、イタリックなど)を付与位するとかセルを結合するとかですが、他に思いついたら随時メモしてみようと思います。
CloudPi(p2ptunnel server) & mjpg-streamer on RasberryPi

#目的
外出先からLANのRaspberryPiにリモートアクセスし、RaspberryPiに接続されたカメラの映像をスマートフォンで確認する


#方法
* 外出先からLANのRaspberryPiにリモートアクセスする方法は[こちら](http://qiita.com/digitalpeak/items/b9ac81e175e88a3f5100)
* RaspberryPiに接続されたカメラの映像をスマートフォンで確認する方法は、[Infrared Camera module for Raspberry Pi
](http://jp.rs-online.com/web/p/video-modules/7902811/)と[mjpg-streamer](https://github.com/jacksonliam/mjpg-streamer)を使用する

#設定
* git clone

```bash
$ sudo apt-get install libv4l-dev libjpeg8-dev imagemagick
$ suto apt-get install cmake
$ git clone https://github.com/jacksoliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
```

* cloudpi起動
![Screenshot_2016-02-23-00-40-55.png](https://qiita-image-store.s3.amazonaws.com/0/58788/e39fa724-a518-46ee-0cd9-89a4976cd883.png)

* mjpg_streamer起動

```bash
$ ./mjpg_streamer -o "./output_http.so -w ./www -p 9000" -i "./input_raspicam.so -fps 10"
MJPG Streamer Version: svn rev: 
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, input_init(), 125): argv[0]=raspicam input plugin
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, input_init(), 125): argv[1]=-fps
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, input_init(), 125): argv[2]=10
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, input_init(), 197): case 6, 7
 i: fps.............: 10
 i: resolution........: 640 x 480
 i: camera parameters..............:

Sharpness 0, Contrast 0, Brightness 50
Saturation 0, ISO 400, Video Stabilisation No, Exposure compensation 0
Exposure Mode 'auto', AWB Mode 'auto', Image Effect 'none'
Metering Mode 'average', Colour Effect Enabled No with U = 128, V = 128
Rotation 0, hflip No, vflip No
 o: www-folder-path...: ./www/
 o: HTTP TCP port.....: 9000
 o: username:password.: disabled
 o: commands..........: enabled
 i: Starting Camera
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, worker_thread(), 572): Host init, starting mmal stuff
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, worker_thread(), 748): Camera enabled, creating encoder
Encoder Buffer Size 81920
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, worker_thread(), 831): Encoder enabled, creating pool and connecting ports
 DBG(/home/pi/mjpg-streamer/mjpg-streamer-experimental/plugins/input_raspicam/input_raspicam.c, worker_thread(), 955): Starting video output
```

* ブラウザのURLにhttp://127.0.0.1:8080/と入力
![Screenshot_2016-02-23-00-37-36.png](https://qiita-image-store.s3.amazonaws.com/0/58788/d796813e-f67c-6808-755e-7e0c6d17c827.png)

* ブラウザのURLにhttp://127.0.0.1:8080/stream_simple.htmlと入力
* 画質等は調整するとして、動画を表示させることができた
![Screenshot_2016-02-23-00-19-39.png](https://qiita-image-store.s3.amazonaws.com/0/58788/debffe74-6002-b296-2e10-7bdda7fa3eeb.png)
electron+babelのテンプレートを作ってみた その１

自分で何かする時用のテンプレートをつくったのでメモ

github
https://github.com/umema4/electron-babel6

# 開発環境
- windows10
- node v5.6.0
- electron v3.7.1
- gulp v3.9.1
- babel v6.5.1
- webpack v1.12.13

# やっていること
src/js/以下のファイルをbabelで変換

webpackでJSのファイルをまとめるようにした
UglifyJsPluginでminify
dev/prodをgulp-env経由のNODE_ENVで切り替え
sourcemapはdevの設定をしたときのみ生成

```
gulp
or
gulp build-dev
```

sourcemapなしはprodの設定有効時のみ生成

```
gulp build-prod
```

eslintはeslit-config-airbnbを設定
reactは設定しないのでairbnb/baseを適用
vimつかっているので
eslintを-gオプションでもいれて
syntastic側も設定
let g:syntastic_javascript_checkers=['eslint']

#はまったところ
babelでの動作が以前と変わっていた
babel6でいろいろかわっていたようだ
importがうまく動かない
babel-preset-es2015を設定する必要あり

electronでsourcemapがうまく表示できない
リロードしたら改善


#参考にしたサイト
gulp周り
http://qiita.com/tyfkda/items/92dccc14aa7c05f0d3bc
http://qiita.com/kosuke_nishaya/items/cf7f8a2dbb8e47d064fd
http://qiita.com/inureo/items/6ac74fb19e12f395e4c1

electron周り
http://qiita.com/Quramy/items/90d61ff37ca1b95a7f6d
http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29
http://qiita.com/nyanchu/items/1dcd42ba6473f6afa575

babel周り
http://qiita.com/suin/items/00f6dc9e910eaeb6476d

#次の作業
sassの設定とかアプリのパッケージングを予定

css周りを追加
http://qiita.com/umema4/items/597ed5ac2b5304d8a512

jqueryとかを設定
http://qiita.com/umema4/items/4d69045bd9bb8a96b9ba
swiftでUIWebViewを作る(httpにも対応)

swiftで簡単なwebviewを作る手順を記載


ソースコード

```swift:ViewController.swift
var webview: UIWebView = UIWebView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.webview.frame = self.view.bounds
        self.webview.delegate = self;
        self.view.addSubview(self.webview)
        
        let url:NSURL = NSURL( string: "http://www.google.co.jp" )!
        let urlRequest: NSURLRequest = NSURLRequest(URL: url)
        self.webview.loadRequest(urlRequest)
        
    }
```

で、このままだとurlがhttpの場合は以下のようにセキュリティエラーで怒られます
（IOS9から？）
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.


なので、AppTransportSecurityを無効にしてやるか、例外のドメインを追加してやる必要があります。

・AppTransportSecurityを無効にする
1.Info.plistを開く
2.「App Transport Security Settings」を「Dictionary」で追加
3.「Allow Arbitrary Loads」を「Boolean」で追加、valueを「YES」に設定
![スクリーンショット 2016-02-23 0.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/66003/6aa514d2-9d27-ab9b-07e3-c6b9499d0af5.png)


・例外ドメインの追加
1.Info.plistを開く
2.「App Transport Security Settings」を「Dictionary」で追加
3.「Exception Domains」を「Dictionary」で追加
4.「www.google.co.jp」などのドメインを「Dictionary」で追加
5.「NSTemporaryExceptionAllowsInsecureHTTPLoads」を「Boolean」で追加、valueを「YES」に設定
6.「NSIncludesSubdomains」を「Boolean」で追加、valueを「YES」に設定
![スクリーンショット 2016-02-22 23.57.17.png](https://qiita-image-store.s3.amazonaws.com/0/66003/b24123e8-fef0-edfb-8805-aa22e4d244ca.png)


これで表示されます


以上
dein.vimを使ってみる

普段NeoBundleを使っていて特に今のところ問題ないのだが、なんとなく気分で乗り換えてみる。

## dein.vimとは？
みなさんご存知Shougoさんが作成したvimプラグインマネージャ
> Dein.vim is a dark powered Vim/Neovim plugin manager.

中二病心がくすぐられる説明文

## 早速使ってみる
好きなディレクトリにdeinを持ってくる

``` bash
$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone https://github.com/Shougo/dein.vim.git \
    ~/.vim/dein/repos/github.com/Shougo/dein.vim
```

deinで管理したいプラグインをvimrcに記述

``` vim
if &compatible
  set nocompatible
endif
set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/.vim/dein'))

call dein#add('Shougo/dein.vim')
call dein#add('Shougo/vimproc.vim', {'build': 'make'})

call dein#add('Shougo/neocomplete.vim')
call dein#add('Shougo/neomru.vim')
call dein#add('Shougo/neosnippet')

" (中略)

call dein#end()
```

インストールする

``` vim
:call dein#install()
```

入れたプラグインは`:Unite dein`で確認できる

## 備考
Shougoさんのvimrcを見るとtomlにプラグインを記述してるので、そういう書き方もできるみたい。

## 追記
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">current neobundle is bug fix only. <br>No new features are added.</p>&mdash; 暗黒美夢王(deoplete dev) (@ShougoMatsu) <a href="https://twitter.com/ShougoMatsu/status/702324808562782208">2016, 2月 24</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ということらしいので、今後はdein.vimを使う流れになりそう(たぶん)

## URL
[dein.vim](https://github.com/Shougo/dein.vim)
Stringの初期化nullと空文字

初投稿です。なにはともあれ知ったことは書いていこうかなと。

Stringを初期化するとき

String str = null;

とするのが通常かと思っていたのですが

String str = "";

としているプログラムがありました。

ググったところ知恵袋によると
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11136894676

＞nullで初期化→初期化である。ユーザはnullを入力できない事を利用して、値が無い事を明確化し、後々のプログラムでは値が与えられていないことを前提としたコーディングが求められる。

＞空文字で初期化→初期値代入である。デフォルトの値として空文字を使う。また、型推論を利用する場合に文字列型である事を明示するために利用する。

とのこと。

使い分けがあるんですね。

以上！ほぼ引用でした。
Rails4 ストロングパラメータ(&バリデーション)  ※簡易メモ [ 自分用メモ ]

<h1>ストロングパラメータ(&バリデーション、日本語化含む)</h1>

1. viewに<%= f.text_field :title, class: 'form-control' %>
2. DB(テーブル)にカラム
3. コントローラのprivateメソッド下のストロングパラメータ
4. モデルのバリデーションの記述
5. ja.yml(エラーメッセージの日本語化)<br>※ Git Hub ダウンロード先　必ずコピペする<br>　https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/
6. config/application.rb<br>config.i18n.default_locale = :ja<br>を追加する。 

※あらかじめformにある何かの入力項目を無くすときは、1~5の項目を全て削除する。<br><br>
<p>参考サイト<br>
http://piyopiyocs.blog115.fc2.com/blog-entry-421.html<br>
http://qiita.com/yutackall/items/0ff97132f31e5bacbf00<br>
http://ruby-rails.hatenadiary.com/entry/20140810/1407623400<br>
</p>
テキストファイルの行末に^Mが表示されているときの一括削除

Windowsで作成したファイルを、Macで開くと改行コード周りの関係で生じます。事前にgitの設定で排除しておけばいいという話ではありますが。。。
詳しくは引用元をご参照ください。

gitで管理しているプロジェクトの場合は、以下のように一掃できます。

```bash
git grep -l ^M | xargs sed -i '' -e 's/^M//g'
```
入力の際の注意点は以下の通り。
> 
　^Mを入力するには、［Ctrl］＋［V］キーを押してから、［Ctrl］＋［M］キーを押す。^Mは制御コードなので、［^］キーと［M］キーで「^M」と入力しても^Mとは認識されないので注意が必要だ。
via: http://www.atmarkit.co.jp/flinux/rensai/linuxtips/164linendm.html
matplotlibで日本語を描画 on Ubuntu

## 日本語フォントが入ってることを確認(今回はTakaoPGothicを利用)
```shell-session
fc-list | grep Takao
```

```
/usr/share/fonts/truetype/fonts-japanese-gothic.ttf: Takao Pゴシック,TakaoPGothic:style=Regular
/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf: Takao Pゴシック,TakaoPGothic:style=Regular
```

## フォントを設定

```py
import matplotlib
from matplotlib.font_manager import FontProperties

font_path = '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf'
font_prop = FontProperties(fname=font_path)
matplotlib.rcParams['font.family'] = font_prop.get_name()

f1 = plt.figure()
af1 = f1.add_subplot(111)
af1.set_title(u'たいとる')
af1.set_xlabel(u'横軸')
af1.plot([1, 2, 3, 4], label=u'えー')
af1.plot([2, 3, 3, 2], label=u'びー')
plt.legend()
plt.draw()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/9294/484153a8-1e27-9726-18db-6d4e0fd03631.png)


## 動かない時はキャッシュを削除(超重要)
```
rm ~/.cache/matplotlib/fontList.cache
```
LAN内にいるRaspberry Piを探す方法

最近RaspberryPiを買ったのでいろいろいじってたんですが、ラズパイ自体に画面とかキーボードをつけるのはちょっとアレです。

なので、いつもwindowsやmacからSSHでアクセスするわけなんですが、みんなはラズパイのIPアドレスをどうやって探しているんだろうという疑問が生まれました。

うちはスマホとかを含めても3台か4台くらいしか繋がってないのでパソコンに近いIPアドレスを適当に選んでいけばそのうち当たって接続できるんですが、なんかめんどくさくなってきたので調べてみたらいいのがありました。

ネットで調べたところAvahiっていうのがあってそれを使えばホスト名でアクセスできる（LAN内DNS的なやつなのかな？）ということがわかりました。

# やり方
たぶんみなさんLinuxマスターだと思いますので、あえて言う必要もないかもしれませんが「hostname」とうって、ラズパイのホスト名を調べましょう。

```
$ hostname
raspberrypi
```

でした。変更もできるけどめんどくさいのでそのまま使用します。

ほんでもってavahiってやつを入れます。

```$ sudo apt-get install avahi-daemon```

これで終了！

上の例だと「raspberrypi.local」を宛先にすればSSHで接続できるようになったので「IPアドレスなんだろう？」っていうことで悩む必要がなくなりました。

ちなみにラズパイを再起動しても自動的にavahiも起動するようで、いきなりホスト名でアクセスできました。
Arduino M0 Pro でマルチタスクプログラミング : マルチタスク

# はじめに
[TOPPERS/R2CA](http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino)は，[Arduino M0 Pro](http://www.arduino.org/products/boards/4-arduino-boards/arduino-m0-pro) (以下，M0)上で，Arduinoライブラリ+[TOPPERS/ASPカーネル](http://www.toppers.jp/asp-kernel.html)ベースのマルチタスクプログラミング環境を提供するパッケージです．

この記事では，[インストールとサンプルの実行](http://qiita.com/exshonda/items/093870ecdcda6c79678c)に続き，マルチタスクを使用する方法について説明します．開発環境のインストールやビルド＆実行方法はこちらの記事を見て下さい．

# 実行
とりあえずサンプルプログラムを実行します．以下のファイルを
```
examples/MultiTask/do_make.do
```
をダブルクリップしてビルドして下さい．次にボードを接続して，
```
examples/MultiTask/do_run.do
```
をダブルクリックしてダウンロードして実行します．

![r2ca_term.jpg](https://qiita-image-store.s3.amazonaws.com/0/106870/d81d0bb3-a403-b5a9-015a-9b8d49c5c84b.jpeg)

実行すると，タスクが5個実行され定期的にログをTerminalに出力します．

# マルチタスクサンプル
コードはr2ca_app.cppに記述します．通常のArduinoのプログラミングで記述するsetup()/loop()に加えてloopx()が用意されています．例えばloop1()はタスク1用の記述です．タスクは標準で最大5個まで追加することができます．今回のサンプルではタスクを5個(setup()/loop()用に1個，loopx()用に5個)動作させています．

```examples/MultiTask/r2ca_app.cpp
#include "r2ca.h"

/*
 *  For MAINTASK
 */ 
void setup() {
    Serial.begin(115200);
    Serial.println("setup() : running ");

    pinMode(13, OUTPUT);
}

int loop_cnt = 0;

void loop() {
    Serial.print("loop() : running ");
    Serial.print(loop_cnt++);
    Serial.println(" .");
    delay(1000);
}

/*
 *  For TASK1
 */
void loop1() {
    digitalWrite(13, HIGH);
    delay(1000);           
    digitalWrite(13, LOW); 
    delay(1000);           
}

int task2_loop_cnt = 0;

/*
 *  For TASK2
 */
void loop2() {
    Serial.print("task2_loop() : running ");
    Serial.print(task2_loop_cnt++);
    Serial.println(" .");
    delay(2000);
}

int task3_loop_cnt = 0;

/*
 *  For TASK3
 */
void loop3() {
    Serial.print("task3_loop() : running ");
    Serial.print(task3_loop_cnt++);
    Serial.println(" .");
    delay(2000);
}

int task4_loop_cnt = 0;

/*
 *  For TASK4
 */
void loop4() {
    Serial.print("task4_loop() : running ");
    Serial.print(task4_loop_cnt++);
    Serial.println(" .");    
    delay(2000);
}


```

タスクの個数はr2ca_app.hでR2CA_NUM_TASKというマクロで指定します．

```examples/MultiTask/r2ca_app.h

#define R2CA_NUM_TASK 4

```

プログラムが開始されると，まずsetup()が実行され，その後に他の関数が実行されます．そのため，全体的な初期化はsetup()に記述するようにします．

各タスクのディフォルトの優先度は同一で'5'に設定されています．
# おわりに
R2CAでは可能な限りArduinoのプログラミングモデルでマルチタスクを実現しています．今回のプログラムでは必要性は分かりにくいかとおもいますが，外部との通信をする場合にはマルチタスクの必要性が出てくると思います．次回はIoT的にESP8266を使うプログラムについて紹介します．
三角関数で球を回す


デモ：http://mo49.tokyo/threejs/earth_trigonometric.html

sin, cosを x, y片方ずつに使っている「赤」「黄」の球は円を描きながら回転していることがわかる。

| 色 | x | y |
| --- | --- | --- |
| 黄 | cos | sin |
| 赤 | sin | cos |
| 青 | sin | sin |
| 緑 | sin | tan |

<br>

```javascript:javascript
window.addEventListener("load", init);
function init() {
    // シーン
    var scene = new THREE.Scene();

    // カメラ
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
    camera.position.set(0, 0, 1000);
    camera.lookAt(new THREE.Vector3(0, 0, 0));

    // レンダラー
    var renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    var degree = 0; // 角度
    var radius = 300; // 半径
    var radius2 = 150; // 半径
    var radius3 = 50; // 半径
    var radius4 = 100; // 半径

    // 球
    var sphere = new THREE.Mesh(new THREE.SphereGeometry(20), new THREE.MeshBasicMaterial({ color: 0xffff00, wireframe: true }));
    scene.add(sphere);
    var sphere2 = new THREE.Mesh(new THREE.SphereGeometry(20), new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true }));
    scene.add(sphere2);
    var sphere3 = new THREE.Mesh(new THREE.SphereGeometry(20), new THREE.MeshBasicMaterial({ color: 0x0000ff, wireframe: true }));
    scene.add(sphere3);
    var sphere4 = new THREE.Mesh(new THREE.SphereGeometry(20), new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true }));
    scene.add(sphere4);
    // 地球
    var earth = new THREE.Mesh(new THREE.SphereGeometry(250, 20, 20), new THREE.MeshBasicMaterial({ wireframe: true }));
    scene.add(earth);

    // フレーム毎の再描画
    function ballRotate() {
        // 球を回転させる
        degree += 1;
        // 角度をラジアンに変換
        var rad = degree * Math.PI / 180;
        // xとyでsin,cosを入れ替えると逆回転する
        // http://www.ajaxtower.jp/js/math_class/index9.html
        var x = radius * Math.cos(rad);// X座標 = 半径 x Cosθ
        var y = radius * Math.sin(rad);// Y座標 = 半径 x Sinθ
        var x2 = radius2 * Math.sin(rad);
        var y2 = radius2 * Math.cos(rad);
        var x3 = radius3 * Math.sin(rad);
        var y3 = radius3 * Math.sin(rad);
        var x4 = radius4 * Math.sin(rad);
        var y4 = radius4 * Math.tan(rad);
        sphere.position.set(x, y, 0);
        sphere2.position.set(x2, y2, 0);
        sphere3.position.set(x3, y3, 0);
        sphere4.position.set(x4, y4, 0);

        renderer.render(scene, camera);

        requestAnimationFrame(ballRotate);
    }
    ballRotate();
}
```

> 参考
https://ics.media/entry/10657
CURLOPT_HTTPHEADER と CURLOPT_USERAGNET の両方でユーザエージェントを指定した場合、CURLOPT_HTTPHEADERで指定したものが送信される


以下、PHP7.0.3にて検証

## CURLOPT_HTTPHEADERとCURLOPT_USERAGENT両方でユーザエージェントを指定した場合

```php:CURLOPT_HTTPHEADERを先に書く場合.php
<?php
$ch = curl_init('google.com');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-HOGE: FUGA','user-agent: ua1']);
curl_setopt($ch, CURLOPT_USERAGENT, 'ua2');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);

var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));

// 以下出力結果
string(80) "GET / HTTP/1.1
Host: google.com
Accept: */*
X-HOGE: FUGA
user-agent: ua1
```

```php:CURLOPT_USERAGENTを先に書く場合.php
<?php
$ch = curl_init('google.com');
curl_setopt($ch, CURLOPT_USERAGENT, 'ua2');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-HOGE: FUGA','user-agent: ua1']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);

var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));

// 以下出力結果
string(80) "GET / HTTP/1.1
Host: google.com
Accept: */*
X-HOGE: FUGA
user-agent: ua1
```

このように、`CURLOPT_HTTPHEADER`を先に書いた場合でも`CURLOPT_USERAGENT`を先に書いた場合でも、`CURLOPT_HTTPHEADER`で指定したユーザエージェント文字列が送信されます。

## CURLOPT_USERAGENTのみでユーザエージェントを指定した場合
```php:CURLOPT_USERAGENTのみの場合.php
<?php
$ch = curl_init('google.com');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-HOGE: FUGA']);
curl_setopt($ch, CURLOPT_USERAGENT, 'ua2');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);

var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));

// 以下出力結果
string(80) "GET / HTTP/1.1
Host: google.com
User-Agent: ua2
Accept: */*
X-HOGE: FUGA
```

このように、CURLOPT_USERAGENT で指定した文字列がUser-Agentリクエストヘッダとして送信されます。

## CURLOPT_HTTPHEADERでユーザエージェントを指定する場合とCURLOPT_USERAGENTを使う場合の違い

`CURLOPT_USERAGENT`を使うと
`User-Agent: 指定したユーザエージェント`
となります。

一方、`CURLOPT_HTTPHEADER`では
`curl_setopt($ch, CURLOPT_HTTPHEADER, ['user-agent' => 'ua']);`
とすれば
`user-agent: ua`
となり、
`curl_setopt($ch, CURLOPT_HTTPHEADER, ['UsEr-AgEnT: ua1']);`
とすれば
`UsEr-AgEnT: ua1`
となります。

つまり、`CURLOPT_HTTPHEADER`を使えばヘッダ名の大文字小文字を自由に設定できます。
numpyで配列の要素とインデックスを降順に取り出す


numpyで配列の要素とインデックスを降順に取り出すには、sort関数とargsort関数を使います。

ただ、sort関数は昇順にソートし、argsort関数は昇順にソートしたインデックスの配列を返すので、[::-1]というスライスの書き方を使って逆順、つまり、降順にします。

```py:
import numpy as np

x = np.array([18, 7, 55, 31])

for i in range(len(x)):
    print np.argsort(x)[::-1][i], np.sort(x)[::-1][i]
```

次のように出力されます。

```
2 55
3 31
0 18
1 7
```
PhpStromを導入してみた

# 概要
PHP編集で有名なPhpStormを使った時に参考にしたサイトをまとめたいと思う

# 参考サイト
■PHP書いている人は、絶対にPHPStormを使うべき
http://koni.hateblo.jp/entry/2016/01/12/090000

■ダウンロード先
https://www.jetbrains.com/phpstorm/
※有料ソフトですが30日間なら無料で使えます。

■初回起動時の設定画面（JetBrains PhpStorm Initial Configuration）の内容と、後から変更する方法
http://tips4storm.tsunamayo.net/tips/3

■PhpStormを使い始めた人は知っておきたい便利な使い方25選 その1
http://www.karakaram.com/phpstorm-useful-tips1

■日本語化
http://ao-works.net/wordpress/japan-language-of-php-storm/
※上記ページで解説している「Settings」ページはAlt+F7キーで開くことができます。
RDPでチルダが入らない場合の対処法

## バッククウォートとチルダが入らない経緯
人様のWindows機をUSキーボードに変換して、Macからリモートデスクトップを使ったところ、`（バッククウォート）と~（チルダ）が入力できない事態に遭遇した。

まとめると下記のようになる。

- USキーボードのMac（OSX）
- Windows：日本語キーボード → 英語キーボード
- Mac → Windows ：RemoteDesktopで接続

## 検討（読み飛ばし推奨）
Windows側の日本語を英語に変えたら打てなくなった、と言われたのでちょっと確認してみた。
打って見ると全部 \（円マーク：Windows機なので）が入力される。
他のキーは全部問題なく英字キーボード配列。
Macの設定を見ても、Karabinerの設定を見てもおかしな箇所はない。
ついでとばかりにRDPアプリを最新版にしてもダメ。

そこで思い出したのは、確かそんな記事があったな、という事実！
確認してみるとKarabinerにXML書いて追加せよ。

流石にその対処を人様のMacでやるのはどうかな、と思った瞬間脳裏に電流走る。
自分のMacは同じ状況で問題が起こっていない。
差分を変更すればなんとかなるはず。

## 結論と暫定対処法（簡易）
- Google日本語入力をインストール。
- 次にシステム環境設定 > キーボード > 入力ソースタブ。
- Google日本語以外を削除。※1
- 再起動

※1.ひらがな（Google）と英数（Google）だけ残せば良いです

解決！

---

参考：http://qiita.com/ssashir06/items/e46a9ae94d7ffdaea802
Table of Contents Plusで特定の記事だけ目次を表示させない 

#WordPressプラグイン「TOC+」
自動的に目次を作成してくれる便利なプラグイン。
正式には「Table of Contents Plus」
[https://ja.wordpress.org/plugins/table-of-contents-plus/](https://ja.wordpress.org/plugins/table-of-contents-plus/)

##非表示ショートコード
投稿内のどこでもいいので、次のショートコードを挿入する。

```lang:shortcode
[no_toc]
```

>公式ドキュメント
>[How do I stop the table of contents from appearing on a single page?](http://dublue.com/plugins/toc/#How_do_I_stop_the_table_of_contents_from_appearing_on_a_single_page)
おじさんが若い時はね$.ajax()のオプションでsuccessとかerrorとか指定していたんだよ（追憶）

jQueryでAjaxを使う時、こんな書き方していませんか？

```js:昔の$.ajax()
$.ajax({
	url: "http://jsrun.it/assets/E/H/Z/t/EHZt3",
	success: function (data) {
		$("#results").append(data);
	},
	error: function () {
		alert("読み込み失敗");
	}
});
// urlを適当なものに変更すると「読み込み失敗」のアラートが出ます。
```

- [jsdo.itで実行する](http://jsdo.it/tonkotsuboy/KxkJ)

**これはInternet Explorer 6(故)が猛威を振るっていた時代の、jQuery1.4くらいの旧い書き方**です。「成功したらさらに非同期通信をしたい」「失敗したら別の処理をしたい」等、他の処理が多くなるに連れて**コールバック地獄に陥り、バグの温床**となります。

もう辞めましょう。。。

#イマドキの$.ajax()はこう書く

イマドキは、**jQueryの[Deferredオブジェクト](https://api.jquery.com/category/deferred-object/)の`then()`いうメソッドを使ってECMAScript 2015のPromise風のコードが使えます**。複雑なコールバック地獄から解消され、すっきりと見通しのよいコードを記述できます。ECMAScript 2015のPromiseそのものとは違い、**IEでも動作します**。

`then()`の使い方は下記です。

```js:$.ajax()のイマドキの書き方
$.ajax({
		オプション
	})
	.then(成功時の処理, 失敗時の処理);
```


では、冒頭のコードを`then()`を使ったコードに書き換えてみましょう。

```js:$.ajaxとthen()の実例
$.ajax({
	url: "http://jsrun.it/assets/E/H/Z/t/EHZt3"
})
.then(
	// 1つめは通信成功時のコールバック
	function (data) {
		$("#results").append(data);
	},
	// 2つめは通信失敗時のコールバック
	function () {
		alert("読み込み失敗");
});
// urlを適当なものに変更すると「読み込み失敗」のアラートが出ます。
```

- [jsdo.itで確認する](http://jsdo.it/tonkotsuboy/6MF2)


## アロー関数でもっとイマドキに
上記のコードはECMAScript 2015のアロー関数を使って下記のように記述できます。

```js:アロー関数でもっとイマドキに
$.ajax({
  url: 'http://jsrun.it/assets/E/H/Z/t/EHZt3'
})
  .then(
    data => $('#results').append(data),
    error => alert('読み込み失敗')
  );
```

- [jsdo.itで確認する](http://jsdo.it/tonkotsuboy/y6dT)

※ アロー関数はIE 11で非対応なので、必要に応じてTypeScriptやBabelで変換してください

- [TypeScriptの環境構築方法 - ICS MEDIA](https://ics.media/entry/16329)
- [Babelの環境構築方法 - ICS MEDIA](https://ics.media/entry/16028)

#新時代の$.ajax()を
比較的最近作られたWebコンテンツ等を見ても、いまだ古い`$.ajax()`の書き方をしているコードを見かけます。`Promise`を使った見通しのよい幸せなコーディングをしましょう。
Visual Studio 2015でNUnit3を使ってテストをする

# 0. 前書き
Visual Studioを用いてユニットテストをする際には、MsTestが標準のユニットテストフレームワークとして具備されています。MsTestを用いれば、事前の設定なしで、「テストの実行」や「テスト結果の確認」が、テストエクスプローラーから行えます。一方NUnitを利用したい場合には、Visual Studioに拡張機能のインストールが必要です。

今回は、Visual Studio 2015とNUnit3の組み合わせで拡張機能のインストールからテストの実行までを説明します。
（Nunitを使ったテストコードが存在することを前提にしています）

**バージョン情報**

|name|ver.|
|:--|:---:|
|Visual Studio Professional|2015 Update1|
|NUnit|3.0.1|
|NUnit3 Test Adapter|3.0.8.0|

# 1. 拡張機能のインストール
Visual Studioを起動後、「ツール」－「拡張機能と更新プログラム」を選択。
Visual Studioギャラリーから「NUnit3 Test Adapter」を検索します。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/3e5cede7-e67a-30d7-cc3a-d3dc905c4569.jpeg)

ダウンロードの実行、ダウンロード後、Visual Studioを再起動します。

# 2. テストの実行

「テスト」－「ウインドウ」－「テストエクスプローラー」を選択します。
テストエクスプローラーを開いた時点で、NUnitのテストを検索し、一覧に表示してくれます。この画面の「すべて実行」をクリックするとテストが実行されます。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/09af25ce-af53-349b-ea5a-5d6a36b854b1.jpeg)

# 3. テストの結果確認
テストが終了すると、「テストエクスプローラー」内と、「コード内（Visual Studio 2013から搭載されたコードレンズという機能）」にテスト結果が出力されます。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/b72a4817-515c-30b1-0dd9-fe7fb4460bdf.jpeg)

コードレンズの出力結果をクリックすると、テストの詳細な結果が表示されます。失敗したテストの場合は、「期待値」、「実績値」、「スタックトレース」などです。知らなかったです、これ便利。。。（もちろん、テストエクスプローラーでも同様の情報が参照できます）

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/2344bcad-004d-c662-3613-ff462dffd9da.jpeg)

さらに、コードレンズからは各テストメソッドを個別に「テストの実行」を行うこともできます。

# 4. おわりに
Visual Studio 2015とNUnit3を組み合わせてテストを実行する方法について説明しました。

ちなみに、JavaScriptのJasmineやQUnitでテストを行いたい場合は、「Chutzpah Test Adapter for the Test Explorer」というツールがあるようです。下記のサイトが参考になります。

・[Visual Studio 2012 と QUnit / Jasmine でおこなう JavaScript 単体テスト](http://blogs.msdn.com/b/chack/archive/2013/01/09/unit-test-for-javascript-using-qunit-jasmine-on-visual-studio-2012.aspx)
・[Chutzpah＋QUnitでTypeScriptのユニットテストをTypeScriptで書いてみたメモ](http://kiyokura.hateblo.jp/entry/2014/12/27/084158)

それと、[ReShaper](https://www.jetbrains.com/resharper/features/unit_testing.html)というアドインを使えば、MsTest、NUnit、QUnit、Jasmineは統合的にテストができるようになります。
CodeIgniter3入れたけどルーティングがうまくいかない

- index.phpと同じフォルダに.htaccessつくる

http://sutara79.hatenablog.com/entry/2013/10/22/160028


```
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
```

- mod_rewrite を有効にする

普通最初から有効なので割愛

- AllowOverride All

httpd.confを適当に検索して有効にしたいディレクトリに対しておこなうよ！
Reactコンポーネント内でjavascript製エディタaceを使う

今回は、react-aceというreactでaceを使うための専用ライブラリを紹介します。
リポジトリ:https://github.com/securingsincity/react-ace
今回はes6で書いてます。
##使い方
大まかな導入方法はREADME読めば大体分かりますね。``npm install react-ace``でインストールして、importするだけです。
テーマや言語のシンタックスハイライトは明示的にimportする必要があります。


```js:index.js
import React from 'react';
import brace from 'brace';
import AceEditor from 'react-ace';
import 'brace/mode/ruby';
import 'brace/theme/github';

class Editor extends React.Component{
  render(){
    return(
      <div>
        <AceEditor
          mode="ruby"
          theme="github"
          name="UNIQUE_ID_OF_DIV"
          editorProps={{$blockScrolling: true}}
        />
      </div>
    );
  }
}

ReactDOM.render(
  <Editor />,
  //DOM Element
);
```
onChangeやonCopyなどの幾つかのaceのイベントハンドラはサポートされていて、普通のReactコンポーネントにonClickを登録するような感覚で使うことができます。

```js:index.js
class Editor extends React.Component{
  handleOnChange(){
    console.log("change!")
  }
  render(){
    return(
      <div>
        <AceEditor
          mode="ruby"
          theme="github"
          name="UNIQUE_ID_OF_DIV"
          editorProps={{$blockScrolling: true}}
          onChange={this.handleOnChange.bind(this)}
        />
      </div>
    );
  }
}
```

ですがこれだけではちょっともの足りないですね、例えばeditor.insertみたいなメソッドが使えません。そういう時はonLoadを使うらしいです。

```js:index.js
class Editor extends React.Component{
  handleOnChange(){
    console.log("change!")
  }
  handleOnLoad(editor){
    this.editor=editor;
  }
  handleOnClick(){
    this.editor.insert("click!")
  }
  render(){
    return(
      <div>
        <AceEditor
          mode="ruby"
          theme="github"
          name="UNIQUE_ID_OF_DIV"
          editorProps={{$blockScrolling: true}}
          onChange={this.handleOnChange.bind(this)}
          onLoad={this.handleOnLoad.bind(this)}
        />
        <button onClick={this.handleOnClick.bind(this)}>click</button>
      </div>
    );
  }
}
```

onLoadで``this.editor = editor``としてインスタンスを取得することで、このクラス内ではthis.editorを使うことができるようになります。

僕自身Reactは初学者なんで、この記事内に間違い等ありましたらコメントにて指摘してくださると幸いです。

おわり
アプリケーションを起動するかアクティブにする

# Mac
```sh
open -a "Google Chrome"
```

# Linux

## xmonadを使っている場合
`runOrRaise`を使えばよい。

```hs
import XMonad.Actions.WindowGo

  -- ...
  , ((controlMask, xK_u), runOrRaise "google-chrome-stable" (className =? "google-chrome"))
  -- ...
```

のような設定を足すと`C-u`でChromeが立ち上がる。

## wmctrl(1)を使う方法

```sh:activate-window
#!/bin/sh
keyword=$1
shift

match=$(wmctrl -l | grep "${keyword}$")
case $? in
  1)
    $@
    ;;
  0)
    window_id=$(echo $match | tail -n1 | cut -d' ' -f1)
    wmctrl -i -R $window_id
    ;;
esac
```

上記のようなコマンド`activate-window`を作っておき、

```sh
activate-window "Google Chrome" google-chrome-stable
```

とする。
Macでいろんな記号を直接入力する方法

Macではoption+キーで、いろいろな記号が直接入力できます。

|入力できる文字       |日本語|キー         |
|------------------+------+------------|
|【】               |ON    |option + () |
|・（中黒）          |ON    |option + ?  |
|＼（バックスラッシュ）|ON    |option + ¥  |
|…（三点リーダー）    |ON    |option + ;  |
|≤≥                |OFF   |optino + <> |

他にも、shift + option + キーでもいろいろ入力できます。
gulp+browserifyで環境構築、watchify導入まで

gulpとbrowserifyを使って、[livescript](http://livescript.net/)での開発環境構築をしたので構成などを書いていきます。
また、gulpのタスクなどはlivescriptを使って書いていきます。
ほぼ同じやり方で他のAltJSでも応用することが出来ます。

## Directory structure
```
.
├── gulpfile.js
├── build
├── src
└── gulp
    ├── browserify.ls
    ├── build.ls
    ├── default.ls
    ├── index.ls
    ├── uglify.ls
    ├── watch.ls
    └── watchify.ls
```

## Installed node modules
`npm i -D modules`

- livescript
- prelude-ls
- gulp
- gulp-plumber
- gulp-rename
- gulp-uglify
- gulp-util
- browserify
- browserify-livescript
- watchify
- colors
- run-sequence
- vinyl-source-stream

## gulpfile

gulpfile.jsからAltJSで書いたファイルを読み込みます。

```javascript:gulpfile.js
require("livescript");
require("./gulp/index.ls");
```

index.lsからgulpディレクトリ内にあるファイルを一括で読み込みます。
また、ファイルはタスク毎に分割していきます。

```livescript:gulp/index.ls
require! <[gulp fs]>
global <<< require \prelude-ls

fs.readdir-sync __dirname
|> filter ( .match /\.ls$/)
|> reject ( .match /index/)
|> each ->
  (require "#__dirname/#it") gulp

```

### gulp-task: default
デフォルトタスクは`gulp build`に設定します。

```livescript:default.ls
module.exports = (gulp)->
  gulp.task \default, <[build]>

```

### gulp-task: build

```livescript:build.ls
require! \run-sequence

module.exports = (gulp)->
  gulp.task \build, (cb)->
    run-sequence \browserify, \uglify, cb
```

### gulp-task: browserify
watchify導入にあたりタスクの共通化も考えましたが、いい感じに書けなかったので別ファイルで書いています。
似たようなことを書いているので出来れば共通化したい。。

```livescript:gulp/browserify.ls
require! <[browserify colors]>
source = require \vinyl-source-stream

module.exports = (gulp)->
  gulp.task \browserify, (cb)->
    browserify do
      entries: <[./src/embed/index.ls]>
      extensions: <[ls js]>
    .transform \browserify-livescript
    .bundle!
    .on \error, -> process.stderr.write it.to-string!.white.bg-red; @emit \end
    .pipe source \embed.js
    .pipe gulp.dest \build/
```

### gulp-task: uglify

```livescript:gulp/uglify.ls
require! <[gulp-uglify gulp-rename]>

module.exports = (gulp)->
  gulp.task \uglify, (cb)->
    gulp
      .src \build/embed.js
      .pipe gulp-uglify!
      .pipe gulp-rename extname: \.min.js
      .pipe gulp.dest \build/
```

### gulp-task: watch

```livescript:gulp/watch.ls
module.exports = (gulp)->
  gulp.task \watch, (cb)->
    gulp.watch \./src/**/*.ls, <[watchify]>
```

### gulp-task: watchify

```livescript:gulp/watchify.ls
require! <[browserify watchify colors gulp-util gulp-plumber]>
source = require \vinyl-source-stream

module.exports = (gulp)->
  gulp.task \watchify, (cb)->
  	ops =
  	  entries: <[./src/embed/index.ls]>
  	  extensions: <[ls js]>
  	  cache: {}
  	  package-cache: {}
    bundler = browserify ops |> watchify
      ..transform \browserify-livescript
    bundle = ->
      bundler
        .bundle!
        .on \error, -> process.stderr.write it.to-string!.white.bg-red; @emit \end
        .pipe gulp-plumber!
        .pipe source \embed.js
        .pipe gulp.dest \build/
    bundler
      ..on \update, bundle
      ..on \log, gulp-util.log
    return bundle!
```

## まとめ
browserify + watchifyを導入できたので、ビルドがかなり早くなりました。
ただ、書き方が悪いのかたまにwatchifyが上手く動いてくれないのでここは要調査です。


## 追記
2016/02/29　watchifyでtransformする場所を修正
AWS EC2は（デフォルトで）Pingに応答しない

障害調査でPingを打つなどしていたのですが、その過程で「正常に動いているサーバからpingが帰ってこない」ということに気づきました。このサーバは、AWSのEC2でした。

# デフォルトのセキュリティグループ
AWSでは、「セキュリティグループ」といって、どこからのどんな通信を受け付けるかを設定する機能があります。デフォルトではこれはSSHのみとなっていて、（SSHトンネリングですべて片付くような用事ならともかく）まっとうな用途に使うにもポート開放は必須となっています。

で、「SSH以外すべて」弾くようになっている、ということは、Pingに使うICMPもその対象となってしまいます。もしPingに反応して欲しいなら、ICMPにも反応するように、設定を書き換える必要があります（ICMPについてはPing用のECHOなど、種類に応じて開閉を調整できます）。

ある意味、当然と言えば当然なのですが、むしろ「Pingを返す」ほうが常識に近かったので、ちょいと面食らってしまいました。

# 外部リンク
* [AWS EC2 で Ping応答を得られるようにする設定](http://www.checksite.jp/aws-ec2-icmp-rule/)