OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxでx86アセンブラ（マクロ編）

# \:large_blue_diamond:この記事について
Linuxでx86アセンブラ、第7回．今回はマクロについて扱います．
アセンブラにはCで言う関数がありません．その代わり、プロシージャやマクロを使います．プロシージャは動的に呼び出されるのに対してマクロは静的（アセンブル時）にプログラムに埋め込まれます．プロシージャのような柔軟性はありませんが、スタックフレームの構築が必要ないため高速に動作します．
しかし、短所もあります．マクロは単に呼び出された箇所でマクロ内に記述された命令に置き換えるだけです．なので、マクロを多用すると生成される実行ファイルのサイズが巨大化します．

# \:large_blue_diamond:マクロの定義方法
マクロは以下のように定義します．

```
%macro <マクロ名> <引数の数>
~マクロの処理~
%endmacro
```

nasmのマクロは引数に名前をつけることができません．その代わり、

```
%1
%2
%3
```

このように%に番号をつけ、引数の渡された順番でアクセスします．

# \:large_blue_diamond:マクロの呼び出し方
同じソースコード内ならマクロの名前に引数をつけるだけで呼び出せます．

```
mymacro eax, ebx, 23
```

他のファイルで定義したマクロを読み来るには```%include```を使います．

```
%include "<ファイルの名前>"
```

# \:large_blue_diamond:デモコード
rax、rbx,rcxレジスタの値を合計するマクロのデモコードです．

```sum.asm
%macro sum 3
   add %1, %2
   add %1, %3
%endmacro 
```

``` mymacro.asm
%include "sum.asm"
section .data

section .bss

section .text

global main

main:
   enter 0,0
   nop

.call_macro:
   mov rax, 1
   mov rbx, 2
   mov rcx, 3
   sum rax, rbx, rcx

.final:
    mov eax, 0
    leave
    ret
```

コンパイルしてgdb上で実行してみてください．


# 参考文献
* NASM development team site:   
http://www.nasm.us/
* GDB: The GNU Project Debugger site:   
https://www.gnu.org/software/gdb/
* Assembly Language Step-by-Step: Programming with Linux:   
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step
* Stack Analysis with GDB:    
http://resources.infosecinstitute.com/stack-analysis-with-gdb/

↓↓\:bowtie:過去の投稿もよろしくね\:bowtie:↓↓

* Linuxでx86アセンブラ（スタック編）
http://qiita.com/MoriokaReimen/items/31a8f8ce4a46ba0f3590

* Linuxでx86アセンブラ（基本的なコードの構造編）
http://qiita.com/MoriokaReimen/items/b320e6cc82c8873a602f

* Linuxでx86アセンブラ（論理演算編） 
http://qiita.com/MoriokaReimen/items/bf863585616ad0a0a969

* Linuxでx86アセンブラ(四則演算編)
http://qiita.com/MoriokaReimen/items/4853587dcb9eb96fab62

* Linuxでx86アセンブラ(Cとの連携編)
http://qiita.com/MoriokaReimen/items/590a4ddb3de15bfacb4b

* Linuxでx86アセンブラ(道具編)
http://qiita.com/MoriokaReimen/items/b316a68d76c1eafa18f8

* tmuxの使い方
http://qiita.com/MoriokaReimen/items/d7d5b158cb412dd65a60



↓↓\:bowtie:コメントをいただけたら励みになります\:bowtie:↓↓
Angular2 Form


http://blog.ng-book.com/the-ultimate-guide-to-forms-in-angular-2/

angular2のチュートリアルでフォームを作ってみた。
教えられた通りに入力するともちろん動作するのだけど、それぞれのキーワードが何を指定しているのかよく分からなかったので調べた事をまとめる。

# 簡単なフォームを作ってみる

### FORM_DIRECTIVESをインポート

```JavaScript:app.ts
import {FORM_DIRECTIVES} from 'angular2/angular2';
```

### フォームを定義

```JavaScript:app.ts
@Component({  
  selector: 'demo-form'
})
@View({
	directives: [FORM_DIRECTIVES],
	template: `
		<form #f="form">
		</form>
	`
})
export class DemoForm {}
```

### フォームを構成する要素を定義

```JavaScript:app.ts
<div>
	<label for="id">id</label>
	<input type="text" ng-control="id">
</div>
      
<div>
	<label for="name">name</label>
	<input type="text" ng-control="name">
</div>
```

### submitボタンを設置

```diff:app.ts
- <form #f="form">
+ <form #f="form" (submit)="onSubmit(f)">
...
	<button type="submit" class="btn btn-default">Submit</button>
...
export class DemoForm {
+	onSubmit(f){}
}
```

### バリデーションをつけてみる

```diff:app.ts
- <input type="text" ...>
+ <input type="text" ... required>

- <button type="submit" ...>Submit</button>
+ <button type="submit" ... [disabled]="!f.valid">Submit</button>
```

### 完成。とりあえず動く。

[plunker](http://plnkr.co/edit/uewN3TvYg05wR8BLFTFz?p=preview)

## しかし仕組みがさっぱり分からない

### FORM_DIRECTIVESって何?

フォームを利用するにはディレクティブをインポートする必要がある。

* ng-control
* ng-control-group
* ng-form
* ng-model
他。

FORM_DIRECTIVESを使うとこれらをまとめて指定した事になる。

### f="form"って何?

`#`はテンプレート内での変数宣言。
formだけでなく他のタグでも使用可能。

```html:app.ts
<!--"input1"という変数名をつける-->
<input type="text" #input1>

<!--DOMを変数として参照-->
{{#input1.value}}
```

つまり`<form>`を変数`f`として参照する事を意味している。

```
<form #f="form">
```

### ="form"って何?

`=`の右側にクラス名を書くと、そのクラスのエイリアスが生成される。
angularのソースを参照すると`ngControlGroup`が`form`という名前で利用可能になっている。

[angular/angular forms/directives/ng_control_group.ts](
https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/directives/ng_control_group.ts#L76)

```javascript:ng_control_group.ts
@Directive({
  selector: '[ng-control-group]',
  ...
  exportAs: 'form'
```

`="form"`と書くとformのエイリアスが生成され、自動的に`ng-form`が設定される。

### ControlGroup???

サンプルで作った簡単フォームは以下のディレクティブで構成される。

```
ng-form
  |-- ng-control
  |-- ng-control
  |-- ...
```

テンプレートの定義に置き換えるとこうなる。

```
<form #f="form">
	<input ng-control="id">
	<input ng-control="name">
	...
```

各ディレクティブはこのようなイメージでクラスを生成する。

```
// 実際のメソッドを調べた訳でないので、あくまでイメージ
var f = new ControlGrup();
f.add(new Control('id'));
f.add(new Control('name'));
```

ng-form(=ControlGroup)がいろいろ動いてフォームの機能を実現しているらしい。

### ng-formは何をしてくれるのか?

* 子要素(ng-control)を見つける
* フォームのデータ管理
* バリデーション
など。

submitイベントを持っているのでこのような指定ができる。

```
<form #f="form" (submit)="onSubmit(f)">
```

引数で渡した`f`はng-form自身を示す。
.valueを見ると子要素をkey:valueのペアで持っている。

```
onSubmit(f){
	console.log(f.value);
	// console : Object {id:"1", name:"test"}
}
```

またバリデーションを実行しているため、結果を参照できる。

```
<button type="submit" ... [disabled]="!f.valid">Submit</button>
```

チュートリアルだけでは何がどう動いているのか、さっぱり分からなかった...。
wai/warp でBasic認証をかけてみる


`Hello World!`と表示するだけのとても簡単なWebアプリを書いてみます。

```hs
{-# LANGUAGE OverloadedStrings #-}

import Network.HTTP.Types
import Network.Wai
import qualified Network.Wai.Handler.Warp as Warp

app :: Application
app req res = res $ responseLBS status200 [] "Hello World!"

main :: IO ()
main = do
  putStrLn "Listening at http://localhost:3000/"
  Warp.run 3000 app
```

これにサクッと[Basic認証](https://www.wikiwand.com/ja/Basic%E8%AA%8D%E8%A8%BC)をつけてみます。

```hs
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Network.HTTP.Types
import Network.Wai
import qualified Network.Wai.Handler.Warp as Warp
import Network.Wai.Middleware.HttpAuth

app :: Application
app req res = res $ responseLBS status200 [] "Hello World!"

authorize :: Middleware
authorize = basicAuth (\u p -> pure $ u == "lotz84" && p == "haskell") "Basic Auth Example"

main :: IO ()
main = do
  putStrLn "Listening at http://localhost:3000/"
  Warp.run 3000 $ authorize app
```

使ったのは [wai-extra](http://hackage.haskell.org/package/wai-extra) の [Network.Wai.Middleware.HttpAuth](https://hackage.haskell.org/package/wai-extra-3.0.13/docs/Network-Wai-Middleware-HttpAuth.html) の [basicAuth](http://hackage.haskell.org/package/wai-extra/docs/Network-Wai-Middleware-HttpAuth.html#v:basicAuth) という関数です。
ruby on railsでShoryukenを使うときにGod(神様)を使って監視をする


# 実行環境
ruby 2.2.0
Rails 4.2.1
OS X EL Capitan


# 下準備
Gemfileに下記の追記を行う

```ruby:Gemfile
gem "shoryuken"            # sqs worker
gem "god"                  # A Process Monitoring
```

```
bundle install
```


補足ですが、bundle installに失敗する人は、下記のコマンドで解決出来るかもしれないです。
(私は数時間ドハマリしました。)

```
brew install ghc
```

# 設定ファイルを作成

```ruby:config/shoryuken.yml
aws:
  access_key_id: "hogehoge"
  secret_access_key: "hogehoge"
  region: "ap-northeast-1"
concurrency: 25
delay: 5
queues:
  - ["sqs_queue", 1]
```


```ruby:config/shoryuken.god 
RAILS_ROOT = File.expand_path(File.dirname(__FILE__) + '/../')

God.watch do |w|
  w.name = "shoryuken"
  w.env = { 'RAILS_ROOT' => "#{RAILS_ROOT}",
            'RAILS_ENV' => "development" }
  w.start = "cd #{RAILS_ROOT} && bundle exec shoryuken -R -C ./config/shoryuken.yml -L ./log/shoryuken.log -P ./log/shoryuken.pid &"
  w.pid_file = File.join(RAILS_ROOT, "log/shoryuken.pid")
  w.keepalive
end
```


# 実行と確認

```ruby:実行
bundle exec god -c config/shoryuken.god -D
```

```実行しているプロセスを確認
% tail -f log/shoryuken.log
yyyy-mm-ddT12:47:59Z 9939 TID-ouqa6vpp8 INFO: Rails environment loaded
yyyy-mm-ddT12:48:02Z 9939 TID-ouqb0ogb8 INFO: Starting

```

```プロセスを強制的に削除
kill `cat log/shoryuken.pid`
```


```log/shoryuken.logで再度プロセスが立ち上がることを確認
yyyy-mm-ddT13:13:54Z 9939 TID-ouqa6vpp8 INFO: Got TERM signal
yyyy-mm-ddT13:13:54Z 9939 TID-ouqa6vpp8 INFO: Received TERM, will shutdown down
yyyy-mm-ddT13:13:54Z 9939 TID-ouqb0ogb8 INFO: Shutting down 25 quiet workers
yyyy-mm-ddT13:13:54Z 9939 TID-ouqb0ogb8 ERROR:
yyyy-mm-ddT13:14:07Z 12128 TID-oxcm0ccf0 INFO: Rails environment loaded
yyyy-mm-ddT13:14:08Z 12128 TID-oxcnb0v1k INFO: Starting
```


ちなみにgodのプロセス停止は下記のコマンド

```ruby:停止
bundle exec god terminate
```


# 終わり
最小限の動作確認まですることが出来ました。
Godにはいろいろな設定があるようなので、もう少しいろいろと検証してみる必要がありそうです。

余談ですが、
検証の途中で、godを起動した瞬間に100以上のshoryukenが立ち上がり、再起動しながら動作検証をした時には、パソコンを投げそうになりました。



# 参考
shoryuken(github) https://github.com/phstc/shoryuken
god公式ページ http://godrb.com/
god(github) https://github.com/mojombo/god
NotificationServiceListener周りの調査

# Overview
- Notificationの通知、削除を知ることができる
- Added in API level 18（JBMR2)
- 使うときはSettings > Sound&notification > Notification accessからアプリを有効にする必要あり（Mで確認。OSのバージョンによってこの設定までのパスが違うかも）
- 上記でEnableにすればSystemから勝手に呼ばれるので自分でServiceをStartする必要なし。

# Reference
- NotificationListenerService   
http://developer.android.com/reference/android/service/notification/NotificationListenerService.html
- StatusBarNotification   
http://developer.android.com/reference/android/service/notification/StatusBarNotification.html
- Notification   
http://developer.android.com/reference/android/app/Notification.html
- ticker text null in NotificationListenerService   
http://stackoverflow.com/questions/21934979/ticker-text-null-in-notificationlistenerservice
- Android 4.3: NotificationListenerServiceマニアックスとAndroidセキュリティ観測 - ブライテクノBlog   
http://brightechno.com/blog/archives/125

# SampleApplication   
- https://github.com/kpbird/NotificationListenerService-Example
- https://github.com/ynakanishi/NotificationListenerSample
Exchange Onlineで予定表・タスクを非表示にする


大人の事情で、そんなことをしなければならない場合があるんです。
備忘録。参考にさせていただいたサイト：[日々徒然様](http://blog.o365mvp.com/2013/03/17/customize_owa_feature/)


1. 管理者でOffice365にログインし、メニューから「管理者」を選ぶ
2. Exchangeをクリック
![Screen Shot 2015-11-29 at 1.14.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/82737/ea127c80-2c89-5ba2-93d8-674ad7edaf24.png "Screen Shot 2015-11-29 at 1.14.08 PM.png")

3. アクセス許可 > Outlook Web Appポリシー　> 設定したいポリシーをダブルクリック
![Screen Shot 2015-11-29 at 1.59.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/82737/50ceb5ce-264a-1bda-d1ab-5bafe3d2fceb.png "Screen Shot 2015-11-29 at 1.59.10 PM.png")

4. 機能をクリックし、予定表とタスクのチェックを外して保存する
![Screen Shot 2015-11-29 at 2.01.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/82737/4ec9c21a-f2a8-6bfb-04db-8f444a529428.png "Screen Shot 2015-11-29 at 2.01.41 PM.png")

5. 既存のアカウントにも有効（が、反映まで時間が時間がかかる？or 一度サインアウトが必要？）
Arch LinuxにGNOMEでデスクトップ環境を構築する

## はじめに
Arch LinuxにGNOMEでデスクトップ環境を構築します。
環境構築手順とともに、必要な知識についても簡単にまとめていきます。

## 手順
1. X Serverをインストールする
2. ドライバをインストールする
2. GNOMEをインストールする
3. GNOMEを起動する

## X Serverをインストールする
X Serverをインストールします。
```pacman -S xorg-server xorg-server-utils```
GNOMEのデスクトップ環境は、X Window Systemの上に構築するので必要になります。

X Window Systemとは、MITで開発されたGUI環境を構築するためのシステムです。
X Window SystemはClient-Serverモデルを採用していて、先ほどインストールしたものがこのServerにあたります。

X Serverはディスプレイの表示を管理したり、キーボード、 マウスからの入力を処理したり、 タブレットやビデオプロジェクタ等の他の装置からの入出力を処理します。

対してClientは何かというと、X Window System上で動くアプリケーションのことを言います。
XTermやFirefoxなどもX Clientです。

![X_client_server](https://upload.wikimedia.org/wikipedia/commons/9/9e/X_client_server_example.png)

## ドライバをインストールする
Video Driverと(TouchpadがSynapticsの場合は)Synaptics Touchpad用のDriverをインストールします。

Video Driverに関しては、vesaというDriverがデフォルトで入っているのですが、Video Cardの機能をフル活用するためにも、刺さっているVideo Cardに対応したDriverをインストールします。

Synapticsについては、[evdev](https://en.wikipedia.org/wiki/Evdev)という、汎用のデバイスドライバがあるのですが、私のPCではevdevでTouchpadが反応しなかったのでインストールします。

Video Driverのインストール方法
https://wiki.archlinux.org/index.php/Xorg#Installation

Synaptics Driverのインストール方法
https://wiki.archlinux.org/index.php/Touchpad_Synaptics#Installation

インストール終了後、Synapticsに関してはX ServerがTouchpadに対してインストールしたDriverを利用するように設定する必要があります。
X Serverのデフォルトの設定ではTouchpadに対してevdevを利用してしまうためです。

X ServerがSynaptics Driverを利用するように設定ファイルを追加します。

```/etc/X11/xorg.conf.d/50-synaptics.conf
Section "InputClass"
    Identifier "touchpad"
    Driver "synaptics"
    MatchIsTouchpad "on"
EndSection
```

上の設定は最小限の構成です。
色々とカスタマイズしたい場合はこちらが参考になると思われます。
https://wiki.archlinux.org/index.php/Touchpad_Synaptics

また、X Serverの設定ファイルについて詳しく知りたい方はこちらを参照してください。
https://wiki.archlinux.org/index.php/Xorg

## GNOMEをインストールする
GNOMEをインストールします。

インストール方法
https://wiki.archlinux.org/index.php/GNOME#Installation

## GNOMEを起動する
必要なもののインストールが完了したので、起動してみましょう。
GNOMEを起動する方法は複数ありますが、今回は、推奨されている[GDM](https://wiki.archlinux.org/index.php/GDM)という[Display Manager](https://wiki.archlinux.org/index.php/Display_manager)を使います。

Display Managerは、Loginの管理やX Serverの起動などを行ってくれます。
GDMは、GNOMEが提供するDisplay Managerですが、他にも[XDM](https://wiki.archlinux.org/index.php/XDM)や[KDM](https://wiki.archlinux.org/index.php/KDM)などがあります。

PCを起動すると自動的にGDMが立ち上がるようにします。
```sudo systemctl enable gdm```

これでrebootすれば、GNOMEが起動します。
GDM以外の方法でGNOMEを起動させたい方はこちらが参考になります。
https://wiki.archlinux.org/index.php/GNOME#Starting_GNOME
JavaScript(jQuery使用)でRSSフィードを取得して切り替える例

# 前提

以下の条件と同じです

JavaScript(jQuery使用)でRSSフィードを取得するイケてるプラグイン
http://qiita.com/selious/items/c82e3deac0bd838795b5


# カスタマイズ内容

上記に対して、配列＋selectボックスで動的に切り替えれるようにします。



# コード例

```html:rss_sample2.html
<html>
<head>
<link rel="stylesheet" href="jquery.zrssfeed.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="jquery.zrssfeed.js"></script>
<style>
.rssFeed{margin:2px;}#fe{overflow-y:scroll;}
</style>
</head>
<body>
<div>
	<div><select class="form-control" id="sel1"></select></div>
	<div id="fe"></div>
</div>
<script>
$(function(){
var Us =[ ["http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss","Google"]
	,["http://itpro.nikkeibp.co.jp/rss/develop.rdf","ITproソフト"]
	,["http://black-flag.net/feed","BlackFlag"]
	,["http://nikkeibp.jp/jp/flash/index.rdf","日経BP"]
];
</script>
<script>
$(document).ready(function(){
	if(typeof(RSS_LIST1)!="undefined"){
		Us=RSS_LIST1;
	}
	var u=Us[0][0],s=$('#sel1'),f=$('#fe');
	for(var i=0;i<Us.length;i++){
		s.append('<option value="'+Us[i][0]+'">'+Us[i][1]+'</option>');
	}
	f.css("height",500-50).rssfeed(u,{limit:10});
	s.on('click change',function(){
		f.rssfeed($(this).val());
	});
});
</script>
</body>
</html>
```


## 動作サンプル

https://jsfiddle.net/selious17/ey3h4mLe/6/
JavaScript(jQuery使用)でRSSフィードを取得するイケてるプラグイン


# 前提

・最近のBrowser
　※以下のBrowserで動作確認しています
　　Chrome最新版
　　IE11
・jQuery：比較的新しいやつ
・RSS Feeds Reader Plugin for jQuery 1.20
　　RSS Feeds Reader Plugin for jQuery - Zazar, Online Business Website Builder
　　http://www.zazar.net/developers/jquery/zrssfeed/


# 使い方
jQuery読み込んで、RSSプラグイン読み込んで、任意のブロック要素タグ(div等)に、
RSSプラグインのコンストラクタ呼び出すだけです。

# コード例

```html:sample1.html
<html>
<head>
<link rel="stylesheet" href="jquery.zrssfeed.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<style>
.rssFeed{margin:2px;}#fe{overflow-y:scroll;}
</style>
</head>
<body>
<div id="fe"></div>
<script src="jquery.zrssfeed.js"></script>
<script>
$(document).ready(function(){
	$('#fe').css("height",500-50)
			.rssfeed("https://www.moongift.jp/feed/",{limit:10});
});
</script>
</body>
</html>
```

## 結果

OSSの神、Moongiftの最新記事が取得できます。

## 動作サンプル

https://jsfiddle.net/selious17/kvofqaar/5/
redmine.tokyo 第9回 へ参加



現在は Redmine は使っていませんが、工数見積の精度向上のために実績工数を記録したいと考えていたので、Redmine が使えないだろうか？　と思い参加しました。
[第9回勉強会 - redmine.tokyo](http://redmine.tokyo/projects/shinared/wiki/%E7%AC%AC9%E5%9B%9E%E5%8B%89%E5%BC%B7%E4%BC%9A)

ITS の経験としては、以下のようなところ。
- 7年位前に Trac を使っていた。ITS 的に使おうとしたが、担当者をうまく巻き込むことができずに一人だけで使うことに。Wiki に運用手順などを記載していたが、異動に伴い Word へ書き写して Trac は停止。
- TestLink と Trac を連携させて使ってみたこともあった。リグレッションテストと TestLink はわりと相性が良かったように思った。現在は小規模な開発しかしていないため、またテストを主に別部門が実施しているため TestLink を使う機会はない（広める気力はない）
- 1年前くらい、個人的に Bitnami Redmine をインストールして使っていたが、個人のタスク管理としては冗長に感じて使わなくなってしまった。
- 現在は、社内の独自 BTS を使用中。

今回の勉強会では、Work Time プラグインが使えそうとの情報をいただけたことと、View Customize Plugin の作者 onozaty さんが Vagrant box を用意してくれていたこともあり、久しぶりに Vagrant を使って、Redmine を動かしてみました。

WBS からチケットを作って、作業時間を計測してみようと、こんな感じにチケットを作ってみました。
作業時間の集計は、単純にチケット一覧を CSV で出力して Excel で集計すれば良さそう。

![チケット一覧](https://qiita-image-store.s3.amazonaws.com/0/24711/cd4ae638-7907-8f4d-aec7-5b3fad347027.png)

Work Time Plugin は工数入力が少し便利になるかな？
今のところ集計の機能は使わなそう。

![工数表@Work Time Plugin](https://qiita-image-store.s3.amazonaws.com/0/24711/1fae00aa-b9b4-3698-9d91-c1dabc7f7c81.png)

正直、Redmine にこだってはいないので、別の手法で簡単に同じようなことができるといったことがあれば教えて頂きたいです。



最後に、忘れた帽子の回収、ありがとうございました。
帽子を忘れたのは今年だけで三度目なので、この病を治したい。（二回は、そのまま紛失しました。）
[期間限定小ネタ]hex 0.9.0のバグ：proxy環境で動かない

hex 0.9.0にはバグがあり、proxy環境下では動かないそうです。

[mix does not work behind proxy](http://stackoverflow.com/questions/33898007/mix-does-not-work-behind-proxy)

作者のEricさんから直々に回答をいただき「バグで、とりあえずはgithubから最新の開発版をcloneして試してほしい」とのことでした。

```bash
$ git clone https://github.com/hexpm/hex 
Cloning into 'hex'...
remote: Counting objects: 4392, done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 4392 (delta 5), reused 0 (delta 0), pack-reused 4368
Receiving objects: 100% (4392/4392), 1022.51 KiB | 347.00 KiB/s, done.
Resolving deltas: 100% (2549/2549), done.
Checking connectivity... done.
$ cd hex
$ mix install
```

stable版に戻したい場合は

```bash
$ mix local.hex
```

週末には修正を入れたstable版をリリースするとのこと。ただ、11/29 21:00(日本時間)現在、まだ直っていないようですが...
Slack用hubotに今北産業機能を追加するスクリプト

# はじめに
hubot-slack-imakitasangyo という名前で[npmに公開しました](https://www.npmjs.com/package/hubot-slack-imakitasangyo)。コードは[githubに公開しています](https://github.com/takashyx/hubot-slack-imakitasangyo)。
**CoffeeScriptというかjsも殆ど書いたことがないままとりあえず作ったので手続き型っぽくて汚いです。細かいところでも pull request 大歓迎です。よろしくお願いします。→ [https://github.com/takashyx/hubot-slack-imakitasangyo/](https://github.com/takashyx/hubot-slack-imakitasangyo/)**

# これは何？
- [リクルートテクノロジーズさんの開発した要約API](http://blog.recruit-tech.co.jp/2015/10/30/summpy-released/)を利用して、hubotに「今北産業」と投稿すると、直前の投稿を幾つか拾ってきて３行に要約してくれる機能を追加します。
- 機械学習タグはいかがなものかと思いますが、微妙に釣りで入れました。

<img width="605" alt="Slack.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/24956/39245e3a-7b6b-bf32-c671-1ab26a620c53.jpeg">

# 必要な準備
[リクルートテクノロジーズさんの開発した要約API](http://blog.recruit-tech.co.jp/2015/10/30/summpy-released/)を自前でホストする必要があります。
私の場合はhubotを動かしているサーバの適当なポートを利用しました。

# インストール
お手持ちのSlack用Hubotのルートディレクトリにて

```bash
npm install hubot-slack-imakitasangyo --save
```

その後hubot-slack-imakitasangyoをexternal-scripts.jsonに追加

```bash
$ cat external-scripts.json
[
  ... ,
  "hubot-slack-imakitasangyo",
  ...
]
```

# 設定

環境変数で設定します。

```bash
export HUBOT_SLACK_TOKEN=[SLACK　TOKEN 例: ”xoxp-afjpoaijfasd349asgfwadfa"]
export HUBOT_IMAKITASANGYO_BOT_USER_ID=[botのユーザーID 例: "U021A3SA3"]
export HUBOT_IMAKITASANGYO_SUMMPY_API_URL=[SummpyのAPIをホストしているURL 例: "http://127.0.0.1:9000/summarize"]
export HUBOT_IMAKITASANGYO_SOURCE_LINES=[さかのぼって要約する行数　例: "30"]
```

# Special Thanks
以下のリクルートテクノロジーズさんのAPIを使用しています。

自動要約APIを作ったので公開します | RECRUIT TECHNOLOGIES Member's blog
http://blog.recruit-tech.co.jp/2015/10/30/summpy-released/

recruit-tech/summpy
https://github.com/recruit-tech/summpy
補完時のエコーエリアのメッセージ(^X)のチラつきを抑制する

※注意：本記事の内容は version 7.4.314 以上のVimが対象です

Vimでneocomplete等の補完プラグインを使用していると、Vimの下部が以下の様なメッセージで点滅して気になることがある。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/a96502af-435d-35e1-4ddb-40bd545569df.png)

その時にはshortmessの設定をcに変更する。

```vim
" エコーエリアに補完時のメッセージを表示させない
" https://github.com/vim-jp/issues/issues/305
if (v:version > 704 || (v:version == 704 && has('patch314')))
  set shortmess=c
endif
```

```text:help-shortmess
'shortmess' 'shm'       string  (Vim default "filnxtToO", Vi default: "",
                                                         POSIX default: "A")
                         global 
                         {not in Vi}
         This option helps to avoid all the hit-enter prompts caused by file
         messages, for example  with CTRL-G, and to avoid some other messages.
         It is a list of flags:
          flag   meaning when present
<中略>
           c     don't give ins-completion-menu messages.  For example,
                 "-- XXX completion (YYY)", "match 1 of 2", "The only match",
                 "Pattern not found", "Back at original", etc.

```

パッチは `7.4.314` 以降で取り込まれた様子。作成者はShougoさん。

[Ctrl-x modeのメッセージを出さずにポップアップメニューのみ表示したい · Issue #305 · vim-jp/issues](https://github.com/vim-jp/issues/issues/305)

yumやaptで取ってこれるVimはおそらくバージョンが古いので、有効にしたい場合は最新ソースからのビルドが必要。
Linux主なディレクトリ一覧

# Linuxのルート下のディレクトリ

***「 / 」***   ルートディレクトリ。全てのディレクトリの一番上のディレクトリ
|
|--- ***bin (Binary)***   一般ユーザーでも実行可能な基本的なコマンドがある。コマンドのバイナリファイルを表す。
|
|--- ***sbin (System Binary)***  rootユーザーのみが実行可能なシステム管理コマンドがある。
|
|--- ***etc (Et Cetera)***   システムやコマンドの各種設定ファイル、スクリプトファイルがある
|
|--- ***dev(Device)***   ハードディスク、CD-ROM、DVD-ROMなどのデバイスファイルがある
|
|--- ***lib (Library)***   共有ライブラリやカーネルモジュールがある
|
|--- ***「mnt (Mount)」***   CD-ROMなどのファイルシステムの一時的なマウントポイント
|
|--- ***opt (Option)***   追加パッケージや追加プログラムがインストールされる
|
|--- ***proc (Process File)***  カーネル内部の情報にアクセスするための仮想ファイルシステム
|
|--- ***root***  rootユーザー専用のディレクトリ
|
|--- ***boot***  システム起動に必要なカーネルイメージや設定ファイルがある
|
|--- ***home***  一般ユーザーごとのホームディレクトリ
|
|--- ***tmp (Temporary)***   一時的に使用する作業用ファイルがある
|
|--- ***var (Variable)***   ログファイル、各種のスプールなど、頻繁に更新されるファイルで、変わりうる情報を扱う
|
|--- ***「usr」***   一般ユーザーが共有するコマンド、ライブラリ、ドキュメントなどがある
|
|--- ***「lost+found」***   破損したファイルがある
|

下記サイトのLinuxのフォルダ構成の説明画像をメモした。
http://www.infraeye.com/study/linuxz0.html
STF(Smartphone Test Farm)をCentOS 6.7で動かしてみる(Android端末接続編)


# 1.目的

[インストール編](http://qiita.com/hojojon/items/630214798c9be5b84f8c)からの続きとなっています。
Android端末接続編では、下のイメージのようにAndroid端末をブラウザから遠隔操作できるようにするため、以下のことを行っていきます。

* udev設定
* Android SDKのインストール
* Android端末の接続
* STFの起動及び動作確認

![スクリーンショット 2015-11-29 17.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/77455/d442c7c4-2cb6-f13a-619e-e7d0dab413c6.png "スクリーンショット 2015-11-29 17.59.50.png")

# 2.前提条件

## 2-1.必要なもの

* STFがインストール済みのCentOS6.7
* Android端末

## 2-2.注意事項

* VagrantでCentOS6.7の仮想環境を構築している場合は、VirtualBoxでUSB認識できるように拡張パックのインストールや設定等を行う必要があります。[VirtualBoxでのUSBデバイス認識](http://qiita.com/civic/items/684c4b82428feb0c4ae1)などが参考になります。
* Android端末は、あらかじめ`開発者向けオプション`の`USBデバッグ`をONにしておいて下さい。


# 3.udev設定
Android端末をCentOSが認識できるように、udev設定を行います。

## 3-1.lsusbのインストール
まずは、CentOSマシンに接続されているUSB端末の情報を取得できるように、yumでlsusbパッケージのインストールを行います。

```
yum -y install usbutils
```

## 3-2.Android端末のベンダIDの取得
Android端末を接続し、`lsusb`コマンドを実行して、端末のベンダID情報を取得します。
以下は、Google Nexus4を接続してコマンドを実行した時の結果です。
３行目のIDの右側の４桁の数字(下の例だと __18d1__ )がベンダIDとなります。

```
lsusb

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 014: ID 18d1:4ee6 Google Inc. 
```

## 3-3.udev設定
`/etc/udev/rules.d/51-android.rules`というファイルを作成し、端末の情報を追記します。

```
vi /etc/udev/rules.d/51-android.rules

# 以下を追記する
# ベンダIDの部分には、接続した端末のベンダIDを入力する。
SUBSYSTEM=="usb", ATTRS{idVendor}=="ベンダID", MODE="0666", GROUP="plugdev"
```


# 4.Android SDKのインストール

## 4-1.Javaランタイムのインストール
platform-tools内のadb等を実行するのに必要なため、Javaランタイムのインストールを行います。

```
yum -y install java-1.7.0-openjdk
```

## 4-2.Platform-toolsのインストール

[Android Developers](http://developer.android.com/intl/ja/sdk/index.html)からAndroid SDKをダウンロードし、platform-toolsのインストールを行います。

```
wget http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz
tar zxvf android-sdk_r24.3.4-linux.tgz
cd android-sdk-linux/
cd tools
./android update sdk -u -a -t platform-tools
```

`android-sdk-linux/tools`や`android-sdk-linux/platform-tools`にはパスを通しておくと便利です。

# 5.Android端末の接続
Android端末を接続した状態で、adbを起動します。
その後、`adb devices`で接続されている端末を確認します。
attachedの部分が`device`になっていれば正常に接続されている状態となります。

```
cd ../platform-tools/
./adb start-server
./adb devices

List of devices attached
05065978104d2268	device
```

※attachedのところが`offline`になっている場合、端末を接続しているUSBを抜いて`adb kill-server`、`adb start-server`を実行し、再度USBを接続してみて下さい。
※`unauthorized`になっている場合は、`開発者向けオプション`の`USBデバッグの許可の取り消し`をタップして、接続からもう一度試してみてください。

# 6.STFの起動
Android端末が正常に接続されている状態で、STFを起動します。
STFにアクセスすると、下図のように接続した端末が`端末リスト`に表示されればOKです。

![スクリーンショット 2015-11-29 19.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/77455/3f90cdee-4d58-cbf3-e2f8-a64f5b94b423.png "スクリーンショット 2015-11-29 19.52.30.png")

あとは、実際にAndroid端末を遠隔操作でいろいろ触ってみましょう。

![スクリーンショット 2015-11-29 19.56.53.png](https://qiita-image-store.s3.amazonaws.com/0/77455/ce756029-9a77-7812-b65a-308d43f6a82c.png "スクリーンショット 2015-11-29 19.56.53.png")
`latexdiff`で生成したLaTeXファイルのコンパイルが，`\begin{aligned} \end{aligned}`を含む数式で失敗する場合の対処法

`latexdiff`で生成したLaTeXファイルのコンパイルが，`aligned`を含む数式で，以下のようなエラーとともに失敗する事があります：

```
! Limit controls must follow a math operator.
\UL@onmath ...hrest \mathop {\kern \z@ #1}\limits 
                                                  \sb {\UL@leadtype \LA@hski...
l.515     = }
           &
```

このエラーは，`latexdiff`が配列環境を探すために使用している正規表現が`aligned`に対応していないことが原因で発生します．
`latexdiff`の

```perl
my $ARRENV='(?:array|[pbvBV]?matrix|smallmatrix|cases|split)';
```
という行を

```perl
my $ARRENV='(?:aligned|array|[pbvBV]?matrix|smallmatrix|cases|split)';
```
のように書き換えることで，対処できます．
ThinkPad X41にDebian 8.2（Jessie）をインストール（メモ）

ThinkPad X41に、Debian 8.2（Jessie）をインストールした時のメモです。

ゴールは、必要最低限の「無線LANでネットワークに接続する」ところまでなので、あまり高度なことは書いていません。X41にDebian 8.2はインストールできますよ、ということを言いたかっただけです。

## 準備

[Debian JP Project](http://www.debian.or.jp/)の「**ダウンロード**」から、「**PC/サーバー用DVDイメージ (32ビット)**」のリンクをクリックし、ISOイメージ（`debian-8.2.0-i386-DVD-1.iso`）をダウンロードし、DVDに焼きます。

外付けのDVDドライブをUSB接続後、BIOSの設定画面に入り、ブートシーケンスを変更したのち、Save & Exitします（BIOS設定画面への入り方は、ThinkPadロゴの画面で、F2キー押下）。

あとは画面の指示に従って、インストールを行います。インストール完了後のOSバージョンは、こうなりました。

```bash:
# uname -a
Linux debian 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) i686 GNU/Linux
# lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.2 (jessie)
Release:	8.2
Codename:	jessie
```

## 無線LANファームウェアの取得

目的のファームウェアは「ipw-2200-fw」なのですが、このワードで検索をかけて出てくるページをしらみつぶしに探したところ、Intelのダウンロードページをはじめ、いずれもリンク切れしていたので途方に暮れました。が、「ipw-2200-fw-3.1」で検索をかけると、あっさり見つかり。

## ファームウェアのインストール

ダウンロードした`ipw-2200-fw-3.1.tgz`を適当なディレクトリで解凍後、中身を`/lib/firmware/`直下に配置します。

```bash:
# tar zxvf ipw-2200-fw-3.1.tgz
# cp ./ipw-2200-fw-3.1/* /lib/firmware/
```

あとはマシンを再起動（`rmmod`→`modprobe`でも支障ないと思いますが、念のため）すると、タスクバーのWifiのアイコンから、接続先のルータを選択してパスワードを入力すれば、設定完了です。

## おわりに
なぜDebianなのかというと。今までは、PAE非対応なX41にUbuntu 11.04LTSをインストールしてバージョンアップする、という運用をしていたのですが、Ubuntuのバージョンアップを繰り返すうち、その肥大化にマシンが耐えきれなくなったため、「PAE非対応のマシンにもインストール可能で、かつ軽量である」という条件を満たすディストリビューションを探していたところ、目についたのがたまたまDebianだったというわけです。

せっかくのDebianが宝の持ち腐れにならないように、今後も精進したいと思いますm(_ _)m。
Pythonのemailライブラリで差出人名がたまにデコードされない時の対処

※注意
- 最新版のPythonだと解消されているようですので3.4以前をご利用のかた向けです。
- [以前の記事](http://qiita.com/stkdev/items/a44976fb81ae90a66381)の補足です。
- 取得、エンコードをしているソースコードは以前の記事をどうぞ

# 現象
Pythonの標準ライブラリ"email"を使って日本語が含まれているメールの差出人名（From）を取得した際に、「たまにだけ」デコードできない状態で取得される。

例：
”日本語名 &lt;xxxx@test.com>” という差出人名の場合

| 正常の場合 | データ | 文字コード |
|:-----------:|:------------:|:------------:|
| 名前部分|?ISO-2022-JP?B?Re5LEJeS……QKI=?= | iso-2022-jp |
| アドレス部分| &lt;xxxx@test.com> | - |

| たまにエラー | データ | 文字コード |
|:-----------:|:------------:|:------------:|
| 名前部分|?ISO-2022……QK&lt;txxxx@test.com>I=?= | - |

正常の場合は名前部分を文字コードにしたがってエンコードすれば日本語名を取得できます。
たまに起こるのが、エンコードされた文字列がそのままメールアドレスとひっついてbyte型（デコードできない）で取得されてしまう現象です。

# 原因と対処
メールのヘッダ部分（差出人や件名）の部分を判定して取得する機能はemailライブラリを構成するheader.pyにあります。
この中で差出人部分がエンコードされた文字であるかが判定され、データを分解して取得しています。
そこの判定部分がこちら

```py3
# Match encoded-word strings in the form =?charset?q?Hello_World?=
ecre = re.compile(r'''
  =\?                   # literal =?
  (?P<charset>[^?]*?)   # non-greedy up to the next ? is the charset
  \?                    # literal ?
  (?P<encoding>[qb])    # either a "q" or a "b", case insensitive
  \?                    # literal ?
  (?P<encoded>.*?)      # non-greedy up to the next ?= is the encoded string
  \?=                   # literal ?=
  (?=[ \t]|$)           # whitespace or the end of the string
  ''', re.VERBOSE | re.IGNORECASE | re.MULTILINE)
```
コメントの通り、=?charset?q?・・・?= の形になっているかを判定するための正規表現です。こうなっていたら何かしらエンコードされている文字列です。
上記の現象が起きる原因は文字の最後（`?=[ \t]|$`）を判定している部分でした。殆どの場合はこれでよいのですが、一番最後に改行コードが混ざるメールがたまにあり、その場合、エンコードされていると判定されませんでした。
なので、

```py3
  (?=[ \t\r\n]|$)           # whitespace or the end of the string
```
としておくと対処できます。
あなたがジャバを書く前に確認しておきたい5項目

あなたとジャバ、今すぐダウンロード！ジャバは150億のデバイスで使われているので、これからジャバを書きたい、という人も多いはずです。世界中の大学でジャバを扱っているコースがあります。本稿では、ジャバを書く、その前にチェックしておいてほしい5つの項目について、その背景を含めて解説していきます。

# １、ジャバで現実世界の問題を解決しようとしない

ジャバは、複雑な問題に対しても管理しやすい方法で記述する方法を与えます。しかし、この性質は、現実世界での複雑な問題ーー就職や受験、人によっては恋愛などーーを解決する方法をジャバが提供できることを意味しません。これらの問題は、本質的に個人的で、たとえジャバの表現力をもってしても、実際の問題解決とは結びつきません。ただし、これらの問題から目を逸らす方法についてはジャバは提供できますが、これはしばしば現実の問題の解決を遅らせる（あるいは不可能にする）ことがあります。

# ２、ジャバはあなたの日記ではない

おそらく、あなたはジャバを記述するとき、エクリプスやインテリジェイと呼ばれる道具を使っているでしょう。これらの道具には、バージョン管理システムと呼ばれる、いわば自動化された日報ツールが統合されています。ここに、日頃の愚痴や家庭での出来事、趣味の話を記述したくなるかもしれません。しかし、思いとどまってください。こういった事項はバグジラなど、適切なツールを用いて管理するべきです。

# ３、ジャバ以外の言語を迫害しない

ジャバは素晴らしい言語です。しかし、ジャバを使っていない人々を必要以上に攻撃するのは好ましくありません。こういった態度は、ジャバの中での宗派間対立を煽ることにもつながり、結果として2038年に起きたジャバ事件に繋がってしまいました。過去の反省の意味も含め、よき隣人であることに努めましょう。

また、異教徒が崇拝している言語機能もいずれジャバに組み込まれることでしょう。そのとき、恥ずかしい思いをしないためにも、批判はほどほどにするべきです。場合によっては、ジャバスクリプトのように、処理系ごと取り込んでしまうことだってありえるのです。

# ４、ジャバを書くことをためらわない

時に、自分のジャバが独りよがりではないか、他人からバカにされるのではないか、といった感情からジャバを書くのをためらってしまう人がいます。しかし、ジャバは本質的には内面的なものであり、いわば「他人にどうこういわれる筋合いのものではない」のです。同時に、あなたのジャバが他人から認められ、仮にそれであなたが満足感を得られるとしても、結局のところ、そういった感情もあなたの2つの耳の間での化学物質のやりとりに過ぎないのです。必要以上に他人を気にすることなく、ジャバは自由に書くべきなのです。

----

以上、いかがでしたでしょうか。これらは私の考えに過ぎないので、他にもジャバについていろいろ思いのある方も多いと思います。以下質疑ではそれらのことについて議論させていただければと思います。
PythonでOracleのデータベースの指定したテーブルをファイル毎にExcelに出力する


# 作った理由

OracleのWebアプリを作っていますが、手軽にデータを出力して確認したりバックアップするために作成しました。


# 前提条件

OS：Windows 8.1
Python：2.7.10 x64
必須モジュール：cx_Oracle、xlwt


# コード

```pyt:output_oracle_to_excel.py
# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import os,sys
import csv
import codecs
import numbers
import unittest
import cStringIO
import itertools

import cx_Oracle

import xlwt

from itertools import chain

os.environ["NLS_LANG"] = "JAPANESE_JAPAN.AL32UTF8"

ORACLE_CONF = {
	'ID'		: 'SCHEMENAME'
	, 'PASS'	: 'SCHEMEPASSWORD'
	, 'HOST'	: '192.168.1.5'
	, 'SID'		: 'XE'
}

def fetchTables( table_name ):
	output_file_name = 'DB_to_Excel_' + HOST + '_' + ID + '_' + table_name + '.xls'

	wb = xlwt.Workbook()				# 新規ワークブック作成
	ws = wb.add_sheet( table_name )		# 新規ワークシート作成

	column_name_sql = 'select column_name from user_tab_columns where table_name = :tbl'
	cur_columns = conn.cursor()
	cur_columns.execute(column_name_sql, tbl=table_name)
	columns = cur_columns.fetchall()
	cur_columns.close()
	columns = tuple(chain.from_iterable(columns))

	data_sql = 'select * from "%s"' % table_name
	cur_data = conn.cursor()
	cur_data.execute(data_sql)

	nRow = 0
	nLine = 0
	for value in columns:
		ws.write(nRow, nLine, value) 
		nLine = nLine + 1

	row = cur_data.fetchone()

	nRow	= 1
	while row != None:										# データがあれば
		nLine = 0
		for value in row:									# 取得要素分ループ
			if isinstance( value , cx_Oracle.LOB ):
				value = value.read()
			ws.write(nRow, nLine, value)					# Excelに書き込み
			nLine = nLine + 1
		nRow = nRow + 1
		row = cur_data.fetchone()							# 次レコードへ

	cur_data.close()
	wb.save( output_file_name )							# Excelファイル保存


def fetchAllTables( conn ):
	str_sql = "select TABLE_NAME from user_tables where TABLE_NAME LIKE '%USER%' or TABLE_NAME LIKE '%SHOP%' ORDER BY TABLE_NAME"
	cur_tables = conn.cursor()
	cur_tables.execute( str_sql )
	rows = cur_tables.fetchall()
	i = 0
	lst_table = list()
	for row in rows:
		print row[0]
		lst_table.append( row[0] )
		fetchTables(lst_table[i])
		i = i + 1

conn = cx_Oracle.connect( ORACLE_CONF['ID'] , ORACLE_CONF['PASS'] , ORACLE_CONF['HOST'] + '/' + ORACLE_CONF['SID'] )

fetchAllTables( conn )
```

# 解説

## Oracleの文字コード
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.AL32UTF8"
で指定しています。
最近は、UTF-8が多くなりましたので、UTF-8の場合は、そのまま利用できると思います。


## 接続情報

ORACLE_CONF = {
	'ID'		: 'SCHEMENAME'
	, 'PASS'	: 'SCHEMEPASSWORD'
	, 'HOST'	: '192.168.1.5'
	, 'SID'		: 'XE'
}
適宜ご自身の環境に応じて変更してください


## 出力されるファイル名

def fetchTables( table_name ):
	output_file_name = 'DB_to_Excel_' + HOST + '_' + ID + '_' + table_name + '.xls'

の部分でファイル名を生成しています。
例えば、HOST：192.168.1.5、ID:SCHEMENAMEで取得したテーブルが「TEST_USER」であれば、
DB_to_Excel_192.168.1.5_SCHEMENAME_TEST_USER.xls
というファイルに出力結果が保存されます。


## 出力するテーブルを絞り込んだり、絞り込みをしない場合

def fetchAllTables( conn ):
	str_sql = "select TABLE_NAME from user_tables where TABLE_NAME LIKE '%USER%' or TABLE_NAME LIKE '%SHOP%' ORDER BY TABLE_NAME"
のWHERE句を適宜変更して頂きますと可能です。
SPARQL文で言語指定して取得する方法

DBpedia Japaneseの東京都のURIのラベルを日本語で取得したい場合は以下のSPARQL文

select * where { 
<http://ja.dbpedia.org/resource/東京都> <http://www.w3.org/2000/01/rdf-schema#label> ?tokyo_label . 
filter(LANG(?tokyo_label) = 'ja')
}

英語の場合は'ja'を'en'に変更
Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs.のエラー対応


## 前置き

Reactを使って開発している時に、デザイン部分はMaterial-UIを使おうと

```
$ npm install --save material-ui
```

し、Material-UIのコンポーネントを呼び出したら記事タイトルのエラーが起きたお話。

## 対応

原因はインストールしていたReactのバージョンとMaterial-UIのDependenciesで指定していたReactのバージョンが違っていたせいでした。

なので以下の様に対応

```
$ npm uninstall --save react react-dom
$ npm install --save react react-dom
```

これで解決しました。

```
$ ncu -u
```

で解決するのかやってみたのですが、何故かダメでした。

## 参考
- [Invariant Violation: addComponentAsRefTo(...)](https://github.com/callemall/material-ui/issues/477)
- [jimfb/react-refs-must-have-owner.md](https://gist.github.com/jimfb/4faa6cbfb1ef476bd105)
コミュニケーションって何をすることなの？

TL;DR: コミュニケーションは互いの気持ちの共有をすること

この記事は [コミュニケーション Advent Calendar 2015](http://qiita.com/advent-calendar/2015/communication) の1日目の記事です。

初日なので「コミュニケーションって何をすることなの？」という、そもそもな部分について考えてみました。

## コミュニケーションとは

まずはコミュニケーションについて [wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) の説明を見てみましょう

>「コミュニケーション」という語は多種多様な用いられ方をしている。
辞典類ではまず、人間の間で行われる知覚・感情・思考の伝達、などといった簡素な定義文が掲載されている。
ただし、上記のような定義文では不十分で、一般に「コミュニケーション」というのは、情報の伝達だけが起きればが充分に成立したとは見なされておらず、人間と人間の間で、《意志の疎通》が行われたり、《心や気持ちの通い合い》が行われたり、《互いに理解し合う》ことが起きて、はじめてコミュニケーションが成立した、とされている、といった説明を補っているものもある
学術的には、一般的な用法から離れて、広義に用いることがあり、記号などの何らかの因子の移動を伴う、ある分けられる事象間の相互作用の過程をコミュニケーションと呼ぶことがある

前半で述べられている `知覚・感情・思考の伝達` という部分は A から B へ一方的に何かを伝えている印象を受けます。

一方、それ以降で述べられている部分では

- 意志の疎通
- 心や気持ちの通い合い
- 互いに理解し合う

と言ったことを述べており、こちらは A と B が相互に何かを伝え合っている印象があります。

我々にとって身近な例を挙げると、前者はリリースノートやコミットメッセージなど一方が他方に何か情報を伝える場合が考えられます。

後者はチャットやプルリクエストのコメントなどでの会話が考えられます。

今回は後者で述べているようなものをコミュニケーションとして取り扱いたいと思います。

## コミュニケーションとは何をすることなのか

コミュニケーションは `互いの気持ちを理解し合う` ことを目的としていると思います。

まずは `互いの気持ちを理解し合う` 気持ちのないコミュニケーションがもたらす惨状を見てみたいと思います。

皆さんがよく知るあの状況です。 :arrow_down:

![project_comedy_l.gif](https://qiita-image-store.s3.amazonaws.com/0/17704/07ef489b-b7c0-789b-0a1f-caebc2238055.gif)


何故このような状態になってしまったのでしょうか？

それは各段階でコミュニケーションがうまく行っていなかったからです。

一般的にソフトウェア開発において、何らかの指示は上流から下流に伝達されると思います。

その際 `何故これをやるのか？` という部分が正しく共有されずに仕様だけが一方的に伝えられる事があります。

これだと `A から B` への一方的な情報の伝達に過ぎずコミュニケーションをとっているとは言えません。

本来であればきちんと `誰が困っているのか？`、 `どんなニーズがあるのか？`、 `それを何故私がやるのか？` などなど、様々な背景について時間を割いて伝えて互いに理解し合う必要があります。

多くの場合、時間的な制約により事務的に仕様を伝えて終わってしまいますが、結果としてプロジェクト後半に炎上したりして大変なことになってしまいます。

僕もこのような事が原因で地獄のような体験をしたことが何回かあります。

## 良いコミュニケーションをとるためには

`互いの気持ちを理解し合う` ことを意識して話し合うことが大切です。

これは突き詰めていくのは非常に大変ではありますが、始めるのは簡単です。

まずはメンバーで　`互いの気持ちを理解し合う` ことの重要性について議論します。

この段階でしっかりとコミュニケーションの目的を共有しましょう。

道徳の授業みたいで楽しそうですね。 意外とこういうことってしないですよね。

次に時間が許す限りみんなでだべったり、定期的にどっかに遊びに行ったりすると良いと思います。

アットホームな職場と聞くと鳥肌が立つかもしれませんが、メンバー間で互いのことをよく知ることはとても大事です。

- この人はこういう思考のパターンなんだな
- この人はこういう方向に興味が強いんだな
- この人はこういう界隈への知識が多いんだな

などなど、様々なものが見えてくると思います。

その上で、仕事の話を行うと世間話の延長線のような感覚で議論ができて楽しいと思います。

仕事は楽しい方がいいですよね！

もちろんメンバーで飲みに行くのも良いと思います。

飲み会とかやだな〜という人がいる場合はまだまだメンバーの間の仲良し度が足りていないと思います。

友達と飲みに行くような感覚で適当に飲みに行って適当にだべって帰る感じになると楽しいと思います。

その延長で仕事をすればいいのです。

多分そんな感じの雰囲気なら事務的な仕様の伝達とかそういうことは発生しなくなると思います。

みんな丁寧に困っていることを共有したり、困っているのなら協力してあげたくなったりと言った雰囲気になると思います。

こういう雰囲気で働けたら最高ですね。

しかし、そのためには様々なものと戦う事になります。

- つまらない会議
  - 事務的な仕様の伝達
- メンバー間の微妙なギスギス感
- 結論を急ぎたくなる気持ち

こういった部分をどのようにして解決すればいいのか僕には分かりませんでした。

僕が取った手段としては会社を辞めて、楽しいメンバーたちと会社を作ることでした。

今では適当に遊んで、適当に飲みに行って、適当にダベって、その延長線で楽しく仕事ができています。

みなさんもぜひぜひ楽しく働けるように挑戦してみてください！
Raspberry PiにてRuby on Railsを動かす / 外付けHDDに不揮発データを格納する

家庭内でとあるサービスを作りたかったためRaspberryPi2にRuby on Rails環境を構築し、サービスを動かすまでの個人メモです。
SDカード劣化を防ぐために外付けHDDにDBファイル等格納しています。
それら一連の構築手順をまとめておきます。

## 前提条件

* Raspberry pi2を使用
* 外付けHDDは電源供給のものを使用（後述するがバスパワー対応のUSBハブを使用すれば接続できるかも・・・？）
* 外付けHDDのマウントポイントは2つ。/varと/home

## 前準備

1. raspbianのイメージファイルを以下のURLからダウンロードする
https://www.raspberrypi.org/downloads/raspbian/
※現時点ではJessie-2015-11-21が最新版のためこちらで進める。Desktop等のパッケージは不要なためLITEを使用

2. imgファイルをSDカードに書き込む
※当方環境はMacのため以下のコマンドにて書き込みを実施した（書き込みは2分ほどで終了する）
> diskutil unmountDisk /dev/disk2
> sudo dd if=~/Downloads/2015-11-21-raspbian-jessie-lite.img of=/dev/rdisk2 bs=1m

3. SDカードをRaspberry piに挿入し起動する

4. SSHで接続する（初期ユーザ名は「pi」パスワードは「raspberry」）
※IPアドレスは頑張る。当方環境ではRaspberry piのMACアドレスに固定IPを割り振るように設定済み

5. 初期パスワードを変更する
> passwd

6. システムを最新化する
> sudo apt-get update
> sudo apt-get dist-upgrade

7. raspi-configにてSD内容量を拡張する
> sudo raspi-config
> [1 Expand Filesystem]を選択する

8. SWAPを切る
デフォルトで100MB程のSWAP領域があるためこれを0にする
> sudo apt-get remove dphys-swapfile

## Raspberry piに外付けHDDをつなげる

1. おもむろにUSBのHDDをRaspberry piにつなげる
※たぶんバスパワータイプの場合にはバスパワー対応のUSBハブ等が必要になると思う

2. fdiskでHDDを確認する
> sudo fdisk -l

3. 外付けHDDのパーティションを変更する
当方環境は/dev/sdaがHDDになっていた。適宜読み替えてください
以下を実施するとパーティションが削除され新規パーティションが作成されます。
**十分注意して実施してください。**
> sudo fdisk /dev/sda
> Command (m for help): d
> Command (m for help): n
> Select (default p): p
> もろもろ入力
> Command (m for help): w

4. フォーマットを実行
> mkfs.ext4 /dev/sda1
> mkfs.ext4 /dev/sda2

5. HDDのUUIDを調べる
以下のコマンドを実行後/dev/sdXXとなっているものがHDDです。1行分メモしておく
> sudo blkid

6. 既存ファイルをHDDに移行する
仮に一旦/mnt/varと/mnt/homeにマウントさせてファイルを移動後HDDをそれぞれの領域にマウントさせる
> sudo mount /dev/sda1 /mnt/var
> sudo mount /dev/sda2 /mnt/home
> sudo mv /var/* /mnt/var
> sudo mv /home/* /mnt/home
> sudo umount /mnt/var
> sudo umount /mnt/home
> sudo mount /dev/sda1 /var
> sudo mount /dev/sda2 /home

7. 次回起動時以降も自動でマウントするために/etc/fstabに記載する
> UUID="XXXXXXX" /var ext4 1 2
> UUID="YYYYYYY" /home ext4 1 2

## rubyとrailsをインストールする

1. rubyをインストール
> sudo apt-get install ruby ruby-dev ruby2.1-dev

2. railsをインストール
> sudo gem install rails

3. sqlite3もインストールしとく
> sudo apt-get install sqlite3 libsqlite3-dev
> gem install sqlite3

これでセットアップ完了！！
herokuにRailsアプリをアップしたが、うまくいかないケース

RailsのアプリをHeroku上にアップする作業の復習中に発生した問題（書きなぐり。あとで推敲します）

# Herokuにデプロイしたが　うまく動かない？！

## こんなエラーが
前提
※１ heroku上に 'xxx-yyy-7140' というURIを持つアプリが存在しない
※２ アップしたいのは 'app-exist-2345' というURI

ここで、herokuにデータをpushしようとしたら、gitがないって怒られた。


```
$ git push heroku master
remote: !	No such app as xxx-yyy-7140.
fatal: repository 'https://git.heroku.com/xxx-yyy-7140.git/' not found
```

## 先人の対応
stackoverflowに、同様のケースがあった。

http://stackoverflow.com/questions/28749771/cant-push-to-heroku-after-accidentally-deleting-app-on-heroku

gitのリモートURLを変更する。
```
git remote set-url heroku https://git.heroku.com/boiling-falls-6570.git
```

そして　再度pushする。
```
git push heroku master
```

できた

## （追記）プリコンパイルの必要性

assetsのプリコンパイルも必要。


http://qiita.com/jnchito/items/a1833b48c3b47a955bdf

http://www.workabroad.jp/posts/1164
ruby（以外でも使える）で、ファイルパスの一部を抜き出すケース

# ファイルパスの一部だけ抜き出したい。

<pre>
$ pry
[1] pry(main)> ary = './dir/dir2/hoge.html'.split('/')
=> [".", "dir", "dir2", "hoge.html"]
[2] pry(main)> dir = File.dirname('./dir/dir2/hoge.html')
=> "./dir/dir2"
[3] pry(main)> dir2ary = dir.pop
NoMethodError: undefined method `pop' for "./dir/dir2":String
from (pry):3:in `__pry__'
[4] pry(main)> dir2ary = dir.split('/')
=> [".", "dir", "dir2"]
[5] pry(main)> lastdir = dir2ary.pop
=> "dir2"
[6] pry(main)> filename = File.basename('./dir/dir2/hoge.html')
=> "hoge.html"
[7] pry(main)> 

</pre>
EC-CUBE3プラグイン開発初期にハマったことメモ集

私自身や周りの方が、EC-CUBE3のプラグイン開発初期の頃にハマったことに関して、
メモしておきます。

■共通
・各プラグインのルートフォルダは、先頭大文字。
→ PSRの規約に従う必要あり。（アッパーキャメルケースで書いてください）
・（ソースをコピーしてきた場合）クラスnamespaceのパス/クラス名を間違わないように注意
・文字コードは「UTF-8」を使用する
・インストール直後にプラグイン一覧から、プラグインを「有効にする」としておく
　よく忘れたまま開発を進めていき、追加機能が全く動かない？となることがある。
・PDFからコピーすると、文字が変わるので注意。
→ githubからコピー行うべき。
■config.yml
・codeとディレクトリ名を一致させる。
・コロンの後ろは、必ず半角スペースを入れる
・「service - ○○ServiceProvider」の「-」と○○ServiceProviderの間には、
　必ず半角スペースを入れる。
■event.yml
・フックポイント記述と、呼び出し関数名の間には改行をいれないと、foreachエラーが発生する

```yaml:event.yml（正解パターン）
eccube.event.render.shopping.before:
 - [呼び出し関数名, NORMAL]
```
```yaml:event.yml（間違いパターン）
eccube.event.render.shopping.before: - [呼び出し関数名, NORMAL]
```

■プラグイン圧縮時
・プロジェクト直下のフォルダの中身から、圧縮する。
■プラグインzipファイルインストール時
・app/Plugin/直下にインストール対象と同一のプラグイン名のフォルダ（config.ymlファイルのcodeが一致）が存在しているとエラーとなる。
・ファイルの所有者がapacheになってしまうので、レンタルサーバ・Vagrantなどでは編集権限がなくなってしまうので、権限変更する必要あり。
TinyMCEのボタン一覧

# TinyMCE 3 のボタン
## advancedテーマでデフォルトで使用可能なボタン
### ボタン一覧
bold
italic
underline
strikethrough
justifyleft
justifycenter
justifyright
justifyfull
bullist
numlist
outdent
indent
cut
copy
paste
undo
redo
link
unlink
image
cleanup
help
code
hr
removeformat
formatselect
fontselect
fontsizeselect
styleselect
sub
sup
forecolor
backcolor
forecolorpicker
backcolorpicker
charmap
visualaid
anchor
newdocument
blockquote
### 配置例
![tinymce_button.png](https://qiita-image-store.s3.amazonaws.com/0/15175/63dbbdd5-62e7-e703-0cc0-b3368ea35bfa.png)

```
fontselect,fontsizeselect,removeformat,|,bullist,numlist,|,indent,outdent,|,blockquote,|,styleselect,formatselect
```
```
bold,italic,underline,strikethrough,sub,sup,|,backcolor,forecolor,|,justifyleft,justifycenter,justifyright,justifyfull,|,link,unlink,anchor,|,mt-image,mt-file,charmap,hr
```
```
tablecontrols,|,cut,copy,paste,pastetext,pasteword,|,undo,redo,|,cleanup,code,fullscreen,visualaid
```
`mt-image` と `mt-file` は Movable Type のカスタムボタンです。

## その他ボタン
http://archive.tinymce.com/wiki.php/TinyMCE3x:Buttons/controls

## PowerCMS での設定場所
サイドバー「設定」→「PowerCMS」→「TinyMCE 設定」→「advanced_button1～5」
http://www.powercms.jp/blog/2014/04/tinymce.html
Eclipseプラグインのテストで、hamcrest-library を使う。

Eclipse の JUnit プラグインには hamcrest-library が含まれていません。

解決法はいくつか考えられますが、 [Orbit](http://download.eclipse.org/tools/orbit/downloads/) の p2 アップデートサイトから Plugin bundle としてインストールするのが正攻法です。
Swiftでコールバックの書き方

自分でコールバック関数を使いたくてメモ

## 宣言
文字列をコールバック関数に渡すメソッドを設定します

```swift:
func tempFunc(callback: (String) -> Void) {
	callback("callback!!!!")
}
```
## 呼び出し
### クロージャで指定

```swift:
tempFunc({ (msg: String) -> Void in
	print(msg)
})
```

### メソッドで指定

```swift:
func cb(msg:String) {
	print(msg)
}

tempFunc(cb)
```
concrete5 管理画面で、多言語翻訳機能を使うためのセットアップ方法


concrete5 では、管理画面から、管理画面、属性情報の多言語化を行うことができます。

画像付きの説明はこちら
http://ja.katzueno.com/2015/11/3535/ 


## 設定 & 登録方法

1. [管理画面] - [システムと設定] - [多言語]　より、サイトで英語、日本語を使うよう設定する。日本語のみのサイトでも、隠れページに英語トップページを作成する
1.  選択属性もしくはトピックなどは英語で属性を登録する
    - [ページとテーマ] - [属性] の選択で
    - [システムと設定] - [属性] - [トピック] より
1. [管理画面] - [システムと設定] - [多言語] - [サイトインターフェースを翻訳] に訪問
1. メッセージに従って /application/language/site フォルダをサーバー上で作成し、サーバーが書き込みできるようにしてください。その後「サイトインターフェースを翻訳 」ページを再読み込みして、エラーメッセージが消えていることを確認
1. 「文字列を再読み込み」ボタンをクリック。翻訳ファイルが「/application/language/site」サーバー上に生成される
1. 日本語のリストの右側の鉛筆アイコンをクリック
1. 管理画面、属性で登録した英語の名前を見つけ、日本語の属性を入力。
1. 【注意】日本語の翻訳文字列の入力が終わったら、必ず、ページ右上の「ファイルに保存」をクリックして保存。
Gitのコミットログで作業の振り返りをする。

# Gitのコミットログで作業の振り返りをする
日報書くときに、トリアタマなので忙しくしてると直近の事以外何をしていたのかさっぱり忘れてしまう。
だいたいのことはGitのログとかチャットの会話履歴見れば思い出すので、抽出しやすいGitからログを抽出する。

```
git log --author=authorname --since=yesterday --format='- %s' --date=iso
```
出力例
```
- ほげほげふがふがにのぴよぴよにヒゲヒゲの不具合があったので修正
- ほげほげふがふがを実装完了
```

金曜日に浮かれて帰ってしまって日報書き忘れたとき、月曜日に何してたんだろうとか探すのに、上のだともちろんうまくいかないので、そういう時はsinceに与えてる文字列を2.dayとか3.dayとか指定する、ちゃんと抽出したい場合はuntilとかを指定すると良いと思う。

ただ、フォーマット覚えるのはめんどくさいので、Gitのエイリアスとして登録したり、SourceTreeのカスタム操作に登録したりすると便利だと思う。

- [gitで便利なエイリアス達](http://qiita.com/peccul/items/90dd469e2f72babbc106
)
- [SourceTreeでコミット間の差分ファイルを抽出しよう (カスタム操作を使う方法)](https://ics.media/entry/4475)


# 実例
私の場合、日報用のログ書き出しはSourceTreeのカスタム操作を使用している。当日用のログを書き出すものと、1週間全部のログを書き出すものの2つ。
1週間全部のものだとどれがいつのコミットログなのかわからないので、formatに**%ad**とかを入れておいて、ログを日付で選別できるようにしている。
```
git log --author=authorname --since=1.week --format='%ad - %s' --date=iso
```

- 出力例

```
2015-11-28 14:07:13 +0900 - ほげほげふがふがにのぴよぴよにヒゲヒゲの不具合があったので修正
2015-11-28 13:59:53 +0900  ほげほげふがふがを実装完了
```
このフォーマットだと日報にコピペとかしづらなるので、必要なコミットログだけ選んでから、検索に正規表現が使えるようなエディタで日時部分を置換(削除)する。

- 置換用文字列(行頭から、ハイフンスペースがあるまでを探す)

```
^.*?-\s
```

ほんとは日付ごとにまとめたりとかもできると思うのだけれど、シェル職人ではないのでこの辺りで諦めておく。
playアプリの起動スクリプトサンプル

/etc/init.d/functions の関数を使った形で、playアプリのrc起動スクリプトのひながたを作成。

start,stop,statusがあれば十分という方針。

検証して、もう少し整理していく。

```lang:play-app
#!/bin/sh
# chkconfig:345 99 1
# description: play-app 
# processname: $APP

IP_ADDRESS=`ip -f inet -o addr show eth0|cut -d\  -f 7 | cut -d/ -f 1`

APP=app
APP_USER=appuser
APP_HOME=/home/${APP_USER}/${APP}

CONF="-Dconfig.file=conf/application.conf -Dlogger.file=conf/logger.xml"

MEM="-J-Xms1024M -J-Xmx1024M -XX:MaxPermSize=256m -XX:PermSize=256m"

GC="-J-Xloggc:/var/log/${APP}/gc_%p_%t.log 
-J-XX:+UseGCLogFileRotation -J-XX:NumberOfGCLogFiles=10 -J-XX:GCLogFileSize=100k 
-J-XX:+PrintGCDetails 
-J-XX:+PrintGCTimeStamps"

HEAPDUMP="-J-XX:+HeapDumpOnOutOfMemoryError"

JMX="-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1111
-Djava.rmi.server.hostname=${IP_ADDRESS}"

HEAPSTATS="-J-agentlib:heapstats"


JAVA_OPTIONS="$CONF $MEM $GC $HEAPDUMP $JMX $HEAPSTATS"

# Source function library.
. /etc/rc.d/init.d/functions

prog=$(basename $APP)
lockfile=${LOCKFILE-/var/lock/subsys/${APP_NAME}}
pidfile=${APP_HOME}/RUNNING_PID
RETVAL=0

start(){
    echo  "starting ${prog}:"
    su - $APP_USER -c "cd $Dir; ./bin/${APP} $JAVA_OPTIONS &"
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}

stop(){
    killproc -p ${pidfile} ${prog} -QUIT
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

status(){
    status -p ${pidfile} ${prog}
    RETVAL=$?
}

case "$1" in
  start)
    start
      ;;
  stop)
    stop
     ;;
  status)
     status
     ;;
  restart)
    stop
    start
     ;;
     *)
      echo $"Usage: $0 {start|stop|status|restart}"
      exit 2
esac
```

参考サイト

https://gist.github.com/shrkw/4491097

https://gist.github.com/kozy4324/5795993

http://darutk-oboegaki.blogspot.jp/2012/10/etcinitdfunctions.html

http://d.hatena.ne.jp/tashen/20081124/1227548098

http://hogespace.hatenablog.jp/entry/2013/06/13/222637

https://moomindani.wordpress.com/2014/09/17/linux-command-ip-address/

http://qiita.com/sharow/items/66d89136180884a2f7b7

http://qiita.com/YN0314/items/5e5c57d52ac1379daf6d

http://d.hatena.ne.jp/miyakawa_taku/20150131/1422696243

http://www.oracle.co.jp/jdt2015/pdf/7-3.pdf
Unity uguiのCanvasサイズがおかしくなった場合の対処法

![スクリーンショット 2015-11-29 14.23.33.png](https://qiita-image-store.s3.amazonaws.com/0/59429/fbd478e8-bc4b-d0e8-8bc4-424d8ca04e6c.png)

画像の様に、Expandでx:640,y:1137などにしているのに、
Width:2227,Height:1137とおかしな値になって修正出来ない問題
(正常な場合は Width:640,Height:1137)

解決策:ゲームのアスペクト比を変える

原因:ゲームのアスペクト比を固定からFreeAspectに変えたりすると起こる(要検証)
iCalでシェルスクリプトをスケジュール実行する方法

# 手順
1.Automatorの新規作成で「カレンダーアラーム」を選択

![スナップショット 2012:10:08 23:42.png](https://qiita-image-store.s3.amazonaws.com/0/103041/5f2fcce2-c228-7dd7-86bb-f61c7845c34e.png)

2.アクション「シェルスクリプトを実行」を追加し、スクリプトを書く

![スナップショット 2012:10:08 23:44.png](https://qiita-image-store.s3.amazonaws.com/0/103041/69ada812-37b7-ecc1-b2fd-73cd0fb8332f.png)

3.カレンダーアラームを保存するとiCalにAutomatorという名のカレンダーが作成され、カレンダーアラームと同名のイベントが追加される

![スナップショット 2012:10:08 23:46.png](https://qiita-image-store.s3.amazonaws.com/0/103041/e7a6ce93-0b87-7a92-4843-3205ea2dde95.png)

# 保存場所
カレンダーアラームは下記の場所に保存される。
~/Library/Workflows/Applications/Calendar

イベント終了後もカレンダーアラームは削除されないので、新規イベント作成時に再利用できる。
通知>カスタム…>ファイルを開く
![170109-0001.png](https://qiita-image-store.s3.amazonaws.com/0/103041/f5072b36-0945-5c1b-89c8-0d31b873c811.png)


# 注意
Automator上でスクリプトのデバッグをするのは難しいため、スクリプトは別ファイルとして用意し、カレンダーアラームからはそれを呼び出すだけにした方が良い。また、カレンダーアラームはログを残さないので、スクリプト側でログを出力するようにする。

カレンダーアラームはカレンダーアプリの通知として実行される。集中モードの設定等で通知がブロックされていた場合、カレンダーアラームは実行されない。集中モード「睡眠」はデフォルトで全ての通知をブロックしているため、深夜に実行したい場合は集中モードの設定を変更する必要がある。

macがスリープ中はカレンダーアラームは実行されない。カレンダーアラームが実行されるタイミングにスリープしていない状態を維持する必要がある。
SandBoxオプションで起動したRails Consoleの中からActionMailerでメールが送れなくなってる

本番再現環境で

```rb

RAILS_ENV=production_dummy rails c -s
```

して、数値を変更してからActionMailerで運営チーム宛にメール送信すると今週の数値速報値や特定の切り口でのレポートが送れる、というすごいDirty Hackしていたわけですが、RailsとActionMailerを4.1.7に上げたら出来なくなってました。
いつから出来なくなっていたかは分かりませんが。

ActionMailerからメールが送れない模様です。

本番でSideKiqを使っているのですが、SideKiqにデータを送る事は可能です。


```rb
HogeMailer.send_mail(awesome_data) # <= 送れない
HogeMailer.delay.send_mail(awesome_data) # <= 送れるが・・・
```

ただしsandboxオプションをつけたrails cは１つのトランザクションであり、SideKiqはそのトランザクションの外で動くので、console内の変更を読み込みません。

ということで、Dirty Hack ができなくなったね、という話でした。