OmniAICreator/Qiita-1.07M huggingface dataset:
IExでimportしたモジュールを一覧表示したい

##簡易的な確認
簡易的には`__ENV__.requires`で`import`したモジュールを確認できます。

```iex
iex(1)> __ENV__.requires
[IEx.Helpers, Kernel, Kernel.Typespec]
iex(2)> import Ecto.Query
nil
iex(3)> __ENV__.requires
[Ecto.Query, IEx.Helpers, Kernel, Kernel.Typespec]
```

`__ENV__.requires`には`require`したものも含まれます。
特定の関数やマクロがimportされているかどうかは`__ENV__.functions`と`__ENV__.macros`で確認できます。


##カスタムヘルパー
`__ENV__`を何度もタイプするのは面倒くさいので、自分用のIExペルパーを書いて`.iex.exs`に追加してみました。（こういうマクロの使い方がいいのかどうかはよくわかりませんが）
残念なことに、今のところ`.iex.exs`で定義したモジュールは`.iex.exs`内でimportすることはできないため、セッション開始後に手動でimportする必要があります。

```:.iex.exs
defmodule IEx.MyHelpers do

  def default_env do
    __ENV__
  end

  defmacro env do
    quote do
      __ENV__
    end
  end
 
  defmacro alias do
    quote do
      __ENV__.aliases
    end
  end

  [:requires, :functions, :macros] |> Enum.each(fn name ->
    defmacro unquote(name)(option \\ :imported) do
      name = unquote(name)
      import MapSet
      quote bind_quoted: [option: option, name: name] do
        case option do
          x when x in [:a, :all]      -> __ENV__     |> Map.get(name)
          x when x in [:d, :default]  -> default_env |> Map.get(name)
          x when x in [:i, :imported] ->
            difference(new(__ENV__     |> Map.get(name)),
                       new(default_env |> Map.get(name)))
            |> MapSet.to_list
        end
      end
    end
  end)

  defmacro imported(option \\ :imported) do
    quote bind_quoted: [option: option] do
      f = functions(option) |> (fn x -> %{functions: x} end).()
      m = macros(option)    |> (fn x -> %{macros: x} end).()
      Map.merge(f, m)
    end
  end

end

alias IEx.MyHelpers
```


セッション開始後に`import`した関数・マクロを表示できるので、`__ENV__`を見るよりは少しだけ見やすいです。

```iex
iex(1)> import MyHelpers
nil
iex(2)> import Ecto.Query, only: [select: 3]
nil
iex(3)> imported
%{functions: [{IEx.MyHelpers, [default_env: 0]}],
  macros: [{Ecto.Query, [select: 3]},
   {IEx.MyHelpers,
    [alias: 0, env: 0, functions: 0, functions: 1, imported: 0, imported: 1,
     macros: 0, macros: 1, requires: 0]}]}
```

##参考資料

[Elixir: How to define multiple macros using a List as a variable? (StackOverflow)]
(http://stackoverflow.com/questions/37236450/elixir-how-to-define-multiple-macros-using-a-list-as-a-variable)
[Support delayed evaluation of code in .iex.exs (Github)]
(https://github.com/elixir-lang/elixir/issues/3328)
pythonのmemory_profilerが重いので計測してみた

# スペック
MacBook Air
OS X El Capitan
プロセッサ 1.4GHz Intel Cor i5
メモリ 4GB 1600 MHz DDR3

# インストール
https://yakst.com/ja/posts/42
を参考に

```
pip install -U memory_profiler
pip install psutil
```

# 計測用スクリプト
1万回数を数えるだけ

１. メモリ測定なし用

``` count10k.py
#!/usr/bin/env python
import time

def main():
	start = time.time()
	j = 0
	for i in range(10000):
		j += 1
	print ("elapsed_time:{0}".format(time.time() - start)) + "[sec]"

if __name__ == "__main__": main()
```
２. メモリ測定あり用
main関数の前に"@profile"を挿入しただけ

``` mem_count10k.py
#!/usr/bin/env python
import time
@profile
def main():
	start = time.time()
	j = 0
	for i in range(10000):
		j += 1
	print ("elapsed_time:{0}".format(time.time() - start)) + "[sec]"

if __name__ == "__main__": main()
```

# 測定結果
```
$ python count10k.py
elapsed_time:0.00121402740479[sec]
$ python -m memory_profiler mem_count10k.py
elapsed_time:0.404528856277[sec]
```
350倍くらい違う。
使い方が悪いのかなぁ
shibuya.apk #7のメモ

# イベント概要
http://shibuya-apk.connpass.com/event/30779/

# Introduction to Agera
@hydrakecat
https://speakerdeck.com/hkurokawa/introduction-to-agera

Agera
Rxなプログラミングをするためのライブラリ
渡ってくるのはUpdateしろという通知だけでデータはpullしてくる

RecycerViewで使える

onResume/onPauseでサブスクリプションを止める

Repositoryのcompile時のメソッドチェーンは結構厳密に呼べる順番が決まっているらしい

BaseObservableを継承するといい

Repositoryをチェインすることができる

ActivityのライフサイクルにあわせてObservableのaddUpdatableとremoveUpdatableを登録しまくる必要がある

# 未熟なチーム開発
@kgmyshin 

設計方針をしっかり決めた
　非同期
　永続化
　ビジネスロジック
　イベント管理
　Viewの管理
　フレームワーク独自

テストは必ず書く
　mockできないようなコードを書くと後でツケが払えなくなる
color追加禁止
theme, Styleの追加／変更禁止
dimens,strings,shape,selectorはこまめに切る
クラス図を書いてプルリクの説明に貼ってもらった
　新卒向け

# チーム開発にKotlinに導入した話
@kikuchy
http://www.slideshare.net/HiroshiKikuchi/kotlin-61811289

他のメンバーに訴求できるか
　ザイオンス効果

世間的なトレンド
　CAが採用してる
　Qiita

「ユーザーの得になるなら上司の承認は後で良い」

# アプリ開発とSDK開発の違い
@nekoe

堅牢さが第一
　簡単導入
　アホでも使える
　落ちない
　性能劣化しない

導入簡単
　ASでもEclipseでもUnityでもCordovaでも簡単に導入できるようにする
　3rd party製のライブラリへ依存があると色々大変
　Kotlinですら使えない

アホでも使える
　ひたすらいじめ系のテストをやる
　　Appium、Robolectric
　
落ちない
　try-catchでRuntimeExceptionすらCatch
　UncaughtExceptionHandler
　普段はタブーとされているやつ

性能劣化させない
　UIスレッドの邪魔しない

　バックグラウンドスレッド多用

# AndroidとIPv6
@hidey
https://speakerdeck.com/hidey/androidtoipv6

DNS64
AndroidでIPv6アクセスしてくる人ほとんど居ない(5～6%ぐらい)
iOSはほぼ0
　モバイルプロファイルはIPv4 only
　Wi-Fi環境ではv6対応はしている

日本
　KDDI：使えるらしい
　docomo mopera U：対応済み
　docomo sp：2017年対応予定
　SB：情報出てこなかった
　IIJ：対応済み

Androidで特別に対応する必要はない
　v4を期待しているコードがあるならv6でも動くようにする
　webRTCは対策必要

# 殺伐としたアイコン入れ替えフローのご提案
@dagezi

温かみのあるフロー

デザイナがSketchで書いたデータをCI経由でpngを吐く
デザイナも巻き込んだCIになる

ブログとQiitaに紹介記事がある
http://qiita.com/dagezi/items/7af6621fffb15e2c4c08


# Androidにおけるいいねボタンの動作の実装
設計はつかれちゃった
　育ってきた環境が違うから

何が面倒なのか
　Activityをまたいだ状態の変化
　非同期通信のエラー処理
　連打の対応

Activityをまたいだ状態の変化
　onActivityResultでモデルを更新
　　DroidKaigi公式アプリ
　EventBusで通知
　　Taptrip
　Repositoryクラスでメモリキャッシュ
　　GoogleのMVP実装サンプル

onActivityResultでモデルを更新
　無駄が多い、スマートじゃない

EventBus
　Observerパターンでイベントを通知する仕組み
　RxJava
　onActivityResultよりも反映は速い

Repositoryパターンを利用
　DDD、PofEAAに出てくる概念
　Repositoryクラスはインフラ層からいい感じにデータを取って返す
　onResumeとかで更新してるのであんまりイケてない

結論：どんなやり方でもいい
map が単射ではなかった件

今日遭遇したバグ。簡略化して書くと以下のような処理だった。

```scala
trait X {
  def foo():Iterable[String]
}
class Y extends X {
  def foo() = Seq("ab", "c", "def", "ghi")
}
class Z extends X {
  def foo() = Set("ab", "c", "def", "ghi")
}

new Y().foo().map{ _.length }.sum
new Z().foo().map{ _.length }.sum
```

どちらも a～i までの 9 文字を数えているだけなので同じ 9 という結果になると思いきや `Z` の方が小さい結果になります。

```scala
scala> new Y().foo().map{ _.length }.sum
res1: Int = 9

scala> new Z().foo().map{ _.length }.sum
res2: Int = 6
```

`Z` は重複した値を排除する目的で内部では `Set` を使用していたわけですが、その `map` 結果も `Set` となるため `"def"` 要素と `"ghi"` 要素に対応する `_.length`=3 が重複排除され結果として `Y` より 3 少ない値となったわけです。`Set` を選択している場所は多態化した特定のクラスのみであり `map` を使用している場所とは離れています。ぱっとコードを見ただけで原因に気づくのは難易度が高い。実際、ステップ実行してみてインスタンスが `Z` の場合だけ `foo()` が `Set` を返していることを見つけて気づいたわけです。

`map` は単射 (前後で要素数が変わらない) と認識していたわけですが、単射とも限らず元の集合の実装特性による動きになるのか、値域に同値があるからそもそも単射じゃないと解釈するのか、まぁどちらにせよもやっと微妙な感じが残りました。
Paperclipのバージョンを上げたらPaperclip::Storage::S3::AWSのNameErrorが出た時の対応

結論から書くと　同時に上げたaws-sdkのバージョンを上げすぎたため。

調査不足というか、残念なハマり方をしてしまったので、反省を込めて共有。

エラー発生時の環境は以下の通り。

```
ruby: 2.2.3
rails: 4.2.6
paperclip: 4.3.6
aws-sdk: 2.3.2
```

事の始まりは、Railsのバージョンを上げた時。
同時に一部のGemのバージョンも更新しました。

その後に画像アップロード系の処理で以下のエラーが出ました。

```
NameError uninitialized constant Paperclip::Storage::S3::AWS
```

Paperclipがaws-sdkの1系にしか対応してないのは聞いてたんだけどなぁ。
どこかで見た2系も対応してるって情報を不用意に信じすぎました。。。

ちゃんとREADME見ないとダメですね。

https://github.com/thoughtbot/paperclip
> You may also choose to store your files using Amazon's S3 service.
> To do so, include the aws-sdk gem in your Gemfile:
>
> gem 'aws-sdk', '>= 2.0.34'
>

というか、というかだ。
確かに2系に対応してるけど・・中途半端な・・・

最終的に自分はaws-sdkを1系(v1.66)に戻す対応を行い、その後は問題なく動作しています。

aws-sdkを直接使ってアップロード系の処理を書いたほうがいいのかな。。。
CentOS7にyumでRedisを入れる

インストールできそうなRedisを探しましょう。

```latex:redisの検索
yum list | grep redis
```
これを書いた時点(2016/5/9)では、次のものが最新でした。

```latex:
redis.x86_64                            2.8.19-2.el7                   epel     
```
確認できたらこのコマンドでインストール。

```latex:インストール
sudo yum -y install redis
```
インストールしたRedisのバージョン確認。

```latex:バージョン確認
redis-cli -v
```
```
redis-cli 2.8.19
```
このように表示されたらインストール成功。
続いてRedisを起動します。

```latex:redisの起動
sudo systemctl start redis.service
```
動作確認のコマンド

```latex:動作確認
redis-cli ping
```
```latex:redisから返事
PONG
```
これが返ってくれば動いています。
仕上げにRedisがサーバー起動時に自動起動するようにしておきましょう。

```latex:自動起動
sudo systemctl enable redis.service
```
終わり
【Unity2d】Animationに合わせて音を出す

走るAnimationに対して、着地するたびに足音を出すようにしたい。

で、いろいろと調べたところ簡単にできるみたい

「Window」→「Animation」でAnimationタブを表示して、
音を出したいところで（秒数の下あたりを）右クリック。
で、EventをセットしてやればOK！
※EventはSpriteにAttachされているScriptから選択可能です。

![animation_event.png](https://qiita-image-store.s3.amazonaws.com/0/124782/89fa705e-916a-eeb2-0859-c9b516daf597.png)

# 参考
http://bribser.co.jp/blog/animation-method/
Perl6でも愛が生まれた

```love.pl
say "生"~&"死"
```

# 参考

* [愛が生まれた - Qiita](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)
* [なんで愛が生まれるのか - Qiita](http://qiita.com/tienlen/items/44daf3a52eb872085556)
Windows 7でのWindows 10アップグレード抑止

「Windows10を入手する」(GWX.exe)を含む更新プログラム
---
以下の更新プログラムに含まれる。
・KB2952644
・KB3035583

Windows 10アップグレードを抑止するにあたって必要となる更新プログラム
---
・KB3065987
・KB3075851
・KB3083324
・KB3083710

レジストリ設定によるWindows 10アップグレード抑止
---
※コマンドプロンプトを「管理者として実行」にて起動し、入力

```lang:「Windows10を入手する」(GWX.exe)アイコンを消す
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Gwx /v "DisableGwx" /t REG_DWORD /d 00000001 /f
```
</br>

```lang:Windows&nbsp;10のアップグレードを無効化
reg add HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate /v "DisableOSUpgrade" /t REG_DWORD /d 00000001 /f
```

公式ツールを利用したWindows 10アップグレード抑止
---
ダウンロード元：http://aka.ms/diag_70952
</br>
1. [次へ]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/a679f677-003d-cb7d-5f7f-2f29513a9077.png)
</br>
2. [Upgrade Later]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/50533825-9372-bb6e-921a-93510efa96b8.png)
</br>
3. [トラブルシューティングツールを終了する]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/18d498c5-9c9c-cd8e-bd72-7d859f11fae7.png)


参考URL
---
>**＠IT：Windows UpdateによるWindows 10へのアップグレードを「ブロック」する方法**
URL：http://www.atmarkit.co.jp/ait/articles/1507/27/news022.html

>**Microsoft：Windows 10アップグレードの予約取り消し方法**
GWX.exeが既に動作し、アップグレードがスケジュールされている場合の取り消し手順。
URL：https://support.microsoft.com/ja-jp/kb/3095675

>**INTERNET Watch：Windows 10自動アップデートを抑止する公式ツールが提供開始、通知アイコンの非表示も可能**
URL：http://internet.watch.impress.co.jp/docs/news/20160523_758599.html

>**Microsoft：Windows 10アップグレードが開始された後のキャンセル方法**
URL：https://mix.office.com/watch/ikvhtn5xb7mu

>**Microsoft：Windows 10へのアップグレードを抑止する方法**
https://sway.com/paGpQ6qPQYtxokYE

環境
---
Windows 7 Professional SP1
ロリポップ環境でSSIを使用するとき


## .htaccessに下記を追加
Options +Includes
AddHandler server-parsed html

上記をhtaccessに追加すれば、htmlの拡張子で絶対パスも可能。

引用：<a href="http://fuga-net.com/blog/2012/09/3.html" target="_blank">ロリポップ！で動かしているSSIの.htaccess　htmlファイルの記述 | Blog | fuga-net.com</a>
localhost3000でエラーが起きます

ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development
Extracted source (around line #392):
390
391
392
393
394
395
  def check_pending!(connection = Base.connection)
    raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection)
  end

  def load_schema_if_pending!

上記のエラーができましたのでターミナルでRAILS_ENV=developmentと打ちましたら下記のようになりました。
aberyuuokunoAir:mooovi ryuki$ rake db:migrate RAILS_ENV=development 
rake aborted!
NameError: uninitialized constant AddUserIdToReviews

NameError: uninitialized constant AddUserIdToReviews

Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Rails::APIで名前空間を使ってWeb APIをバージョニングする


# 結論
Ruby on Railsでminorバージョン付きのURLを作るのは面倒です。
理由は...

1. controllerのパスに`.`を含めることができない
2. module名に`_`を含めることができない
3. module名に連続した数字を含めることができない
4. module名を数字から始めることができない

これを回避するためにcontorllerのバージョンナンバーを

```
v[数字][英小文字（適当な区切り文字）][数字]
```
形式にしました。

もっとかっこいい方法を教えてください。

# ゴール

APIをつくる際はURLにバージョンを入れたいです。
できれば、バージョン番号をmajorとminorの2段階欲しいです。

例えば...

```
/api/v0.0/users
```

な、URLにしたいです。

# 手順
## アプリケーションを作る
[Rails::APIを使ってノンコーディングでAPIサーバーを作る](http://qiita.com/ledsun/items/3cdb6267f6f34062bab6)と同じです。

### rails-api new
```
rails-api new battle-beast -BJTS -d mysql
```

### Gemfile編集
Gemfileからspringを削除します。

### bundle install

```
bundle install --without staging production --jobs=4
```

### DB作成

database.yamlをDBに合わせて修正します。

```
bundle exec rake db:migrate
```

## モデルを作る
rails generatorでモデルをつくります。

```
bundle exec rails generate model User name:string invisible:boolean
```

初期値とNULL禁止を指定する場合には[NOT NULLなどの制約の設定 - Ruby on Rails入門](http://www.rubylife.jp/rails/model/index9.html)を参考に、マイグレートファイルを編集してください。


```
bundle exec rake db:migrate
```

## コントローラーを作る
ここが本題です。

```
bundle exec rails generate scaffold_controller api/v0x0/user --model-name=user
```

- RUby on Railsはcontrollerのパスに.が使えない
- Rubyはモジュール名に`_`を使わない（generateコマンドで_は取り除かれる）
- V00や0V0のようなモジュール名は無効（なぜかわかりません。V0は大丈夫）

そこで、xで区切ります。
xには意味はありません。趣味です。

## ルート設定
config/routes.rbにルート設定を追加します。
Rails Resorceだと、URLとcontrollerのパスを変更できないので、手作業で設定します。

```rb
get  '/api/v0.0/users'     => 'api/v0x0/users#index'
post '/api/v0.0/users'     => 'api/v0x0/users#create'
put  '/api/v0.0/users/:id' => 'api/v0x0/users#update'
```

## コントローラーを修正
### locationヘッダーを削除
locationヘッダーを作る指定を外します。

```rb
  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    if @user.save
      render json: @user, status: :created
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end
```

[Rails: NoMethodError (Undefined method _url for _controller. I can't seem to respond_with json properly after my create. Why? - Stack Overflow](http://stackoverflow.com/questions/23582389/rails-nomethoderror-undefined-method-url-for-controller-i-cant-seem-to-res)

名前空間を使ったコントローラーでは`user_url`の代わりに`api_v0x0_user_url(@user)`を呼ばなければいけません。
割と面倒くさいので消します。

### 更新可能なパラメータを設定
strong parameterで更新できるパラメーターを設定します。

```rb
def user_params
  params.require(:user).permit(:name)
end
```
この変更はRailsを再起動しないと反映されないようです。

## 動作確認
IPアドレスは適当に読み替えてください。

#### 起動
```
bundle exec rails s -b 0.0.0.0 -p 9292
```


#### POST
```
curl -XPOST 'http://100.92.136.162:9292/api/v0.0/users' -H content-type:application/json -d '{"user":{"name":"abc"}}'
```

content-typeヘッダをつけないと、bodyをパースしてくれません。

#### GET
```
curl 'http://100.92.136.162:9292/api/v0.0/users'
```

#### PUT
```
curl -XPUT 'http://100.92.136.162:9292/api/v0.0/users/1' -H content-type:application/json -d '{"party":{"invisible": true}}'
```

permitを設定していない時、updateでは、例外は出ません。
DBのUPDATEをスキップします。

# 感想
今の所「Ruby on Rails（4.2.6）でWeb APIを作るのは面倒臭いなあ」と、思いました。
【ExcelVBA】VBAからTeraTermマクロを起動させる黒魔術

## なぜVBAとTeraTermを融合させないと満足しないのか？

データをTeraTermで取得した後、Excelで整理する、そんな作業ってたくさんあるんじゃないでしょうか。


単純なTeraTermマクロはシンプルに作れると思いますが、
ExcelVBAからTeraTermマクロをコントロールできると、幅が広がります。

何が便利かというと、、、

**「ユーザインターフェイスの統一」**が大きなメリット。

例えば以下のようなモジュールがあったとします。

- Linuxサーバでコマンドを実行
- 結果を取得する
- Excel上に展開する

普通につくると、TeraTermマクロ、SCP、Excelなどを別々につくって実行することになりますが、ExcelVBAから動かすことで、ユーザの操作を簡素化できます。

## 黒魔術のレシピ

![](https://3.bp.blogspot.com/-XpKJmpZCGgA/WdyDpbYHRQI/AAAAAAABHeM/dsM5vV8jD2Yh7WWVsiueF1nef91rnAa0ACLcBGAs/s800/mahoutsukai_necromancer.png)

それではさっそく見ていきましょう。

以下は、定義した内容をもとに、シェルを実行して結果を出力するサンプルです。

```vbnet:VBA
Sub TeraTermAction()

'変数定義（適当な値を代入してください）
Dim ACCOUNT As String    'TeraTermログインアカウント
Dim PASSWD As String    'パスワード（入力する方式にしてもOK）
Dim PROMPTNAME As String    'TeraTermプロンプトを設定
Dim LOGINPROMPT As String    'ログインプロンプトを設定（etc LOGIN:）
Dim PWPROMPT As String    'パスワードプロンプトを設定
Dim TTL_Path As String    'TeraTermMacroのファイルが存在するパスを指定
'その他の変数の定義は省略しています...

'コマンドファイル名の作成
sCmd_File = ThisWorkbook.Path & "¥sample_command.cmd"

'TTLファイル名の作成
sTtl_File = ThisWorkbook.Path & "¥sample_tterm.ttl"
        
'TTLファイル作成
'シェルを実行するTeraTermマクロを作成
n = FreeFile
Open TTL_File For Output As #n
'ここからTeraTermマクロの記述
Print #n, "UsernamePrompt ='" & LOGINPROMPT & "'"
Print #n, "prompt='" & PROMPTNAME & "'"
Print #n, "PasswordPrompt ='" & PWPROMPT & "'"
Print #n, "wait   UsernamePrompt"
Print #n, "sendln '" & ACCOUNT & "'"
Print #n, "wait   PasswordPrompt"
Print #n, "sendln '" & PASSWD & "'"
Print #n, "wait   prompt"
Print #n, "sendln 'TEST.sh XXX > OUTPUT.log'"
Print #n, "wait   prompt"
Print #n, "sendln 'exit'"
Close #n

'コマンドファイル作成
'TeraTermMacroをキックするbatを作成
n = FreeFile
Open CMD_File For Output As #n
'ここからbatの記述
Print #n, "@ECHO OFF"
Print #n, "SET TTPMACRO=""" & TTL_Path & """"
Print #n, "SET LOGINTTL=""" & TTL_File & """"
Print #n, "START /WAIT /D%TTPMACRO% ttpmacro.exe /V %LOGINTTL%"
Print #n, "DEL """ & CMD_File & """ """ & TTL_File & """"
Close #n
makeCommand = True

'コマンド実施
'batを実行してTeraTermMacroを起動する
Set oShell = CreateObject("WScript.Shell")
oShell.Run """" & CMD_File & """", , True
    
Set oShell = Nothing
    
End Sub
```

これでExcelVBAからTeratermマクロを呼び出し、て処理を実行できます。

処理内容はこのスクリプト内で動的に記述できるので、パターンがある場合にも便利ですね。


## 気をつける点

デメリットとしては、ただでさえクライアントサイドでの動作で不安定なTeraTermマクロなので、細かい動作は気をつけたほうが良いです。

たまに処理タイミングの問題で動作が止まる可能性もあります。

まずはサーバサイドでの処理を検討し、難しい場合にそれを補完する方法として検討するのが良いと思います。更新処理などにはあまりむいてないです。


## まとめ

さて、今回はExcelVBAからTeraTermを起動させる黒魔術のお話でした。

ここまでやるか？って感じですが、コテコテの運用現場で制約が多い場合には救いになるかもしれません。

特に精緻な動きが求められないケースで、少しでも工数を削減したいときにおすすめです。

Let's try!
Windows 10

個人的な備忘の為、記載。随時追記予定。

制限事項
---
>**・「Windows 10 Pro」でWindowsストアへのアクセスを制限する管理機能を停止**
管理者が「Windows 10 Pro」ユーザーに対し、Windowsストアへのアクセスをブロックするという設定ができなくなった。
2016年4月頃までは、管理者がグループポリシーを活用し、Windowsストアにアクセスできないよう設定することが可能だった。
Microsoftは、Windows 10の全バージョンでWindowsストアにアクセスできるようにすべきだと主張しているが、Enterprise版とEducation版では意図的にそうなっていない。
もし、Enterprise版やEducation版を利用している場合、管理者は今でも「AppLocker」やグループポリシーを利用してWindowsストアへのアクセスをブロックできる。
Microsoftの広報は、この変更があったことを認めており、Windowsストアへのアクセスを遮断する必要のある企業はWindows 10 Enterprise版を使用するようにとしている。Microsoftの公式コメントとしては以下の通り。

>>Windowsストアへのアクセスをブロックする機能は、企業で所有するデバイスの管理を強化したい企業に向けたもので、Windows 10 Enterpriseにて提供される機能だ。Windowsストアに関する管理機能は、MicrosoftがWindows 10 1511 (2015年11月のアップデート)を新Current Branch for Business (CBB)としてリリースすると公表した際に制限された。

引用元：http://japan.zdnet.com/article/35082203/
iOSのMKMapViewで、GoogleMap的なダブルタップ → 上下スライド でのズームイン・アウトとダブルタップでのズームを共存させる

# 始めに

iOS標準の地図を提供するMapKitのMKMapViewで、
GoogleMapのようなダブルタップからの上下スライドでズームイン・アウトする機能を実装した。
単にズームイン・アウトをするだけなら単純だったのだが、
デフォルトで設定してあるダブルタップでのズームの機能を残すのに少し苦労した。

# コード
```swift:ViewController.swift

import MapKit

class ViewController: UIViewController {

    /* ドラッグの位置記憶用の変数 */
    var dragPoint: CGPoint?

    var mapView: MKMapView!
    override func viewDidLoad() {
        super.viewDidLoad()
        mapView = MKMapView(frame: view.bounds)
        view.addSubview(mapView)

        let doubleLongPress = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.doubleLongPress(_:)))

        /* ダブルタップ後、即座にLongPress状態に移るように */
        doubleLongPress.minimumPressDuration = 0
        doubleLongPress.numberOfTapsRequired = 1

        mapView.addGestureRecognizer(doubleLongPress)

        doubleLongPress.delegate = self

        /* MKMapViewの機能が実装してあるSubViewを引っ張ってきて、設定してあるDoubleTapGestureRecognizerにdelegateを設定する */
        mapView.subviews[0].gestureRecognizers?.forEach({ (element) in
            if let recognizer = (element as? UITapGestureRecognizer) where recognizer.numberOfTapsRequired == 2 {
                element.delegate = self
            }
        })
    }
}

extension ViewController: UIGestureRecognizerDelegate {
    /* このzoomメソッドの実装は適当 */
    func zoom(magnification: Double) {
        var region = mapView.region
        let span = region.span
        region.span = MKCoordinateSpan(latitudeDelta: span.latitudeDelta * magnification, longitudeDelta: span.longitudeDelta * magnification)
        mapView.setRegion(region, animated: false)
    }

    /* ダブルタップ → 上下動  で、ズームイン / アウト する (GoogleMap的な挙動) */
    func doubleLongPress(recognizer: UILongPressGestureRecognizer) {
        let state = recognizer.state
        let location = recognizer.locationInView(recognizer.view)
        switch state {
        case .Began:
            dragPoint = location
        case .Changed:
            /* 上に動いたか下に動いたか判断 */
            let diffY = Double(location.y - dragPoint!.y)
            let magnification = 1 - diffY * 0.01
            self.zoom(magnification)
            dragPoint = location
        default:
            break
        }
    }

    /* MKMapViewに元から設定されているDoubleTapと、自分で設定したLongPressを同時に機能させる */
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
```

forced unwrapとかエラー処理とか設定する値のvalidationとかには適宜対応する。

# ポイント
* 元から設定してあるDoubleTapのrecognizerを無理矢理引っ張ってくる

* `gestureRecognizer(gestureRecognizer: UIGestureRecognizer,  
shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer)`
のdelegateメソッドを実装して、 
元から実装してあるDoubleTapと自分で設定したLongPressを同時に機能させる

これで、ダブルタップ → 上下スライド でのズームイン・アウトと単なるダブルタップでのズームが共存できるはず。
上下スライドを行った後で勝手にズームしないか心配だったが、その辺は都合よく動いた。

# 終わりに
iOS標準の地図にダブルタップ → 上下スライド でズームイン・アウトの機能が実装されていないのは特許の問題だろうか。
だとしたら勝手に実装したらまずい気もする。探しても実装した例が見つからなかったのはそのせいだろうか。とか思った。
MagicalRecordでLighteWeitMigrationが行われるかどうかを検出するスニペット


[CoreDataのLightweight Migrationが行われるかどうかを検出する](http://qiita.com/color_box/items/904fbdb64f92e60660fa)
上記記事のMagicalRecord対応版

```swift:willmMigrate
    func willMigrate() -> Bool{
        
        let sqliteURL =
        self.applicationDocumentsDirectory.URLByAppendingPathComponent("MigrateDetect.sqlite")
        let managedObjectModel = NSManagedObjectModel.MR_defaultManagedObjectModel()!
        
        do {
            // 初回実行時はメタデータの取得が出来ず、下記メソッドがエラーとなるため例外処理を行う
            let metadata = try NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType,
                URL: sqliteURL,
                options:nil)
            return !managedObjectModel.isConfiguration(nil,compatibleWithStoreMetadata:metadata)

        } catch {
            return false
        }

    }
```

MagicalRecordのManagedObjectModeｌはMR_defaultManagedObjectModel（）を使って取得する。
ManagedObjectModeｌの取得処理関連に手を入れている場合はそれを考慮したコードにしないといけない。
KVM のゲストで fstrim する

下記の環境で試しています。

- centos-release-7-2.1511.el7.centos.2.10.x86_64
- kernel-3.10.0-327.10.1.el7.x86_64
- qemu-kvm-1.5.3-105.el7_2.3.x86_64
- libvirt-1.2.17-13.el7_2.3.x86_64

下記の記事などを参考にやってみました。

- http://blog.widodh.nl/2015/12/using-trimdiscard-with-ceph-rbd-and-libvirt/
- http://dustymabe.com/2013/06/11/recover-space-from-vm-disk-images-by-using-discardfstrim/
- http://seesaawiki.jp/w/kou1okada/d/libvirt

----

ゲストの設定の編集を開始します。

```sh
virsh edit GUEST
```

scsi controller を追加します（既にあるなら不要です）。

```xml
<controller type='scsi' model='virtio-scsi' index='0'/>
```

ディスクの設定を変更します。

```xml
<disk type='block' device='disk'>
  <driver name='qemu' type='raw' discard='unmap'/>
  <source dev='/dev/vg1/guest.img'/>
  <target dev='sda' bus='scsi'/>
</disk>
```

- `<target/>` を `dev='sda' bus='scsi'` に変更する
- `<driver/>` に `discard='unmap'` を追記する
- `<address/>` は削除する

変更を保存して、ゲストを開始します。

```sh
virsh start GUEST
virsh console GUEST
```

fstrim してみます。

```sh
fstrim -a -v
```

TRIM されました。

```
/: 3.2 GiB (3422597120 bytes) trimmed
```

なお、元のゲストのディスクが virtio で接続されていた場合はディスクデバイスの名前が `/dev/vda` から `/dev/sda` に変わりますのでご注意ください。

## ホストで SystemTap で TRIM を確認

下記の記事の通りの方法で、ホスト側で SystemTap を使って、ゲストで fstrim したときに実際に TRIM されていることを確認してみました。

- [SSDに対するBlock Discard/TRIMをSystemTapで可視化する - SH2の日記](http://d.hatena.ne.jp/sh2/20110123)

ホスト側で次の通り準備します。

```sh
yum install systemtap \
  kernel-devel-$(uname -r) \
  kernel-headers-$(uname -r)

debuginfo-install kernel-$(uname -r)

cat <<'EOS'> /tmp/discard.stp
probe kernel.function("blkdev_issue_discard").return {
  printf("%s, sector=%d, nr_sects=%d, return=%d (%d - %d KiB)\n",
    execname(), $sector, $nr_sects, $return,
    $sector / 2, ($sector + $nr_sects) / 2 - 1);
}
EOS

stap -v /tmp/discard.stp
```

上がゲストで下がホストです。

![kvm-lvm-fstrim.gif](https://qiita-image-store.s3.amazonaws.com/0/8734/ccd16c88-d6d0-8a63-6b99-e28f38370ff1.gif)
Haskellでも愛が生まれた

```haskell
import qualified Data.ByteString as B
import Data.ByteString.UTF8 (fromString, toString)
import Data.Bits ((.&.))

main :: IO ()
main = putStrLn $ toString $ B.pack $ B.zipWith (.&.) (fromString "生") (fromString "死")
```

これだとutf8-stringパッケージが必要なんですよね。標準ライブラリだけでUTF-8エンコードはできないのだろうか？

## ごさんこう

- [愛が生まれた - Qiita](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)
- [なんで愛が生まれるのか - Qiita](http://qiita.com/tienlen/items/44daf3a52eb872085556)
実行時に続行するかどうかを聞くplaybook

vars_promptとfailの応用。
デプロイ時や重要な処理を行うときの意思表示を求める。

プロンプト表示

```
vars_prompt:
  - name: 'decision'
    prompt: 'Do you want to do something?(yes/no)'
    private: no
```

プロンプトで入力させた文字列に応じて実行を中断させる

```
tasks:
  - fail: msg='Deployment has terminated by user.'
    when: decision != 'yes'
```

参考
[Playbook 実行時に任意の値を指定する](http://d.hatena.ne.jp/akishin999/20130818/1376824640)
[fail - Fail with custom message](http://docs.ansible.com/ansible/fail_module.html)
Windows Live メール 2012

個人的な備忘の為、記載。随時追記予定。
制限事項
---
>・**Outlook.com、Office 365サポート停止**
“Outlook.com”は最新の“Office 365”インフラストラクチャー上に構築されているが、「Windows Live メール 2012」は新しい“Office 365”のプロトコルをサポートしていないため、メールの送受信が行えなくなる。
“Outlook.com”アカウントのアップグレードは2016年6月30日に開始されるため、それより前にアプリケーションの移行を済ませておく必要がある。

>引用元:http://m.forest.watch.impress.co.jp/docs/news/20160509_756402.html?ref=hl_rss
Vimでテキストを印刷

↓の記事を見て、[backspace.fm](http://backspace.fm/)のVim-sideでKoRoNさんがVimでカラー印刷できると言っていたのを思い出して、もうちょっと簡単に(?)実現する方法を調べてみた。
> プログラムの写経（vim編）
> http://qiita.com/NoriakiOshita/items/b7a5b0f14189da25128a

## 追記
参照先の記事で`hardcopy`について触れられている記述を見逃してました... すみません
`hardcopy`が動作する場合はこんな感じにするといいよ、と受け取って頂ければ幸いです。

## 印刷方法
結論としては以下のコマンドをVimで実行するだけ。(MacVimでのみ検証済み)

```
:set background=light
:set printoption=syntax:y,number:y
:hardcopy
```

Vimでは`hardcopy`というコマンドで印刷ができる (詳しくは[help :hardcopy](http://vimdoc.sourceforge.net/htmldoc/print.html#:hardcopy)を参照　ちなみに自分の環境だとMacのプレビューが開かれた)
helpを見ると、
>If 'background' is "dark", then the colours are darkened to compensate for
   the fact that otherwise they would be too bright to show up clearly on
   white paper.

と書いてあるので`background=light`に指定
また行番号とsyntaxを反映させるため`printoptions=syntax:y,number:y`に指定

Vimのコンパイルオプションとかによっては動作しない場合もあると思うので注意
Tumblr API v1を使った投稿のランダム取得

Tumblr API v1（バージョン1）を使って、Tumblrブログの投稿をランダムに取得する方法を紹介します。
現在、Tumblr APIは v2（バージョン2）に移行しているのですが、新しい方の v2 を使ってランダム取得するのは難しい、というか私は v2 ではAPI単体ではトリッキーな方法をとらないとランダム取得が出来ません。でも古い方の v1 なら結構簡単に出来るのです。

想定される使い方は、自分のTumblrからランダムに一つ取得してきて表示してくれるブログパーツ、ランダムで取得した投稿を定期的にTwitterに流すTwitter Botなどが考えられますでしょうか。

# 注意事項
この方法は、[廃止がアナウンスされて久しい](http://developers.tumblr.com/post/28557510444/welcome-to-the-official-tumblr-developers-blog)Tumblr API v1の /api/read を使った方法となります。そのためTumblrさんの気分によって、ある日スパーンッと利用不可能になる可能性がある点をご了解ください。
ただ、v1に昔はあった、/api/dashboard や /api/likes は使えなくなり、[Tumblr API v1ドキュメント](https://www.tumblr.com/docs/en/api/v1)からも削除されているのに対し、/api/read だけ今だに正常に使える上にドキュメントにも使い方の記載が残っているため、当分使えるんじゃないかと勝手に期待しています。

# /api/read とは
特定のTumblrブログから投稿を取得する事の出来るAPIです。認証は不要なので、自分以外ブログを指定しても取得出来ます。ですので後述のランダム取得もどのブログからでも取得出来ます。使い方は、http://(YOU).tumblr.com/api/read の(YOU)の部分に自分のIDを入れてアクセス。

リクエスト例：

```
http://nihongo.tumblr.com/api/read?num=50
```

上記URLをブラウザのアドレスバーに入れて遷移してみればデータがXMLで取得出来る事が確認出来るはずです。利用可能なオプションなどの詳細は情報は[Tumblr API v1ドキュメント](https://www.tumblr.com/docs/en/api/v1)をご参照ください。

# ランダム取得の方法
/api/read はレスポンスにそのブログの総投稿数をレスポンスとして返してくれる素敵な性質があります。今回のやり方はその性質をうまく使うものとなっております。

1. **総件数を取得する**
    ここでは総件数のみが必要なので num=0 として取得件数0件を指定。
    リクエスト例：

    ```
http://nihongo.tumblr.com/api/read?num=0
``` 
    レスポンス例： 

    ```
<tumblr version="1.0">
  <tumblelog name="nihongo" timezone="Europe/Amsterdam" title="Tumblr Nihongo">
    <a href="http://www.tumblr.com">Tumblr</a>スタッフが送る公式ブログフィードです。
  </tumblelog>
  <posts start="0" total="716"/>
</tumblr>
```
    total="716" の部分が総件数。
2. **ランダムな開始位置を決める**
    総件数の範囲の中でランダムな開始位置を選択する。開始位置は0から始まるのでこの例だと 0～715 の間で選ぶ。
3. **ランダムな投稿を取得する**
    先ほど決めたランダムな開始位置をstartパラメーターにセット、num=1 として取得件数1件を指定。
    リクエスト例：

    ```
http://nihongo.tumblr.com/api/read?start=666&num=1
```

これでランダムな投稿が取得出来ますので、後は取得出来たレスポンスからご随意にどうぞ。なお、startの番号が若い方が新しい投稿です。

# Tumblr API v1 のJSONでのレスポンスについて
/api/read は、/api/read/json とすればレスポンスをXMLではなくJSONで取得が出来ます。

リクエスト例：

```
http://nihongo.tumblr.com/api/read/json?&num=0
```

ただ、このJSONでの取得はまったくもってお薦め致しません。以下にJSONでのレスポンスの例を示します。見やすいように整形してあります。

```
var tumblr_api_read = {
    "tumblelog":{
        "title":"Tumblr Nihongo",
        "description":"<a href=\"http:\/\/www.tumblr.com\">Tumblr<\/a>\u30b9\u30bf\u30c3\u30d5\u304c\u9001\u308b\u516c\u5f0f\u30d6\u30ed\u30b0\u30d5\u30a3\u30fc\u30c9\u3067\u3059\u3002",
        "name":"nihongo",
        "timezone":"Europe\/Amsterdam",
        "cname":false,
        "feeds":[]
    },
    "posts-start":0,
    "posts-total":716,
    "posts-type":false,
    "posts":[]
};
```

なるほど、tumblr_api_read という変数に値が格納された状態で返って来ますね。Tumblrさん、これは JSON ではなくJavascript にございます。content-type は「application/javascript」で返って来ますので本当はご存知なのかもしれませんが、これは Javascript です。もちろんこのままではパース出来ません。ですのでパースするには先頭の「var tumblr_api_read = 」と末尾の「;」を除去してあげる必要があります。しかし成せる事とそれを成したいと思うかは別でございましょう。この方法は美しさに欠けると私は思うのです。
Scala でも愛が生まれた

# 概要
今日 Scala を始めた者が Java のコードを参考に書いてみました。

# コード
全然Scalaっぽくなくてすみません。

```scala:愛を生むコード
object Main extends App {
  override def main(args: Array[String]) : Unit = {
    val sei: Array[Byte] = "生".getBytes("UTF-8");
    val shi: Array[Byte] = "死".getBytes("UTF-8");
    var ai:  Array[Byte] = new Array[Byte](sei.length);

    for (i: Int <- Range.apply(0, sei.length)) {
      ai(i) = (shi(i) & sei(i)).asInstanceOf[Byte];
    }
    println(new String(ai, "UTF-8"));
  }
}
```

# 確認
Ideone で確認しました。
http://ideone.com/2VqESO

<img width="582" alt="スクリーンショット (46).png" src="https://qiita-image-store.s3.amazonaws.com/0/102004/202343ea-73f0-7714-0e5a-60cb7893ddc7.png">


# 元ネタ
[愛が生まれた](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)
Mac App Storeに申請する際に気をつけるべきこと

自社でMacアプリを開発したのですが、申請時にいくつかハマる点があったため、メモ。
基本的には、iOSアプリと同じため、iOSアプリとMacアプリで違いがあった点のみ取り上げています。

# Info.plistにApplication Categoryが必須
Mac App StoreではiOS App Storeのようにmetadataを別途管理するのではなく、バイナリファイルにmetadataを含める、という点がいくつかあります。
これもその1つで、Info.plistにアプリのカテゴリを示す"Application Category"という項目を加える必要があります。

# AppSandBoxが必須
Macアプリでは、Capabilitiesに**App SandBox**という項目があります。
これはアプリの権限を適切に制限することにより、システムやユーザーデータを保護しようというものなのですが、Mac App Storeでアプリを公開する場合、この項目が必須となっています。
<img width="1010" alt="スクリーンショット 2016-05-07 12.10.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/96087577-9414-fde7-7014-5a8a65fc8d5c.png">

# pkg形式のファイルをアップロードする必要あり
通常、アプリをarchiveした際には、.appファイルが生成されるのですが、Application Loader等でアプリをアップロードする際、ファイルは.pkg形式である必要があります。

# 参考
- [Mac アプリケーションの配布](https://developer.apple.com/osx/distribution/jp/)
- [App Sandboxing](https://developer.apple.com/app-sandboxing/)
- [Information Property List Key Reference](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8)
localhost3000でエラーが起きます

ActiveRecord::PendingMigrationError

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development

Extracted source (around line #392):
390
391
392
393
394
395
              

      def check_pending!(connection = Base.connection)
        raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection)
      end

      def load_schema_if_pending!
yum updateをキャッシュから実行する

yumの使い方レベルの話なので、ほぼ自分用のメモです。

# やりたいこと
複数の環境(本番・開発など)で別々の時期にパッケージインストール、更新をする際に、パッケージバージョンを合わせられるように`yum update`を実行できるようにしたい

# 環境
よくあるインフラ運用のシーンを想定し、ここでは以下の環境を想定する。
* 開発検証環境(今日作業する)
* 本番環境（本番リリースである1ヶ月後に作業する予定）

## 解決方法
環境数や範囲があまりにも多い場合はキャッシュリポジトリを作るといった大掛かりなことが考えられるが、今回は数台レベル想定なので、ローカルキャッシュを用いる。

# 実際の手順
開発環境で`yum update`する。

```
# yum update
```

これで開発環境はその日時点の最新状態になる。

次に本番環境でリポジトリのメタ情報のキャッシュ作成とパッケージ取得を行う。

```
# mkdir repocache
# yum update --downloadonly --downloaddir=repocache
```

ポイントは`--downloadonly`オプション。
パッケージの取得まで行うが、インストールは行わず処理を終了してくれる。
ここでは`yum update`で更新対象となったパッケージ群のrpmファイルが`repocache`フォルダに保存される。

そして日を改め、本番環境でリリース作業を行う時、キャッシュからアップデートを行う。

```
# yum -C update --downloaddir=repocache
```

`-C`オプションを使うことで、最新のリポジトリメタ情報を取得しに行かず、キャッシュから`update`の対象を選びに行く。
そして、ダウンロード済みのrpmファイル郡は全部保存されているため、保存先を`--downloaddir`オプションで指定してあげることで無事キャッシュから`yum update`ができる。

これで2つの環境のパッチレベル・パッケージバージョンは同一の状態を成立できる。
rails s の実行で、エラー「no acceptor (port is in use or requires root privileges) (RuntimeError)」

$rails s
でrails startによるサーバーを立ち上げようとしたら、以下のエラーが発生。

`start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)

start_tcp_server(tcpプロトコルで、サーバーを立ち上げる意味??)メソッドを実行する際に、
RuntimeError(実行時のエラーが発生)が発生。その理由は、受け取り手がいない(ポートが使用中か、ルート権限を要求している最中)と言われています。

なので、$ps aux | rails sで、立ち上がっているrailsのプロセスをkillして再度、rails sで開始で動きます
日付だけ抜き出したファイル作成 mac コマンド

デスクトップにtexts というフォルダがあって
その中にtxtファイルがたくさんあり,各ファイルに 
date: 20xx/xx/xx　
という行があるとき
　

cd desktop/texts　　　　　　　　　　textsフォルダに移動
　
cat ./*.txt > new.txt　　　　　　　　　全txtファイルを一つにまとめたファイルnew.txt作成
　
grep "date:" new.txt > date.txt　　　　　　　　　　date:を含む行だけを書き出したファイルdate.txt作成

sed 's/date: //g' date.txt > date2.txt　　　　　　　　　　date: を削除したファイルdate2.txt作成
　

完成

今回は逆順にしたかったので
　

tail -r date2.txt > date3.txt　　　　　　　　　　逆順にしたファイルdate3.txt作成

以上
　
　

sort -r date2.txt > date3.txt　　　　　　　　　　逆順にしたファイルdate3.txt作成

だとうまくいきませんでした。
 
　
 
■date
２０１６/xx/xx/xx

のように改行があるときは


cat ./*.txt > new.txt　　　　　　　　　txtファイルを一つにまとめる
 
grep "date" -A 1 new.txt > date.txt　　　　　　　　　2行分書き出す

なぜか

■date
2016/xx/xx/xx
ーー
■date
２０１６/xx/xx/xx
ーー

となったので

sed '/date/d' date.txt > date2.txt　　　　　　　　　dateの行を削除

sed '/--/d' date2.txt > date3.txt　　　　　　　　　--の行を削除


sed '/date/d;/--/d' date.txt > date2.txt 　　　　　　　　で一気にできる
 
でできました。上書きがうまくできなかったので毎回ファイルを作成しました


複数条件で行を抜き出すときは

grep "AAA\\|BBB\\|CCC" new.txt > abc.txt

でできました
EspressoテストでActivity起動Intentにパラメータを追加したい

##全てのテストで同じパラメータを使いたい場合
 ActivityTestRuleのgetActivityIntentをオーバーライドする

```java:HogeActivityTest.java
public class HogeActivityTest {
    @Rule
    public ActivityTestRule<HogeActivity> mActivityRule = new ActivityTestRule<HogeActivity>(
            HogeActivity.class) {
        @Override
        public Intent getActivityIntent() {
            Intent intent = new Intent();
            intent.putExtra("param1", 1);
            intent.putExtra("param2", "2");
            return intent;
        }
    };
```
##テスト毎にパラメータを変更したい場合
ActivityTestRuleのパラメータ３つのコンストラクタを使用する
ドキュメントを確認すると、第３引数が自動でActivityを起動するフラグになっており、falseを設定することで
テスト毎に異なるパラメータを渡して起動することができる。

```java:HogeActivityTest.java
    @Rule
    public ActivityTestRule<HogeActivity> mActivityRule = new ActivityTestRule<HogeActivity>(
            HogeActivity.class, false, false);

    @Test
    public void test1() {
        Intent intent = new Intent();
        intent.putExtra("param1", 1);
        intent.putExtra("param2", "1");
        mActivityRule.launchActivity(intent);
    }

    @Test
    public void test2() {
        Intent intent = new Intent();
        intent.putExtra("param1", 2);
        intent.putExtra("param2", "2");
        mActivityRule.launchActivity(intent);
    }
```
起動対象のActivity情報は、ActivityTestRule#launchActivityの中でセットされるので自分でセットする必要はない

まれに＠Beforeアノテーションをつけたメソッド内でActivityを起動しているサンプルを見かけるが、
これでは、パラメータをテスト毎に変更できない。

参考：http://developer.android.com/intl/ja/reference/android/support/test/rule/ActivityTestRule.html
SDKTransform について

#SdkTransform

10.1 Berlin から SdkTransform.exe というコマンドラインツールが増えています。

…が！
説明が全くありません（正確には SDKTransform.exe が簡易ヘルプを出力してくれる）。

ここでは使い方を説明します。

（このページを参考にしました [[杂谈] SDKTransform 试用笔记](http://blog.qdac.cc/?p=3824)）

#OC2OP ではない

かつて Java2OP と同じように OC2OP が提供されると期待されていました。
しかし、提供されたのは SdkTransform.exe…
つまり！
SDKTransform は OC2OP ではないのです。

名前から判るとおり SDK へアクセスするための Object Pascal ソースコードを吐き出すツールなのです。
任意の Objective-C コードを Object Pascal コードに変換する物ではありません！

#SDKTransformRun.bat

SdkTransform.exe を動かすためのバッチファイルが同梱されています。
それが SdkTransoformRun.bat です。
もちろん、SdkTransform.exe 単体で動くのですが、コマンドラインスイッチがやたらと長いため自分でコマンドラインから起動するのは現実的ではありません。
SdkTransformRun.bat を使わないと難しいでしょう。

#SdkTransformTypes.txt

SDKTransform が参照する型の対応表です。
例えば 

```text
char=Byte
char*=MarshaledAString
short=SmallInt
```

などと書いてあります。

#準備

SdkTransformRun.bat の３ヶ所を編集します。

##CLANG

26行目にある

```bat
set CLANG=c:\clang3.5\llvm\tools\clang
```

を変更して正しく clang のある場所を指すようにします。
Delphi では Android NDK の導入と同時に clang も導入されています。
デフォルトのままであれば多分↓のようになるでしょう。

```bat
set CLANG=C:\Program Files (x86)\Embarcadero\Studio\18.0\PlatformSDKs\android-ndk-r9c\toolchains\llvm-3.3\prebuilt\windows\lib\clang\3.3\include
```

##CC_OPTS

SdkTransformRun.bat では↓のように clang 配下に \lib\Headers\ というディレクトリが期待されています。

（44行目 および 62行目の２ヶ所あります）

```bat
set CC_OPTS=%CC_OPTS% -isystem "%CLANG%"\lib\Headers\
```

ですが、上記の CLANG 変数が指す先には \lib\Headers\ という構造はありません。
そのまま include を指すように編集します（\lib\Headers\ を削除します）。

```bat
set CC_OPTS=%CC_OPTS% -isystem "%CLANG%"
```

##SDK_ROOT

使う SDK のパスを指すように変更します。
iOS と OSX それぞれあるので、それを変更します。

ここで、注意！
SDK マネージャで導入済みの SDK しか使えません！

[SDK マネージャの使い方はこちら](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Mac_OS_X_%E3%81%BE%E3%81%9F%E3%81%AF_iOS_%E7%94%A8_SDK_%E3%81%AE%E8%BF%BD%E5%8A%A0)

![SDK.png](https://qiita-image-store.s3.amazonaws.com/0/12977/a9cc7b6f-9de8-963e-ed8f-ad89ef3631e2.png)

インポート済みであれば、下記の様に SDK の場所を設定します。

iOS用 36行目

```bat
set SDK_ROOT=c:\SDKs\iPhoneOS8.3.sdk
```

を↓のように

```bat
set SDK_ROOT=C:\Users\ユーザー名\Documents\Embarcadero\Studio\SDKs\iPhoneOS9.3.sdk
```


OSX用 53行目

```bat
set SDK_ROOT=c:\SDKs\MacOSX10.10.3.sdk
```

を↓のように

```bat
set SDK_ROOT=C:\Users\ユーザー名\Documents\Embarcadero\Studio\SDKs\MacOSX10.11.sdk
```

変更します。

#使い方

準備が終わったらコマンドを実行するだけです。

```bat
SdkTransformRun.bat iOS --out:<ディレクトリ名>
```

最初の引数は iOS か OSX を渡します。
２番目の --out には吐き出すディレクトリを指定します。
たとえば、"C:\Temp\SDKs\" などです。

#使いどころ
デフォルトでインストールされない SDK を使いたいときに SdkTransform を使うと、Objective-C Bridge ファイルが生成されるので、自分で移植せずに使えます。

たとえば、Security.framework や HealthKit.framework などです。
これらを使うときに SdkTransform があるとないとでは作業工数が変わってくるハズです。

#めんどくさいよお！

作りました。
GUI で楽々！！

しかも SdkTransoform.exe, clang, SDKRoot を自動的に取得します（環境変数より）。

![sdkas.png](https://qiita-image-store.s3.amazonaws.com/0/12977/e1ad0f45-7b80-cb8e-0818-9514f583d979.png)

[ソースはこちら。](https://bitbucket.org/JunHosokawa/sdktransformassistant)
Berlin でのみ試しています。

追記
2020/10/20 Rio, Sydney で動作するようにしました。

それでは！
TypeScriptでブオボブババボ！

#2016/5/9今日のトレンドバブブ！

*「[ウウゥーーーン：Twitterトレンドが「ブゥゥオオオーーーーン」「ブボボボボォォオオン」など擬音語に侵略される - ITmedia Mobile](http://www.itmedia.co.jp/mobile/articles/1605/09/news117.html)」*

#jsdo.itにバブンゥゥン
これにインスパイアされて、jsdo.itにバブンゥゥン。

[ボゥオボンオバ！オ！ - jsdo.it](http://jsdo.it/tonkotsuboy/04Ko)

[![](https://qiita-image-store.s3.amazonaws.com/0/67884/f4c984ae-c1a2-8ef3-0582-f4207cdd3c7b.png)](http://jsdo.it/tonkotsuboy/04Ko)

#TypeScriptのコードボンブゥバンンボ！ーゥバブ！

```ts:TypeScript
class Main {
	// ランダムに選択する文字群
	texts:string[] = [
		"ブ",
		"ー",
		"！",
		"バ",
		"ン",
		"ゥ",
		"ボ",
		"ウ",
		"ア",
		"ォ",
		"オ"
	];
	// ランダムに選択する文字の数
	textCount:number = this.texts.length;
	// ツイートするテキスト
	tweetText:string = "";
	// ツイートする文字数。50文字以上100文字未満
	outputNum:number = 50 * (Math.random() + 1);
	// 生成した文字列を表示するテキストエリア。
	outputArea:HTMLTextAreaElement;

	constructor() {
		this.outputArea = <HTMLTextAreaElement> document.getElementById("outputArea");
		this.createTweetText();
		this.manageButtons();
	}

	/**
	 * ツイート文字列を生成する。
	 */
	private createTweetText():void {
		this.tweetText = "";
		for (let i:number = 0; i < this.outputNum; i++) {
			this.tweetText += this.getText();
		}
		this.displayOutPutText();
	}

	/**
	 * ランダムにつなげる文字を取得する。
	 */
	private getText():string {
		return this.texts[Math.floor(Math.random() * this.textCount)]
	}

	/**
	 * テキストエリアに文字を表示する。
	 */
	private displayOutPutText():void {
		this.outputArea.value = this.tweetText;
	}

	/**
	 * ボタンのイベント設定
	 */
	private manageButtons():void {
		// 文字列を再生成するボタン
		document.getElementById("generateButton").addEventListener("click", () => this.createTweetText());
		// 生成した文字列をツイートするボタン
		document.getElementById("tweetButton").addEventListener("click", () => {
			window.open("https://twitter.com/intent/tweet?text=" + this.tweetText + " : &hashtags=ンボォJS版 http://jsdo.it/tonkotsuboy/04Ko");
		});
	}
}

// ウインドウロード完了時にMainクラスを実行する。
window.addEventListener("DOMContentLoaded", () => new Main());
```

#バブンンンンー
ババゥーゥブンーゥボーブーー！ーーオブーバブボボンゥ！オブバオブバゥボブ！ボン！ンゥオボバブオオブ！ゥーゥオンボオゥゥブブオン！バブンンンンーバ！ン
Rubyを最新バージョンに変更する(2.3.0)　[ 自分用メモ ]

参考サイト
http://blog.yuhiisk.com/archive/2014/12/17/dot-ruby-version.html


プロジェクトルートに.ruby-versionというファイルを作成して、rubyのバージョンをファイル内に記述。これだけでRubyのバージョンを指定することが出来る。


・検索キーワード(ターミナルの表示に2.3.0がなく2.3.0-devしか表示がなかったため)
2.3.0-dev

・参考サイト
http://qiita.com/akito19/items/f2900f53e26dcc22faac



・検索キーワード
rbenv 最新 ruby
rbenv ruby 2.3

・参考サイト
http://9ensan.com/blog/programming/ruby/rbenv-plugins-ruby-build/
http://qiita.com/akisanpony/items/ae9d8eed72945de98285

上記のサイトの手順を実行後、

ターミナルに表示されたエラー文の中の指示を実行
cd /usr/local/opt/rbenv/plugins/ruby-build

git pull

・新しいRubyバージョンのインストール
rbenv install 2.3.0

・インストール済みのrbenvを確認する
rbenv versions

・bundlerのインストール
gem update bundler
gem install bundler

・gem 再インストール
bundle install
java でも愛。。。

http://qiita.com/dongri/items/041ff3e7dde6c99beeb0

よし、java で

```java
import java.io.*;
import java.lang.Byte;

class Love {
	public static void main(String[] args) throws Exception {
		byte sei[] = "生".getBytes("UTF-8");
		byte shi[] = "死".getBytes("UTF-8");
		byte ai[] = new byte[sei.length];

		for (int i = 0; i < sei.length; i++) {
			ai[i] = (byte) (shi[i] & sei[i]);
		}
		System.out.println(new String(ai, "UTF-8"));
	}
}
```

なんか異常にめんどいなって思ったら

http://qiita.com/misoca12/items/10f833c0ff98c40f9f6a

こんな簡単だった。＼(^o^)／

ところで、ByteStream ってのは無いんですね。
テキスト抽出について

Officeの文書やPDFなどからテキストデータだけを抽出する.NETで動くライブラリがないかなぁ？と思って探したら、こんなの見つけたのでメモしておきます。

[Toxy - .NET Text/Data Extraction Framework](https://toxy.codeplex.com/)

ドキュメントを見てみると、テキストデータの抽出だけじゃなく、例えばExcelの表のデータなら、抽出したデータのDataSet化なんかもやってくれるみたいですね。

試しにExcelファイルのテキストデータ化を試してみました。こんな感じのプログラムで出来ました。

```
ParserContext context = new ParserContext(@"C:\Work\Test.xls");
ITextParser extractParser = ParserFactory.CreateText(context);
string extractedText = extractParser.Parse();
```

ParserContext(@"C:\Work\Test.xls");の部分にPDFファイルとかWordのdocファイルとか指定しても、Excelファイルと同様にテキスト抽出できました。

Apache Tikaとかの方が有名だと思うんですが、.NETでも同じことが出来るものが欲しかったんで、助かりました。

これ以外だと、[xdoc2txt](http://ebstudio.info/home/xdoc2txt.html)が良く知られていますね。
Dockerで「docker run」した後にコンテナのホスト名を変える方法

Docker初心者です✋

```bash:dockerのバージョン
root@Host:~# docker -v
Docker version 1.10.3, build 20f81dd
```
OSはUbuntuです。

ふと、`docker run`した後にコンテナのホスト名を変えたくて手こずったのでメモ。

##「docker run」するときにホスト名を指定するには
`docker run`するときにホスト名を指定するには`docker run`コマンドの`-h`オプションを使います。

```bash:例
docker run -h "Docker-Sample" ubuntu /bin/bash
```

##`docker run`した後にホスト名を変更する
恐らく邪道ですが、、

###1.コンテナを止める
まず、作業の前に対象のコンテナを止めておきます。
`docker stop コンテナ`
###2.Dockerサービスを止める
Dockerサービスを止める必要があります。
`service docker stop`
###3.ファイルを編集
`/var/lib/docker/containers/コンテナID/config.v2.json`を開き、編集します。
※コンテナIDは省略形ではなくフルIDです。フルIDは`docker ps -a --no-trunc`で確認できます。
このjsonファイルの`"Hostname" : "コンテナのID"`のところを好きなホスト名に変えればOK
![https://i.gyazo.com/fcb7208d8cf37cfcc5492d1986638606.png](https://i.gyazo.com/fcb7208d8cf37cfcc5492d1986638606.png)
一応、コンテナ内に入り、`/etc/hostname`と`/etc/hosts`を変更しておくといいかも。

##参考
[linux - docker: set hostname for container - Server Fault](http://serverfault.com/questions/590191/docker-set-hostname-for-container)
[Rails 4.x] Viewでアクションごとの条件分岐を綺麗に書く小技


完全に小ネタの投稿ですが、Ruby on Railsの`views/layout/application.html.erb`などで、
特定のコントローラ/アクションでは表示したいけど、他ではいらないみたいな要素があるとき、
素直に実装するなら、

```erb
<% if controller.controller_name == 'pages' && controller.action_name == 'index' %>
    <a href="#">メニュー</a>
<% end %>
```

みたいな書き方になって、かなり面倒くさくなるので、あらかじめ、

```ruby
# controllers/application.rb
before_action :request_path
def request_path
    @path = controller_path + '#' + action_name
    def @path.is(*str)
        str.map{|s| self.include?(s)}.include?(true)
    end
end
```

という風に書いておけば、Viewから参照するときに、

```erb
<% if @path.is('pages#index') %>
    <a href="#">コントローラがpagesで、アクションがindexの時</a>
<% end %>
```

と書けるし、以下みたいに色々応用が利く。

```erb
<% if @path.is('admin/users#add') %>
    <a href="#">名前空間がadminで、コントローラがusersで、アクションがadd</a>
<% end %>
<% if @path.is('pages#index', 'pages#add') %>
    <a href="#">コントローラがpagesで、アクションがindexまたはadd</a>
<% end %>
<% if @path.is('pages#') %>
    <a href="#">コントローラがpages</a>
<% end %>
<% if @path.is('#index') %>
    <a href="#">アクションがindex</a>
<% end %>
```

ちょっとした小技だけど、コーディングのストレスが減るのでおすすめです。
Mockeryのクラス指定の考え方


https://github.com/mockery/mockery
Mockery::mock()によるオブジェクト生成の考え方で、aliasとかoverloadとかプロキシとか、よくわからなかったのでメモ。ツッコミ募集！

#「クラス名」

- 定義済みクラスの拡張として生成
- 静的メソッドはいじれない
- shouldDeferMissing()すると、既存メソッドを呼べる
- `m::mock('User')->shouldDeferMissing()` と `m::mock('User')->makePartial()` と `m::mock(new User)`は同じような挙動（つまり既存メソッドを呼べる）。


```php
class User{

	function fuga(){
		return 'hoge';
	}
	
	static function fuga(){
		return 'fuga';
	}

	function foo(){
		return 'foo';
	}
}

$obj = m::mock('User')->shouldDeferMissing();
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');

$obj->hoge(); //mocked_hoge
Staff::fuga(); //fuga
$obj->foo(); //foo
```

#「alias:クラス名」

- 未定義のクラスならなんでも、stdClassの拡張として生成（→つまりshouldDeferMissingはできない）
- 追加したメソッドは、静的にも動的にも呼べる
- 以後 new すると、空のmockが生成される

```php
$obj = m::mock('alias:Bar');
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');

$obj->hoge(); //mocked_hoge
Bar::hoge(); //mocked_hoge
Bar::fuga(); //mocked_fuga


$obj = new Bar;
$obj->hoge(); //error method not exists
$obj->foo(); //error method not exists
```


#「overload:クラス名」

- 未定義のクラスならなんでも、stdClassの拡張として生成（→つまりshouldDeferMissingはできない）
- 追加したメソッドは、静的にも動的にも呼べる
- 以後 new すると、メソッド追加済みのモックが生成される

```php
$obj = m::mock('overload:Bar');
$obj->shouldReceive('hoge')->andReturn('mocked_hoge');
$obj->shouldReceive('fuga')->andReturn('mocked_fuga');

$obj->hoge(); //mocked_hoge
Bar::hoge(); //mocked_hoge
Bar::fuga(); //mocked_fuga


$obj = new Bar;
$obj->hoge(); //mocked_hoge
$obj->fuga(); //mocked_fuga
```
Ubuntu への Apache Spark のインストール


Ubuntu 16.04 への Apache Spark のインストール手順。
Windows, Mac へのインストールは以下を参照すること。
- [Sparkアプリケーションの基本と、はじめに押さえておきたい重要な概念 ：CodeZine](http://codezine.jp/article/detail/9347)

# JDK のインストール

```sh
$ sudo apt-get install -y openjdk-8-jdk
```

# Spark のインストール
/usr/local/spark を SPARK_HOME とする

```sh
$ wget http://ftp.riken.jp/net/apache/spark/spark-1.6.1/spark-1.6.1-bin-hadoop2.6.tgz
$ tar zxvf spark-1.6.1-bin-hadoop2.6.tgz
$ sudo mv spark-1.6.1-bin-hadoop2.6 /usr/local/
$ sudo ln -s /usr/local/spark-1.6.1-bin-hadoop2.6 /usr/local/spark
```

.bashrc に以下を追記

```sh
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
```

# ログレベルの設定
何も設定していないとログレベルは INFO で結構な量のログが出力されるので log4j.properties でログレベルを設定する

 ```sh
$ cd $SPARK_HOME/conf
$ cp log4j.properties.template log4j.properties
 ```

log4j.properties の以下の行でログレベルを WARN に変更することを推奨する。

```
log4j.rootCategory=INFO, console
```

# spark-shell によるサンプルの実行

Spark の README.md に含まれる単語の数え上げ

```
$ spark-shell --master local[*]
(中略)
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.1
      /_/

Using Scala version 2.10.5 (OpenJDK 64-Bit Server VM, Java 1.8.0_91)
Type in expressions to have them evaluated.
Type :help for more information.
(中略)

scala> val textFile = sc.textFile("/usr/local/spark/README.md")
textFile: org.apache.spark.rdd.RDD[String] = /usr/local/spark/README.md MapPartitionsRDD[1] at textFile at <console>:27

scala> val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:29

scala> wordCounts.collect()
res0: Array[(String, Int)] = Array((package,1), (For,2), (Programs,1), (processing.,1), ...(中略)...,  (>>>,1), (programming,1), (T...
scala>
```

# 参考
- [Spark Overview](http://spark.apache.org/docs/latest/index.html)
JavaScriptでも愛が生まれた


golangの[愛が生まれた](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)が元ネタだが、JavaScriptでも無事愛が生まれた。

```js
console.log(String.fromCharCode('生'.charCodeAt(0) & '死'.charCodeAt(0)));
```