OmniAICreator/Qiita-1.07M huggingface dataset:
[DL]Momentumって何？

**Momentum**は、Parameterの更新を改善する手法です。

よく**Momentum**で出てくる話が、**loss function**の空間が下記のように横長の場合に、
垂直方向から更新されてくると更新が行ったり来たり（**Oscillation**）することがあります。
**Momentum**にはこれを抑制する効果があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/8f5e07f1-978f-d725-e786-83087c3258b4.png)



**loss function**の空間は、Neural NetworkではWeightやbiasのようなParameterによって描かれる空間です。
いわゆる下記のような勾配降下法のweightの更新式の$C(w)$のことです。

```math
w \leftarrow w -\eta \frac{\partial C(w)}{\partial w} 
```

**Momentum**では、更新が**Oscillation**しないように前回の更新量のいくらかを加算します。
上の図で言うと、例えば「前回下の方向に移動していたら、次も下の方向の可能性が高いんじゃない」という感じで補正項を加えます。
式で書くと下記のようになります。

```math
\begin{equation}
w_{t+1} = w_{t} - \eta \frac{\partial C(w)}{\partial w} + \mu\Delta w_{t-1}\\
\end{equation}
```

これでも十分にわかりやすいですが、もう少しわかり易くするために、新しい変数$v$を導入して、
上の式を$w$と更新量$v$に分けてみます。
そうすると上記の式は下記のようになります。

```math
\begin{equation}
w_{t+1} = w_{t} + v_{t}\\
v_{t} = \mu v_{t-1} - \eta \frac{\partial C(w)}{\partial w}
\end{equation}
```

Parameter $w$の更新はまず
1. $v$を前回の$v$とgradientにより更新
2. 得られた新しい$v$をParameter $w$に足す
という感じになります。

実際に**Momentum**ありとなしでの挙動をAnimationにしてみました。
たしかに**Momentumなし**は更新がOscillationしていますが、**Momentumあり**だとしばらくするとOscillationが収まっています。
![momentum1.gif](https://qiita-image-store.s3.amazonaws.com/0/100523/e45eb6f0-a101-9d92-aebb-111bcc6b564d.gif)

更新量を加えている分少し行き過ぎることもあります。
![momentum2.gif](https://qiita-image-store.s3.amazonaws.com/0/100523/29354b04-2b20-22ac-d3f7-672902c5518a.gif)

このAnimation gifは、Alec RadfordさんのOptimizationの[比較アニメーション](http://imgur.com/a/Hqolp)にinspireされて作ってみました。
pyenv + fish 環境構築


## pyenvのインストール
Macの場合、brewコマンドでインストール可能
`brew install pyenv`

## バージョン確認
`pyenv install -l`

## Pythonインストール
`pyenv install hogehoge` ※上記コマンドで確認したpythonのバージョンを指定

## config.fishに設定追加
下記の設定を追記する
`set -x PATH $HOME/.pyenv/bin $PATH`
`. (pyenv init - | psub)`

## バージョンの指定
`pyenv global hogehoge` 
`hogehoge`部分にオプションで使用するpythonのバージョンを指定

下記コマンドでバージョンが変更されている事を確認
`python --version`
getlineのデリミタを文字列に対応させる

標準にはありそうでなかった、getlineの第三引数がstd::stringのオーバーロードを書いたので載せるだけ。実際にはstd空間に追加しちゃだめだけど…
自分で書いてる人も多いと思うけどコピペすれば使えるよ。
これを使えば文字列を区切り文字に使えるので、単語を区切り文字にしたり、`\r\n`を区切り文字にしたりということができるようになるよ。

```cpp
// for example..
std::istringstream iss("world wide word");
std::string delim = " wo";

std::string str;
getline(iss, str, delim);
std::cout << str << std::endl; // outputs "world wide"
```

注意点は全て標準のstd::getlineと同じつもりですが、思い違いがあったり不足があったりするかもしれません。
　・出力であるoutputは関数の最初にクリアされる。
　・eof, bad, failのいずれかのフラグが立っていると関数は失敗する。その際、ストリームにfailフラグが立つ。
　・ストリームの中に`std::string::max_size()`と同じかそれより多くの文字が入っていると関数は失敗する。その際、ストリームにfailフラグが立つ。
　・ストリームの先頭がデリミタであった場合を除き、一文字も出力がなかったとき関数は失敗したとみなされる。その際、ストリームにfailフラグが立つ。
　・デリミタが見つからなかった場合、ストリームにeofフラグが立つ。
　・デリミタは出力されない。

以下実装。本当はistreamの右辺値参照版のオーバーロードも作るべきです。
主な処理はdo-while文の中身だけで、ラムダ式の中でデリミタの判定をしているだけなので関数の長さほどやってることは多くないです。

```cpp
#include <istream>
#include <string>
#include <exception>

template< class Char, class Traits, class Alloc >
std::basic_istream< Char, Traits >& getline(
    std::basic_istream< Char, Traits >& is,
    std::basic_string< Char, Traits, Alloc >& output,
    const std::basic_string< Char, Traits, Alloc >& delim)
{
  if (!delim.size()) { return std::getline(is, output); }
  output.erase();
  is.peek();
  using uint_enough =
    typename std::basic_string< Char, Traits, Alloc >::size_type;
  if (!is.good()
      || static_cast< uint_enough >(is.rdbuf()->in_avail())
          == output.max_size())
  { // output.max_size() characters have been stored,
    // in which case getline sets failbit and returns.
    is.clear(std::ios::failbit | is.rdstate());
    return (is);
  }

  auto is_to_continue = [&]
  { // lambda
    for (std::size_t i = 1; i < delim.size() && is.good(); ++i)
    {
      Char c = is.get();
      output.push_back(c);
      if (!Traits::eq(c, delim[i])) { return true; }
    }
    output.resize(output.size() - delim.size());
    return false;
  };

  do
  { // extracts the input
    std::basic_string< Char, Traits, Alloc > buf;
    std::getline(is, buf, delim.front());
    output += buf;
    if (!is.good()) { break; }  // no delim found or some errors occured.
    output.push_back(delim.front());
  } while (is_to_continue());
  return (is);
}
```
rubyでコマンドプロンプトのカーソル移動

# 経緯

さっきポストした記事にも書きましたが、コマンドプロンプトのカーソル移動ってどうやるんだろう？という技術的興味から。

# 実際の動き

こんな感じで動きます。

![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/12550/415d7f54-a914-e98f-7eca-0bb05166ba46.gif)

# スクリプト

```rb
require 'readline'
require 'pp'
require 'Win32API'

module RbReadline
  @GetStdHandle = Win32API.new('kernel32', 'GetStdHandle',['L'],'L')
  @hConsoleHandle = @GetStdHandle.Call(STD_OUTPUT_HANDLE)
  @GetConsoleScreenBufferInfo = Win32API.new('kernel32', 'GetConsoleScreenBufferInfo',%w(L P),'L')
  @ReadConsoleOutputCharacter = Win32API.new('kernel32', 'ReadConsoleOutputCharacter',%w(L P L L P),'I')

  alias :old_rl_get_char :rl_get_char
  def rl_get_char(*a)
    c = old_rl_get_char(*a)

    my_event_hook

    return c
  end

  def self.my_event_hook
    if @prev_end.to_i != @rl_end
      x,y = xy
      line_end = @prev_end.to_i > @rl_end ? @prev_end : @rl_end
      print "\e[" + (y+3).to_s + ";0H" + @rl_line_buffer[0...line_end]
      print "\e[" + (y+1).to_s + ";" + (x+1).to_s + "H"
      @prev_end = @rl_end
    end
  end

  def self.xy
    csbi = 0.chr * 24
    @GetConsoleScreenBufferInfo.Call(@hConsoleHandle,csbi)
    x = csbi[4,2].unpack('s*').first
    y = csbi[6,4].unpack('s*').first
    [x, y]
  end

  module_function :old_rl_get_char, :rl_get_char 
end

print "\e[2J" # Clear the screen
print "\e[0;0H" # Move to Top line on the screen

loop do
  line = Readline.readline('> ')
  break if line.nil? || line == 'exit'
  Readline::HISTORY.push(line)
  puts "You typed: #{line}"
  print "\e[0;0H" # Move to Top line on the screen
  print "\e[2K" # Delete current line
end
```

# やったこととアルゴリズム的なもの

入力された文字をリアルタイムで入力行の2行下に表示する。一行したは改行したときにタイプした文字を表示するようにリザーブしておきます。

~~文字が入力されたこと知るために、rb-readlineを使いました。RbReadlineモジュールの中にrb_event_hookという特異メソッドがあり、これに任意のメソッド名をシンボルで渡してやることで、RbReadlineがキー入力チェックの毎スキャンごとに任意のメソッドを呼ぶようになります。このフックは引数を渡しません。その代り、RbReadlineをレシーバとしてメソッドを呼び出すので、RbReadlineに定義されているインスタンス変数を参照することができます。`@rl_end`には現在の文字数が。`@rl_line_buffer`には現在の文字列が格納されています。前回のスキャンと今回のスキャンで入力されている文字数に違いがあれば、その文字を2行下に表示するようにしています。~~

参考にしたサイトの一つmattnさんのコードを使うことで、カーソル移動にも対応できたので、そちらを採用します。内容は参考資料のURL先の記事を参考にしてください。なんしか、rl_event_hookを使うのをやめ、rl_get_charをのエイリアスで対応しました。以前のコードをご覧になられたい場合は、編集履歴からどうぞ。

2行下を相対的に指定したかったので、RbReadlineにxyというメソッドを生やして、その中でWin32APIのGetConsoleScreenBufferInfoを呼び出すことで、現在のカーソル位置を取得し、そこから行数を+2することで2行下に表示することを実現しています。

実際に行数を指定するには、エスケープシーケンスを利用します。print("\e[#{x};#{y}H#{text}") と記述することで、(x,y)の位置にtextを表示するという意味になります。ただ、x, y は 最初の行を1として指定しないといけないので、先ほどのGetConsoleScreenBufferInfoで取得した情報をそのまま渡してしまうと、一列左、一行上に表示されてしまうので、x,yともに+1した値を指定しないと思ったところに表示できません。

# 今後の課題

* ~~同時押しした時の文字"!"等に対応したい。~~ => rl_get_charのエイリアスで対応

* ~~カーソルキーの移動に対応したい。~~ => rl_get_charのエイリアスで対応

* なぜ、rl_get_charのエイリアスで対応できたのか不明なので、調査

# 参考資料

* [rb-readlineを試験するスクリプト書いた。]( http://mattn.kaoriya.net/software/lang/ruby/20110728020759.htm)

* [11-2.エスケープシーケンス表](http://www5c.biglobe.ne.jp/~ecb/assembler2/b_2.html)

* [rb-readline](https://github.com/ConnorAtherton/rb-readline)
凸頂点の数


幾何はきついのですよ>_<
まあ、平面図形は空間図形よりはましですが。

## 前提
- まず、枠ごとに辺を割り振る(mapping)。このとき、反時計回りに繋がるように注意する。
- 1aは`[[0,0],[1,0],[2,0],[3,0],[2,19],[1,19],[0,0]].each_cons(2).to_a`となる。

## 最初の方針
- 重複している辺を取り除く。
- 残った辺について閉路を検出する。辺自体が反時計回りという情報を持っているので、辺の集合の前側(edges[i][0])だけ見れば良い。
- それぞれの閉路について、x,y座標を算出し、ベクトルに変換、隣接したベクトルの外積を計算する。外積が正なら180°未満の頂点である。
  - 鈍角・鋭角ではなく凸か凹かなので内積ではなく外積。
- ドーナツ型の場合、内側の閉路が検出されることがある。しかし、 **この閉路は時計回りになっている。** したがって、外積の符号は逆になる。外積が正の個数を数えればよいのは変わらないのである。

## 新しい方針
- しかし、これだけのものを60分でその場で実装できるはずはない。あくまで帰宅後の清書である。
- ロスタイム中に、 **頂点数が1個ならば採用すべき頂点である** ことがわかった。言い換えれば、伸びている辺が2本、である。
- ただし、00が含まれる場合は一番内側の頂点を除けば良い。

## コード
清書含みます。変数名も多少まともに。

```rb:tyama_henae03.rb
#!/usr/bin/ruby
#http://qiita.com/Nabetani/items/b8bf742d278c6cf501aa
#http://nabetani.sakura.ne.jp/hena/orde03nofconv/

D=[0,1,1,0,0,1,1,0,0,1]
Vertex=D.each.with_index(1).map{|e,r|
	20.times.map{|i|Complex(r*Math.cos(-(2*i+e)*Math::PI/20),r*Math.sin(-(2*i+e)*Math::PI/20))}
}
def mapping(s)
	if s=='00'
		(20.times.flat_map{|i|[[0,i],[1,i]]}+[[0,0]]).each_cons(2).map(&:reverse)
	else
		n,m=s[0].to_i-1,s[1].ord-97
		f=n%2
		[
			[n*2,(m+n/2)%20],
			[n*2+1,(m+n/2+f)%20],
			[n*2+2,(m+n/2+f)%20],
			[n*2+3,(m+n/2)%20],
			[n*2+2,(m+n/2-(f^1))%20],
			[n*2+1,(m+n/2-(f^1))%20],
			[n*2,(m+n/2)%20]
		].each_cons(2).to_a
	end
end

STDOUT.sync=true
while gets
	data=$_.chomp.scan(/../)
	if false #どちらでも通ります
		h=Hash.new(0)
		edges=data.flat_map{|e|mapping(e)}
		edges.map(&:sort).each{|e|e.each{|f|h[f]+=1}}
		r=h.select{|k,v|v==2}.map(&:first)
		if data.include?('00')
			r.reject!{|x,y|x==0}
		end
		p r.size
	else
		h=Hash.new{|h,k|h[k]=[]}
		data.flat_map{|e|mapping(e)}.each{|e|h[e.sort]<< e}
		edges=h.select{|k,v|v.size==1}.flat_map(&:last)
		r=0
		while !edges.empty?
			cycle=[edges.shift]
			while cycle.last[1]!=cycle.first[0]
				edges.size.times{|i|
					if edges[i][0]==cycle.last[1]
						cycle<<edges[i]
						edges.delete_at(i)
						break
					end
				}
			end
			cycle=cycle.map{|e|e.map{|n,m|Vertex[n][m]}}.map{|e,f|
				f-e
			}
			r+=cycle.size.times.count{|i|
				# 外積を手早く計算したくてComplexにした
				(cycle[i].conj*cycle[(i+1)%cycle.size]).imag>0
			}
		end
		p r
	end
end
```
Raspberry Pi でMinecraftサバイバルモード

#<i class="fa fa-cubes" style="font-size:1em;"></i>概要
Raspberry Pi で遊べるMinecraftをサバイバルモードにする方法を整理する。

#<i class="fa fa-cube" style="font-size:1em;"></i>背景
Raspbianを起動レベル5で起動するとメニューからマウス操作だけでMinecraftを起動できるため子供(4歳)に自由に遊ばせてみたところ、子供が夢中になってしまった。

何度か遊んでいる内に「ピンクの豚はどうやったら出てくるのか？」とのこと。保育園の友達から聞いてきたらしい。
私自身のMinecraft知識・経験は子供と一緒に2,3回いじってみた程度。

調べると[サバイバルモードなるものがある](http://qiita.com/rina0521/items/b235a08f4d66864f5865)ことが分かったので、そのためのパッチ適用方法と起動方法を整理する。

#<i class="fa fa-cube" style="font-size:1em;"></i>環境
HW　：　[Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)
OS　：　[Raspbian](https://www.raspberrypi.org/downloads/raspbian/)
Minecraft(パッチ適用前)　：　Minecraft Pi Edition v0.1.1 alpha
Minecraft(パッチ適用後)　：　Minecraft Pi Edition v0.6.1 alpha

#<i class="fa fa-cube" style="font-size:1em;"></i>パッチ適用方法
作業はRaspberry Pi 2にログインして行う。起動レベルは5でなくてもよい。
実行時ユーザは次の通り
$ : pi
\# : root

`# apt-get install bsdiff`
![mcpipatched01.png](https://qiita-image-store.s3.amazonaws.com/0/85506/8424a349-41b2-a0ff-253c-65d69faf345c.png)

`# cd /opt/minecraft-pi/`
`# wget https://www.dropbox.com/s/iutdy9yrtg3cgic/survival.bsdiff `
![mcpipatched02.png](https://qiita-image-store.s3.amazonaws.com/0/85506/d5460d1c-8302-3f71-12f8-d262aad61485.png)

`# bspatch minecraft-pi mcpipatched survival.bsdiff`
![mcpipatched03.png](https://qiita-image-store.s3.amazonaws.com/0/85506/a64cee42-294c-c5aa-5a5b-b381241e3fbf.png)

`# chmod 755 mcpipatched`
![mcpipatched04.png](https://qiita-image-store.s3.amazonaws.com/0/85506/b59c46ad-f340-7582-910c-740c57d128cd.png)

#<i class="fa fa-cube" style="font-size:1em;"></i>起動方法
作業はRaspberry Pi 2にログインして行う。起動レベルは5。
実行時ユーザは次の通り
$ : pi
\# : root

`$ sudo /opt/minecraft-pi/mcpipatched`
![mcpipatched05.jpg](https://qiita-image-store.s3.amazonaws.com/0/85506/bbdd3a82-7a24-2983-28ee-20510ece5b7b.jpeg)

![mcpipatched06.jpg](https://qiita-image-store.s3.amazonaws.com/0/85506/50712223-2a25-c4e1-317f-7899f9e4eeaf.jpeg)


#<i class="fa fa-book" style="font-size:1em;"></i>参考
Raspberry PiデビューしてMinecraft Pi Editionで遊んだ話
http://qiita.com/rina0521/items/b235a08f4d66864f5865
mac OS X でhomebrewがupdateできない


`$ homebrew update`がうまく実行されなかったので、メモします。

homebrewをアップデートしようとすると、
`/usr/local/Library/brew.rb`のpermissionが原因で、実行できない。

```
$ brew update
/usr/local/bin/brew: line 28: /usr/local/Library/brew.rb: Permission denied
/usr/local/bin/brew: line 28: exec: /usr/local/Library/brew.rb: cannot execute: Undefined error: 0
```

`/usr/local/Library/brew.rb`に実行権限がないと言われたので、実行権限を与えてみる。

```
$ chmod 754 /usr/local/Library/brew.rb
```

`$ brew --version`にコマンドを変更し実行すると、今度はなぜかsyntax errorが出る。。
`/usr/local/Library/brew.rb`のコードを編集した記憶はないにもかかわらず。

```
$ brew --version
/usr/local/Library/brew.rb: line 1: syntax error near unexpected token `('
```

ググってみると、解決方法ありました。なんかの拍子で差分ができてしまうらしいです。
（実際、`$ git status`で確認しました。）
ググって出てきた記事: https://github.com/Homebrew/homebrew/issues/33913

記事にある通り、以下のように`git reset`で差分を消したところ解決しました。

```
$ cd /usr/local
$ git reset --hard origin/master
```

<br>

後ほど、`/usr/local/Library/brew.rb`の権限を元に戻しました、
HTML,CSS勉強メモ #8 〜実践!12-最後まで〜

本日の勉強。

##**進度**##
実践！ウェブサイトを作ろう。

- 12:見出しと本文を作ってみよう
- 13:画像付きリストを作ってみよう
- 14:キャプション付き画像を作ろう
- 15:バッジをつけてみよう
- 16:アイコン付きリストを作ろう

##**メモ**##

- ###13:画像付きリストを作ってみよう###
`border:none;`が適応されずにハマりました。
原因は`html`で`ul`を閉じ忘れたことです。しかしずっと`css`の方を見ていて、他の要素で`last-child`を試したり、
`border:none;`を試したりして原因が分からずにハマってました。

- ###16:アイコン付きリストを作ろう###
`submenu>li`が何故か`sidebar`の中央に配置されています。
未だ原因不明で現在調査中です。

- ###ビュレット###
以前にも書きましたが、レッスン内では特に指定することなくビュレットが非表示になっているようです。
私のところではいちいち表示されるため`list-style:none;`が必要です。
これも現在調査中です。


「実践！ウェブサイトを作ろう。」はとりあえず終了したので、
残った課題を調べつつ、次は一度画像を揃えてウェブサイトを作ってみようと思います。
DOS窓上を手が鋏の某星人が横歩するrubyスクリプト

# 経緯

VIMを触っていると、DOS窓でカーソル移動ができたり、オムニ補完ウィンドウが表示されたりするので、なにがしかのカーソル処理がなされているんだろうなぁと思ってましたが、どういう仕組みなのかさっぱりなので、技術的興味から調べていたら、以下のページを発見。rubyで書きたい衝動に駆られたので、書いてみました。

https://www.grapecity.com/tools/support/powernews/column/clang/047/page02.htm

# ○タン星人を横歩きさせるrubyスクリプト

こんな感じで動きます。

![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/12550/2dcf3236-6e64-9c74-bd70-809b8da0d9ca.gif)

以下、ソースコード

```rb
module Screen
  ESC = "\e["

  def draw_text(x, y, text)
    print ESC + y.to_s + ";" + x.to_s + "H" + text
  end

  def draw_map(left, top, map)
    map.split("\n").each.with_index do |text, line_idx|
      draw_text(left, top + line_idx, text)
    end
  end

  def init_screen
    print(ESC, ">5h")
    print(ESC, "2J")
    print(ESC, "33m")
  end

  def finalize_screen
    print(ESC, ">5l")
    print(ESC, "2J")
    print(ESC, "0m")
  end
end

# --- main

include Screen

WAIT = 0.2
LOOP = 200
COLUMNS = 80

map1 = <<'MAP'
  Yo\oY 
    w   
   | |  
MAP

map2 = <<'MAP'
   o\o  
 >- w -<
   < >  
MAP

left = 0
top = 0

LOOP.times do |i|
  left = i % COLUMNS + 1
  if left == 1
    init_screen
    top += 1 
  end

  draw_map(left,top, map1)
  sleep(WAIT)
  draw_map(left+1,top,map2)
  sleep(WAIT)
end

finalize_screen
```
CKeditor: Richcomboプラグイン

例：見出しプラグインの作成
<img width="174" alt="Screen Shot 2016-04-03 at 00.07.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/114590/d88ea44e-e4a4-9b9c-46ee-ed00f0fb27dc.png">

コード：

    CKEDITOR.plugins.add(PLUGIN_NAME,
    {
      requires : ['richcombo'],
      init : function( editor )
      {
        var header_strings = [];
        header_strings.push(['0', 'なし', 'なし']);
        for(var i=2; i<=5 ; i++){
          header_strings.push(['h'+i, '<h'+i+'>見出し'+i+'</h'+i+'>', '<h'+i+'>見出し'+i+'</h'+i+'>']);
        }
    
        editor.ui.addRichCombo('header',
        {
          label:    '見出し',
          title:    '見出し',
          voiceLabel: '見出し',
          className:  'cke_format',
          multiSelect:false,
          panel:
          {
            css: [ editor.config.contentsCss, CKEDITOR.skin.getPath('editor') ],
            voiceLabel: editor.lang.panelVoiceLabel
          },
    
          init: function()
          {
            this.startGroup( "見出し" );
            for (var i in header_strings)
            {
              this.add(header_strings[i][0], header_strings[i][1], header_strings[i][2]);
            }
          },
    
          onClick: function( value )
          {
              // your code: process data
              editor.focus();
              editor.fire( 'saveSnapshot' );
              // your code: save data
              editor.fire( 'saveSnapshot' );
          }
        });
      }
    });
GitHub Markdown + TeX記法で数式に空白を入れたい

GitHub Markdown + $\TeX$ 記法で数式を書く際に調べた事について覚書き
# 数式に空白を入れたい

` \` ` \quad`  ` \qquad`  で調整してみた.

```lang:
$$a_{ij} \ (i \neq j)$$
```
$$a_{ij} \ (i \neq j)$$

```lang:
$$a_{ij} \quad (i \neq j)$$
```
$$a_{ij} \quad (i \neq j)$$

```lang:
$$a_{ij} \qquad (i \neq j)$$
```
$$a_{ij} \qquad (i \neq j)$$
***
よりスマートな方法があれば教えていただけると嬉しいです.
ＲＰＧツクールＭＶ　スクリプト　使用例


## 移動ルート　画像の変更
イベント１番の画像をアクター1番の画像のインデックス2番に変更する。

```js
this.character(1).forceMoveRoute({
  "list":[{
    "code":41,
    "parameters":[$gameActors._data[1]._characterName, 2]
  }],
  "repeat":false,
  "skippable":false,
  "wait":false
});
```
udemyでSwift等の人気言語の爆安キャンペーンやってます。

udemyでSwift等の人気言語の爆安キャンペーンやってます。

内容によっては90%オフのものがゴロゴロとあります

明日までとの事で新春キャンペンなのでしょうか

英語字幕なしで英語のヒアリングできる人には最適かなと
僕は9本程購入してしまいました。

こういうキャンペーン度々やってるんでしょうかね

![全画面_2016_04_02_22_10.png](https://qiita-image-store.s3.amazonaws.com/0/119624/24a62f51-e121-d34e-9b24-3187707c34bc.png)
jQueryを利用した10行で書けるシンプルスライドショー

JavaScriptの教材用に作成した、スライドショーのサンプルスクリプト。
意外と短く書けたので公開。

Safari,Firefox,Chromeで動作確認。IEは今、手元に環境が無いので未チェック。

一般的なスライドショーと異なり、子要素の一番後ろから逆順にアクティブなスライドになる仕様。

もっと簡潔に書く方法はあるのだろうか。

HTML

```html
<ul id="slideshow">
	<li style="background: blue;">JKL</li>
	<li style="background: green;">GHI</li>
	<li style="background: red;">DEF</li>
	<li style="background: orange;">ABC</li>
</ul>
```

CSS

```css
#slideshow {
	position: relative;
	display: block;
	width: 200px;
	height: 200px;
}
#slideshow li {
	display: block;
	position:absolute;
	width:200px;
	height: 200px;
	text-align: center;
	line-height:  200px;
	border:solid 1px black;
}
```

JavaScript

```js
 function slideshow(target){
	setTimeout(function(){
		var slide = $(target).children().last();
		$(slide).fadeOut(1000,function(){
			$(target).prepend(slide);
			$(slide).show();
			slideshow(target);
		});
	},3000);
}
slideshow('#slideshow');
```
任意の色グラデのCMYK分解カーブを画像化する


Labを指定し、Lのみ0〜100したグラデのCMYK値をPhotoshopに吐き出させて、Bridgeで読み込み画像にします。
汚いけど一応うごくから触らない！（再

Photoshop環境設定のCMYKプロファイル＋マッチング方法を設定しておいて実行。
カラーピッカーで任意の色を選択すると、デスクトップにプロファイル名＋LabのA＋LabのBのファイル名のテキストを書き出す。

```Javascript:PhotoshopCMYK.jsx
#target photoshop
var myColor = new SolidColor;
app.showColorPicker();

var doc = app.documents.add(100, 50, 72, "CMYK Separation Curves", NewDocumentMode.CMYK);
var profile_name = doc.colorProfileName;
var myFColor = app.foregroundColor.lab.a+'_'+app.foregroundColor.lab.b;
doc.close(SaveOptions.DONOTSAVECHANGES);
profile_name=profile_name.replace (/\//g, '_');

var myFile=new File('~/Desktop/'+profile_name+'_'+myFColor);
myFile.open("w");
myFile.encoding='BINARY';
for (var myG=0;myG<101;myG++){
    myColor.lab.l=myG;
    myColor.lab.a = app.foregroundColor.lab.a;
    myColor.lab.b = app.foregroundColor.lab.b;
    myC = myColor.cmyk.cyan;
    myM = myColor.cmyk.magenta;
    myY = myColor.cmyk.yellow;
    myK = myColor.cmyk.black;
    myR = myColor.rgb.red;
    myGr = myColor.rgb.green;
    myB = myColor.rgb.blue;   
    myWrite = myG+"\t"+myR+"\t"+myGr+"\t"+myB+"\t"+myC+"\t"+myM+"\t"+myY+"\t"+myK;
    myFile.writeln(myWrite);
        
    }
myFile.close();
```

Bridgeで書き出したテキストを選択しておいて実行。
デスクトップにgrid.pngを置いておき、その上に描画する。
ファイル名はテキストファイル名＋jpg

```Javascript:BridgeCMYKChart.jsx
#target "Bridge"
var myFile=app.document.selections;
var mySc=File(myFile[0].path);

var myLine=new Array();
mySc.open("r");
while(!mySc.eof){myLine.push(mySc.readln());}
mySc.close();

var myImg=new BitmapData(new File("~/Desktop/grid.png"));

var myAry=new Array();
for(var i=0;i<100;i++){
    myAry[i]=myLine[i].split("\t");
 
    var myColor=new Color(0,255,255);
    var myColor2 = new Color(myAry[i][1],myAry[i][2],myAry[i][3]);
    myDraw2(i*4,201,myColor2);
myDraw(i*4, 200-myAry[i][4]*2,myColor);
        var myColor=new Color(255,0,255);
myDraw(i*4, 200-myAry[i][5]*2, myColor);
        var myColor=new Color(255,255,0);
 myDraw(i*4, 200-myAry[i][6]*2, myColor);
        var myColor=new Color(0,0,0);
 myDraw (i*4, 200-myAry[i][7]*2, myColor);
 
}

myImg.exportTo(new File(myFile[0].path+".jpg"),100);

function myDraw(x,y,c){
    for(var a=0;a<4;a++){
        for(var b=0;b<2;b++){
    myImg.setPixel (x+a, y+b, c);
    }
}
}
function myDraw2(x,y,c){
    for(var a=0;a<4;a++){
        for(var b=0;b<20;b++){
    myImg.setPixel (x+a, y+b, c);
    }
}
}
```

##grid.png

デスクトップに置いておく。

![grid.png](https://qiita-image-store.s3.amazonaws.com/0/35477/7b1af952-b411-f610-b07d-e89c317d0f49.png "grid.png")
underscoreコードリーディング（iteratee）



underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##iterateeとは


###[underscorejs.orgのiteratee](http://underscorejs.org/#iteratee)

こんな説明。
>####_.iteratee(value, [context]) 
>Generates a callback that can be applied to each element in a collection. 
>_.iteratee supports a number of shorthand syntaxes for common callback use cases.
>Depending value's type _.iteratee will return:


```javascript
// No value
_.iteratee();
=> _.identity()

// Function
_.iteratee(function(n) { return n * 2; });
=> function(n) { return n * 2; }

// Object
_.iteratee({firstName: 'Chelsea'});
=> _.matcher({firstName: 'Chelsea'});

// Anything else
_.iteratee('firstName');
=> _.property('firstName');

```

The following Underscore methods transform their predicates through _.iteratee: countBy, every, filter, find, findIndex, findKey, findLastIndex, groupBy, indexBy, map, mapObject, max, min, partition, reject, some, sortBy, sortedIndex, and uniq

------------- 
 
コレクションの中でそれぞれの要素に対して適用できるコールバックを生成します。
_.iterateeは共通のコールバックのユースケースのために、簡略的なシンタックスをサポートします。
_.iterateeは値の型に依存しています。


次のUnderscoreのメソッドは_.iterateeを用いることによって変形されます。
```
countBy, every, filter, find, findIndex, findKey, findLastIndex, groupBy, indexBy, map, mapObject, max, min, partition, reject, some, sortBy, sortedIndex, uniq
```

###[underscore.iteratee](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L93)
コード的にはこのあたり。

```javascript
  _.iteratee = function(value, context) {
    return cb(value, context, Infinity);
  };
```
引数はvalueとcontext
cbにvalue,context,Infinityを渡した結果を返す。
seabornにset_contextで渡せる4つのスタイルの比較

# この記事は何?
pythonにはseabornというmatplotlibを元にした視覚化ライブラリがあります．
matplotlibは綺麗なグラフを描こうとすると少しメンドウですが，seabornを使うとパッと綺麗なグラフを描けるのでオススメです．

seabornには，グラフの文字サイズを設定するset_contextという関数が用意されています．
set_contextにpaper･notebook･talk･posterの4つのスタイルのうち1つを選んで引数に渡すことで，掲載媒体に合わせてグラフの文字サイズを変更することができます．

この記事はpaper･notebook･talk･posterのそれぞれをset_contextに渡したときの出力を比較したときのメモです．

# 4つのスタイルによる出力
## paper
![paper.png](https://qiita-image-store.s3.amazonaws.com/0/58543/992a9a3f-088c-59e4-3885-9e0900a2f64f.png)

## notebook
![notebook.png](https://qiita-image-store.s3.amazonaws.com/0/58543/ec94aecb-e660-fec1-8d15-e26579a8fe50.png)

## talk
![talk.png](https://qiita-image-store.s3.amazonaws.com/0/58543/a9ce2363-c4e2-3562-56e8-10e5118535c5.png)

## poster
![poster.png](https://qiita-image-store.s3.amazonaws.com/0/58543/075e75a3-63b6-fb44-6af3-60cd72ac9d83.png)

# 4つのスタイルの比較
文字サイズに関して，paper < notebook < talk < posterの順に大きくなります．

paperは非常に文字が小さいです．paperと言ってはいますが，これを論文誌に載せても文字が潰れて読めないんじゃないかなあと思います．

talkはどういった状況を想定しているのか名前だけでは分かりにくいですが，おそらくスライドに載せる状況を想定しているのだと思います．
しかし，スライドに載せるグラフは文字サイズを大きくしないと読みにくいので，スライドに載せる際もposterを選択した方が良いかもしれません．

# ソースコード

```py
import seaborn as sns
import matplotlib.pyplot as plt


def draw(context):
    sns.set_context(context)
    plt.clf()
    plt.plot([0, 1], [0, 1])
    plt.legend(["line"])
    plt.xlabel("this is x label")
    plt.ylabel("this is y label")
    plt.title(context)
    plt.tight_layout()
    plt.savefig(context + ".png")

if __name__ == '__main__':
    context_lst = ["paper", "notebook", "talk", "poster"]
    [draw(context) for context in context_lst]
```

# 参考
[seaborn.set_context](https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.set_context.html)
Swiftで指定した位置の文字列を、簡単に切り出す

正直、息をするのも面倒なタイプなので、`substringWithRange()`の引数に`foo.startIndex.advancedBy(ﾎｹﾞｪ)`とかいちいち書くのほんとだるいです。
単純にInt型で_"x〜y文字目"_、あるいは_"n文字目"_が引数でいいじゃん。

…なので、Extension作った。

以下のコードをまるっとコピペして、プロジェクトに追加すれば使えます。

```String+Extension.swift
extension String{
	func substringWithRange(start: Int, end: Int) -> String{
		return self.substringWithRange(Range(self.startIndex.advancedBy(start) ..< self.startIndex.advancedBy(end)))
	}

	func substringWithRange(range: Range <Int>) -> String{
		return self.substringWithRange(Range(self.startIndex.advancedBy(range.startIndex) ..< self.startIndex.advancedBy(range.endIndex)))
	}

	func substringWithRange(position: Int) -> String{
		return self.substringWithRange(Range(self.startIndex.advancedBy(position) ..< self.startIndex.advancedBy(position + 1)))
	}

	func substringToEnd(position: Int) -> String{
		return self.substringWithRange(Range(self.startIndex.advancedBy(position) ... self.endIndex))
	}

	func substringFromEnd(position: Int) -> String{
		return self.substringWithRange(Range(self.endIndex.advancedBy(-position) ... self.endIndex))
	}
}
```



以下、使用例

```swift
var str = "いろはにほへとちりぬるを"

// 範囲指定、指定位置の切り出し
print(str.substringWithRange(8, end:9)) // りぬ
print(str.substringWithRange(1...4))    // ろはにほ
print(str.substringWithRange(12))       // を

// 指定位置から最後まで切り出し
print(str.substringToEnd(5))   // へとちりぬるを

// 最後から数えて指定位置まで切り出し
print(str.substringFromEnd(1)) // るを
```
JRubyからJavaのクラスを呼んでみる

C言語のライブラリをRubyから使おうとすると、その間をつなぐグルーコードに悩まされることに、往々にしてなりますが、JRubyからJavaのライブラリを呼ぶのは、それよりは楽です。

なお、この記事は適宜追加していく予定です。

# まずは`require`

まずは、`require 'java'`と書くと、JRubyのJavaサポートが発動します。また、CRubyでネイティブの`.so`を`require`できるのと同様に、JRubyでは`.jar`ファイルを`require`することもできます（なお、JRuby向けなjarを`require`すればそのままJRuby側に現れますが、組み込みのJavaクラスと同じようなやり方でアクセスするために、ふつうのjarを`require`することも可能です）。

# Javaのクラスにアクセスするための手法
Javaのクラスは、`java.lang.StringBuilder`や`org.apache.commons.collections4.CollectionUtils`というように、パッケージで区分されています。これをJRubyの世界で表現するには、いくつかの方法があります。

まず1つは、パッケージ名をドット区切りからキャメルケースにして、`Java::`以下のモジュール名として、それをクラスにするという方法です。上の2つであれば、`Java::JavaLang::StringBuilder`、`Java::OrgApacheCommonsCollections4::CollectionUtils`となります。`p`などで見たクラス名もこれになっています。

次に、トップレベルの定数からドット区切りのまま参照する、という方法があります。`Java::Java.lang.StringBuilder`や`Java::Org.apache.commons.collections4.CollectionUtils`というような書き方になります。

さらに、`require 'java'`とした時点で、Ruby側のカーネルメソッド(`puts`のような、どこでも書けるメソッド)として`java`、`javax`、`org`、`com`が用意されます。これを使うことで、`java.lang.StringBuilder`や`org.apache.commons.collections4.CollectionUtils`が、そのままRuby側で使えるようになります。ただし、これらを変数で書き潰さないように注意が必要かもしれません。

# メソッドへのアクセス

JavaもRubyもオブジェクト指向の言語なので、メソッド呼び出しは普通に行えます。なお、`new`はRuby的に、クラスメソッドとなっています。

## Ruby的に書く
メソッドの書き方が、Rubyではスネークケース（アンダーバー区切り）ですが、Javaではキャメルケース（大文字区切り）という慣習になっています。JRubyでは、`obj.foo_bar_baz`を`obj.fooBarBaz`のように変換してくれます（もちろん、Javaの名前で書いても構いません）。

また、JavaBean的な`getXXX()`、`setXXX()`を、Rubyのプロパティとしてアクセスができるほか、`isHoge()`のようなメソッドは`hoge?`としても使えます。

## `java_send`
Javaはメソッドをオーバーロードできますが、Rubyで型がうまく表現できない、あるいはJavaでのメソッドが`initialize`という名前で、Rubyのコンストラクタと干渉するので呼べない、というような場合には、`java_send`というメソッドを使えます。オーバーロードに対応するという性質上、メソッド名だけでなくシグネチャも指定する必要があります。

# 注意が必要な引数・返り値

## Javaのクラスを渡したい
たまに、Javaで`ClassName.class`のような引数を渡す場面がありますが、JRubyでこう書いてしまうと、**Ruby側の**クラスオブジェクトが渡ってしまって、うまく動きません。`ClassName.java_class`としましょう。

## 配列が返り値の場合
配列が返り値の場合、Javaネイティブな配列が返ってきてしまいます。Rubyで使うには`.to_a`としましょう。
シェルスクリプトでDSLのようなこと

お手軽に書けるシェルスクリプトで、DSL (domain specific language) が記述できると、生産性は更に向上します。次のようなシェルの説明が記述されれたDSLを書いてみます。

```bash:database
name 'bash'
version '4.3.042-4'
desc 'The GNU Bourne Again shell'

name 'fish'
version '2.2.0-5'
desc 'Smart and user friendly shell intended mostly for interactive use'

name 'zsh'
version '5.2-1'
desc 'A very advanced and programmable command interpreter (shell) for UNIX'
```

DSLの定義
---

`source` する前に定義された変数・関数は、`source` されたスクリプトから呼び出せます。上のDSLを記述するために、`name`、`version`、`desc`関数を `source` する前に定義し、その後ファイル `database` を `source` します。

```bash:shelllist
#!/bin/sh

print_current() {
  echo "${current_name} - ${current_version}"
  echo "${current_desc}"
  echo
}

name() {
  [ -n "$current_name" ] && print_current
  current_name="$*"
}

version() {
  current_version="$*"
}

desc() {
  current_desc="$*"
}

source ./database
print_current
```

`version`、`desc` 関数では引数に渡された文字列を変数に格納します。また `name` 関数では変数に格納された変数を表示します。

実行結果
---

実行結果は次のとおりです。ここでは画面に表示しましたが、データ構造に落とすと更に柔軟にDSLを定義できそうです。

```text:実行結果
bash - 4.3.042-4
The GNU Bourne Again shell

fish - 2.2.0-5
Smart and user friendly shell intended mostly for interactive use

zsh - 5.2-1
A very advanced and programmable command interpreter (shell) for UNIX
```
Kobitoの複数Macでの同期をicloud DriveとGoogle Driveで試してみた


##背景
自宅用にiMacと持ち運び用にMacBook Airを持っている。
MacBook Airに入れたKobitoの情報を確認したくなったが、
Mac間の同期が行われなかったので、
複数のMac環境でKobitoを同期させたくなった。

同期をDropboxで行う方法はKobitoにあったが（参考に記載）、
Dropboxは使っていないので、icloud DriveとGoogle Driveで試してみた。（実行コマンドは下記参照）
修正をしても1分以内では、双方で同期は行われなかった。（どれぐらいで同期されるかは未確認）

強制的に同期をさせようとicloud DriveのKobitoディレクトリに新規ディレクトリを作成しても同期されなかった。
しかしGoogle Driveで同様のことを実施したところ同期が行われたのでGoogle Driveを使用することにした。


## 環境
OS X 10.11.4(El Capitan)
Kobito 2.3.5


##icloud Drive

1.同期するすべてのKobitoアプリを閉じる
2.バックアップを取る
3.icloud側にディレクトリを作成し、DBファイルをicloud側のディレクトリに移動（以下のコマンド）

```bash
mkdir -p $HOME/Library/Mobile\ Documents/com\~apple\~CloudDocs/Kobito/
mv $HOME/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/* $HOME/Library/Mobile\ Documents/com\~apple\~CloudDocs/Kobito/
```
4.icloud Driveディレクトリにハードリンクを貼る（以下のコマンド）

```bash
cd $HOME/Library/Containers/com.qiita.Kobito/Data/Library/Kobito
ln $HOME/Library/Mobile\ Documents/com\~apple\~CloudDocs/Kobito/Kobito.db Kobito.db 
ln $HOME/Library/Mobile\ Documents/com\~apple\~CloudDocs/Kobito/Kobito.db-shm Kobito.db-shm
ln $HOME/Library/Mobile\ Documents/com\~apple\~CloudDocs/Kobito/Kobito.db-wal Kobito.db-wal
```

##Google Drive
1.同期するすべてのKobitoアプリを閉じる
2.バックアップを取る
3.Google Drive側にディレクトリを作成し、DBファイルをGoogle Drive側のディレクトリに移動（以下のコマンド）

```bash
mkdir -p $HOME/Google\ ドライブ/Kobito/
mv $HOME/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/* $HOME/Google\ ドライブ/Kobito/
```
4.Google Driveディレクトリにハードリンクを貼る（以下のコマンド）

```bash
cd $HOME/Library/Containers/com.qiita.Kobito/Data/Library/Kobito
ln $HOME/Google\ ドライブ/Kobito/Kobito.db Kobito.db
ln $HOME/Google\ ドライブ/Kobito/Kobito.db-shm Kobito.db-shm
ln $HOME/Google\ ドライブ/Kobito/Kobito.db-wal Kobito.db-wal
```

##参考
KobitoのファイルをDropboxで同期とる(Kobito2.2.0) - Qiita
http://qiita.com/koyopro/items/2122b6d9d20d578c85f2
Ubuntu 14.04 LTS でhostsの設定をする方法

特定のIPアドレスに対して、ドメインを設定をする前に自分のPCで設定するドメインで正常に動作するか確認をしたいときに hostsファイルを書き換えることがあると思います。
以下では、Ubuntu 14.04 LTSの環境でhostsを設定する方法を説明します。

# 1. hostsファイルを開く
Ubuntu 14.04 LTSの場合でも、[こちらの記事](http://www.remixdesign.net/wp/2013/01/25/ubuntu-12-04-%E3%81%A7-hosts-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)のUbuntu 12.04と同じように **/etc/hosts** ファイルの内容を修正するだけで良いようです。
そこで、以下のコマンドで hosts ファイルを開きます。

```
$ sudo vi /etc/hosts
```

# 2. hostsファイルに確認を行うIPアドレスとドメインを紐付けた内容を記述
vi で開いた hostsファイルの最下行あたりに、IPアドレスとドメインを紐付けした内容を記入して完了です。

```op:hosts
・
・
・
# 対象のIPアドレス  ドメイン
192.168.1.1       hoge.example.com
```

# 参考文献
1. Ubuntu 12.04 で hosts ファイルを編集する方法 « re_mix design blog, http://www.remixdesign.net/wp/2013/01/25/ubuntu-12-04-%E3%81%A7-hosts-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/, Online; accessed April-2-2016.
筋トレ大好きな文系女学生のJava入門〜クラス定義とオブジェクト生成①〜

#はじめに

新年度になり、わたしは大学４年生になりました :tulip: :tulip: 
今日久々に学校に行き、学生証発行とついでに健康診断受けようと思ったんですけど、キラキラ :princess: :sparkling_heart: １年生が行列になって受診待ちしていたので、居心地悪くなり引き返しました笑
私も３年前は、大学の立地的？にファッションやメイクに気合を入れてたんですけど、歳を取るにつれUNIQLO縛りになったり、すっぴんで出歩くようになったりと・・・笑
でも、鍛えているので、ボディラインが出るUNIQLOの服をセクシーに着こなしています :muscle: :sunglasses: :heartbeat: :heartpulse: :purple_heart: :purple_heart: :purple_heart: 
では、今回から何回かに分けてクラス定義とオブジェクト生成についてやっていきたいと思います！
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです :sparkles: :sparkles: :v: :heart_eyes_cat: :v: :sparkles: :sparkles: 


##クラス定義

<dl>
<dt>クラス名の１文字目以降</dt>
<dd>Unicode文字、アンダースコア「＿」、ドル記号「$」</dd>
<dt>２文字目以降</dt>
<dd>上記に加え、数字（０〜９）</dd>
</dl>
※Javaび予約語、リテラルである`true`,`false`,`null`は使用できません。
Unicodeも利用可能なのでひらがなや漢字を使うことができるが一般的でないため推奨されません。



クラスのブロック内に定義できる要素
***1.フィールド***
　インスタンスの状態を表現するもの
***2.コンストラクタ***
　インスタンスの事前準備のためのもの
***3.メソッド***
　処理するもの

クラス定義の書式 :pencil2: 

> アクセス修飾子　class　クラス名　{
> 　　//クラス内の定義
> }


```java
1 public class Main {
2   public static void main(String[] args) {
3     Muscle m = new Muscle();
4     m.name = "腹筋";
5     System.out.println(m.name);
6   }
7 }

```

こんな感じです :laughing: :laughing: 

クラス宣言には、必ず`class`キーワードを付けます！



###クラスのインスタンス化

いきなりですが、問題です :trollface: ！！
３行目の *`//※`* には何が入るでしょうか！！

```java
1 public class Main {
2   public static void main(String[] args) {
3     //※
4   }
5 }
6 class Muscle {
7   //クラス内の定義
8 }
```

1. Muscle muscle = new Muscle();
2. Muscle muscle = new Muscle;
3. Muscle muscle = create Muscle();
4. Muscle muscle = create Muscle;

↓答え :notes: :notes: 

正解は１番です！おめでとうございます :kissing_heart: :exclamation: :heart: 

クラスは型の定義であり、そのままでは利用することができません！！
定義されたクラスを使って、インスタンスを生成することによって初めて利用することができます。


インスタンスを生成する書式 :pencil2: 

> クラス名　変数名　=　new　クラス名();
> または
> クラス名　変数名　=　new　クラス名(引数);



<dl>
<dt>クラス名</dt>
<dd>インスタンス化するクラスの名前を記述</dd>
<dt>クラス名()　または　クラス名(引数)</dt>
<dd>呼び出すコンストラクタの名前(クラスの名前と同じ)および引数を記述</dd>
<dt>new</dt>
<dd>コンストラクタを呼び出してインスタンスを生成する</dd>
</dl>



###コンストラクタ

コンストラクタとは、インスタンスを使用できるように準備するための初期化処理を記述したもの。
`new`によるインスタンス化の際に自動的に呼び出される。



書式 :pencil2: 

> アクセス修飾子　コンストラクタ名(引数)　{
> 　　//インスタンスを使用できるようにするための初期化処理
> }

```java
1 public class クラス名 {
2   public コンストラクタ名() {
3　   //ここにインスタンス生成処理を記述
4   }
5 }
```


***コンストラクタのルール***

1. コンストラクタ名は、クラス名と同じ
2. 戻り値型は記述できない(`void`等)
3. インスタンス生成時のみ
Seleniumでタイムアウトを設定/要素が読み込まれるまで待つ方法 (ruby)

# Seleniumでタイムアウト
任意の要素が読み込まれるまで待った後に処理を行い、指定した時間内にその要素が見つからない場合にはタイムアウトする場合。

```rb
require 'selenium-webdriver'

#ブラウザとwait(10秒)のインスタンスを生成
$browser = Selenium::WebDriver.for :firefox, profile: default_profile
$wait = Selenium::WebDriver::Wait.new(timeout: 10)

$browser.navigate.to 'https://www.hogehoge'

begin
  #id_nameをidに持つ要素が見つかるまでwait, 10秒の間に見つからなければTimeout
  @element = $wait.until { $browser.find_element(id: id_name) }
rescue RuntimeError => e
  print e.message
  $browser.close
rescue => e
  print e.message + "\n"
end

#click
@element.click
```

# 最後に
自分への勉強も込めて書いてみました。誰かの参考になれば幸いです。

また、個人的に電車などで使える場所で起こす目覚ましアプリ[MapMe](https://play.google.com/store/apps/details?id=com.takusemba.mapme&hl=jp)とNetflixの映画レビューサイト[WhatchaSee](https://whatcha-see.herokuapp.com/)を運営しているので、使っていただけるとありがたいです。
Xcode 7.3 Cocoapods "Could not build module" の対処法


SwiftでかかれたライブラリをObjective-Cで使おうとして、`Could not build module`エラーが出ました(Xcode 7.3 Cocoapods 0.39.0 にて)。

![Screen Shot 2016-04-02 at 8.14.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8920/8cce0abf-6c82-1735-f05d-115e9f28719a.png)


# 対処法

`Allow Non-modular Includes In Framework Modules`の値を`Yes`にします。

![Screen Shot 2016-04-02 at 8.15.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8920/d24aa8ad-af25-a65e-3fd7-324be284370e.png)


# Podfile

そのエラーがでた時の設定を書いておきます。

```
platform:ios, '9.0'
use_frameworks! # Swiftのライブラリを使うための記述

def main
  pod 'ReactiveCocoa', '~> 4.1'
end

# ReactiveCocoaTestというプロジェクト名にライブラリを読み込む
target 'ReactiveCocoaTest' do
  main
end
```

![Screen Shot 2016-04-02 at 8.17.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8920/efb123d5-0f37-36f6-da02-bf96d7ea9744.png)

# 参照

Can't build after cocoapods install when use_frameworks is enabled #2
:link: https://github.com/ParsePlatform/ParseFacebookUtils-iOS/issues/2
Seleniumでログインページを省略する方法 /Profileを選択する方法 (firefox, ruby)

# seleniumとは
Seleniumはブラウザを使ったUIテストツールです。ページ遷移したり、クリック処理、フォームに入力、スクリーンショットなど、様々なことができます。

# Seleniumでログインページをまたぐ時
ログインを要するサイト(facebook, Netflix, Gmailなどなど、)をSeleniumを使って巡回する際に、いちいちパスワードとユーザーIDを入力していては時間がかかってしまいます。
そんな時には事前にログインをさせておいたprofileでブラウザを立ち上げることによってログインページをまたがずに済むことができます。

# 指定のProfileでブラウザを立ち上げる (ruby, firefox)
ここではrubyとfirefoxを使っていますが、任意の言語、任意のブラウザで可能です。
1. profileを新規作成して、ブラウザを開く
ターミナルで以下のコマンドを叩き、profileを作成しブラウザを立ち上げます。

```java
/Applications/Firefox.app/Contents/MacOS/firefox-bin -P
```

<img width="397" alt="スクリーンショット 2016-04-02 20.11.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/93589/afeefa9e-9d2b-f253-3888-f01aec89faf2.png">

2. ログインが必要なページでログインを済ます。
ブラウザのキャッシュにパスワードとIDが保存されるようにしてください。

3. 指定したprofileでブラウザを立ち上げる。

```ruby
require 'selenium-webdriver'
default_profile = Selenium::WebDriver::Firefox::Profile.from_name 'hoge'
default_profile.native_events = true
$browser = Selenium::WebDriver.for :firefox, profile: default_profile
$browser.navigate.to 'https://whatever_your_url_is'
```

# 最後に
自分への勉強も込めて書いてみました。誰かの参考になれば幸いです。

最近アプリをリリースしました。[MapMe]というAndroidアプリ(https://play.google.com/store/apps/details?id=com.takusemba.mapme&hl=jp)です。
また、[WhatchaSee](https://whatcha-see.herokuapp.com/)というNetflixの映画レビューサイトも運営しているので、興味があればそちらも拝見してみてください。
英語を話せるようになるために自分がした4つのこと

# 下記手順にてそこそこしゃべれるようになった(気がする)

1. 【基礎】英文法を覚える
2. 【Reading】英語の本を読む
3. 【Writing】英語を書く
4. 【Speaking】日本語がわからない自分と同じ英会話レベルの友達としゃべる

## 1. 【基礎】英文法を覚える
下記の本で勉強した
https://www.kinokuniya.co.jp/f/dsg-01-9784487376162

高校総合英語が学べる教科書であれば何でも良い

章ごとに問題があるから繰り返し問題を解く

## 2. 【Reading】英語の本を読む
一冊とにかく読み終えること。
わからない単語は辞書を使って、意味を調べて本に直接書き込む

下記のような本とか簡単な本ですでに日本語で話が知ってるものから進めるとよいかも
http://www.amazon.co.jp/%E3%81%BE%E3%82%93%E3%81%8C%E6%97%A5%E6%9C%AC%E6%98%94%E3%81%B0%E3%81%AA%E3%81%97%E2%80%95Once-upon-time-Japan-%E3%80%90%E8%AC%9B%E8%AB%87%E7%A4%BE%E8%8B%B1%E8%AA%9E%E6%96%87%E5%BA%AB%E3%80%91/dp/4770022107/

## 3. 【Writing】英語を書く
日記でも、小論文でもいいから英語を書いてみる。
調べながらでもいいから書く。

小論文は難しいから日記から始めるのが良いと思う

下記のサイトで日記を書くと、英語できる人が添削してくれるのでおすすめ
http://lang-8.com/

## 4. 【Speaking】日本語がわからない自分と同じ英会話レベルの友達としゃべる
同じく英語を勉強してる外国人と友達になる。
自分と同じくらいの英語力の人と友達になること。
そうしたら相手の話してることもだいたいわかるし、相手にも自分が何を話しているか理解されやすい。
勉強したことなどを実際に話すことで次から自然と英語が話せるようになってくる。
Ubuntu14.04をインストールしたらタッチパッドが動かなかったときの対処法

# はじめに
初投稿です

パソコンを手に入れた時、真っ先にすることはなんでしょう？
そうですね、Ubuntuのインストールですよね！
というわけで私も最近手に入れたノートパソコンにUbuntu14.04LTSをインストールしました。

しかし、なんということでしょう、タッチパッドがうんともすんとも言いません。つらい。

色々ググった結果、なんとか解決できたのでここに共有します（軽く検索したらQiitaには同じような記事はなかった）。

## ノートパソコンについて
ノートパソコンは、Diginnos Note Critea DX4です。
詳細略

## 症状
1. インストールするときにも、インストールしたあと使用するときもタッチパッドが反応しない。
1. 外付けマウスは普通に動作する

## 解決策
[こちら（Ubuntu 日本語フォーラム）](https://forums.ubuntulinux.jp/viewtopic.php?pid=100090#p100090)に書いてあった方法で直りました。

`sudo vim /etc/default/grub`

```:/etc/default
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.noloop=1" #i8042.noloop=1を追加
```
`sudo update-grub`
`sudo vim /etc/modprobe.d/blacklist.conf`

```:/etc/modprobe.d/blacklist.conf
blacklist usbtouchscreen #末尾に追加
```

これで再起動したら直りましたヽ(=´▽`=)ﾉ

## 原因？
どうやらi8042というマイコン互換チップのバグ？らしいです([参考](http://agrimo.jp/wp/?page_id=6594))
残念ながらもっと詳しい原因はわかりませんでした。
詳しい方がいたらぜひ教えて欲しいです！
Wall-e project (ジョニー ファイブの復元)ー駆動部

# Wall-e ?

<img width="294" alt="Screen Shot 2016-04-02 at 7.01.23 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/73662/c6ccef68-d0b8-7b50-3bf3-7ba2d07ab668.png">


Wall-eです。

でも、僕の世代なら、やっぱ

<img width="245" alt="Screen Shot 2016-04-02 at 7.01.32 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/73662/ae25334f-68a7-5686-cb6a-a85ff6e3f819.png">

ジョニーですね、


子供の頃から、ロボットが好きで、何よりもキャタピラがついっているジョニー型のロボットが現実てきだなて思いました。Wall-eみたいな感じですね、
今回、Wall-eを作ってみたいと思います。（て言いながら、ジョニーの復元て書きます）

なるべく、うちの引き出しに入っている部品を活用します。すでにアマゾンで購入したので、とこでも売っているものなんでしょね。

# 駆動部で使われるフレーム（キャタビラ）

<img width="500" alt="Screen Shot 2016-03-27 at 12.10.09 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/73662/2c418268-cceb-e9db-3e89-a1e17803fc98.png">

これです。

ALIEXPRESS
http://ja.aliexpress.com/item/Smart-car-tank-metal-chassis-kits-crawler-chassis-tracked-vehicle-chassis-robot-chassis-Wali-Free-shipping/32284679947.html


12VのDCモータが２個内装されています。

＊その他の部品
コントロールボード：Arduino
モータドライブ：Arduino Motor Shield

を使う予定です。


今日はここまでです。

また、時間があったら書き続きます。
UNION した際、 CONVERT した項目で ORDER BY するには

#UNIONするとCONVERTとした項目でORDER BYできない！
ORDER BY句内でCONVERT関数を用いた時に発生した事象の備忘録です。

先日、もともと存在していたSQLのソート方法を現在の文字コードではなく、別の文字コードによるソート方法にしたい、という問題が起こりました。
そこで、CONVERT関数を用いて、

```
SELECT 
    A項目
    B項目
FROM
    Xテーブル
ORDER BY
    A項目
;
```

↓

```
SELECT 
    A項目
    B項目
FROM
    Xテーブル
ORDER BY
    CONVERT(A項目,'JA16EUC')
;
```

とし、これでA項目を別の文字コード（ここではEUC）でソートした順番で表示してくれます。

しかし、ORDER BYをする対象が、UNION等で取得データの結合が行われたものであった場合は単に「CONVERT(A項目,'JA16EUC')」とするだけではうまくいきませんでした。
例えば、

```
SELECT 
    A項目
    B項目
FROM
    Xテーブル
UNION ALL
SELECT 
    A項目
    B項目
FROM
    Yテーブル
ORDER BY
    CONVERT(A項目,'JA16EUC')
;
```

はうまくいきません。
「ORA-01785:ORDER BY 項目は、SELECTリスト式の数値である必要あります。」
が発生すると思います。

ちなみに、

```
SELECT 
    A項目
    B項目
FROM
    Xテーブル
UNION ALL
SELECT 
    A項目
    B項目
FROM
    Yテーブル
ORDER BY
    A項目
;
```

では結合後の取得データをA項目でソートしたもの（ソートの際の文字コードはその環境デフォルトのものだが）がしっかりと表示されます。

取り急ぎ、該当処理を実行するためには、

```
SELECT
    A項目
    B項目
FROM(
    SELECT 
        A項目
        B項目
    FROM
        Xテーブル
    UNION ALL
    SELECT 
        A項目
        B項目
    FROM
        Yテーブル
    )
ORDER BY
    CONVERT(A項目,'JA16EUC')
;
```

としてやれば達成できます。

なぜこのようにサブクエリを用いて取得したデータを、もう一回SELECTしなおさねばならないのかよくわかっていないですが、 これは課題とします。
ソースコードで想いを届ける

# ソースコードで想いを届ける
PG上級者になるとソースコードから想いを届けることができるらしい。
・・・というわけで、相手に想いを届ける「告白メソッド」を作ってみた。
※たぶん、そういうことじゃない。

## Java

```ILoveYou.java
public class ILoveYou{
	public static void main(String args[]){
		final String name = args[0];
		System.out.println("私は" + name + "のことが好きです");
	}
}
```

実行結果

```
$ java iLoveYou 吹石一恵
=> 私は吹石一恵のことが好きです
```

本当は name なんていう変数いらなくて、直接表示する時に args[0] をぶち込んでも動く。
ただ、好きな人の名前を args[0] なんていう何がはいっているか分からないやつで表示したくなかった。
後、name を final にしたのは、一生この気持ちは変わらないよっていうことを伝え（ry

吹石ロスは辛かった・・・

## ruby
```iLoveYou.rb
def i_love_you n
  p "私は #{n} のことが好きです"
end

i_love_you ARGV[0]
```

実行結果

```
$ ruby iLoveYou.rb 土屋太凰
=> 私は 土屋太凰 のことが好きです
```
ruby なので簡潔に短く書きたかった。
告白は簡潔に想いを伝えるのが一番で（ry

簡潔に書きたかったから、変数名は長々と name じゃなくて n 一文字。
メソッドが３行だから n でも変数の意味忘れないでしょう。

必要に応じて「# n は 名前(nameの頭文字) のこと」みたいな、コメントいれてもいい。
今回はコメントはいらないと判断。
ソースを簡潔に書いたけど、コメントをいれて長くなる、見づらくなるみたいな、本末転倒なことにならないようにしたい。

出力するメソッドも puts でも print でもなく p。
だって、１文字で書けるから。 

```
def i_love_you(n) p "私は #{n} のことが好きです" end
```
メソッドをワンライナーで書くとこんな感じでしょうか？

個人的に見づらい印象があるので、３行の方でいい気がします。
簡潔にするのもいいけど、ソースコードを通して伝えたい「意味」が相手(ソースを読む人)に伝わるか、ソースコード自体が分かりやすいかは凄い大事ですよね。

## swift
```
func iLoveYou(name: String) {
    print("私は\(name)のことが好きです")
}

iLoveYou("ウルトラマン")
```

実行結果（xcode の playground 上）

```
"私はウルトラマンのことが好きです\n"
```

特になし。
ちなみに吹石一恵と土屋太凰は
ウルトラマン映画のゲストヒロインです。
吹石一恵はウルトラマン役です。
土屋太凰は地球とは別の惑星のお姫様役です。
２人とも宇宙人です。

## まとめ
・・・くだらないことやってないで、リーダブルコード読もう。
もっと読む人が読みやすく、僕の想いが伝わるソースを目指して勉強します。書きます。
Mac 10.11(capitan)でCocos2dを動かすと画面遷移でエラーが出る。

ここでハマって人はいないと思うけど・・・

```objc:CCTransition.m
-(void)draw:(CCRenderer *)renderer transform:(const GLKMatrix4 *)transform
{
    typedef id (*Func)(id, SEL);
    ((Func)objc_msgSend)(self, _drawSelector);
    
}
```

Macを今更`Capitan`にあげたら上記の箇所で落ちた。

```objc:CCTransition.m
-(void)draw:(CCRenderer *)renderer transform:(const GLKMatrix4 *)transform
{
//	typedef id (*Func)(id, SEL);
//	((Func)objc_msgSend)(self, _drawSelector);
    
    void (*Func)(id, SEL) = (void(*)(id, SEL)) objc_msgSend;
    Func(self, _drawSelector);
}
```

こうすれば動くようになったけど・・・
そろそろcocos2dも終わりかなぁ・・・。
SpriteBuilderでプロジェクトを作ると必ずここで落ちるって事だよなぁ・・・。
Python3での日本語変換モジュールの比較

ちゃお・・・†

自然言語処理といえば前処理がつきもの。前処理は速いにこしたことがない。というわけで、Python3での日本語変換モジュールの比較をしました。

## 比較項目
全角・半角の変換と、ひらがなからカタカナへの変換。対象文字列が長い場合と短い場合の両方を見る。

## 比較対象
- [jaconv](http://pypi.python.org/pypi/jaconv/) (わたしが作ったモジュール。最近 jctconv から名前を変えました)
- [mohayonaoさんのコード](http://d.hatena.ne.jp/mohayonao/20101213/1292237816)
- [cnvk](https://github.com/yuka2py/cnvk)
- [mojimoji](https://pypi.python.org/pypi/mojimoji/0.0.5)
- [zenhan](https://pypi.python.org/pypi/zenhan/0.5)
- [rfZenHan](https://pypi.python.org/pypi/rfZenHan/0.4)
- [python-nkf](https://pypi.python.org/pypi/nkf/0.2.0)

## 比較結果

[詳細はこちら](https://gist.github.com/ikegami-yukino/d71350cbb9fbec7f42c507c494bbe8b1)

| | jaconv  | cnvk  | mojimoji  |  zenhan | rfZenHan  | mohayonao | nkf |
|---|---|---|---|---|---|---|---|
| 短文を半角→全角 | 27.1 µs  |  96.4 µs | **5.04 µs** | 75.8 µs | 222 µs | | 23 µs|
| 長文を半角→全角 | 89.9 ms  |  38.6 ms | **23.1 ms** | 360 ms | 237 ms | | 95.4 ms |
| 短文をひらがな→カタカナ | **18.1 µs**  |  79.1 µs |  |  | | 25.4 µs | 23.2 µs |
| 長文をひらがな→カタカナ | 51.6 ms  |  **41.8 ms** | | |  | 246 ms | 98.6 ms|

Cython使ってるだけあってmojimoji速いです。Pure Pythonだとjaconvは短文のときにパフォーマンスがよくて、長文ではcnvkがよいようです。
読み取り専用メンバー変数

# constメンバー変数とvectorの問題

[@chikashimiyamaさんの記事](http://qiita.com/chikashimiyama/items/c052f4cb513a6869c73f)に対して[コメントした妥協案](http://qiita.com/chikashimiyama/items/c052f4cb513a6869c73f#comment-7c7a80d761caee00042a)より良さそうな実装を思いついたので、メモしておく。
コメントした妥協案の最大の不満点は、

- コンストラクター、代入演算子の実装が面倒臭い

ことである。これは、結局コピー／ムーブできないconstメンバー変数を抱えているからだ。
そこで、メンバー変数をクラスの外に出し、書き込みできないように関数経由で読み取るようにしてみる。

```cpp
#include <vector>
#include <iostream>

template <class T>
class AutoROData
{
    T m_data;

  public:
    explicit AutoROData(const T &data)
        : m_data{data}
    {}

    const T &operator()() const {
        return m_data;
    }
};

class WithConst
{
  public:
    WithConst(const int value1, const int value2)
        : value1{value1}
        , value2{value2}
    {}

    int getConstValue1() const {
        return value1();
    }
    void setConstValue1(const int value1) {
//      this->value1 = value1; // 間違って書き換えようとしても、コンパイルエラーになる
    }

    int getValue2() const {
        return value2;
    }
    void setValue2(const int value2) {
        this->value2 = value2;
    }

  protected:
    AutoROData<int> value1;
    int value2;
};

int main()
{
    std::vector<WithConst> vec{
        {20,21},
        {30,31},
        {40,41}
    };
    vec.erase(vec.begin()+1);
    for ( const auto &v : vec ) {
        std::cout << v.getConstValue1() << "," << v.getValue2() << '\n';
    }
}
```

データ用クラスを一々実装するのも面倒臭い[^面倒臭い]のでテンプレートにしている。
[^面倒臭い]: プログラマーは面倒臭がり屋である(^^;

`AutoROData<T>`型のオブジェクトは、コピー／ムーブできるようにするために代入演算子を削除していないが、元の型（T型）ではなく`AutoROData<T>`型のオブジェクトを代入する必要があるので、間違って代入してしまうことはないだろう。
これで、`WithConst`クラス自体はコピー／ムーブできるが、メンバー変数`value1`は読み取り専用（に見えるよう）になった。

## おまけ

メンバー変数`value1`から元のint型の値を読み取るためには関数形式`value1()`で呼び出す必要があるので、多少違和感がある。
そこで、C++標準委員会に提出された「[C++ Properties -- a Library Solution](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1615.pdf)」を参考にプロパティ化すると、自然に見えるようになる。

```cpp
#include <vector>
#include <iostream>

template <class T>
class AutoROProperty
{
    T m_data;

  public:
    explicit AutoROProperty(const T &data)
        : m_data{data}
    {}

    operator const T &() const {
        return m_data;
    }
};

class WithConst
{
  public:
    WithConst(const int value1, const int value2)
        : value1{value1}
        , value2{value2}
    {}

    int getConstValue1() const {
//      return value1();
        return value1; // 元のint型の値を読み取る場合と全く同じように書ける
    }
    void setConstValue1(const int value1) {
//      this->value1 = value1; // 間違って書き換えようとしても、コンパイルエラーになる
    }

    int getValue2() const {
        return value2;
    }
    void setValue2(const int value2) {
        this->value2 = value2;
    }

  protected:
//  AutoROData<int> value1;
    AutoROProperty<int> value1;
    int value2;
};

int main()
{
    std::vector<WithConst> vec{
        {20,21},
        {30,31},
        {40,41}
    };
    vec.erase(vec.begin()+1);
    for ( const auto &v : vec ) {
        std::cout << v.getConstValue1() << "," << v.getValue2() << '\n';
    }
}
```
Macからログイン画面経ずにAWS Management Console行くで！

# Macからログイン画面経ずにスムーズにAWS Management Console行くで！

ビビリな私は、当然MFAを有効にしてパスワードも定期的に変更しているので

__ログインが面倒くさくて最近ほとんどログインしていなかった。__

![login.png](https://qiita-image-store.s3.amazonaws.com/0/103725/2b7659ee-8e1b-df05-3097-f02da96a103e.png "login.png")

やりたいことはあるのにログインが面倒だから入らないってなんやねん。

ってことでコマンド叩いたらログイン済みの画面開くようにするで。

## ターゲット

+ AWS使う人
+ ログイン画面でログインするのが面倒くさい人
+ Macユーザ(じゃなくても良いけど、openコマンド使ってるので窓の場合はそこの書き換えが必要)
+ Node.jsの環境ある人
+ cliをちょっとは触ったことがある。

## 技術要素とライブラリ

技術要素

+ AWS IAM
+ AWS STS
+ Node.js

Node.jsのライブラリ

+ aws-sdk
+ co
+ request

## やったこと

+ IAMでユーザとロールを作成(ユーザは既存のユーザで良い)
+ Node.jsのスクリプトをゴリゴリ書く
+ 走らせる

### Role

Roleの作成としては

+ AssumeRole52というロールを
+ AdministratorAccessのポリシを当てて
+ ユーザにそのロールを使う権限を与える

AdminiStratorAccessに関しては下図の通り

![Role1.png](https://qiita-image-store.s3.amazonaws.com/0/103725/20773f5d-f1f6-0346-02d4-18eeb4bd6dce.png "Role1.png")

信頼関係タブから「信頼関係の編集」を選んで下の感じでユーザを書き足したらOK

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com",
        "AWS": "arn:aws:iam::数字:user/ユーザのID"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

追加したら画面にユーザの情報が追加される

![Role2.png](https://qiita-image-store.s3.amazonaws.com/0/103725/2742f9a0-5dc2-c01d-81cf-d40148c32318.png "Role2.png")

ただ、AdministratorAccessなんぞ許可することはオススメせず、触りたいサービスの許可したいActionだけに絞ってRoleを与えるくらいの認可制御しなきゃなんやで。

### コード

https://github.com/uji52/awsmc

Githubに上げているのでそちらを参照。

流れとしては

+ 付与したいPolicy等の設定を読み込んで
+ STSに対して自分のユーザでログインセッションを要求
+ 取得したセッションのTokenを使ってログイン画面へアクセスさせる。

## まとめ

ログインを簡単にする上に、権限絞ったアクセスしかできないトークンを発行するから安心！

人に一時的にログインさせるとかが起こってもPolicy切ってから渡せばOKなので素敵！

調子乗ってAppleScript書いて呼び出したけど、自分の環境以外で使えるようにするの面倒だったので今後ビックリするくらい気が向いたら公開。