OmniAICreator/Qiita-1.07M huggingface dataset:
Carthageを使用したQuickの導入

##はじめに
carthangeを使用してQuickを導入してみましたので、自分用のメモがてら記録します。

##環境
以下の環境を使用しています。

* macOS sierra 10.12.4
* Xcode 8.3.2
* Homebrew 1.2.0
* Carthage 0.22.0

##導入手順
実際に行ってみた手順は下記になります。

1. homebrewの導入
2. Carthageのインストール
3. 使用したいframeworkの記載
4. frameworkのビルド
5. projectへのライブラリの紐付け

##1. homebrewの導入
homebrewの公式HP(https://brew.sh/index_ja.html) を参考にterminalで以下を実行します。
```/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

##2. Carthageのインストール
homebrewを使用してCarthageのインストールを行います。
```brew install carthage
```

##3. 使用したいframeworkの記載
対象のprojectファイルに移動し、以下のコマンドでCartfile.private[^1]を作成します。
```touch Cartfile.private
```

Cartfile.privateに使用したいframeworkを記入します。
```github "Quick/Quick"
github "Quick/Nimble"
```

[^1]: プロジェクトに使用するframeworkはCartfileに、テストでしか使用しないframeworkはCartfile.privateに記入します。
##4. frameworkのビルド
以下のコマンドでframeworkのビルドを行います。

```carthage update --platform iOS
```
作成されたframeworkは`Carthage/Build/iOS/`内にあります。

##5. projectへのライブラリの紐付け
projectファイルの　対象のtarget（今回はtTests）の.xcodeproj -> buildPhases -> Link Binary With Librariesに Quick.frameworkとNimble.frameworkを追加します。
左上の「＋」を押して、New Copy Files Phaseを選択、Copy FilesにQuick.frameworkとNimble.frameworkを追加します。
以上を行うと下の画像のような状態になるかと思います。
<img width="873" alt="スクリーンショット 2017-05-07 18.12.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/d6205934-086d-7ebb-723f-39918e7dc704.png">

ビルドが通れば導入は完了です。
テストも作成したサンプルのrepositoryをあげています。
https://github.com/HironobuIga/CarthageSample
Googleドライブの指定フォルダ内のフォルダ名をメールで連絡する。

## 概要
Googleドライブの指定フォルダ内のフォルダ名をメール送信する。
GoogleAppsScriptのトリガーを設定しておくとフォルダやファイルの変更があったときに自動でお知らせしてくれるので便利です。

```DriveApp.gs
function sendMail() {
  var BR = '\r\n';
  // 共有フォルダ内のフォルダを取得
  var folders = DriveApp.getFolderById('フォルダID').getFolders();
  if (folders.hasNext()) {
    // 連絡先メールアドレス
    var EMAIL = 'xxx@aaa.bb.cc';
    // 本文
    var body = 'ファイルがアップロードされました。' + BR;
    body += '【ファイル一覧】' + BR;

    while(folders.hasNext()) {
      var folder = folders.next();
      body += '・'+ folder.getName() + BR;
    }

    body += '' + BR;
    body += '-------------------------------'+ BR;
    body += 'このメッセージは自動送信されています。';
    GmailApp.sendEmail(EMAIL, 'ファイルアップロードのお知らせ', body);
  }
}
```
アクセスメソッドについて(覚書)

##アクセスメソッド

- Rubyではオブジェクトの外部からインスタンス変数を直接参照したり、インスタンス変数に代入したりすることができない。
- オブジェクトの内部の情報にアクセスするには、そのためのメソッドを定義する必要がある。

```ruby:ruby

class Helloworld

  def initialize(myname)
    @name = myname
  end

  def name #@nameを参照する (最初のメソッド)
    @name
  end

  def name=(value) #@nameを変更する(２番目のメソッド)
    @name = value
  end

end

bob = Helloworld.new("Bob")

p bob.name # => "Bob"

p bob.name = "Robert" # => "Robert"

```
1. 最初のメソッドnameは単に、@nameの値を返す。このメソッドは「属性」を参照しているかのように利用できる。
2. ２番目のメソッドはname=という名前を持っている。

2.について

```ruby:ruby

p bob.name = "Robert" # => "Robert"

```

一見、オブジェクトの属性のようなものに代入を行っているように見える、この文は実際はname=("Robert")というメソッド呼び出しを行っている。
このようなメソッドを用意すれば、インスタンス変数に外部からアクセスを許すことができるようになる。
しかし、インスタンス変数が幾つもある場合には何度もメソッドを定義するのは面倒かつ見つかりにくいミスが入り込みやすくなる。
そこで、これらのメソッドを簡単に定義するために用意されているのが以下。

- attr_reader
- attr_writer
- attr_accessor

インスタンス変数名を示すシンボルを指定すると、同名のアクセスメソッドを自動的に定義してくれる。

アクセスメソッドの定義

|定義 |  意味|
|:------|:------|
|attr_reader| 参照のみ可能にする(nameメソッドを定義する)  |
|attr_writer| 変更のみ可能にする(name=メソッドを定義する)  |
|attr_accessor| 参照と変更の両方を可能にする(上記２つを定義)  |

先ほどのnameメソッドとname=メソッド定義する代わりに次のように一行書けば同じ意味になる。

```ruby

class Helloworld

attr_accessor :name

.
.
.

end

```

<メモ>

インスタンス変数を設定するメソッドをライター、参照するメソッドをリーダーと呼ぶ。
これらのメソッドを合わせてアクセサーと呼ぶ。
リーダーのことをゲッター、ライターをセッター、アクセサーのことをアクセスメソッドということもある。
【Rails】バリデーションの追加方法とエラーメッセージの表示

# バリデーション(Validation)とは？
たとえば、入力フォームで「名前」などの項目が抜けて登録しようとした際に、保存させずに「名前が抜けていますよ！」のようなエラーを表示させて再入力を求めたい場合があると思います。こういった処理をrailsではバリデーションの設定によって簡単に作ることが可能です。
<img width="1034" alt="スクリーンショット 2017-05-07 16.38.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/28311b3b-bf02-936f-c4b3-0e5850d00d6c.png">
# バリデーションの追加方法は？
### modelの中に「validates」を記載する。

```group.rb
class Group < ApplicationRecord
  validates :name, presence: true
  
end
```

上記の場合、nameカラムに対応する入力内容がpresence(存在しているか？)がtrueの場合にのみデータが保存されるよ！という設定になります。
他にも色々オプションをつけることができます。たとえば、 

```group.rb
class Group < ApplicationRecord
  validates :name, presence: true,
                   length: { minimum: 8}
end
```
このように記載すれば「8文字以上か？ 」という検証も追加で行うことができます。
両方の条件をクリアした場合にのみデータが保存されます。

### controllerの中にデータのセーブに「成功」「失敗」それぞれの場合の処理を記載する。

```groups_controller.rb
def create
  @group = Group.new(group_params)
  if @group.save
    redirect_to :root #成功の場合
  else		  
    render 'new' #失敗の場合 
  end
end
```
「validate」による検証によって、条件を満たさなければデータのセーブがされなくなります。したがって、データのセーブに「成功」、「失敗」それぞれの処理を上記のようなif文の形で記載します。

<img width="1030" alt="スクリーンショット 2017-05-07 16.38.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/bc991b02-3dab-a227-9765-541e00f022b5.png">
↓グループ名を入力せずに「save」をすると↓
<img width="1033" alt="スクリーンショット 2017-05-07 16.37.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/14a8745d-fc22-57b5-1abd-44ea7be7149d.png">
データはセーブされずにフォームTOPに戻るようにしました。

# 失敗の場合に「エラー文」を表示したい。
今のままだと、データのセーブに失敗した場合にただフォーム入力画面に戻ってしまうだけなので、利用者はエラーに気づかず困惑してしまいます。失敗の場合にはエラー文を表示してあげたいですよね。

### ビューのエラー文を表示したい箇所に「if 〇〇.errors.any?」を記載する。
ビューのエラー文を表示したい箇所に下記のように追加します。

```new.html.erb
<% if @group.errors.any? %>
   <p>エラーでーす。</p>
<% end %>
```

「.errors.any?」を用いることで、エラーが発生しているかを判定することができます。
上記の「エラーでーす。」のところに、エラーの際に表示したい内容を記載することで、エラー文が表示されます。
<img width="1034" alt="スクリーンショット 2017-05-07 16.38.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/d2e04a38-233d-5726-996e-e91ba60712dc.png">


エラーメッセージについては「@group.errors.count」を用いることで「○件のエラーがあります」と表示することができる等、テクニックがまたありますが、今回はバリデーションの追加方法ということで、この辺で区切りたいと思います。
SKLabelNodeにカスタムフォントを設定する

Sprite Kit の SKLabelNode にカスタムフォントを設定する方法です。

# まずはデフォルトフォント

```swift:GameScene.swift
let label = SKLabelNode(text: "Chibi")
label.fontSize = 50
label.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addChild(label)
```

<img width="376" alt="20170507165237.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/550ccc1e-83cf-4abe-6ae6-c35bf94d5b3c.png">

# カスタムフォント

http://itouhiro.hatenablog.com/entry/20130602/font
こちらのフォントを使用させていただきました。

## プロジェクトにフォントファイルを追加する

<img width="640" alt="20170507165236.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/d7eb941f-ddda-585b-2b6b-eb77afcf7c99.png">

<img width="640" alt="20170507165235.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/712bd037-b82a-82b7-a6d6-188ffc2095fb.png">

チェックを入れることで、
リソースがコピーされるようになります。

ここまでで、Storyboardで `UILabel` に設定できるようになります。

<img width="363" alt="スクリーンショット 2017-05-07 17.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/c1571dff-2f55-75fc-e4f5-98d211405f77.png">

しかし、今回やりたいのは `SKLabelNode` に設定することです。
下記に続く。

## info.plist を編集する

ソースコードから利用する場合は `info.plist` を編集する必要があります。

<img width="340" alt="20170507165233.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/30fabe6b-7d0a-d92d-d392-c0925cbab408.png">

`+ボタン` を押して `Fonts provided by application` を追加します。
そして、下記のように `Item 0` にフォントファイルを追加します。

<img width="452" alt="20170507165234.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/0e516a96-cd51-fd90-7b9c-29b32dd91df0.png">

## SKLabelNode にカスタムフォントを設定する

```
let label = SKLabelNode(text: "Chibi")
label.fontName = "PixelMplus10-Regular"
label.fontSize = 50
label.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addChild(label)
```

<img width="373" alt="20170507165232.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/dd8d6b1a-e36e-95e4-b54f-ca297bf47f5f.png">

SKLabelNode のフォントが変わるようになりました！

# トラブルシュート

自分がハマッたトラブルです。

## font not found が出てフォントが変わらない！

```
SKLabelNode: "PixelMplus10-Regular" font not found.
```

### 原因1

Copy Bundle Resources に追加されていない

![20170507172431.png](https://qiita-image-store.s3.amazonaws.com/0/53393/8d38b6bf-10a4-546c-7933-5f95ff2dfef6.png)

フォントをプロジェクトに追加した際に、
`Add to targets` のチェックを入れ忘れると `Copy Bundle Resources` に追加されないようです。
その場合、手動で追加して解決しました。

### 原因2

`info.plist` を修正していない

![20170507173234.png](https://qiita-image-store.s3.amazonaws.com/0/53393/7d72ac76-96ec-0bab-4743-c5d92b19313a.png)

`Fonts provided by application` を追加するのを忘れていました。
[rails]date_field_tagで入力した日付をdate型に変換して特定フォーマットで表示する方法


# やりたいこと
date_field_tagで入力された日付を特定フォーマット(yyyy年mm月dd日(r曜日))に変換したい。
具体的にはViewからある文字を入力させて、値をMailerに渡して、メールを送りたい。

Rails ver: 4.2.6
Ruby ver: 2.3.1

# やり方
## View部分
モデルに紐付かない形にしたかったので、date_field_tagで指定。 初期値はなし(nil)

```
= date_field_tag 'date', nil
```

## controller部分
params[:date]は、string型であり、フォーマットは```yyyy-mm-dd```になっている。

```
date = params[:date]
```

そして、値をdate型に変換する際は

```
date.to_date
```
のようにする。

その他にも、

```
date.in_time_zone
date.to_time
date_datetime
```
 等が使え、様々な型に変換できる。

[参考リンク]
http://qiita.com/aono/items/3d348fb5bd7f85a3a6ed


## 表示フォーマット変換
フォーマット変換はいくつかやり方がありますが、railsの場合、i18nを使うのが良いかなと思っています。
一度定義すれば流用しやすく、管理もしやすいです。

### 1.フォーマットの登録
localesファイルに登録します。
ファイルを作ってもいいですが、ここから持ってきて自分で変更してもOK
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

以下のようにすることで、言語が日本語で、date型の場合の表示を方法を定義できます。
なお、time型の場合は、time: という項目を作ってあげる必要があります。

```yaml:config/locales/ja.yml
ja:
  date:
    abbr_day_names:
    - 日
    - 月
    - 火
    - 水
    - 木
    - 金
    - 土
    formats:
      default: "%Y/%m/%d"
      short: "%m/%d"
      long: "%Y年%m月%d日(%a)"
```

併せて、application.rbのlocale設定を変更

```ruby:application.rb
config.i18n.default_locale = :ja
```

### 2.使ってみる
以下のように使います。

```I18n.l('時刻の指定', format: '使うフォーマットの指定')```

例
```I18n.l(date.to_date, format: :long)```


なお、viewであれば、ヘルパーメソッドが使えるのでもっと簡潔に書けます。
```l date.to_date, format: :long ```



# 参考リンク
Railsで文字列から日時をパースしたい
http://qiita.com/aono/items/3d348fb5bd7f85a3a6ed

【Rails】曜日フォーマット
http://qiita.com/onody/items/ad84fdd6c4b2013affdf

RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い
http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
Ruby｜privateメソッドをどう定義するか

行数にボリュームが出ると、あれ？プライベートは・・・と探すことが多いです。（私だけ？）
クラス（モジュール）の中に何箇所も`private`を使っていて、ハマったことが過去にあります。

```ruby
class Company
  # パブリックメソッドがたくさん
  # ...
  # ...
  # ...

  private
  # よくよく見ずにprivateをつけたりしてアクセサが全滅・・・
  def this_is_private_method
  end
  # ...
  # ...
  # ...

  attr_accessor :name

  private
  # プライベートメソッドがたくさん
end

company = Company.new
company.name = "Hoge Co.,Ltd." #=> NoMethodError!!
```

ベストプラクティスだとは思っていませんが、私がよくやるのは
privateのあとにコメントをつけてなるだけ目立つようにしています。
これだと、重複して`private`を使うことも少なくなるかなと

```ruby
class Hoge
  # パブリックメソッドゾーン
  private #---------------なるだけ目立つ仕切りを作る-------------------#
  # プライベートメソッドゾーン
end
```

あと、Ruby2.X系から`def`がシンボルを返すようになったので１つずつ指定してあげるのもよいかもしれませんね。

```ruby
class Hoge
  private def sample; end
end

hoge = Hoge.new
hoge.sample #=> NoMethodError!!
```
デザインパターン学習メモ：「Singleton」

## このパターンの目的
GoF本より引用する。

> 　あるクラスに対してインスタンスが１つしか存在しないことを保証し、それにアクセスするためのグローバルな方法を提供する。

## 実装例

『アジャイルソフトウェア開発の奥義』（P.231）より引用する。

```java:Singleton.java
public class Singleton
{
	private static Singleton theInstance = null;
	private Singleton() {}
	public static Singleton Instance()
	{
		if (theInstance = null)
			theInstance = new Singleton();
		return theInstance;
	}
}
```

## 利点
 * あるクラスに対して、インスタンスが１つしか存在しないことを保証する
    * システム内の一貫性を保つ
    * 無駄なインスタンス生成を行わない

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
 * ロバート・C・マーチン（2004）『アジャイルソフトウェア開発の奥義　第２版　オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ
Immutable.js を触ったメモ

# Immutable.js とは何か

* JavaScript で不変なデータ構造を扱うためのライブラリ
* 不変なデータは変更ができないため、なんらかの処理で更新した結果を新しいデータとして生成する
* Immutable.js では List, Map, OrderedMap, Record などが不変データ構造として提供されている

# Immutable.js を使用するメリットは？

* データが不変であるため、ソースコードの可読性が向上する
    * 変更は常に新しいデータコレクションになる
* React/Redux ではビジネスロジックを Model という形で閉じ込める用途にも使用可能
    * ref. https://www.wantedly.com/companies/wantedly/post_articles/28935

# Immutable.js のインストール

```
$ npm install immutable
または
$ yarn add immutable
```

# Immutable.js が提供する代表的なコレクション

## List
* JS の配列相当の順序付けされたコレクション

```js:List
const { List } = require('immutable');
const array = List([1, 2, 3, 4, 5]);

// List 生成
List(); // List []
List([1, 2, 3]); // List [1, 2, 3]
List.of(1, 2, 3); // List [1, 2, 3]

// List かどうかチェック
List.isList([]); // false
List.isList(List()); // true

// List の長さ
List([1, 2, 3]).size; // 3

// 値の取得
array.get(4); // 5

// 値のセット
array.set(0, 5); // List [ 5, 2, 3, 4, 5 ]

// 値の削除
array.delete(4); // List [ 1, 2, 3, 4 ]
array.remove(4); // List [ 1, 2, 3, 4 ] : delete の alias

// 値の存在確認
array.includes(5); // true

// List の初期化
array.clear(); // List []

// List のコレクションを JS の配列に変換
array.toJS(); // [ 1, 2, 3, 4, 5 ]
```

## Map
* JS のオブジェクト相当で順序が未定義のコレクション
* Map の key は任意の型を指定できる

```js:Map
const { Map } = require('immutable');
const map = Map({ a: 'valueA', b: 'valueB', c: 'ValueC' });

// Map 生成
Map(); // Map {}
Map({ a: 'valueA', b: 'valueB' }); // Map { "a": "valueA", "b": "valueB" }

// Map かどうかチェック
Map.isMap({}); // false
Map.isMap(map); // true

// Map の長さ
map.size; // 3

// 値の取得
map.get('a'); // 'valueA'
map.get(a); // undefined

// 値のセット
map.set('d', 'valueD'); // Map { "a": "valueA", "b": "valueB", "c": "ValueC", "d": "valueD" }

// 値の削除
map.delete('b'); // Map { "a": "valueA", "c": "ValueC" }

// 値の存在確認
map.includes('valueB'); // true

// Map の初期化
map.clear(); // Map {}

// Map のコレクションを JS のオブジェクトに変換
map.toJS(); // { a: 'valueA', b: 'valueB', c: 'ValueC' }
```

## Record

* JS のオブジェクトに似ているコレクションを生成
* 特定の key を強制適用し、デフォルト値を持つのが特徴

```js:Record
const { Record } = require('immutable');
const Person = Record({ name: null }, 'Person');

Person(); // Person { "name": null }
const me = Person({ name: 'Taro' }); // Person { "name": "Taro" }

// 値の取得
me.get('name'); // 'Taro'

// サイズの取得
me.size; // 1
```
VyOS：tcpdumpでログを取得する

たとえば、ポート番号80番〜8079番のログを取得したいとき。
```
sudo tcpdump portrange 80-8079 -s 0 -C 100 -w /config/tcpdump/log.pcap &
```

- パケットから取り出すバイト数を無制限に(-s 0)
- 指定MBごとにファイルを変える(-C 100)
- 時間ごとに指定の場合は-Zを使う
- 書き出し(-w)
- バックグラウンド実行(末尾に&)
Windows10 Creaters Updateをしてからライセンスエラー(0xC004f200)が表示される

#Windows10でライセンスエラー(0xC004f200)が出た場合の対処法
自分はこうすることで直ったというメモです。
なぜこの状態になったかは不明。

##状況
Windows10の大型アップデートであるCreaters Updateを実施した際、正規ライセンスであるにも関わらず何故かWindowsライセンスの再認証を求められました。
更に、以前使ったライセンスキーは「エラーコード 0xC004f200」が出て使えず...

##環境
- MacBook Pro (Retina, 13-inch, Late 2013)
- Windows10 (1703) on Bootcamp
    - Windows10 Education ライセンス
- その他：Mac上でParallelsによるBootcamp領域の起動もしている ←もしかしたらこれ（PCのハードウェア構成が変更されたと認識されている）のせい？


##エラー内容
こんな感じにライセンス認証してないよっていうエラーが出ます。
>画面右下に常に表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/c59186e6-a418-013c-d3f2-4e667c62db22.png)


>設定 > 更新とセキュリティ> ライセンス認証 の表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/deb98bb0-3490-f59b-cde4-1fd6953a68b6.png)
>(null) エラーコード: 0xC004F200


通常通り、「プロダクトキーを変更します」からライセンス認証をしようとしますが、エラーが表示され一切受け入れてもらえません...
>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/78123f08-ebbc-ba77-3557-bd075093d462.png)
「プロダクトキーを変更します」に表示されるメッセージ
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/1b805d61-4f56-a703-319b-af53572aeecb.png)


また、エラーコード「0xc004f200」をGoogleで検索してもOffice関連のライセンスエラーの解決方法や、そもそもOSをクリーンインストールしたら直るよといった情報しかなく、役に立ちませんでした...

##解決策
ライセンスコードではライセンスが通る気配がないので、電話での認証を行ってみます。

以下のコマンドを「ファイル名を指定して実行」から実行

```bat
slui 04
```

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/f823b5d0-f123-f4bf-0f6e-51ac132fcc3e.png)

電話でのライセンス認証ウィザードが出てくるので、プルダウンメニューから「日本」(ほぼ一番下にあります)を選択して「次へ」
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/a4b67e3f-530d-8d52-de6c-78f5c161b2bd.png)

続いて画面に出てくるフリーダイヤル(携帯からの発信可)に電話。以下のメニューに進む

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/a0b2c0d4-6d8b-f451-f4b6-bf13181534cf.png)

>ガイダンスメニュー：
>1（日本語を指定） → 1（WindowsOS） → 1（Windows10のライセンス認証） → 1（Windows10にアップデート） → 2（それ以外の方） → 画面上のインストールIDを指示通り入力

すると、__確認ID番号__が発行され、電話口で音声が流れてくるので入力します。このコードは次回も使えるかもしれないので、念のためにテキストファイルなどへ保存しておくことをおすすめします。

##確認IDでのライセンス認証がうまく出来た場合
以下のようにライセンス認証がきちんと出来ている表示になるかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/886fbadf-30b7-1d67-e181-68c9e163409e.png)

##その他
「こうやったら上手く行った」「これが原因」といった情報があれば教えてください。
技術英語 > They are built to [withstand challenges] commonly found in manufacturing and packaging environments

[BANNER社 Simple, Rugged Safety Light Curtains: LS Series](https://www.bannerengineering.com/us/en/products/machine-safety/safety-light-curtains/simple-rugged-safety-light-curtains-ls-series.html#all)

> EZ-SCREEN LS light curtains are intuitive, easy-to-use safety devices used for machine safeguarding. They are built to **withstand challenges** commonly found in manufacturing and packaging environments.

意訳 「EZ-SCREEN LS light curtainsは直感的で、簡単に使える、機械防護用の安全装置です。これらは製造とパッケージング環境においてよく見られる困難に立ち向かうために構築されます。」

https://www.merriam-webster.com/dictionary/withstand
> 1 b :  to be proof against :  resist the effect of

<hr>
関連して思い出したのは

> is not subject to challenge

http://qiita.com/7of9/items/53fa6d2be6997b6f1f81
Pythonの覚え書

#Python2系⇔3系の自動変換コマンド
```
2to3 -w 〇〇.py
```

#ライブラリの内部実装をみる
```
import inspect
print(inspect.getsource(調べたい関数))
```

- 単に引数を調べたり、簡単な説明を読んだりしたいときは

```
help(調べたい関数)
```
Windows 10 Creators UpdateでのMSアカウントのドメイン

http://qiita.com/tsuyoshi_cho/items/bffa6ec996035b68320b
の続き的なもの

#結論
Creators Update以前のWindows10にて、MSアカウント紐付けのアカウントでmount.cifsなどのマウント指定のオプションのドメイン名はoutlook.comで大丈夫でした。

Creators UpdateしたWin10ではMicrosoftAccountというドメイン名を指定すると大丈夫なようです。
あれかな、outlook以外のアドレスでも紐付けはできるから、とか企業のアカウント管理(not AD)での運用とかの関係かな?

すごい小さいコネタ。
MeCabを「Windows10；Python3.5(64bit)」に入れる

色々な事情が重なって、Windows環境にMeCabを入れるニーズがあった。
なんとか出来たが、ちょっとググればわかるようにWindows以外のOSが推奨される。
複数の参考記事の組み合わせ+αで解決できたので、作業ログを残しておく。

#実行環境
- Windows 10 
- python3.5
- Visual Studio 2015 Update3

#mecab-0.996.exeをダウンロード＆インストール
- http://taku910.github.io/mecab/#download
- UTF-8を選択

#mecab-0.996.tar.gzの改変作業
- http://taku910.github.io/mecab/#download からダウンロード
- [64ビットWindows用にMeCabをビルドする (Visual Studio 2015/2010を利用)](http://www.ipentec.com/document/document.aspx?page=mecab-compile-for-x64-windows-use-x64-windows)を参考に
- srcディレクトリにいく

##Makefile.msvc.inの改変
- Makefile.msvc.inをコピー⇒Makefile.msvcに名前を変える
- 5行目を

```mf
LDFLAGS = /nologo /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /DYNAMICBASE /MACHINE:X64 ADVAPI32.LIB
```
- 7-8行目を

```
-DDLL_EXPORT -DHAVE_GETENV -DHAVE_WINDOWS_H -DDIC_VERSION=102 \
-DVERSION="\"0.996\"" -DPACKAGE="\"mecab\"" \
```
##feature_index.cppの改変
- 356行目

```cpp
case 't':  os_ << (unsigned int)path->rnode->char_type; break;
```

##writer.cppの改変
- 260行目

```cpp
case 'L': *os << (unsigned int)lattice->size(); break;
```

##改変したもののコンパイル
- VS2015 Native Tools コマンドプロンプト　を起動
- \mecab-0.996\src ディレクトリに移動

```
make.bat
```
- \mecab-0.996\src内の全ての〇〇.exeとlibmecab.dllを C:\Program Files (x86)\MeCab\bin に上書き
- \mecab-0.996\src内のすべての〇〇.libを C:\Program Files (x86)\MeCab\sdk に上書き
- C:\Program Files (x86)\MeCab\bin をPATHに追加

#Pythonモジュールに関する作業
- http://taku910.github.io/mecab/#download
- mecab-python-0.996.tar.gz
- 7-zipで展開
- [Windowsにmecab-pythonを導入](http://seesaawiki.jp/spz/d/Windows%A4%CBmecab-python%A4%F2%C6%B3%C6%FE) を参考に

##setup.pyの書き換え

```py
#!/usr/bin/env python

from distutils.core import setup,Extension,os
import string

def cmd1(str):
    return os.popen(str).readlines()[0][:-1]

def cmd2(str):
    return string.split (cmd1(str))

setup(name = "mecab-python",
	version = cmd1("mecab-config --version"),
	py_modules=["MeCab"],
	ext_modules = [
		Extension("_MeCab",
			["MeCab_wrap.cxx",],
			include_dirs=cmd2("mecab-config --inc-dir"),
			library_dirs=cmd2("mecab-config --libs-only-L"),
			libraries=cmd2("mecab-config --libs-only-l"))
			])
```

##mecab.hに追記
- mecab.h は C:\Program Files (x86)\MeCab\sdk にある

```c
/**
 * Lattice class
 */
class MECAB_DLL_CLASS_EXTERN Lattice {
public:

  virtual void set_result(const char *str)        = 0; //この１行を追加

  /**
   * Clear all internal lattice data.
   */
  virtual void clear()              = 0;
```

##コンパイル
- Anaconda Promptを起動
- C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC に移動

```
vcvarsall.bat
```

- コマンドプロンプトにて mecab-python-0.996ディレクトリに移動

```
python setup.py build
python setup.py install
```
これでようやくimport MeCab が上手くいきました。
Indexが実行計画に反映されず遅い！ Oracle

インデックスはテーブルの再作成などの影響で削除される。
また、再作成してもUNUSABLEのステータスとなって名前の通り使用できなくなる模様。(必ずかは不明)

実行計画立てる際にUSUSABLEのIndexを使用しようとしてエラーを吐くとかはなく、使わず実行計画を立てる。
なので影響が大きくない場合は気づかないかもしれない。

ALTER INDEX [Index名] REBUILD;
とするとVALIDのステータスとなり使用可能になる。

今回気づいた経緯は、
・バッチが異常に遅くなった
→調べると SQLが遅い
→別の環境では早い
→実行計画見直す
→Indexが遅い環境では動いてない
→ヒント句でIndex強制使用
→java.sql.SQLException: ORA-01502: 索引'[索引名]'またはそのパーティションが使用不可の状態です。
→ select index_name, status from all_indexes where index_name = '[索引名]';
→UNUSABLE だった！

Index 作り直すだけで大丈夫なんだと思ってました。
ターミナルから、Atomでファイルを開いてみる

MacのターミナルからAtomでファイルを開く方法を調べたのでメモ

##準備
Atomを起動して、Atom > Install Shell Commandsでatomとapmをインストールする。

##方法

- Atomを開く
```$ atom```

- 今いるディレクトリ内でAtomを開く
```$ atom .```

- 特定のディレクトリ内でAtomを開く
```$ atom folder_name```

- 特定のファイルをAtomで開く
```$ atom file_name``` (指定のファイルがなければ新規で作成される)

例：desktopにいる時に、新規ディレクトリhogeを作成+その中に新規ファイルhoge.jsを作成。
```desktop (ユーザ名)$ atom ./hoge/hoge.js```

##参考
- [How to open Atom editor from command line in OS X?](http://stackoverflow.com/questions/22390709/how-to-open-atom-editor-from-command-line-in-os-x)
- [ターミナルから、Atomを起動してみたら便利だった。](http://qiita.com/35_267_/items/5d7afff691477a24742a)
ASP.NETでコード側の判定次第で画面 (ページ) を閉じる

ASP.NETで登録ボタン等を押した際、成功時は画面を閉じ失敗時は閉じずにエラーメッセージなどを出すということがしたい。

結論: ClientScript.RegisterClientScriptBlockを使用

```vbnet
Private Sub RegistrationClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RegistrationButton.Click

Dim result As Boolean = False

If(registration(Me.params))
  ClientScript.RegisterClientScriptBlock(Me.GetType(), "key", "window.alert('成功ですさよなら');window.close()", True)
Else
  Me.error.Visible = True
EndIf

End Sub
```

上記のRegisterClientScriptBlockを使用するとページを描画せずにアラート (閉じるとウィンドウもそのまま閉じる)。
RegisterStartupScriptに変えるとページを描画してからアラートが出る。

```vbnet
Response.Write("<script language='javascript'> { window.alert('成功ですさよなら');window.close();}</script>")
```

でも同じ動作自体は実現できるようです。
参照元: [Re[3]: webページのボタンを押したら画面が閉じるようにしたい](http://bbs.wankuma.com/index.cgi?mode=al2&namber=23519&KLOG=44)

上の方法の方がよろしそうな気はしますが。

以上。残りは経緯というか、手間取った言い訳というか。

ボタンに最初からOnclickイベントでWindow.Closeを仕込んでいると、Confirmでキャンセルしても画面が閉じてしまうしバリデーションエラーを表示してもユーザがそれを見ることもできないうちに画面が閉じる。
かといって、登録成功時にボタンのOnclickイベントにWindow.Closeを追加するようにしても動作するのは再びボタンを押下した際となって意味がなかった。

やりたいことから検索ワードを考えて探しても上の Onclick でウィンドウを閉じる方法に関する日本語ページしか見つからず、onload 使ってやればいけるのではと気づいてようやくヒントとなるページに到達。

定番の動作だと思うんですけど ASP.net の標準機能 (？) でできないようですし記事もぱっと見つからないというと、あんまりこういう動作をしたいシチュエーションってないものなんでしょうか？

ちなみに、検索語に stack overflow を加えて最初から決め打ちにするといい感じのページが出てくるらしい。
Windowとかcloseとかグーグラビリティの低い検索ワードが多くなってしまうネタだったので日本語ページがノイズになって自然には到達できませんでした。無念。
一から整理するクッキーとセッション

## はじめに
クッキーとセッションっていっつもこんがってよくわかんなくなる。  
で、いざ使おうとした時に毎回調べて納得してまた忘れる…の繰り返しなので  
もう忘れないようにメモしておくことにした。
元記事は[こちら。](http://www.yjhm214.com/entry/cookie-session)

## 目次
- [クッキー](#cookie)
- [セッション](#session)

<a name="cookie"></a>
## クッキー
- WebサーバがHTTP ヘッダーに格納するデータ
- クライアントのブラウザに保存される
- よく保存されるデータ
    - 利用者の識別や属性に関する情報
    - 利用者が最後に訪れた日時
- 保存しない方がいいデータ
    - ログイン情報などの改ざんされてはいけないデータ

クッキーはクライアント側に保存するデータのため、
容易に改ざんできてしまう。
  
そのため、ログイン情報など改ざんされてはいけないデータはクッキーではなくセッションを使う。


```
▼Request Header
:authority:webtools.yjhm214.com
:method:GET
:path:/
:scheme:https
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
accept-encoding:gzip, deflate, sdch, br
accept-language:ja,en-US;q=0.8,en;q=0.6
cookie:XXX=xxx ← ブラウザに保存されているクッキー
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
```

```
▼Response Header
cache-control:no-cache, private
content-encoding:gzip
content-type:text/html; charset=UTF-8
date:Mon, 17 Apr 2017 02:17:56 GMT
server:nginx
set-cookie:XXXXXX=xxxx; expires=Mon, 17-Apr-2017 04:17:56 GMT; Max-Age=7200; path=/ ← サーバで生成されてセットされたクッキー
status:200
```

<a name="session"></a>
## セッション
- サーバに保存するデータ。
- それぞれのセッションはセッションID という識別子に紐づいている。
- セッションを取り出すときはクライアントからセッションID送信する。  
- セッションIDはクッキーに保存する。
- セッションはWebブラウザを閉じるまで保存される。
- よく保存されるデータ
    - ログイン情報
    - ECサイトなどのカートに入れた商品情報
windowsのnginxでdocument root設定

https://nginx.org/en/download.html

今回は https://nginx.org/download/nginx-1.12.0.zip を使った。

解凍

```diff:nginx-1.12.0/conf/nginx.conf
 43         location / {
-44             root   html;
+44             root   c:/www/html;
 45             index  index.html index.htm;
 46         }
```

パス区切りは `\`ではなく`/`である必要があった。
Rails＆MySQLの文字列型において大文字小文字を区別したい

ユーザーが自分の記事に対して任意のカテゴリーを付与できる機能を実装しようとしたときの話。
モデルのバリデーション(:case_sensitive)は大文字小文字を区別しない設定(デフォルト)。

そして__twitter__というカテゴリーが既に登録してある状態で__Twitter__というカテゴリを登録しようとした際にエラーが発生しました。

どうやらMySQLはデフォルトだと文字列の大文字小文字を区別しない模様。
自分の実装している内容的には区別した上でDBに登録しておきたいので、何とかしたい。

Railsにおいて既存のカラムに大文字小文字を区別させる具体的な手順が見当たりませんでしたので、備忘録として残しておきます。
## 手順
マイグレーションを生成します。命名規則については今回のケースに合致するものが見つからなかったため、参考までに。

```rb
rails g migration ChangeCollationForCategoryNames 
```

大文字小文字を区別させるためには対象のカラムに__BINARY__属性を付与する必要があるのですが、Railsにそれを実現するメソッドが見当たらなかったため、executeで直接実行させます。

```rb:XXXXXXXXXXXXXX_change_collation_for_category_names.rb
class ChangeCollationForCategoryNames < ActiveRecord::Migration[5.0]
  def up
    execute("ALTER TABLE categories MODIFY name varchar(255) BINARY")
  end
end
```

マイグレーションを実施すれば完了です。

```rb
rake db:migrate
```
## まとめ
DBによってこのような挙動の違いがあるのは結構怖いですね。
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。
Goでのアルゴリズムクイックリファレンス第2版(4.2 選択ソート)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(4.1.1 挿入ソート)](http://qiita.com/amesho/items/64dcd231038c96345848)

今回は選択ソートです。

+ 整列アルゴリズムの一種
+ 平均,最良、最悪と全部(O(n2))と遅い処理。
+ [安定](https://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E3%82%BD%E3%83%BC%E3%83%88)してない

+ アルゴリズム
  + 範囲Aから最大値を選択して、右端の要素A[n-1]と交換
  + これをより範囲の狭いA[0,n-1]に繰り返してAを整列させる

https://play.golang.org/p/RmX55ADceI

```go
package main

import (
	"fmt"
	"math/rand"
)

func selectMax(ar *[]int, left int, right int) int {
	maxPos, i := left, left
	for i <= right {
		if (*ar)[i] > (*ar)[maxPos] {
			maxPos = i
		}
		i++
	}

	return maxPos
}

func sortPointers(ar *[]int, n int) {
	for i := n - 1; i >= 1; i-- {
		maxPos := selectMax(ar, 0, i)
		if maxPos != i {
			(*ar)[i], (*ar)[maxPos] = (*ar)[maxPos], (*ar)[i]
		}
	}
}


func main() {
	var ary []int
	size := 30
	for i := 0; i < size; i++ {
		ary = append(ary, rand.Intn(size-1))
	}
	fmt.Println(ary)
	sortPointers(&ary, len(ary))
	fmt.Println(ary)
}

```

今回の書き方で迷ったのは、

```go
(*ar)[i], (*ar)[maxPos] = (*ar)[maxPos], (*ar)[i]
```

の部分で、ここは、伝統的な書き方だとこういう書き方になるんですが

```go
tmp := (*ar)[i]
(*ar)[i] = (*ar)[maxPos]
(*ar)[maxPos] = tmp
```

Goの場合こういう入れ替えが可能なのでこちらにしました。

次回は[ヒープソート](https://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E3%82%BD%E3%83%BC%E3%83%88)の予定です。
【Python/PyQ】４.list,for文

# はじめに
Python強化のために「PyQ」というビープラウド社のサービスを個人利用して勉強しています。
こちらは、環境を作ることなくブラウザでプログラミングができます。
また、基本的な文法を写経することで技術習得ができるというのが特徴の１つだったりします。
初心者向けの文法だけでなく、実務で使いそうなユニットテストやDjangoを使ったWebのコースもあります。

そんなPyQで写経だけじゃなくて学んだ文法もアウトプットするためにまとめていきます。

※ 参考
PyQについて私的なおすすめポイントを紹介します
http://esuji5.hateblo.jp/entry/2017/04/15/180632

# list
listは以下のような感じで作成します。

```例
test = ['hoge','fuga','hege']
```

## 要素の出力
listに設定されている値は要素といいます。
要素は、0からスタートします。

```例
test = ['hoge','fuga','hege']

print(test[0]) # hogeが出力されます
print(test[1]) # fugaが出力されます
print(test[2]) # hegeが出力されます
```


## listへの要素の追加
末尾に要素を追加する場合は、appendを使います。

```例
test = ['hoge','fuga','hege']
test.append('test')

print(test[3]) # testが出力されます
```

途中に追加する場合は、insertを使います。

```例
test = ['hoge','fuga','hege']
test.insert(1,'test')

print(test[1]) # testが出力されます
```

## listから要素の削除
末尾から要素を削除する場合、pop()を使います。
途中の要素を削除する場合は、pop(インデックス)を使います。

```例
test = ['hoge','fuga','hege']
test.pop()

for item in test:
    print(item) # hogeとfugaが出力されます
```

## listの要素を変更する
変更したい要素を指定し、入力します。

```例
test = ['hoge','fuga','hege']
test(0) = 'test'

print(test[0]) # testが出力されます
```


# for文
listを組み合わせたfor文の構造は以下の通りです。

```例
for 変数 in list:
    print(変数)
```

listに入力した値は順次出力されます。

```例
test = [1,2,3]

for item in test:
    print(item)
# 出力は、以下のような感じ
# 1
# 2
# 3
```

# 次回
次回は辞書型のデータの扱いについて学んだことをアウトプットします。
Delphi 10.2 Tokyo Starter でコンソールアプリケーションを作る

とりあえず Hello Worldでもやってみるかと思って、メニューから新規作成を開くと、、、、
あれ？　選択できるプロジェクトにコンソールアプリケーションがないな。
VCL フォーム アプリケーション
を選択すると、普通のフォームアプリケーションが開くし
マルチデバイス アプリケーションを選択すると
空のアプリケーション
3D アプリケーション
の2つがあるだけ

![マルチデバイスアプリケーション.png](https://qiita-image-store.s3.amazonaws.com/0/151329/0f5403c3-41c0-9906-2dbc-38ceba639e24.png)


Starter Edtionではコンソールアプリケーション作れないのかなと思ったけど
よく見ると新規作成メニューの一番下にカスタマイズって項目を発見
ここを選択すると新規メニューのカスタマイズダイアログが表示されて
その中の真ん中あたりにコンソールアプリケーションがあった。

![カスタマイズ.png](https://qiita-image-store.s3.amazonaws.com/0/151329/818ae5c5-4b0b-07cd-2c7a-7a2bac3fad30.png)

新規作成メニューに表示されるようにするには、このコンソールアプリケーションを
左側のメニューにドラッグアンドドロップする。

![カスタマイズ2.png](https://qiita-image-store.s3.amazonaws.com/0/151329/d3f82e2e-2a1e-4815-4ef1-d14cfe9ef05e.png)

新規作成メニューに
コンソールアプリケーションが追加されて

![新規メニュー追加版.png](https://qiita-image-store.s3.amazonaws.com/0/151329/0091ee5c-4010-f1e8-08c1-ac93cd10e087.png)

コンソールアプリケーションが作れるようになりました。

![コンソールアプリケーション.png](https://qiita-image-store.s3.amazonaws.com/0/151329/34536c33-5df1-4da1-c643-e2aa490a6b96.png)



ちなみにコマンドプロンプトからDelphiコンパイラ実行ファイル dcc32を叩くと
This version of the product does not support command line compiling.
と出ました、Starterではコマンドラインからのビルドはできないっぽい
RubyのHashを作成するとき、Default valueをempty arrayにするときの注意

RubyのHashを作成するとき、Default valueをempty arrayにしたいとき、`Hash.new([])`とすると、すべての存在しないないkeyに対して同じArray instanceを参照することになります。

そのため、以下のようにHashへElementの追加と、その追加したElementのValueであるArrayにElementの追加を行うと、すべて同じArrayに追加されてしまいます。

```
hash = Hash.new([])
hash['hoge'] << 'a'
hash['fuga'] << 'b'

hash['hoge']
=> ['a', 'b']
hash['fuga']
=> ['a', 'b']
hash['foo']
=> ['a', 'b']
```

上記のようにして、別々のElementにするためには、下記のように新しいHashを作る必要があります。

```
hash = Hash.new { |h, k| h[k] = [] }
```

### 参考
http://stackoverflow.com/questions/9343680/how-does-shovel-operator-work-in-ruby-hashes
Twitterとかでダウンロードした.jpg-large画像を一気に.jpgにするバッチファイル

## なにこれ
Twitterで画像をダウンロードすると"hoge.jpg-large"とかになってエクスプローラでサムネ表示されないし,ビューワもダブルクリックで起動してくれない.
いちいちリネームするのもめんどい.
だから,ドラッグアンドドロップで名前を書きかえてくれるやつをつくった.

## 内容
以下の内容をメモ帳とかに書いて*.batと名前を付けて保存する.

```bat:large_remover.bat
@echo off
for %%f in (%*) do (
  ren %%f *.jpg
)
```

## 使い方
つくった*.batに画像をドラッグアンドドロップすると拡張子を.jpgに変えてくれる.
画像を大量保存する人にはちょっと便利.

# 宣伝
フォローお願いします:raising_hand_tone2: [@redshoga](https://twitter.com/redshoga)
Railsで同一モデルに一対多/多対多の関連付けをしたときに躓いたところ

ユーザー(user)は複数の記事(article)を保持する
ユーザー(user)は中間テーブル(favorite_relation)を通じて、複数の記事(article)をお気に入りとして所持する。

上記のような関連付けを実装しようとした際、教科書通りの記載を行うと下記のようになります。

```rb
class User < ApplicationRecord
...
  has_many :articles,dependent: :destroy

  has_many :articles,through: :favorite_relation
  has_many :favorite_relation, dependent: :destroy
...
end
```

が、当然このような記載を行うと、articlesで呼び出したときの対象の名称が重複してしまう度、エラー及び予期せぬ動作を引き起こしました。

```rb
# ユーザーの記事？ユーザーがお気に入り登録している記事？
@user.articles
```

そのようなときはエイリアスを付与して、中間テーブルを介して取得するモデルをsourceで指定します。

```rb
class User < ApplicationRecord
...
  has_many :articles,dependent: :destroy

  has_many :favorite_articles,through: :favorite_relation,source: :article
  has_many :favorite_relation, dependent: :destroy
...
end
```

これで想定通りの実装を行うことができました。

```rb
# ユーザーの記事
@user.articles
# ユーザーがお気に入り登録している記事
@user.favorite_articles
```

## まとめ
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。
GPUマシンのセットアップ(Ubuntu)

# セットアップ環境
使用マシン：MR4300(エプソン製)
グラボ：Geforce GT 730
OS：Ubuntu 14.04(GUI)

主に以下を参考にしました
[Ubuntu16.04 + GTX1080 + CUDA8.0で 機械学習環境を構築する](http://qiita.com/jh3rox/items/20f04527f8084dddd57f)
[Ubuntu14.04 + GPU + TensorFlow 環境構築](http://qiita.com/qooa/items/c516001c07a768c6b51b)


#OSの(クリーン)インストール
ポイントは【真っ黒画面が続いてもとにかく待つ！！】こと。
過去にnouveau問題でめちゃくちゃ苦しんだのはなんだったんだ！？ってくらいすんなりいった・・・

ctrl + alt + Tでターミナルが起動
インストール時にはファイアーウォールの設定はされていません。セキュリティ上好ましくないのできちんとやっておきましょう。

Ubuntu にはデフォルトで `ufw` というコマンドが使える。
22 番ポートは SSH 接続のため、80 番ポートは HTTP 接続のため。

```
# ufw default DENY
# ufw allow 22/tcp
# ufw allow 80/tcp
```

#まずはPythonをば
anacondaからダウンロード

``````
sudo su -  (これをやらないとインストールはできてもjupyterが起動できなかった)
bash Anaconda(まで打ってTab補間しちゃう)
なんかPATHとか勝手にやってくれてるっぽい　便利!!
```

#過去の難所その1　CUDA
CUDA8.0をダウンロード。
**必ず[deb]形式のものを選ぶ。**自分は[deb(network)]を使った。runfileはどうも怪しいらしい。　http://itpro.nikkeibp.co.jp/atcl/column/16/111800262/112900011/

```
sudo dpkg -i ダウンロードしたファイル名.deb
sudo apt-get update
sudo apt-get install cuda
devファイルの使い方は基本この3行で1セット
```

#過去の難所その2　cuDNN
CUDAとおんなじだろう！と　cuDNN v5.1 Developer Library for Ubuntu14.04 (Deb)　を使って上と同じようにしたら、自分の場合だと上手くいかなかった・・・ubuntu14.04用と書いているのに何がいけなかったんだろう。
正解は　**cuDNN v5.1 Library for Linux**

```
tar xvzf ファイル名.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

ここでPATHを通す　
vi ~/.bashrc
一番下に書き加える
# CUDA Toolkit
export CUDA_ROOT=/usr/local/cuda
export PATH=/usr/local/cuda/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CPATH=/usr/local/cuda/include:$CPATH

# cuDNN
export LIBRARY_PATH=/usr/local/cuda/lib64:$LIBRARY_PATH

:wq!で保存したら
source /root/.bashrc
```

#確認作業

/home/ユーザー名/　に戻って

```
nvidia-smi
nvcc -V
```
エラーが出なければ第一段階クリア

```
cd /usr/local/cuda-8.0/Samples/1_Utilities/deviceQuery　　←ここのディレクトリ構成は参考URLと少し違った
make
./deviceQuery
```
Result=Passと出てきたら第二段階クリア

```
cd ../../
cd ./5_Simulations/nobody
make
./nbody -benchmark -numbodies=256000 -device=0
```
でエラーが出ず、無事作業終了。
AtomでPHPCS/PHPMDを活用

# 環境
- macOS Sierra Version 10.12.4
- PHP_CodeSniffer version 3.0.0 (stable) by Squiz (http://www.squiz.net)
- PHPMD 2.6.0

# AtomのLint準備
```bash
$ apm install busy-signal
$ apm install linter
$ apm install linter-ui-default
```

# PHP_CodeSniffer
## インストール
```bash
$ composer global require "squizlabs/php_codesniffer=*"
$ exec $SHELL -l
$ which phpcs
~/.anyenv/envs/phpenv/shims/phpcs
```

## Atomプラグイン
```bash
$ apm install linter-phpcs
```

# PHP Mess Detector
## インストール
```bash
$ composer global require "phpmd/phpmd"
```

## Atomプラグイン
```bash
$ apm install linter-phpmd
```

AtomでPHP適当に書いたらちゃんと警告出してくれた。
Rails deviseで使えるようになるヘルパーメソッド一覧

毎回使いたくなるたびに調べ直しているので個人的な備忘録がてらまとめておきます。

|メソッド|用途|
|-----------|------------|
|before_action :authenticate_user!|コントローラーに設定して、ログイン済ユーザーのみにアクセスを許可する|
|user_signed_in?|ユーザーがサインイン済かどうかを判定する|
|current_user|サインインしているユーザーを取得する|
|user_session|ユーザーのセッション情報にアクセスする|


※モデル名にUser以外を使用している場合、それぞれのメソッドの『user』部分を書き換える
ex.モデル名がmemberの場合、

* before_action :authenticate_member!
* member_signed_in?
* current_member
* member_session


before_action :authenticate_member!
となる。

以下に各メソッドの補足を書いていきます。

## before_action :authenticate_user!

コントローラーの先頭に記載することで、そこで行われる処理はログインユーザーによってのみ実行可能となります。
下記の通り記載した場合、記事の一覧、詳細を確認することができるのはログインユーザーのみとなります。

```rb
class ArticlesController < ApplicationController
  before_action :authenticate_user!

  def index
  end

  def show
  end
end
```

下記のように記載し、一覧(index)は未ログインユーザーでも実行可能・詳細(show)はログインユーザーのみ実行可能とすることも可能です。

```rb
class ArticlesController < ApplicationController
  before_action :authenticate_user!, only: [:show]

  def index
  end

  def show
  end
end
```
## user_signed_in?
before_action :authenticate_user!よりも細かい分岐でログイン/未ログインの処理を分岐することができます。
コントローラー、ビュー問わず使用できます。

```rb
class ArticlesController < ApplicationController
  before_action :authenticate_user!, only: [:show]

  def index
    flash[:notice] = "ログイン済ユーザーのみ記事の詳細を確認できます" unless user_signed_in?
  end

  def show
  end
end
```

```html+erb
...
<body>
  ...
  <% if user_signed_in? %>
    <%= render 'layouts/login_user_header' %>
  <% else %>
    <%= render 'layouts/no_login_user_header' %>
  <% end %>
  ...
</body>
...
```
自分はログイン状態によってレイアウトを分けるときによく使っています。

## current_user
一番利用頻度が高いかも。
現在ログインしているユーザーをモデルオブジェクトとして利用できます。
関連付けがされている場合、子要素・親要素の取得などが可能です。

```rb
class ArticlesController < ApplicationController
  before_action :authenticate_user!, only: [:show,:new]

  def index
    flash[:notice] = "ログイン済ユーザーのみ記事の詳細を確認できます" unless user_signed_in?
  end

  def show
  end

  def new
    @article= current_user.articles.build
  end
end
```

ユーザーのメールアドレスを表示したい場合


```html+erb
...
<div>あなたのメールアドレス:<%= current_user.email %></div>
...
```
## user_session
ユーザーのセッション情報を設定・取得することができます。
下記コードはdeviseのサンプルコードより参照しました。
有効期限の設定やDBに保存するほどではないステータスの保持に使う感じでしょうか。
恥ずかしながら実際に開発で使用したことがありませんので、お詳しい方補足いただければ幸いです。

```rb
class ArticlesController < ApplicationController
...
  def index
    user_session[:cart] = "Cart"
    respond_with(current_user)
  end
...
  def expire
    user_session['last_request_at'] = 31.minutes.ago.utc
...
  end
...
end

```
## まとめ
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。
Bash on Ubuntu on WindowsとWindowsでクリップボード共有っぽいことする

初投稿です．既出だったら許してください．

Windows10は2017年4月11日にCreators Updateが配信されました．
そこで新しく追加された機能の中に「Windowsアプリケーションとの相互運用」があります．  
今回はこれを利用して，Bash on Ubuntu on Windows(以下BoW)とWindowsとのクリップボード共有まがいのことをしてみようと思います．

### 準備

#### Windows10側での準備
まずはWindows10でのCreators Updateを行ってください．  
そのあと[ghuntley/pasteboard](https://github.com/ghuntley/pasteboard)の[releases](https://github.com/ghuntley/pasteboard/releases)から「pasteboard-v1.1.0.zip」をダウンロードしてください．この中の `pbpaste.exe` を使います．  

ダウンロードし，展開したフォルダ`pasteboard-v1.1.0` を`pasteboard` にリネームした後，任意の場所に移動，コピーして環境変数に`pasteboard-v1.1.0` までのパスを追加します．

ここでは `C:\app\pasteboard` を環境変数に追加しました．

コマンドプロンプトで`pbpaste` と打って動くか確認したら準備は終了です．

#### BoW側での準備

改行コードや文字コードの変換に必要な`nkf` をインストールします．  
`sudo apt-get install nkf` でインストール出来ます．Linuxはコマンド一つでインストール出来てとても楽ですね．

`nkf --help` と打ってヘルプが表示されたら準備は終了です．

### 作業

さぁ，実際に使うための作業をしましょう．  
BoWを起動し，`vim ~/.bashrc` などで`.bashrc` を開きます．  
ここに以下のコードを追加してください．

``` sh:.bashrc
alias wcopy='clip.exe'
alias wpaste='pbpaste.exe'
```

保存して，`source ~/.bashrc` するかBoWを再起動してください．  

### 使ってみる

windowsで適当なテキストファイルを作りましょう．ここではデスクトップに`hoge.txt` を作ってみます．

``` :hoge.txt
ばっしゅおんうぶんつおんうぃんどうず

ぽよよ
```

BoWで`/mnt/c/Users/{Windowsのユーザ名}/Desktop` に移動します．  

`cat hoge.txt | wcopy` と入力するとコピーが出来ます．  

その後`pbpaste` と打つとターミナルにコピーした内容が表示されますが，文字化けしていると思います．そこで間に`nkf` をはさみ，文字コードを変換してからコピーするようにします．

`nkf -w hoge.txt | wcopy`  
**(ちなみに，ここで改行コードをLFに変換しても`clip.exe` の仕様のせいかCRLFになってしまうっぽいので`wpaste` したあとに改行コードを変換する必要があります)**

`wpaste` で確認すると文字化けが解消されているかと思います．

また `wpaste > out.txt` とすることで `wpaste` の内容を`out.txt` に保存することが出来ます．

### 使い方まとめ

- `cat ファイル名 | wcopy` でコピー
  - 文字コード問題は`nkf -w ファイル名 | wcopy` で解決
- `wpaste` でコピーした内容が見れる
  - `wpaste > ファイル名` でファイルに出力できる


以上でクリップボード共有まがいを実現する計画は完了です．  
もし何かあったら，コメントか[Twitter](https://twitter.com/kur0k0ji)でリプしてくださると助かります．
デザインパターン学習メモ：「Prototype」

## このパターンの目的
GoF本より引用する。

> 生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行う。(P.127)

## 実装例

```java:ShapeFactory.java
// Client
public class ShapeFactory {
	private Circle prototypeCircle;
	private Rectangle prototypeRectangle;

	public ShapeFactory(Circle circle, Rectangle rectangle) {
		this.prototypeCircle = circle;
		this.prototypeRectangle = rectangle;
	}

	public Circle makeCircle(double radius) {
		Circle circle = prototypeCircle.createClone();
		return circle.initialize(radius);
	}

	public Rectangle makeRectangle(double side1, double side2) {
		Rectangle rectangle = prototypeRectangle.createClone();
		return rectangle.initialize(side1, side2);
	}
}
```

```java:Circle.java
// Prototype
public class Circle {
	private double radius;

	public Circle(double radius) {
		this.radius = radius;
	}

	public Circle initialize(double radius) {
		this.radius = radius;
		return this;
	}

	public Circle createClone() {
		try {
			return (Circle) clone();
		} catch (CloneNotSupportedException e) {
			throw new RuntimeException("Clone Failed");
		}
	}
}
```

```java:Rectangle.java
// Prototype
public class Rectangle {
	private double side1;
	private double side2;

	public Rectangle(double side1, double side2) {
		this.side1 = side1;
		this.side2 = side2;
	}

	public Rectangle initialize(double side1, double side2) {
		this.side1 = side1;
		this.side2 = side2;
		return this;
	}

	public Rectangle createClone() {
		try {
			return (Rectangle) clone();
		} catch (CloneNotSupportedException e) {
			throw new RuntimeException("Clone Failed");
		}
	}
}
```

## 利点
 * 他の生成パターンと同様に、Clientは具体的なクラス名を知らずにオブジェクトを取得できる
 * 生成するオブジェクトの追加・削除を実行時に行える
    * 上記の実装例では可能になっていないが、PrototypeをListなどで保持し、実行時に登録や削除を行うようにできる
 * システム全体で必要になるクラス数を減らすことができる
    * クラスのフィールド値によって異なるクラスにした場合と同じことが表現できる場合には、それぞれPrototypeとしてClientに登録することで、あえてクラス化する必要がなくなる

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
DBレベルでパターンに一致するもののみ保存する方法について

PostgreSQL9.6でしか確かめていないのと、実践的に使えるのか分かりませんが、次のようにすればCHECK制約でパターンマッチするものだけ登録することができます。コメントアウトしている方のCHECK制約でも多分、同じ結果になると思います。

```SQL
DROP TABLE IF EXISTS AccessLog;
CREATE TABLE AccessLog (
  url VARCHAR(200) NOT NULL
  -- CHECK(SUBSTRING(url FROM 'https?://([^/]*)') IS NOT NULL)
  CHECK(url ~ 'https?://[^/*]')
);
INSERT INTO AccessLog VALUES('http://wwww.example.com');
INSERT INTO AccessLog VALUES('https://foo.bar');
INSERT INTO AccessLog VALUES('Hello World'); -- エラー発生
```
分散処理でインタラクティブ分析を可能にするSpark

Hadoopに関する基本的な内容をまとめてみたものです。Hadoopに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[分散処理でインタラクティブ分析を可能にするSpark] (https://www.techcrowd.jp/bigdata/spark-3/)

# [高速で分散処理を行うSpark] (https://www.techcrowd.jp/bigdata/spark-3/)

Sparkは高速に分散処理を行うフレームワークで、HadoopのMapReduceよりも効率良く処理する事を目的に開発されました。

MapReduceはストレージへのアクセス回数が多くオーバーヘッドが増加する傾向にありますが、SparkはHDFSにキャッシュを設ける事でストレージへのアクセス回数を減らして、高速処理を可能にしています。

処理が高速化された事で、インタラクティブな分析が可能となっています。


# [Sparkの特徴] (https://www.techcrowd.jp/bigdata/spark-3/)

Sparkは、次のような特徴を持っています。

RDD（Resillient Distributed Datasets）
RDDは、使用頻度の高いデータをキャッシュ上に配置する仕組みです。
RDDによって、処理速度の低下を招くストレージへのアクセスを減らします。

DSLが使用可能
ScalaのDSLを使って記述する事で、汎用的なプログラミングが可能となっています。

Hadoopとの高い互換性
SparkはHadoopと高い互換性を持ちHDFSも利用出来ますので、容易にHadoopとSparkを組み合わせたシステムを構築する事が可能です。

高い耐障害性
処理を高速化するためにキャッシュ上でデータを維持しますが、耐障害性についても十分な配慮がされています。
障害が発生しても、RDDデータを使って普及作業が行われます。


# [高速で分散処理が出来るSpark] (https://www.techcrowd.jp/bigdata/spark-3/)

SparkはHadoopと同じようにビッグデータを処理するための分散処理システムですが、Hadoopよりも高速に処理出来るように、
・Directed Acyclic Graph実行エンジンの使用
・データをメインメモリにキャッシュ
などの工夫がされています。

そのため、Hadoopでは高速に処理出来ないアルゴリズムやインタラクティブクエリでも、Sparkなら高速で処理する事が可能です。


# [Sparkのインタラクティブモードとバッチモード] (https://www.techcrowd.jp/bigdata/spark-3/)

AWSのEMR(Elastic MapReduce)では、Sparkのアプリケーションをインタラクティブモードとバッチモードで実行出来ます。

インタラクティブモード
Sparkをインタラクティブモードで実行する事で、Spark用アプリケーションの開発が用意になります。

バッチモード
SparkスクリプトをAmazon S3やローカルマスターノードファイルシステムにアップロードする事で、Sparkをバッチモードで実行出来ます。
sedでドライランする

sedにドライランオプションはないけど、ファイルを変更せずにdiffが見たい。

[sed command in dry run - Stack Overflow](http://stackoverflow.com/questions/4513623/sed-command-in-dry-run/37180512#37180512)にコマンドを組み合わせて、diffを見るやり方が書いてあった。

例えば

```:editor.txt
Vim
Emacs
Atom
Visual Studio Code
```

こんなファイルがあった場合に

```
$ sed 's/Emacs/Vim/g' editor.txt | diff editor.txt -
--- editor.txt  2017-05-07 12:47:25.000000000 +0900
+++ -   2017-05-07 12:47:59.390599000 +0900
@@ -1,4 +1,4 @@
 Vim
-Emacs
+Vim
 Atom
 Visual Studio Code
```

な感じでdiffが見れる。

これをシェルスクリプト化してみた。

```bash:sedd
#!/usr/bin/env bash
progname=$(basename $0)

usage() {
  cat <<EOT
Usage: $progname [OPTIONS]

Options:
  -h, --help
  -n, --dry-run
EOT
}

for OPT in "$@"
do
  case "$OPT" in
    '-h'|'--help' )
      usage
      ;;
    '-n'|'--dry-run' )
      dryrun=1
      shift 1
      ;;
    *)
      param+=( $(printf %q "$1") )
      shift 1
      ;;
  esac
done

if [ -z "$param" ]; then
  usage
  exit 1
fi

if [ "$dryrun" ]; then
  cmd="sed ${param[@]} {} | diff -u {} -"
  exec find . -type f -exec sh -c "$cmd" \;
fi

eval "find . -type f -exec sed -i ${param[@]} {} +"
```

`-n`か`--dry-run`をつけるとドライラン

```
$ sedd 's/Emacs/Vim/' -n
--- ./editor.txt        2017-05-07 12:47:25.000000000 +0900
+++ -   2017-05-07 12:55:16.585676000 +0900
@@ -1,4 +1,4 @@
 Vim
-Emacs
+Vim
 Atom
 Visual Studio Code
```

つけないと実行される。`-e`で複数指定してもうまくいく。

```
$ sedd -e 's/Emacs/Vim/' -e 's/Atom/Vim/' -n
--- ./editor.txt        2017-05-07 12:47:25.000000000 +0900
+++ -   2017-05-07 13:10:30.560533000 +0900
@@ -1,4 +1,4 @@
 Vim
-Emacs
-Atom
+Vim
+Vim
 Visual Studio Code
```

対象はカレントワーキングディレクトリ以下のファイル全体にしている。

オプション解析のところで、`param+=( $(printf %q "$1") )`しているのは

```
$ sedd 's/Visual Studio Code/Vim/' -n
```

のように引数に空白などのエスケープが必要な文字が来ても、後のsed実行時に問題なく動かすため。

```
$ printf %q 's/Visual Studio Code/Vim'
s/Visual\ Studio\ Code/Vim
```

な感じに変換される。`printf %q`については[Bashで文字列をエスケープをする - Qiita](http://qiita.com/kawaz/items/f8d68f11d31aa3ea3d1c)で知った。

最後のfindの+は、-execで対象ファイルを並べるオプション

```
sed -i ${param[@]} file1 file2 ...
```

みたいな感じになり、1個ずつファイルをsedするよりも早くなる。
Hadoopとは

Hadoopに関する基本的な内容をまとめてみたものです。Hadoopに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Hadoopとは] (https://www.techcrowd.jp/bigdata/hadoop/)

# [Hadoopの概要] (https://www.techcrowd.jp/bigdata/hadoop/)

Hadoopは、
・テキスト
・画像
・ログ
などの構造化されていないデータを、高速に処理出来るオープンソースのプラットフォームです。
Hadoopは大規模なデータの処理に適しているだけではく、複数のコンピュータで処理を行う分散処理を可能としている点が特徴となっています。

従来の分残処理は処理を分散するだけものが多かったのですが、Hadoopの分散処理はデータも複数のコンピュータに分散させる事で、容易にスケールアウト出来るようになりました。

そのため、Hadoopを使えばビッグデータを処理するシステムは低コストで構築出来ると、注目を集めています。


# [分散処理を可能とするHDFSとMapReduce] (https://www.techcrowd.jp/bigdata/hadoop/)

Hadoopの分散処理機能を実現するのが、HDFSとMapReduceです。

分散ファイルシステムHDFSは複数のコンピュータのローカルディスクを、一つのストレージのように扱います。ローカルディスクを扱うのと同じ方法で分散ストレージを使えるので、特にユーザーが意識する事はありません。容易にスケールアウト出来ますから、ビッグデータを扱うのに最適なシステムを構築可能です。

MapReduceはMapフェーズとReduceフェーズにユーザーが処理を実装する事で、分散処理を実現します。MapReduceを有効に利用する事で一台のコンピュータでは長時間掛かるような操作でも、複数のコンピュータを使って短時間で処理する事が可能となります。


# [ビッグデータ分析基盤を低コストで構築出来る分析エンジン] (https://www.techcrowd.jp/bigdata/hadoop/)

ビッグデータを分析する基盤を構築するには、コストの掛かるデータウェアハウスなどを用意する必要があるため、なかなか導入出来ない企業も少なくありませんでした。
しかし、HadoopをベースとしたAmazon Elastic Mapreduceなどのビッグデータ分析エンジンが普及するようになって、比較的容易に導入出来る環境が整って来ています。

手軽に利用出来るクラウド型ビッグデータ分析エンジンと、ウェブサーバ・データベースサーバ・ワークフロー管理ツール・分析サーバなどを組み合わせる事で、短期間で低コストのビッグデータ分析基盤を構築する事が出来ます。

ビッグデータの分析基盤を構築する際の考え方のポイントは、「蓄積「処理「パイプライン」です。


# [3つのフェーズから構成されるMapReduce] (https://www.techcrowd.jp/bigdata/mapreduce/)

MapReduceとは、Hadoopで分散処理を行うプログラミングモデルです。

MapReduceには、
・Map
・Reduce
・Shuffle
の3つのフェーズが存在し、map関数とreduce関数を使って処理内容を記述します。

MapとReduceは処理内容をユーザーが指定するフェーズですが、ShuffleはMapReduceが自動的に処理を行うフェーズです。


# [MapReduce: 各フェーズの処理内容] (https://www.techcrowd.jp/bigdata/mapreduce/)

MapReduce内のデータは、KeyとValueを組み合わせて表現されます。
通常のテキストもMapフェーズにおいて、KeyとValueを組み合わせたデータに作り変えられます。

Mapフェーズの結果をキーに従ってソートを行い、キーが同じものをまとめるのがShuffle処理です。

Reduceフェースでは、Map処理の結果を使って処理を行います。
同じキーを持つデータ数をカウントするなどの処理が行う事で、より効率良く処理する事が可能となります。


# [大規模データの読み込みに適しているHDFS] (https://www.techcrowd.jp/bigdata/hdfs/)

分散処理を行うHadoopで、ファイルの管理を担当するのがHDFS（Hadoop Distributed File System）です。
複数のノードにファイルを分割して格納しますが、ユーザーからは一つのファイルを扱うようにしか見えませんので、分割処理である事を意識する事はありません。

ビッグデータを高速で処理出来ますがデータを書き込むよりも読み込む方が得意なので、HDFSを効果的に使用するには、ファイルの書き込みをする回数を最低限に減らして、ファイルの読み込みを中心にするべきです。
大量のデータを蓄積して分析をするためにデータを読むDWHやBIツールを使用するのであれば、HDFSの性能を活かす事が出来ます。


# [高速の分散処理が可能で障害にも強いHDFS] (https://www.techcrowd.jp/bigdata/hdfs/)

HDFSが高速で分散処理出来るのは、

・数多くのディスクにアクセス出来る環境を構築する事で、処理の多重度を上げる
・出来るだけローカルディスク内のデータを活用する

といった工夫がされているからです。

これらの工夫は処理速度を向上させるだけではなく、ディスクに障害が発生するなどの障害対策にも役立っています。



# [Hadoop上で稼働するHive] (https://www.techcrowd.jp/bigdata/hive/)

Hiveは、Hadoop上でDWHを構築する時に使うオープンソースのソフトウェアです。

HBaseというHadoop上で動くデータベースもありますが、HiveのインターフェイスはHDFSと親和性の高いので、快適な操作が可能となっています。

HiveのSQLライクな言語HiveQLを使う事で、Hadoop内のデータを手軽に処理する事が可能です。



# [Hiveの使い方] (https://www.techcrowd.jp/bigdata/hive/)

Hiveは、専用のインタプリタhiveで各種操作を行います。
SQLと同じようなコマンドで、操作する事が可能です。

・CREATE TABLE：テーブルの作成
・LOAD DATA：データの読み込み
・SELECT：テーブルの検索
・INSERT：データの保存