OmniAICreator/Qiita-1.07M huggingface dataset:
`Array.prototype.includes()`がES2016に入りましたね


## Meguro.esでの出来事

先日[Meguro.es](http://meguroes.connpass.com/event/21510/)というイベントで、[tc39/ecma262知ってますか?](https://speakerdeck.com/layzie/ecma262)というタイトルでLTさせてもらいました。

で、この中で`Array.prototype.includes()`に言及していて「もうすこしでES2016に入りそうですね」って[発表](https://speakerdeck.com/layzie/ecma262?slide=23)したんです。

## 舞台裏では…

実はこの当日の朝に[TC39 process: clarify two things · Issue #232 · tc39/ecma262](https://github.com/tc39/ecma262/issues/232)というやりとりがありまして、

> A.p.includes is checked in but not yet released. I'll release a draft tomorrow!

https://github.com/tc39/ecma262/issues/232#issuecomment-162721101

って返答がありました。LT中にも一応言及はしましたが、これがようやっとドラフトに入ったようです。

[ECMAScript® 2016 Language Specification](https://tc39.github.io/ecma262/#sec-array.prototype.includes)

## とはいえ…

[これ](http://kangax.github.io/compat-table/es7/)見てもわかるように、すでにChromeとかFirefoxあたりでは普通に実装されていたりします。
Swiftで日付の形式を変換する

RSSなどのデータで見かける以下の形式の日付データ

```
Sat, 02 May 2015 12:04:27 +0900
```
上記のこの形式の日付文字列を

```
2015/05/02 12:04
```
上記の形式に直します

```swift:
func convertDateFormat(dateStr:String) -> String {
    // 引数で渡ってきた文字列をNSDateFormatterでNSDateに直します
    let inFormatter = NSDateFormatter()
    inFormatter.dateFormat = "EEE, dd MM yyyy HH:mm:ss Z"
    let date:NSDate = inFormatter.dateFromString(dateStr)!
    
    // NSDateから指定のフォーマットの文字列に変換します
    let outFormatter = NSDateFormatter()
    outFormatter.dateFormat = "yyyy/MM/dd HH:mm"
    
    return outFormatter.stringFromDate(date)
}
```
## NSDateFormatterに渡す形式

- yyyy : 年
- MMM 月 
- dd : 日
- EEE 曜日
- HH : 時
- mm : 分
- ss : 秒
- Z : 時差
[覚書]Ottoで開発環境を構築 (Appfileをカスタマイズ → Rubyのバージョン指定)

1. [[覚書]Ottoで開発環境を構築](http://qiita.com/neogym/items/c0c3ba87e8535dabe878)
2. [[覚書]OttoでAWSに本番環境構築＆デプロイ](http://qiita.com/neogym/items/e5e0bbf89df390aa9059)
3. [[覚書]Ottoで開発環境を構築 (Appfileをカスタマイズ → Rubyのバージョン指定)](http://qiita.com/neogym/items/73ee4bee570963751153) ← **ここ**
4. [[覚書]Ottoで開発環境を構築 (MongoDBのDockerコンテナを動かす)](http://qiita.com/neogym/items/0d7aa2e07ea1da477f2f)

# プロジェクト作成

プロジェクトをクローン。

```bash
$ git clone https://github.com/hashicorp/otto-getting-started.git
```

# 設定

`Appfile`を作成する。(下記は最小構成の`Appfile`)

```text
application {
  name = "otto-getting-started"
  type = "ruby"
}

project {
  name = "otto-getting-started"
  infrastructure = "otto-getting-started"
}

infrastructure "otto-getting-started" {
  type = "aws"
  flavor = "simple"
}
```

*`Appfile`は、`HCL (HashiCorp Configuration Language)`という言語で書かれているそうです。詳細については、[こちら](https://ottoproject.io/docs/appfile/syntax.html)を参照してください。(未確認)*

# コンパイル

```bash
$ otto compile
==> Loading Appfile...
==> Fetching all Appfile dependencies...
==> Compiling...
    Application:    otto-getting-started (ruby)
    Project:        otto-getting-started
    Infrastructure: aws (simple)

    Compiling infra...
    Compiling foundation: consul
==> Compiling main application...
==> Compilation success!
    This means that Otto is now ready to start a development environment,
    deploy this application, build the supporting infrastructure, and
    more. See the help for more information.
    
    Supporting files to enable Otto to manage your application from
    development to deployment have been placed in the output directory.
    These files can be manually inspected to determine what Otto will do.
```

*コンパイル結果の`Application`、`Project`、`Infrastructure`の項目が、`Appfile`に設定した通りになっています。*

念のため、ステータスを確認。

```bash
$ otto status
==> App Info
    Application:    otto-getting-started (ruby)
    Project:        otto-getting-started
    Infrastructure: aws (simple)
==> Component Status
    Dev environment: NOT CREATED
    Infra:           NOT CREATED
    Build:           NOT BUILT
    Deploy:          NOT DEPLOYED
```

# 開発環境の構築

## 構築

開発環境を構築する。

```bash
$ otto dev
```

### ステータス確認

```bash
$ otto status
==> App Info
    Application:    otto-getting-started (ruby)
    Project:        otto-getting-started
    Infrastructure: aws (simple)
==> Component Status
    Dev environment: CREATED
    Infra:           NOT CREATED
    Build:           NOT BUILT
    Deploy:          NOT DEPLOYED
```

# カスタマイズ

`Appfile`に、下記の記述を追加することで`Ruby`のバージョンを指定できます。

```text
customization "ruby" {
  ruby_version = "2.1"
}
```

先ほど作った開発環境を削除します。

```bash
$ otto dev destroy
```

コンパイルしなおして、開発環境を構築します。

```bash
$ otto compile
$ otto dev
```

*`otto dev`コマンドを実行した際に、下記の行が出力されているはずです。*

```
==> default: [otto] Installing Ruby 2.1 and supporting packages...
```


`Ruby`のバージョンを確認します。

```bash
$ otto dev ssh
vagrant@precise64:/vagrant$ ruby --version
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux-gnu]
```

*`Ruby`のバージョン2.1がインストールされています。*

# 参考

* [Otto by HashiCorp:](https://ottoproject.io/)

以上
【C#】デザインの調整


# 自動デザイン調整

1. Anchorプロパティ
コントロールのどの端をコンテナの端に固定するかを取得または設定

わかりやすい画像↓
http://imagingsolution.net/program/cppcli/anchor-property/

2. Dockプロパティ
フォームの端に合わせてコントロールを配置

3. AutoSizeプロパティ
AutoSize が true の場合、Dock プロパティと Anchor プロパティは有効
https://msdn.microsoft.com/ja-jp/library/ms171729(v=vs.110).aspx


# 直接デザイン調整
Point 構造体、Size プロパティを使用してデザイン調整する。
自動のデザイン調整と組み合わせると複雑になってくるので個人的には直接指定は使いたくない。
日頃からお世話になっている「LIG」ブログについて、感想などを書いてみます

こんにちは。@NEPPIEです。
都内の制作会社でフロントエンドエンジニアをしています。

業務でコーディングをやっていると、いろいろと疑問に思うことが出てきます。
例えば、「CSSで表現したいスタイルはどう書けばいいかなぁ」とか、JavaScriptで動きをつけるとき、どんな風に書けばいいのかなぁ」とかになったら、Googleで検索し、答えを見つけるということをよく行います。

いろいろと調べているうちに、よく出会うサイトを見つけることがあり、自分にとって辞書代わりになることもあり、重宝しています。

#LIGブログとの出会い

さて、今年に入って、JSやCSSを調べるために検索すると必ずといっていいくらい見つけるブログに出会うようになりました。
その名は…

**「[LIG ブログ](http://liginc.co.jp/)」**

![lig-capture.png](https://qiita-image-store.s3.amazonaws.com/0/82037/4cf063ba-c9a6-a596-dfbe-89e591648830.png)

株式会社LIG (リグ) は東京都上野にあるWeb制作会社。
制作会社のウェブサイトはカッコいいものが多いし、実務で培った知識をブログなどで提供していることも多いですが、LIGのブログを見たときの衝撃度はかなりのものでした！

仕事でJSやCSSなどを調べているうちと殆どといっていいくらいこのブログを見つけるようになってから、ほぼ毎日のようにチェックするようになりました。

##LIGブログの特徴

LIGブログは制作にまつわるものだけでなく、様々なコンテンツが混在しています。
カテゴリを見るとWeb、完全オフ、キャリア、旅、マーケティング、DevRel、英語、漫画。

<a href="http://liginc.co.jp/web" target="_blank">Web</a>は制作会社らしく充実したものになっているし、辞書的な感じで利用させていただいてます。
その一方で、それ以外のコンテンツも注目してしまいます。

<h4>「完全オフ」「旅」で気分転換</h4>

Webの隣のタブにある「<a href="http://liginc.co.jp/life/" target="_blank">完全オフ</a>」。
仕事の話はナシという、プライベート感が漂う記事が多くあります。生活に役立つような情報や、どーでもいいけど面白そうなネタ、実験的なネタもあって、気分転換にもなりそうですね。

個人的に気になったのがこれ。

<a href="http://liginc.co.jp/210280" target="_blank">部下の部屋がダサ過ぎるので、いっそ風呂場にしてみました。</a>

![DSC00196-196-655x437.jpg](https://qiita-image-store.s3.amazonaws.com/0/82037/4d158723-8dfd-f64e-4ac2-c3d0b13f1e16.jpeg)

LIG社長のゴウさんが部下の部屋をカスタマイズするという企画が何回かやっているそうですが、今回はなんと！部屋にあったものを片付けて、お風呂場にしてしまうという無謀な企画。
部屋を風呂場にしてしまうとは…部屋中がびしょびしょになりそうー、煙突が懐かしいー、という感じで、写真を見たときには驚きで一杯でした（笑）。

このままお風呂場になってしまうのかなぁと思ってしまいそうでしたが、もちろん風呂がまは撤収され、ゴウさんによるインテリアコーディネートで生まれ変わりました。
果たして、綺麗さが続くのでしょうか…。
（これを見て、段捨離しなくては…と思った私でした）

「旅」のコンテンツも様々。国内、海外の旅だけでなく、移住についても取り上げられてます。
LIGは長野にもオフィスやゲストハウスがあるので、地方ならではの記事も興味深く読ませていただいてます。

Webの知識を助けるだけでなく、キャリア、マーケティングの話が読めたりするので、ビジネス面でも役立ちそうですね。
膨大なので、全部読むまでに相当かかりそうですが、少しずつ読んでいきたいと思います。

##特徴的なデザイン

LIGブログを見て、もう一つ衝撃的だったのが、オリジナル広告のバナーたちでした。
Googleやアフィリエイトでお馴染みのバナー。Web関係のブログでもよく見かけますが、LIGの場合は、その広告バナーがオリジナルになっているというのが大きな特徴です。

![capture_lig_ad.png](https://qiita-image-store.s3.amazonaws.com/0/82037/ae4f3ef6-324c-5140-49db-e4e40d638e51.png)

「これ、広告？」と思わせるようなものばかりですが、よーく見ると広告なんですよね。
広告を広告に見せない手法を使えるのも、優れたデザイナーさんが多いのと、LIGブログからアクセスしやすいようにするための手法がしっかりしているからだと思います。
広告を依頼した会社も、宣伝したいものを新たな形で見せてくれる効果は高いのではないでしょうか。
一番下のバナー、アーティストのページに行くのではと思ってしまいそうでした。

#まとめ（と個人的な目標？）

という感じで、LIGブログを楽しんでいる私ですが、LIGブログを書いてるのはLIGの社員さんだけではないんですよね。LIGブログを執筆する外部スタッフも多くいるので、様々なタラントをもった人たちによる記事が読めるのが嬉しいですね。
ブログ執筆者を募集しているのかは分からないのですが、機会があったら自分も書いてみたいなぁー、と思ってみたりしています。
その為には、自分のスキルを高めるのと、マイブログを更新してストックしていきたいですね。

**LIGブログ、これからもお世話になります！**
今後ともよろしくお願いします。

ブログの方にもアップしましたので、そちらも読んでいただけると嬉しいです。
**[【アドベント・Web】日頃からお世話になっている「LIG」ブログについて、感想などを書いてみました](http://www.neppie.com/blog/?p=8623)**
`NameError: uninitialized constant SchemaMonkey::Middleware::Model`で困っていた昨日の自分へ


```
rm -rf vendor/bundle
```

これでランチを食べに行ける。  

## 背景  
昨日、Railsの開発中にCI環境のJenkinsさんでRspecを回そうとしたところ、タイトルのエラーが出て解決できずはまった。  

## 環境  
Ruby On Rails 4.x.x  
触ってるRailsアプリが多すぎて正確なバージョンは覚えていない。  
 
## エラー発生の状況
呼び出し元はこんなクラス。普通に`has_many`しているだけ。

```ruby
class Hoge < ActiveRecord::Base
  has_many :fugas
end
```

それがこのコードを呼んで

```schema_plus_core/blob/master/lib/schema_plus/core/active_record/base.rb
def has_many(name, scope = nil, options = {}, &extension)
  SchemaMonkey::Middleware::Model::Association::Declaration.start(model: self, name: name, scope: scope, options: options, extension: extension) do |env|
    env.result = super(env.name, env.scope, env.options, &env.extension)
  end.result
end
```

from: https://github.com/SchemaPlus/schema_plus_core/blob/master/lib/schema_plus/core/active_record/base.rb#L23

こうなる。

```
NameError: uninitialized constant SchemaMonkey::Middleware::Model
```

で、この`SchemaMonkey::Middleware::Model`の定義は同じgemの中で行われている。  

つまり、あるgemの中で定義されたメソッドを呼び出しているのに、同じgemの中で定義されている定数が呼び出せない、ということが起こっていた。  
普通に`has_many`しただけなのにヘビーすぎる。  


## 原因は？  
`has_many`メソッドが呼ばれている以上、このgemの読み込みには成功している。  
gemが読み込めている以上、`SchemaMonkey::Middleware::Model`は定義されている。  
ここで定義されていない可能性を疑う(= gemのバグと考える）のは早計なので、定義されていて、かつ読み込めない状況を考える。  

普通、Rubyでは定数を宣言したら以下のように宣言しなおしたからと言って上書きされることはない。  

```ruby
module Hoge; end

puts Object.const_defined?(:Hoge) #=> true
puts Hoge.const_defined?(:Fuga) #=> false

module Hoge
  module Fuga
  end
end

puts Object.const_defined?(:Hoge) #=> true
puts Hoge.const_defined?(:Fuga) #=> true

module Hoge; end # 宣言しなおしてみる

puts Object.const_defined?(:Hoge) #=> true
puts Hoge.const_defined?(:Fuga) #=> true
```

ここで`SchemaMonkey`の宣言方法を見てみる。  

```schema_plus_core/lib/schema_plus/core.rb
SchemaMonkey.register(SchemaPlus::Core)
```

こんなメソッドにたどり着く。  

```schema_monkey/lib/schema_monkey/monkey.rb
def register(mod)
  @client_map[mod] ||= Client.new(mod).tap { |client|
    client.insert if @inserted
    client.insert(dbm: @inserted_dbm) if @inserted_dbm
  }
end
``` 

この先を追求するのは、ちょっと辛いのでここまででわかったことを整理する。  
通常、Rubyのmoduleやclassの宣言（定数の宣言）は元の定数を"開く"だけで上書きはしない。  
このgemではmoduleの宣言を`Hash`を使ってまとめているので上書きされている可能性がある…？  
\#=> `register`の引数の定数がkeyなので可能性は低そう。  

何か、よくわからない力が働いているに違いない…。  

## 結局  
bunderを信じるしかない。  
困った時は`vendor/bundle`を消して`bundle install`しなおす。  

もやもやするのでいつかbundlerを調べて続きを書くかもしれません。
c++ builder > E2015: 'Vcl::Forms::TMonitor'と'System::TMonitor'の区別が曖昧

```txt:動作確認
C++ Builder XE4
```

以下のコードでビルドに失敗した。

```
TMonitor *mntr;
```

> E2015: 'Vcl::Forms::TMonitor'と'System::TMonitor'の区別が曖昧

以下が関係しているのだろうか? 未解決だが。
http://qc.embarcadero.com/wc/qcmain.aspx?d=68313

TMonitor *を使わず、以下を使うことにした。
http://qiita.com/7of9/items/228a65f799f5181e916e
【環境構築】作業機上にLAMP環境を作る(Mac)


##Apache 2.4の設定

Apache:既にインストールされているものを利用
php:5.4系
mysql:5.6系


【Apacheでバーチャルホストを作成する】
※ 今回は書類フォルダ内にバーチャルホスト用のディレクトリを作成します。

1) フォルダの作成を下記のように行う

ex) 作成例
Documents/works/vhosts/
+01/www
+02/www
+03/www

2) httpd.confを編集
    sudo vim /etc/apache2/httpd.conf 
    # Include /private/etc/apache2/extra/httpd-vhosts.conf
    ※ コメントアウトを外す。
    デフォルトでインストールされているApacheのhttpd.confにhttpd-vhosots.confをincludeすることで、
    本来１つのホストしか持てないApacheにバーチャルホストを持てるよう変更する。


2) vhosts.confを編集
※vhosts.confには複数のホストが設定可能。

[1] confにバーチャルホストの情報を設定する。※前述で作成したディレクトリを充てます。

sudo vim /etc/apache2/extra/httpd-vhosts.conf

ex) 設定例
<VirtualHost *:80>
   ServerAdmin namae@gmail.com
   DocumentRoot "/Users/vcj013/Documents/works/vhosts/01/www”
   ServerName test.com
   Options FollowSymLinks
   ErrorLog "/Users/vcj013/Documents/works/vhosts/log/test.com-error_log"
   CustomLog "/Users/vcj013/Documents/works/vhosts/log/test.com-access_log" common
       <Directory "/Users/vcj013/Documents/works/html/04/www">
               Options Indexes FollowSymLinks
               AllowOverride All
				 Require all granted
               Options +FollowSymLinks
       </Directory>
</VirtualHost>


[2] 動作を確認して反映する
httpd -S ※ エラーがでないことを確認
sudo apachectl restart ※ 再起動


[3] hostsファイルを編集

sudo vim /etc/hosts

127.0.0.1 test.com

[4] パスの設定
wwwフォルダに移動し、所有者を調べる
ls -l

sudo vim /private/etc/apache2/httpd.conf
以下をコメントアウト
User _www
Group _www
以下を追加
User _yhamada
Group _staff

sudo vim /private/etc/apache2/httpd.conf

以下をコメントアウト
DocumentRoot “/Library/Webserver/Documents/“


【phpのインストール】

1) ローカルにインストールされているphpのバージョン確認 ※念のため
php -v

2) php5.4のパッケージを丸っと取得してインストールする(今後使用するフレームワークLarabelでは、mcryptが必要となるため)
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4

3) 前項で作成した、vhosts環境にテスト用のphpファイルを作成してphpinfo()を表示して、php5.4が動作していることを確認。

[1]ファイル作成
index.php
<?php
phpinfo();


[2]ブラウザでアクセス http://test.com/


【mysqlのインストール】
homebrewでインストールしてください。

+ homebrew
http://brew.sh/
http://qiita.com/is0me/items/475fdbc4d770534f9ef1


+ homebrewでmysql
http://dejune.net/deblog/mac/post/20131112111732.html


【Laravelの導入】
http://laravel4.kore1server.com/docs/routing
http://laravel.com/

チュートリアル
http://atijusts.hatenablog.com/entry/2013/10/30/235326

※フォルダ構成
Documents/works/vhosts/
+01/www (<- Larabel/public )
   /app, vendor, etc,,, (<- Larabel/pubulic以外)
+02/www
+03/www


【パスの設定】ls 
[1]bash_profileの編集
vim ~/.bash_profile

以下を追記
export PATH=/usr/local/bin:$PATH //homebrewへのパス
export PATH=/usr/local/php5-5.4php5-5.4.33-20141009-124653/bin:$PATH //phpへのパス

[2]bash_profileを再読み込み
source ~/.bash_profile
JIRA チケットは解決してるのに解決してない！？「真の解決済み」について

これは、JIRA のカスタム初心者に良く見られるケース。

どんどんチケット（タスク）を消化してステータスを「解決済み」にしているのに、ダッシュボードでこんなグラフ見たことありませんか？

![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/74970/48c9d07b-639c-ad5f-8fa9-02b76b37b9e0.png)

**・・・全然解決してねーっ！！**

これは、JIRAステータスにおける「解決済み（RESOLVED）」とJIRAが認識する「解決済み」の条件が違うからなんですね。

な…　何を言っているのか　わからねーと思うが。

詳しく説明しますね。
フィールド【解決状況】の中身が「未解決」になっているせいなのです。プログラミング的に言えば Null のまま。
下のスナップショットのような状態です。

![スクリーンショット 2015-12-11 19.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/74970/05f56ad5-deee-b3e8-bd03-abd1fdaf2b35.png)

JIRA的には、ステータスが「解決済」というのはチケット（タスク）が終了したことであって「結果」ではないのです。
解決状況フィールドに何らかの値（標準では、Fixed、Won't Fix、Duplicate、Incomplete、Cannot Reproduce の何れか）が入った状態がJIRAにおける**真の解決済み**です。

逆に言うと、ステータスが「解決済み（RESOLVED）」でなくても、解決状況に何か値が入っていれば「解決済」と見做されるので、カスタム時は注意しましょう。
[Eclipseプラグイン開発] IEditorInputからIFileを取得する


# 目的

- Eclipse のエディタで開いているファイル( `IFile` )を取得する方法をメモ
- 覚え書き的 tips

# 結論

- `IAdaptable` で取得できる

# 方法

例えば、アクティブエディタで開いている `IFile` を取得したいとすると、以下のように書いてしまうと思います。

```java
// nullチェックは省略
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IEditorPart editor = window.getActivePage().getActiveEditor();
IEditorInput editorInput = editor.getEditorInput();
if (editorInput instanceof IFileEditorInput) {
    IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput; // ★
    IFile file = fileEditorInput.getFile();
    // file 取得
}
```

この場合 `IFileEditorInput` を決めうちしていることが問題になります。また、 `IFileEditorInput` を使うには依存プラグインとして `org.eclipse.ui.ide` が必要になります。

これは少しだけ簡単に以下のように取得できます。

```java
// nullチェックは省略
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IEditorPart editor = window.getActivePage().getActiveEditor();
IEditorInput editorInput = editor.getEditorInput();
IFile file = editorInput.getAdapter(IFile.class); // ★
// file 取得(nullの可能性あり)
```

こうすれば  `IFileEditorInput` の決めうちも不要ですし、依存プラグインとして `org.eclipse.ui.ide` も不要になります。

`Optional` を使えばこんな感じ(Workbenchが `null` のことは無いはずだけど)。

```java
IEditorPart editor = Optional.ofNullable(PlatformUI.getWorkbench())
		.map(IWorkbench::getActiveWorkbenchWindow)
		.map(IWorkbenchWindow::getActivePage)
		.map(IWorkbenchPage::getActiveEditor)
		.map(IEditorPart::getEditorInput)
		.map(a -> a.getAdapter(IFile.class)) // ★
		.orElse(null);
```

# 確認

決めうちしていた `IFileEditorInput` ですが、実装クラスは `org.eclipse.ui.part.FileEditorInput` かそのサブクラスになります。

`FileEditorInput` は `PlatformObject` を拡張しています。
これは `IAdaptable` な汎用オブジェクトみたいなものですね。

このあたりの詳細は、「[Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runtime.IAdaptable](http://www.masatom.in/pukiwiki/Eclipse/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%B3%AB%C8%AF%A4%CETIPS%BD%B8/org.eclipse.core.runtime.IAdaptable/)」が大変参考になるかと思います。

実際のアダプターは `org.eclipse.ui.internal.ide.model.FileInputAdapterFactory` が生成しているようです。
ソースを見ると `IFile` と `IResource` を指定されるとファイルを返すようですね。

また、このアダプターファクトリーは `org.eclipse.ui.ide` の `plugin.xml` に定義されているようです。

```xml
<!-- 省略 -->
      <extension
         id="org.eclipse.ui.ide.resourceMappingAdapters"
         point="org.eclipse.core.runtime.adapters">
<!-- 省略 -->
       <factory
             adaptableType="org.eclipse.ui.IFileEditorInput"
             class="org.eclipse.ui.internal.ide.model.FileInputAdapterFactory">
          <adapter
                type="org.eclipse.core.resources.IFile">
          </adapter>
          <adapter
                type="org.eclipse.core.resources.IResource">
          </adapter>
       </factory>
<!-- 省略 -->
```
【kintone】API/イベントハンドラーと便利な独自関数の一覧

```
*もくじ*
1 イベントハンドラー一覧
2 独自関数一覧
3 参考URL
```

## 1 イベントハンドラー一覧

> イベント ハンドラーとは、イベント (ユーザーによるボタンのクリックや、メッセージ キューによるメッセージ受信など) が発生したときに実行されるアクションを決める、コード内の順序



|新規作成イベント類| 意味 |
|:-----|:-----|
|app.record.create.show|レコード追加画面または再利用画面が表示された時|
|app.record.create.submit|レコード追加画面もしくは、再利用画面で保存ボタンをクリックしたあとに発生|
|app.record.create.change.<フィールドコード>|レコード追加画面で、指定フィールドの値が変更された時、フォームの値の書き換え時に発生|


|編集イベント類| 意味 |
|:-----|:-----|
|app.record.edit.show|アプリのレコード編集画面が表示された時|
|app.record.edit.submit|レコード編集画面で保存ボタンをクリックしたあと、サーバーにポストする前に発生|
|app.record.edit.change.<フィールドコード>|レコード編集画面で、指定フィールドの値が変更された時、フォームの値の書き換え時に発生|

|レコード一覧イベント類 | 意味 |
|:-----|:-----|
|app.record.index.show|レコード一覧画面を表示するときに発生するイベント|
|app.record.index.edit.submit|レコード一覧画面でインライン編集の保存ボタンをクリックしたあとに発生|
|app.record.index.edit.show|レコード一覧画面のインライン編集で、任意のレコードのインライン編集が開始された時に発生|
|app.record.index.edit.change.<フィールドコード>|レコード編集画面で、指定フィールドの値が変更された時、フォームの値の書き換え時に発生|
|app.record.index.delete.submit|レコード一覧画面で削除ボタンをクリックしてポップアップの「削除する」をクリックしたあと発生|

|レコード詳細表示イベント類 | 意味 |
|:-----|:-----|
|app.record.detail.show|詳細画面の表示時|
|app.record.detail.delete.submit|詳細画面の削除ボタン後|
|app.record.detail.process.proceed|プロセス関連のアクション発生後|

| その他 | 意味 |
|:-----|:-----|
|app.report.show|グラフを表示するときに発生|






## 2 便利な独自関数一覧

|独自関数名|意味|
|:------|:-------|
|kintone.app.getFieldElements|フィールド要素の配列を取得|
|kintone.app.getHeaderMenuSpaceElement|レコード一覧メニューの右側の空白部分を取得する|
|kintone.app.getHeaderSpaceElement|レコード一覧メニューの下側の空白部分を取得する|
|kintone.mobile.app.getHeaderSpaceElement|レコード一覧メニューの下側の空白部分を取得する（モバイル）|
|kintone.app.record.getFieldElement|詳細フィールド要素を取得|
|kintone.app.record.getHeaderMenuSpaceElement|レコード詳細メニューの右側の空白部分を取得する|
|kintone.app.record.getSpaceElement|スペースフィールドを取得する|
|kintone.app.record.get|レコードの値を取得|
|kintone.app.record.set|レコードに値を設定|
|kintone.app.getId|アプリのIDを取得する|
|kintone.app.record.getId|レコードIDを取得する|
|kintone.app.record.setFieldShown("フィールドコード","true/false")|フィールドの表示/非表示を切り替える|
|kintone.app.getRelatedRecordsTargetAppId|関連レコード一覧の参照先アプリIDを取得する|
|kintone.app.getLookupTargetAppId(fieldCode)|ルックアップフィールドの参照先アプリIDを取得する|
|kintone.getUiVersion|新か旧デザインかのバージョンを取得できちゃうやつ|
|kintone.getLoginUser|ログインユーザーのユーザー情報を色々取得できちゃうやつ（ログイン名、ID、電話番号etc...）|
|kintone.app.record.setGroupFieldOpen|グループフィールドの開閉を切り替える|
|kintone.proxy|外部APIを実行する|
|kintone.getRequestToken|CSRFトークンの取得|
|kintone.api.url|URLを取得する（クエリなし）|
|kintone.api.urlForGet|URLを取得する（クエリ文字付き）|
|kintone.app.getQueryCondition|一覧のクエリ文字列を取得|
|kintone.app.getQuery|一覧のクエリ文字列を取得（order by, limit, offset付き）|



## 3 参考URL
> https://cybozudev.zendesk.com/hc/ja/categories/200147600-kintone-API
【備忘録】Python3でのreduce

Python3では、reduce関数はグローバル名前空間から取り除かれてしまい、functoolsというモジュールに移動してしまいました。

こんな感じで使うようになりました。

```
>>> from functools import reduce
>>> reduce(lambda a,b:2*a+b,[1,0,1,1])
11
```
HiveからSparkに変えたら14時間分の集計バッチが3時間まで短縮できた話

## おきまりのやつ
[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird)の13日目を担当します新卒入社3年目の@fuppiです。
分析基盤の開発・運用と予測モデルの構築をしています。

昨日は大先輩である@SayakaItoさんの「[Unityで仮想現実にさわってみた](http://qiita.com/SayakaIto/private/cfa9d2e962f3b82f5b7c)」でした！
VRは、すごく興味があるのですが3D酔いするのがつらい…
ヘディングをするだけでも、かなり没入感を得られたようなので
BFB(弊社のフットボールゲーム)もVR対応したらおもしろいんじゃないでしょうか！！

## はじめに
弊社の分析基盤はAmazon Web Service(以下AWS)を使って作られているので
AWS用語が出てきますがご了承ください。以下はこの記事に登場する各サービスの概要です。
S3: オンラインストレージサービス
EMR: Hadoopを使った、大量のデータを高いコスト効率で素早くかつ簡単に処理するためのウェブサービス
RDS: 自分でOSやRDBをインストールすることなくすぐに利用できるRDBサービス


## HiveからSparkにしようとした経緯

■ 日次バッチがコケた時の再集計が大変
弊社では、DAUや売上などを、様々なセグメントに分けて可視化を行っています。
以前はHive(SQLライクなクエリで分散処理が行える)を使うことで、SQLでは捌ききれなかった大量のデータでも集計を行うことができ、めでだしめでたしだったのですが
日が立つに連れ、データ量だけでなく、新たに必要な指標がどんどん増え、気づけば日次バッチが14時間分(EMRクラスタは2つでそれぞれ7時間ずつかけて処理)。
バッチがコケた時の再集計が…

■ 過去分集計はもっと大変
新たな指標が追加される度に放たれる恐怖のワード

「過去分集計よろしくね」

おかげさまで、リリースから三年を迎えたタイトルもあるので
Hiveを使った集計はなかなか骨の折れる作業ですし、コストもかかります。

そこでどうにかできないものかと考え行き着いたのが

![spark.png](https://qiita-image-store.s3.amazonaws.com/0/69067/a8e708a2-91af-c816-a6e6-8c10000a5dab.png)
https://ja.wikipedia.org/wiki/Apache_Spark

SparkはHiveと違い、インメモリで処理ができるため高速に処理ができます。
SparkSQLを使えば、さほどSQLと変りなく処理が書けますし、
足りない関数を補ったりもっと細かい処理をする場合は
現在対応しているJava・Scala・Python・Rのどれかを使って、処理を書くことも可能です。
幸い普段からPythonを扱っていたので、比較的すんなり開発にとりかかることが出来ました。

■ 将来性がある
Sparkは、機械学習用のライブラリが用意されていたり、ストリーミング処理もできるので
「バッチに時間がかかって困っている」、「将来機械学習やリアルタイム分析を行いたいと思っている」方は
Sparkを使ってみるのもいいのかなと思います。


## 分析環境の概要 
<img width="600px" alt="構成図.png" src="https://qiita-image-store.s3.amazonaws.com/0/69067/96bafc10-0074-afc4-2f32-d296b63e71fa.png">

■ データの流れ

1. 1日1回各サービスのDBから、1日分のログを抽出しS3へ格納
1. S3に溜まったログをEMRで集計し、集計結果を再度S3へ格納
1. S3に置いた集計データをRDS(BIツールで参照するためのDB)へ格納

## 集計バッチの内容
■ 対象タイトル
11タイトル(分析対象コンテンツ)。
複数プラットフォーム展開しており、タイトルとプラットフォームの組み合わせは50ほど。

■ 指標
DAU、DPU、課金額などを色々な切り口(レベル、継続日数、ログイン頻度など)で分けて集計をする。

例)

レベル | DAU | DPU | 課金額
:----:|:---:|:---:|:----:
1 | 100 | 5 | 5000
2 | 50 | 10 | 3000
3 | 5 | 4 | 100000
・ | ・ | ・ | ・

(今回のHive->Spark化は、タイトル毎の独自指標は対象外)

■ 時間・コスト
Hive:  1タイトル(1時間超え) x 11タイトル = 約14時間
Spark: 1タイトル(15分) x 11タイトル = 約3時間
(インスタンスタイプ・台数は同じ)

時間にして約1/5。
EMRの料金はクラスタの使用時間によって決まるので、コストに関しても同じく約1/5。

## まとめ
Sparkは分散かつインメモリで処理が行えるため、大量データを高速に処理できます。
実際に、HiveからSparkに変えたことで
日次バッチが14時間 -> 3時間まで短縮され、コストも約1/5まで削減できました。

また機械学習のライブラリが用意されていることや
ストリーミング処理もできるため、分析の幅を広げやすい点も良いです。

## 終わりに
多少の学習コストがかかるとはいえ、処理の高速化による
時間短縮・コスト削減という目に見えるメリットだけでなく
「集計バッチがコケてました、復旧まで14時間待ってください」と
「集計バッチがコケてました、復旧まで3時間待ってください」
とでは、現場へ与える悪影響・自身の精神的ダメージも変わってきます。

特にJava・Scala・Python・Rを日々の業務で使っている方であれば
そこまで負担は大きくないと思うのでぜひ！

さてさて、明日の[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird)は、
@yyama2さんの「Unity5.3のあの機能に触ってみた。」です。
@yyama2さんは、プログラミングの講師経験があるようなので、
とてもわかりやすく参考になる記事が出てくるのではないでしょうか！期待です！！
bitbucket >  December 15, 2015. > IPが変わる


https://blog.bitbucket.org/2015/12/03/making-bitbuckets-network-better-faster-and-ready-to-grow/

> We’re changing our A records in DNS starting at 00:00 UTC on Tuesday, December 15, 2015. There will not be any downtime for this migration, and most people will not have to do anything differently because of this migration.

一応メモとして。

<hr>
(追記 2016/01/05)
とくにbitbucketとのリポジトリのやりとりで以前と変わった点はない模様。
EMRクラスタ作成時にスポットインスタンスの安いazを選択する


定時で動かしているSparkバッチのコスト削減の為、スポットインスタンスを利用している。
落ちる対策のために定価の3倍で入札をいれていたのだが、それでも価格が高騰してEMRが起動できない事象が発生した。

見てみると ap-northeast-1a,ap-northeast-1cで値段がぜんぜん違う。
安い方使ったほうが得だなと思ったので制御入れた。

```
#!/bin/sh

TARGET_INSTANCE_TYPE="c4.large"
TARGET_AZ="ap-northeast-1a"
SINCE=`date -u -d '1 hours ago' +"%Y-%m-%dT%H:%M:%S"`
UNTIL=`date -u +"%Y-%m-%dT%H:%M:%S"`

aws ec2 describe-spot-price-history \
--instance-types ${TARGET_INSTANCE_TYPE} \
--product-description "Linux/UNIX (Amazon VPC)" \
--start-time ${SINCE} \
--end-time ${UNTIL} \
--availability-zone ${TARGET_AZ} \
| jq -r '.SpotPriceHistory[] | "\(.Timestamp)\t\(.SpotPrice)"' | \
sed s/.000z//g | awk '{print $2}' | head -n 1
```

↑で調べたいinstance_type,azの値段を調べて、一番安いAZを調べる。


```
# azごとにサブネットを作成し、価格の判定結果によって$TARGET_SUBNET_IDを切り替えた。
# EMR作成コマンド例: 
EMR_CLUSTER_ID=`aws emr create-cluster \
--no-auto-terminate \
--region ap-northeast-1 \
--name SparkCluster \
--ami-version 3.8.0 \
--service-role EMR_DefaultRole \
--instance-groups InstanceCount=1,\
Name=sparkmaster,\
BidPrice=$BID_PRICE,\
InstanceGroupType=MASTER,\
InstanceType=$INSTANCE_TYPE InstanceCount=$INSTANCE_COUNT,\
Name=sparkworker,\
BidPrice=$BID_PRICE,\
InstanceGroupType=CORE,\
InstanceType=$INSTANCE_TYPE \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$TARGET_SUBNET_ID,\
KeyName=fam \
--applications Name=Spark \
--query 'ClusterId' --output text`
```

便利。
これでも落ちるようであれば、落ちるまで1分間猶予ができたようなので定時監視して価格を釣り上げるロジックをいれるしかないかな・・・（詳細未調査
Swift2 の NSURLConnection.sendSynchronousRequest にちょっとつまづいた

##概要

こういうの書いたらエラーでて悩んだ

```swift
do {
    var res: AutoreleasingUnsafeMutablePointer<NSURLResponse?>?
    try NSURLConnection.sendSynchronousRequest(req!, returningResponse: res!)
} catch let e as NSError {
}
```
↓
>fatal error: unexpectedly found nil while unwrapping an Optional value

##対応

`nil` でちゃんと初期化して直った
というより `!` があるとエラーがでた


```swift
do {
    let res: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
    try NSURLConnection.sendSynchronousRequest(req!, returningResponse: res)
} catch let e as NSError {
}
```
<br/>
##経緯

Swift2 で `NSURLConnection.sendSynchronousRequest` に関する処理をちょっと書いたら
`fatal error`が表示されてしまいしばらく詰んだ
なのに検索かけても↓みたいな例ばっか出てくる

```swift
var data: NSData = NSURLConnection.sendSynchronousRequest(req, returningResponse: nil, error: nil)!
```

もう今は try の時代だよ！
・・・はじめたばっかなのでよく知らないけど(´･ω･`)
Akazeによるテンプレートマッチングらしきもの

#なんでAkaze
[AKAZE特徴量の紹介と他特徴量との比較](http://poly.hatenablog.com/entry/2014/01/06/063012)より,様々な変化に耐性があり,速度もまずまず速い.実際に私はAkazeを使って映像からリアルタイムでテンプレートマッチングを行っていました.

#プログラム
[ここ](https://github.com/yjiro0403/Template_Matching/blob/master/Akaze_Matching)にあるプログラムと,環境にあわせて以下のファイルを追加してください.

```
opencv_core300d.lib
opencv_highgui300d.lib
opencv_features2d300d.lib
opencv_objdetect300d.lib
opencv_imgproc300d.lib
opencv_imgcodecs300d.lib
```

##プログラムについて
このプログラムはopencvの[draw.cpp](https://fossies.org/dox/opencv-3.0.0/draw_8cpp_source.html)を参考にして書いています.以下に簡単な使い方みたいなもの.
###閾値の設定
プログラムのTHRESHOLDから閾値を設定してください.値が小さいほど,特徴点を抽出する数が少なくなります.
###画像の設定
テンプレート画像のファイルパスをimg_tmpに比較画像のファイルパスをimgに入れてください.

実行するとAkaze.bmpが作成されマッチング結果とMatchPoint.txtが出力されます.
MatchPoint.txtにはマッチングした領域の中心点が書きこまれています.

ちなみに自分は比較画像の取得と計算をwhile文でまわすことによって映像のテンプレートマッチングを行っていました.

#動作結果
画像
![nogizaka.jpg](https://qiita-image-store.s3.amazonaws.com/0/104887/a44ce963-c2b5-34e2-ad57-c7d166bb4741.jpeg)
(アイドルヲタクですいません)

テンプレート画像
![template.jpg](https://qiita-image-store.s3.amazonaws.com/0/104887/516c1bc0-7afd-59f8-4fba-38064cc8cb11.jpeg)

出力画像
![Akaze.jpg](https://qiita-image-store.s3.amazonaws.com/0/104887/12fd3222-9a44-e8b6-0e2b-70b21d04920e.jpeg)
...ちょっとずれてるのであとで改良ですね.
GCE 向け Ansible の dynamic inventory（gcloudコマンド版）

GCP のホストを Ansible の dynamic inventory で引くの、定番は gce.py を使って設定するんですが、普段 gcloud コマンドの権限使って作業してるのにこのためだけに別途 p12 持ってきてとか面倒。

なので gcloud コマンドを使って引っ張ってくるものを前に書きました。
https://gist.github.com/holysugar/190cbbe99658805f1a53

これを hosts/gce.rb あたりに置いて、 hosts/production とかに

```rb
#!/usr/bin/env ruby

require_relative 'gce'
puts GCE.new('ourproductionid', 'production').result
```

みたいに書いて `ansible-playbook -i hosts/production ....` とすれば environment=production タグが付いたホストに対して実行できるはずです。
DjangoでCeleryのメモ


* * *
# インストール

```bash
$ pip install django
$ pip install django-celery
$ pip freeze
amqp==1.4.8
anyjson==0.3.3
billiard==3.3.0.22
celery==3.1.19
Django==1.9
django-celery==3.1.17
kombu==3.0.30
pytz==2015.7
wheel==0.24.0
```

* * *
# Djangoの設定

1 プロジェクトの作成

```bash
$ django-admin.py startproject proj
$ python manage.py startapp sampleapp
/c/dev/projects/proj
```

確認

```bash
|--manage.py
|--proj
| |--__init__.py
| |--settings.py
| |--urls.py
| |--wsgi.py
|--sampleapp
| |--__init__.py
| |--admin.py
| |--apps.py
| |--migrations
| | |--__init__.py
| |--models.py
| |--tests.py
| |--views.py
```

2 settings

/proj/settings.py

```py3
INSTALLED_APPS = (

    'djcelery',
    'kombu.transport.django',
    'sampleapp',
)

# Celery Setting
import djcelery
djcelery.setup_loader()
BROKER_URL = 'django://'
# Tasks will be executed asynchronously.
CELERY_ALWAYS_EAGER = False
```

/proj/celery.py

```py3
from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

from django.conf import settings  # noqa

app = Celery('proj')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
```

/proj/__init__.py


```py3
from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app  # noqa
```

3 タスクの実装

/sampleapp/tasks.py

```py3
import time

from celery import task

@task
def add(a, b):
    time.sleep(10)
    return a + b
```
4 DBの初期化

```bash
$  python manage.py makemigrations djcelery
Migrations for 'djcelery':
  0002_auto_20151211_1830.py:
    - Alter field status on taskmeta
    - Alter field state on taskstate

$  python manage.py migrate djcelery
Operations to perform:
  Apply all migrations: djcelery
Running migrations:
  Rendering model states... DONE
  Applying djcelery.0002_auto_20151211_1830... OK
```

* * *
# 実行

1 Celery ワーカーの起動

```bash
$ celery -A proj worker -l info -c 1
```

2 Djangoのshellから実行

```bash
$  python manage.py shell
```

```pycon
(InteractiveConsole)
>>> from sampleapp.tasks import add
>>> result = add.delay(1, 2)
>>> result.ready()
False
>>> result.ready()  # 10秒経過
True
>>> result.get()
3
```
RTNPARMによるパフォーマンス検証

V7R1からは、**RTNPARM**オプションをプロシージャに使用する事で、割合大きめサイズの戻り値を返す際にパフォーマンスで有利になるようなので検証してみました。
特に、戻り値の最大サイズは大きいが、実際に返す値が小さい時に有利に働くようです。
サンプルは、1000万回ループで、大きめサイズの戻り値に、3バイトの文字列を返してみました。

```RPG:USR407.rpgle
     H****************************************************************
     H*-------------------------------*
     H*----<<日付・著作権    >>-----*
     H*-------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-------------------------------*
     H*----<<コンパイル条件  >>-----*
     H*-------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     D*
     D print           PR                  EXTPROC('print')                     標準出力関数
     D    msg                      1000A   VARYING CONST
     D*定数
     D MAX_COUNT       C                   10000000
     D*変数
     D RTN_STR         S          65535A   INZ
     D*カウンタ
     D IX              S              9S 0 INZ
     D*タイムスタンプ
     D WTIMESTAMP_S    S               Z
     D WTIMESTAMP_E    S               Z
     C*-------------------------------*
     C*----<<メインルーチン  >>-----*
     C*-------------------------------*
      /FREE

           print ( '---- PROGRAM START ----')    ;

           WTIMESTAMP_S = %TIMESTAMP()   ;
           FOR  IX = 1 TO MAX_COUNT;
               RTN_STR = GET_STRING1();
           ENDFOR  ;
           WTIMESTAMP_E = %TIMESTAMP()   ;

           print ( 'RTNPARMなしは'
                   + %CHAR(%DIFF(WTIMESTAMP_E : WTIMESTAMP_S : *SECONDS ) )
                   + '秒かかりました');

           WTIMESTAMP_S = %TIMESTAMP()   ;
           FOR  IX = 1 TO MAX_COUNT;
               RTN_STR = GET_STRING2();
           ENDFOR  ;
           WTIMESTAMP_E = %TIMESTAMP()   ;

           print ( 'RTNPARMありは'
                   + %CHAR(%DIFF(WTIMESTAMP_E : WTIMESTAMP_S : *SECONDS ) )
                   + '秒かかりました');

           EXSR @END  ;

           //終了
           BEGSR   @END   ;
                print ( '---- PROGRAM END   ----')    ;

               *INLR = *ON    ;
               RETURN        ;
           ENDSR         ;

      /END-FREE
     P****************************************************************
     P** < GET_STRING1       >: 文字列取得RTNPARMなし           **
     P****************************************************************
     P GET_STRING1     B
     D GET_STRING1     PI         65535A   VARYING
     D*----<<変数定義 >>-----*
      /FREE
           RETURN 'ABC'          ;
      /END-FREE
     P                 E
     P****************************************************************
     P** < GET_STRING2       >: 文字列取得RTNPARMあり           **
     P****************************************************************
     P GET_STRING2     B
     D GET_STRING2     PI         65535A   VARYING
     D                                     RTNPARM
     D*----<<変数定義 >>-----*
      /FREE
           RETURN 'ABC'          ;
      /END-FREE
     P                 E

```

●実行結果
![2015-12-11_184403.png](https://qiita-image-store.s3.amazonaws.com/0/100029/8b2105c5-7534-fc4b-8847-1a23f238a4db.png)

実行時間は、約半分になりました。IFSからストリームファイルを読み込む時などに役立ちそうですね。
EC-CUBE3.0プラグイン合宿＠伊東温泉

温泉大好きエンジニアのYangsin＠伊東温泉です。

今日は[伊東温泉の山喜旅館](http://www.ito-yamaki.jp/)を舞台に開催中のEC-CUBE開発合宿の様子をお伝えします。

![12321165_1195544117125634_8036531578886640026_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/72899/fa0785c0-fc4e-7dae-6efe-b677910f74e8.jpeg)

## EC-CUBE開発合宿とは

そもそも、EC-CUBEの開発合宿は2010年の[EC-CUBE2.5開発合宿](https://www.ec-cube.net/camp2010/)にはじまり2012年のプラグイン開発合宿以降ほぼ毎年なにかしらの開発合宿を開催してきています。

始めの頃は皆様のアクセスを優先してビジネスホテルや都心の研修施設を舞台に行ってきましたが、やっぱり合宿といえば温泉ですよね。

都会の喧騒から離れた空間で開発に集中。
DやAやS社のLTEも3Gもいりません。Wi-Fiのつながりやすさだけあればいい。

開発に集中できて、温泉で[普段の疲れも癒される](http://www.ito-yamaki.jp/spa.html)。そんな環境なら普段の数倍の開発効率がでるってもんですよ。 あぁ、なんて素晴らしい。
※個人の感想であり、効果には個人差があります

今年は[EC-CUBEプラグインアワード3.0](http://www.ec-cube.net/events/plugin_award_30/)の〆切1週間前ということもあり、3.0対応プラグイン開発の追い込みにもいいですね

## 実際の実施状況

さて、実際の実施状況ですが、中間発表までをダイジェストでお送りします。

### 11:30 集合

今回はスタートからまさかの展開！

[西・東日本、大雨暴風警戒＝低気圧発達、鉄道に影響](http://jp.wsj.com/articles/JJ11499814633261874616120207030453482748117)

季節外れの暴風暴雨で、会場に辿りつけないひと続出
開発合宿メンバーの連絡用のFacebookグループでは、

```強風で電車の運転見合わせで、三島で足止め食らってます( ；´Д｀)```
```あーー今熱海ですが下り全滅です。。泣```
```現在踊り子特急で茅ヶ崎なんですが、徐行運転で、到着の目処がわかりません。```

などの参加者の悲痛な声がどんどんあがってきます
 
集合時間にたどり着いた参加者は半数にもみたず。そもそも運営すらたどり着かないというスタート！  
プラグイン開発初心者向けのセミナーがスタートする時にはすでに、1時間以上押してのスタートとなりました。  
  
通常のイベントなら開始1時間おしなんてありえないですが、ここから先は精神と時の部屋のような密な時間が待ってるので、気にしません。  
ゆっくりと温泉宿のロビーで続々と辿りつく仲間との出会いを楽しんだり、お弁当でもたべなら、皆が無事につくことを祈りつつメールチェックでもしていればOKです。  
だいたいこの時点で自然発生的に名刺交換大会が始まるのはEC-CUBEがビジネスユーザーが多いからでしょうか。

### 13:30 初心者向けセミナー開始  

全員そろったところで、地下の秘密基地に移動します。
まずは、これまで福岡・東京・大阪でのハンズオンで講師をおこなってきたロックオンの永橋が今回も講師を努めます。  
いつもと違って、今回は実際に手を動かす時間も、個別に質問する時間もたっぷりあるので、セミナー自体は1時間ほどで簡単に終えます。

### 14:30 開発開始

作りたいプラグインを出し合うチーム、もくもくと開発に入るチーム、環境構築からスタートするチームなどなど、各チーム毎に島になって黙々と開発を進めます。    
文字にしても写真にしても面白く無いので、アイデアを表現していたらしきホワイトボードでも乗っけておきます。

![たぶん商品にたいして何かするアイデア](https://qiita-image-store.s3.amazonaws.com/0/72899/81a1f4cb-ae5a-3fb6-b09f-f55dee2bd0fe.jpeg)

![ニコニコ的に商品やショップへの感情をリアルタイムでやり取りするプラグイン](https://qiita-image-store.s3.amazonaws.com/0/72899/74b54b23-58db-2dcd-2b1b-e43d0ef42468.jpeg)

突発的にセミナーが始まったりも 
![全体のフロー解説](https://qiita-image-store.s3.amazonaws.com/0/72899/6f68560f-2e2f-8e32-3764-4193b245663f.jpeg)


### 15:00 チェックイン

15時からはお部屋も使えるようになりますので、おっきな荷物をお部屋に移動します。    
今回は4,5名で1室。  
昭和15年築というだけのことはあり、これぞ旅館！という感じです。  
共同にはなりますが、リフォームも重ねられておりトイレなども綺麗。

お部屋に荷物をおいたら、席にもどって開発再開です。
  
ここから18時まで皆さんドキュメントや、すでにあるプラグインを参考にしたりしながら、自分のつくりたいプラグインのイメージを固めていきます。

### 18:30 中間発表

中間発表ではまだ具体的な成果はありませんが、各自のアイデアを共有します。
今回はこんな感じのがでてきました。  

* 新規会員登録時のアンケート追加機能
* ソーシャルボタン追加
* Twilioと連携したなにか
* SendGridプラグイン
* 某会計ソフト連携プラグイン
* 会員属性でメッセージ変更プラグイン
* うざい退会プラグイン
* 特定商品をかった人にだけキャンペーン
* 商品一覧画面のソート条件追加
* 定休日プラグインの改良 （曜日の定休日追加）
* ニコニコ風サイトコメント

はたして、明日の16時までにどんなプラグインが出来上がるのか、乞うご期待！ 

## 合宿はこれからだ！ 

さて、そろそろご飯です。
ご飯食べて、お風呂に入って、~~呑んで~~、開発して、お風呂はいって、開発して。
夜食食べて、~~呑んで~~、開発して・・・
開発合宿はここからが本番。いちばん開発がススム時間帯がやってきます！  


次は自称プラグイン食わず嫌いの @nanasess さんです。
#webpack chunkファイル名にbuildの度に現在時刻をいれる

<i class="fa fa-comment"></i> **キャッシュされたものが利用されないようwebpackが生成するchunkファイル名にbuildの度に現在時刻をいれた時のメモ**

### <i class="fa fa-code"></i> `webpack.config.js`の`output.chunkFilename`に現在時刻を含める

```javascript:webpack.config.js
module.exports = {
    entry : {
        entry : "./entry.js",
    },
    output : {
        path: __dirname,
        filename: "bundle.js",
        chunkFilename: "[id].bundle.js?" + (+new Date),
        publicPath: "/js/"
    }
}
```

- **`(+new Date)`**が現在時刻

### <i class="fa fa-hand-o-right"></i> HTMLに出力後は次のようになる

```html:HTML
<script type="text/javascript" charset="utf-8" async="" src="/js/0.bundle.js?1444118019225"></script>
```

- `[hash]`でも十分かもしれない。  
例えば、`chunkFilename: "[id].bundle.js?[hash]",`
- QUERY_STRINGではなくファイル名とする方法も良いかもしれない。  
例えば、`chunkFilename: "[id].[hash].js",`

### <i class="fa fa-file-text-o"></i> 参考

- `[id]`や`[hash]`などのキーワードはこちらのサイトを参考にしました。  
http://yokotakenji.me/log/programming/js/webpack/4315/
El Capitan に pear がインストールできない

みんな

```
brew install php-pear だよー
```

っていうけどぜんぜんできない

```
$ brew install php-pear
Error: No available formula with the name "php-pear" 
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.
```

最終的に、PHPUnitの現行版を動かすために後から入れてたPHP5.6を消してプリインのPHP5.5に戻して、

http://blog.imho.jp/2014/01/osxphppearphpunit.html

のようにしたら入った
FP in scala 勉強メモ [PartⅠ 第2章 Scala関数型プログラミングの準備]


- 参照透過性

	- どのようなプログラムにおいてもプログラムの意味を変えること無く、式をその結果に置き換えることができる。
	参照透過な引数による呼び出しが参照透過になる関数を、純粋関数と呼ぶ。 
	
	- プログラムのフロー内のその関数を使っている箇所を、その結果と置き換えても処理内容になにも変わりがない場合、
	その関数は参照透過といえる。（値を返すだけ。他に副作用がないということ)
	このため、参照透過性により、プログラムの等式推論が可能になる。
	
	- 関数の蹴った型に従い、「関数が実行するすべてのことがその戻り値に寄って表される」という不変条件が適用される

シーケンスの一般的な命名 xs,ys,as,bs
シーケンス要素の一般的な命名 x,y,z,a,b
Listの命名 h(head) t(tail) l(list)


# 第2章 Scala関数型プログラミングの準備

## EXERCISE 2.1

```
// Q
n番目のフィボナッチ数を取得する再帰関数を記述せよ。

// answer
def fib(n: Int): Int = {
  @annotation.tailrec
  def loop(v: (Int,Int), count: Int): Int = {
    val (x, y) = v
    if (n > count) loop((y,x+y),count+1)
    else x
  }
  loop((0, 0+1), 0)
}

// 公式のanswer
def fib(n: Int): Int = {
  @annotation.tailrec
  def loop(n: (Int,Int), max: Int): Int = {
    val (x,y) = n
    if (max <= 0) x
    else loop((y,x+y),max-1)
  }
  loop((0,1),n)
}
```

maxから引く形のほうが確かにすっきり。


## EXERCISE 2.2

```
// Q
指定された比較関数に従ってArray[A]がソートされているかどうか調べるisSortedを実装せよ。

// answer
def isSorted[A](as: Array[A], ordered: (A,A) => Boolean) = {
  @annotation.tailrec
  def loop(ar: Seq[A]): Boolean = {
    ar match {
      case Seq(x ,y, vs@_*) =>
        if (ordered(x,y)) loop(y +: vs)
        else false
      case _ => true
    }
  }
  loop(as.toSeq)
}

// 公式のanswer
def isSorted[A](as: Array[A], ordered:(A,A) => Boolean): Boolean = {
  @annotation.tailrec
  def loop(n: Seq[A]): Boolean = {
    n match {
      case Seq(x, y, vs@_*) =>
        if (ordered(x, y)) loop(y +: vs)
        else false
      case _ => true
    }
  }
  loop(as.toSeq)
}

// 実行
isSorted[Int](Array(1,2,3), (x:Int,y:Int) => if (x < y) true else false)

```

一致。無意識にList使おうとしたが、コンパイルが通らなかった。


## EXERCISE 2.3

```
// Q
カリー化(currying)では、引数2つの関数fが、fを部分的に適用する引数1つの関数に変換される。
この場合も、コンパイルできる実装は1つだけである。この実装を記述せよ。

// answer
def curry[A,B,C](f: (A,B) => C): A => (B => C) = (a: A) => (b: B) => f(a, b)

// 公式のanswer
def curry[A,B,C](f: (A,B) => C): A => (B => C) = (a: A) => ((b: B) => f(a,b))

```

公式は()が1組多かった。読みやすさのためだろうか。


## EXERCISE 2.4

```
// Q
uncurryを実装せよ。

// answer
def uncurry[A,B,C](f: A => B => C): (A,B) => C = (a: A, b: B) => f(a)(b)

// 公式のanswer
def uncurry[A,B,C](f: A => B => C): (A,B) => C = (a: A,b: B) => f(a)(b)
```

一致

## EXERCISE 2.5

```
// Q
2つの関数を合成する高階関数を実装せよ。

// answer
def compose[A,B,C](f: B => C, g: A => B): A => C = (a: A) => f(g(a))

// 公式のanswer
def compose[A,B,C](f: B => C, g: A => B): A => C = (a: A) => f(g(a))
```

一致
gitの使い方　練習　備忘録

# gitの使い方&練習

gitの使い方を忘れないように備忘録を残しておきます。
環境はvagrant内のローカル環境のみです。
※主にドットインストールさんの動画を参考にしています。
なので基本的な使い方の練習といった感じです。
また備忘録なのであしからず

## 内容

1.初期設定（ローカル上ですべて完了します。）
2.コミット、現在の状況、ログ確認
3.差分確認
4.バージョン戻す
5.ブランチの設定、マージ、コンフリクトの解消
6.pushとpullなど

## 使用ディレクトリ

home/vagrant/app1
home/vagrant/app2
home/vagrant/repo.git


### gitの設定

◆使用者の名前

```lang:git
git config --global user.name ""
```

◆使用者のメールアドレス

```lang:git
git config --global user.email ""
```

◆cuiで行うのでカラー表示をオンにします。

```lang:git
git config --global color.ui true
```

◆設定の確認

```lang:git
git config -l
```

### ファーストコミット

◆gitの初期化 app1にて作業します。

```lang:git
git init
```

vimでindex.htmlファイルを作成する。

```lang:git
git add index.html
```

◆コミットします。
```lang:git
git commit
```

◆ログの確認
```lang:git
git log
```

◆オプション付き　1行のみ
```lang:git
git log --oneline
```

◆オプション付き　詳細内容
```lang:git
git log -p
```

◆オプション付き　変更内容確認
```lang:git
git log --stat
```

### 状態確認
index.htmlを変更します。

◆現在の状態確認
```lang:git
git status
```

◆編集を戻します。
```lang:git
git checkout -- index.html
```

※編集した内容が戻っています、確認してください。


### 差分確認

index.htmlを変更してください。

◆差分確認します。
```lang:git
git diff
```

◆ステージングに上げた状態で確認
```lang:git
git diff --cached
```

### gitでのファイル操作（削除、移動）

◆適当にファイルを作成してgit addします。
　addしたファイルはgitコマンドでのみ削除可能です。
```lang:git
git rm index.css
```

### git管理に含めないファイルの設定

◆不要なファイルを含めたくない時
git管理下に.gitignoreファイルを作りその中に含めたくないファイルのファイルパスを記載する。


### 直前のコミットを変更する

◆一度コミットしてもう一度コミットするがログに表示させないためのコマンド
```lang:git
git commit --amend
```

### 過去のバージョンに戻す

◆ログを確認して直前のコミットに戻す
```lang:git
git reset --hard HEAD
```

◆idを指定してコミットを戻す（大体コミットIDの7桁くらいあれば大丈夫っぽい）
```lang:git
git reset --hard 1f32sdf345
```

◆リセットしたけどリセット自体を戻したい時
```lang:git
git reset --hard ORIG_HEAD
```

※他にもコマンドはあるので状況に応じて使い分ける

### 共有リポジトリでの作業内容

◆共有リポジトリの設定repo.gitに移動する。
```lang:git
git init --bare
```

◆app1でファイルを作成してpushしてみます。
◆◆1リモートの設定（わからない場合はgit configで確認可能）
```lang:git
git remote add origin ~/repo.git
```

◆◆2ファイルをaddしてリポジトリにpushする
```lang:git
git push origin master
```

◆app2でリポジトリの中身を引っ張ってくる。
◆◆app2のディレクトリで行います。
```lang:git
git clone ~/repo.git
```

### コンフリクトが起こった場合（よく仕事で使っていたやり方）
実際は手動でマージするのが多分普通なんでしょうが、どちらかのブランチの内容を
全適用する方法をとっていました。

ローカルを適用する場合：checkout --ours
リモートリポジトリを適用する場合：checkout --theirs


### gitの便利な使い方エイリアスの使い方(git logでいい感じにグラフログを出力する)

```lang:git
git config --global alias.mylog "log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'"
```


超簡単ですがこんな感じでgitを使っていきます。
後は使用していくうちに他に効率のよいやり方はないか見つけられると思います。
【JavaScript】全角カタカナをローマ字イニシャルに変換


```
*もくじ*
1 概要
2 手順
3 注意点
```

## 1 概要
全角のカタカナからイニシャルを作成したい時に使う関数。
例）タナカ　ハナコ
→T H

## 2 手順

1. 名前のカタカナ（全角）の１文字をとってくる
2. イニシャル変換の関数を実行
3. イニシャルの完成！　tada-!


```名前のカタカナを１文字取得
//名前の最初の文字をカットする
var initial_name = initialCheck(苗字のstr.charAt(0)) + '・' + initialCheck(名前のstring.charAt(0));
```


```イニシャル変換の関数
//イニシャル変換の関数
function initialCheck(initialName){
	switch(initialName){
		case 'ア':return 'A';break;
		case 'イ':return 'I';break;
		case 'ウ':return 'U';break;
		case 'エ':return 'E';break;
		case 'オ':return 'O';break;
		case 'カ':case 'キ':case 'ク':case 'ケ':case 'コ':return 'K';break;
		case 'サ':case 'シ':case 'ス':case 'セ':case 'ソ':return 'S';break;
		case 'タ':case 'チ':case 'ツ':case 'テ':case 'ト':return 'T';break;
		case 'ナ':case 'ニ':case 'ヌ':case 'ネ':case 'ノ':return 'N';break;
		case 'ハ':case 'ヒ':case 'フ':case 'ヘ':case 'ホ':return 'H';break;
		case 'マ':case 'ミ':case 'ム':case 'メ':case 'モ':return 'M';break;
		case 'ヤ':case 'ヰ':case 'ユ':case 'ヱ':case 'ヨ':return 'Y';break;
		case 'ラ':case 'リ':case 'ル':case 'レ':case 'ロ':return 'R';break;
		case 'ワ':return 'W';break;
		case 'ガ':case 'ギ':case 'グ':case 'ゲ':case 'ゴ':return 'G';break;
		case 'ザ':case 'ジ':case 'ズ':case 'ゼ':case 'ゾ':return 'Z';break;
		case 'ダ':case 'ヂ':case 'ヅ':case 'デ':case 'ド':return 'D';break;
		case 'バ':case 'ビ':case 'ブ':case 'ベ':case 'ボ':return 'B';break;
		case 'パ':case 'ピ':case 'プ':case 'ペ':case 'ポ':return 'P';break;
		default: //（ァ、ィ、ゥ、ェ、ォ、ャ、ュ、ョ、ッ、ヮ、ヴ、ヲ、ン）は除外
		break;
	}
}
```

```
console.log(initial_name);
//T・Hとでてくる〜
```

##3 注意点

全角カタカナのバリデーションしたあとに実行する。
正規表現で、こんな感じの関数つくればok!

```
function checkKana(kanaName){
	// カナフィールドの英数をチェック
	var pattern = /^[ァ-ン]+$/;
	if (kanaName !== undefined){
		//定義したパターンにマッチするか確認
		if (!(kanaName.match(pattern))){
		// 上記にマッチしない場合（エラー）
		return null;
		}else{
		//上記にマッチする場合（全角カタカナ）
		return kanaName;
		}
	}
}
```
cssの詳細度・優先度を理解し使いこなすために必要なたった1つのこと

**このサイトの存在を覚えましょう**
http://specificity.keegan.st/

～Fin～

-----

と、このまま終わるのは乱暴なので以下簡単な説明を......


# はじめに
cssには詳細度というものがあります。
cssを少しでも触ったことのある人であれば、ご存知の超基本的なものですが、指定が複雑になってくると混乱することもあります。ありますよね。

ぐちゃぐちゃなcssを触らなくてはいけないが、!importantは使いたくない......
そんなときに発見して大いに活躍したのがこちらのサイトになります。

# css詳細度とは

仕様は下記をご覧ください
http://www.w3.org/TR/css3-selectors/#specificity

**要点を列挙します**

- 指定を増やすと詳細度の点数が増え、点数が高いものが優先される
- ただし指定の種類ごとにカーストのような階層があり、下位でいくら点を稼いでも上位には勝てない（争いは同じレベルの者同士でしか発生しない......）
- 優先度が同じものは後で読み込まれたものが優先される


# サイトの使い方
（特に難しいものは無いと思いますが、念のため）
指定方法を入力することで、その詳細度を可視化してくれます。

例）
こんな指定が良いかどうかはさておきcssマスターの方以外は、すぐには中々答えられないかと思います。

```.css
li:first-child a:link {}
li > .hoge:link {}
li + li a:link {}
```

上記サイトでそれぞれ入力してみます。

![Specificity Calculator.png](https://qiita-image-store.s3.amazonaws.com/0/58436/ab4a92e2-28fb-7082-f709-8a8200ebd6c7.png)


左側に行くほど階層が高くなり、越えられない壁ができます。
また色によって、どの指定がどの階層に属しているかが一目で分かります。


## 便利機能

- `+ Duplicate`を押すと入力エリアを複製してくれます
- 左上にある `Sort by specificity` を押すと、優先度の高いものから並べ替えてくれます

## 注意事項

- !importantには対応していません
- バリデーター機能はないので、指定自体が間違っていても教えてくれません

> 例えば `a:link` を `a::link` としてしまうと、擬似クラスではなく擬似要素を見なされ一番右の点数にカウントされてしまいます


# 終わりに
誰かに説明するのにも使えそうですね！
[勉強会メモ] 白猫プロジェクトの裏側　〜リアルタイム通信と、コロプラのサーバサイドの全貌〜


**コロプラ × Photon 共催！中の人が語る「リアルタイム通信」の実装**
https://atnd.org/events/72402

レポートとは言ってますが、写経ではなく私の中で一旦整理してから書きなおしてます。
ご注意ください。

# サーバシステム構成
- AWS（Amazon Web Services）
- CACHEサーバ：redis
- WEBサーバ：Apche＆Zend Framework
- WebSocket：Node.js＆Nginx
- EC2上にMySQL構築。RDSは使わない（ベンダーロックインが怖い）

# リアルタイム通信
- WebSocketでユーザ間通信を実現
- ユーザ間の表示情報は重要な要素のみ同期する（ボスはしっかり、雑魚は適当）

## データ管理
- ホストユーザ：データ管理する
- ゲストユーザ：ホストユーザから貰う

## ロジック部分
- Node.js部分は簡単には変更する事が出来ないため、ロジックは実装していない
- 改修や不具合が発生した場合に対応が難しい
- Node.jsはDBに命令を積むだけで、実行はバッチが定期的に行う


## 通信保証
- ホストからゲストへ重要なデータ送信時には通信保証を行う
- ゲストは正常にデータ受信した場合はホストに受け取り済みを送信する
- ホストは受け取り済みを受信するまでデータ送信する
- ホストは定期的にゲストにPINGして死活検査する

# ノーメンテナンス運用

## マスタデータ
- サーバ側とクライアント側の同期が難しい
- クライアントはサーバに更新が無いか定期的に確認し必要なら更新を行う

## 不具合
- 新機能を実装する場合はサーバ側でON,OFFを切り替えれるようにしておく
- 問題があった場合は機能をクローズする（部分メンテナンス）

## サーバ負荷
- スケールアウト
- 使用スタミナを減らすと負荷が上がるので注意
- 重要な局面（CM前など）では徹底的な負荷予測をする
- 機能ごとに垂直分割し全体が重くなるのを防ぐ

## オンラインマスタDB切り替え

マスタの構成を大幅に変更する時や、負荷が重いALTERを実行する場合は、
オンライン状態でマスタDB切り替えて対応する。

詳しい方法は下記サイトが参考になります。
**MySQL Casual な生活**
http://www.slideshare.net/idhatak/mysql-casual

## DBテーブル変更

ALTER TABLEを実行すると共有ロックがかかってしまうため、
更新クエリを実行しても即座に終了せずにタイムアウトになってしまう。
そのため、サービスを停止する必要がある。

下記ツールを使用することで、サービスを停止することなく、
スキーマを変更することが出来る。

**Percona Toolkit pt-online-schema-change**
https://www.percona.com/doc/percona-toolkit

詳しい方法は下記サイトが参考になります。
**Percona Toolkit pt-online-schema-change でサービス無停止スキーマ変更**
http://blog.father.gedow.net/2012/10/04/percona-toolkit-pt-online-schema-change/

## クライアントバージョンアップ

- 古いクライアントと新しいクライアントが混在する
- サーバ側はクライアントバージョンで挙動を切り替える
- クライアントバージョンが違うクライアント同士はマッチングさせない
- 知らない機能は無視する（未対応のスキルは無しにしておくなど）
- アップデートで機能が開放されることは明示しておく
Bitnami:Redmineを使用したmacへのRedmineインストール手順メモ

macにRedmineをインストールすることになったのでメモ

以下のサイト様を参考にしました
http://saku-java.be-ourselves.jp/2014/04/17/mac-bitnami-redmine-install/

# インストール

まずはインストーラを下記サイトからダウンロード
https://bitnami.com/stack/redmine

<img width="1267" alt="スクリーンショット 2015-12-11 17.35.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/91b41da6-fcb2-7554-20d9-23145b178f94.png">

こんな感じのサイトなので右下の
緑のタイトルの枠内
local Installのbitnami-redmine-xxxという部分をクリック


ちなみに
<img width="699" alt="スクリーンショット 2015-12-11 17.38.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/76567e5e-895b-e1f2-6a4d-3556432b3cf1.png">

こんな画面が出てきますが
右下の
No Thanks, ~
の部分をクリックすれば特に何もせずにダウンロードできます。

あとは、ダウンロードしたインストーラからredmineをinstallしてください。
インストール時の言語は日本語を選択しました。

<img width="502" alt="スクリーンショット 2015-12-11 17.44.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/65ec02ef-165c-c293-92f8-e8b5cc3c9950.png">


ここはとりあえず全部選択して、

<img width="500" alt="スクリーンショット 2015-12-11 17.45.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/fb0e595d-f87f-e571-8847-1eeca2a79728.png">

ここで管理者用のアカウント情報を作成

あとはインストールを待つだけ。
インストールが完了して表示されたwebviewの
「Access Bitnami Redmine Stack」という部分をクリックしてredmineに
アクセスできるので、確認してみましょう。


# 補足

自分の場合は他からのアクセスをされる必要があったのですが、
同じローカルネットワーク内の端末であればデフォルトでアクセスできる模様です。
urlは
/(redmineが入っているpcのipアドレス):8080/redmine


以上
今年の事と来年の抱負

S15009の前川です。

#今年あったこと

私にとって今年は色々と新しいことがあった年でした。

##学校に入学

ITcollege　ITスペシャリスト科に入学しました
高校の時はほとんどが同級生だったのですが
専門学校ということもあり年上の方が多くて
驚きました。
部活とかもやってなかったので年上の方と
関わる機会もあまりなかったので。

## 技術的な事も

学校に入る前もPC触っていたのですが
学校でLinuxを使ってTerminalで色々したりして
自分がPCを触っていたのはまだまだ浅い範囲
だったなと感じました。

## バイトを始めた

高校の頃はバイトは禁止ではなかったのですが
学校側に申請とか、そもそも面倒だったのでバイトしておらず
しかし18歳にもなったのでそろそろバイトを経験しておきたい！
ということでバイトを始めました。
特に書くことはないです。

#来年の抱負
今年始めたことを伸ばすようにして行きたいです。

## タイピングが早くなる！

これから必ず使うであろうキーボードをもっと
上手く使えるようになりたいので
あと授業で「もータイピング遅いよー」
と言われて授業についていけなくなるのはやばいので
来年は早くなるようe-typingをやります！

## 予習復習をする。

CIWの授業があるのですが範囲が広くて時間も余裕が
ないとのことなので予習をするべきだと感じたので。

三期でSQLの授業があったのですが、
その時間は覚えているのですが
しばらくたって練習問題やると忘れていて
身についてないと感じたので、復習しようと思います。

## プログラムを書く

学校に入ってからPython, Java
と勉強してきましたが。
いざ何かプログラムを書こうとすると
書けないので、何でもいいので
とにかくプログロムを書くことを
始めます！

## まとめ

今年も色々ありました！来年も色々あると思います。

頑張っていきましょー。