OmniAICreator/Qiita-1.07M huggingface dataset:
今更Qt4でQterminalを動かしてみた

Qtの最新版は今や5.8とかでQt4はとっくに死んでるわけですが、QWSがあるおかげで手っ取り早くウインドウシステムを動かしたい場合には相変わらず楽だと思います。
個人的にはブラウザとターミナルがあれば何でもできる気がするのですが、Qt4にはターミナルはついてこないので自分で動かしてみました。

QterminalはWindowsかMacOSかXWindowがある前提だし、新しいGCCだとQt4のコンパイルで文句を言われるとかいろいろあってQterminalをforkしてQt4のパッチもそこに置きました。

まずそれを持ってきて展開します。
> wget https://github.com/tshibata/qterminal/archive/on-bare-qws.zip
> unzip on-bare-qws.zip

さらにQt4も持ってきて
> wget https://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz
> zcat qt-everywhere-opensource-src-4.8.6.tar.gz | tar x

中に入ってパッチを当てます。
> cd qt-everywhere-opensource-src-4.8.6/
> patch -Np1 -i ../qterminal-on-bare-qws/qt-everywhere-opensource-src-4.8.6-for_gcc_5_and_6.patch

そして例によって
> ./configure -opensource -embedded x86 -prefix /usr -qt-gfx-linuxfb
> make
> make install

もちろん「-prefix /usr」とかはご都合に応じて設定して「make install」はルート権限でやってください。

今度はqtermwidgetを持ってきて
> wget https://github.com/qterminal/qtermwidget/releases/download/0.6.0/qtermwidget-0.6.0.tar.xz
> xzcat qtermwidget-0.6.0.tar.xz | tar x
cd qtermwidget-0.6.0/

こっちはcmakeで
> mkdir build
> cd build/
> cmake -DCMAKE_BUILD_TYPE=Release \
>       -DCMAKE_INSTALL_PREFIX=/usr \
>       -DCMAKE_INSTALL_LIBDIR=lib \
>       ..
> make
> make install

最後に
> cd qterminal-on-bare-qws/
> mkdir build
> cd build/
> cmake -DCMAKE_BUILD_TYPE=Release \
>       -DCMAKE_INSTALL_PREFIX=/usr \
>       -DUSE_SYSTEM_QXT=OFF \
>       ..
> make
> make install

あとは
> qterminal -qws -display LinuxFb:/dev/fb0

てな感じでターミナルが動きます。
JPA w/PostgreSQL

```servers/defaultServer/server.xml
<server description="Liberty">
<!-- default Config -->
  <featureManager>...</featureManager>
  <httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
  <keyStore id="defaultKeyStore" password="${ENCODED_KEYSTORE_PASSWORD}"/>
  <basicRegistry id="basic" realm="BasicRealm">
    <user name="${USERNAME}" password="${ENCODED_PASSWORD}"/>
  </basicRegistry>
  <applicationManager autoExpand="true"/>
  <applicationMonitor updateTrigger="mbean"/>
<!-- JTA Config PostgreSQL -->
  <library id="PostgresLib" filesetRef="PostgresFileset"/>
  <fileset id="PostgresFileset" dir="${DB_HOME}" includes="postgresql-9.4.1212.jre7.jar"/>
  <dataSource id="postgres-jpa" jndiName="jdbc/${DS_NAME}" type="javax.sql.XADataSource">
    <jdbcDriver javax.sql.XADataSource="org.postgresql.xa.PGXADataSource" libraryRef="PostgresLib"/>
    <properties serverName="localhost" port="5432" databaseName="${DB_NAME}" user="${DBUSER}" password="${ENCODED_PASSWORD}"/>
  </dataSource>
<!-- WebApps Config -->
  <webApplication id="${WEB_CONTEXT}" location="${build.war}" name="${WEB_CONTEXT}"/>
</server>
```
```META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="${PU_NAME}" transaction-type="JTA">
    <jta-data-source>jdbc/${DS_NAME}</jta-data-source>
    <class>${ENTITY_CLASS}</class>
    <shared-cache-mode>ALL</shared-cache-mode>
    <validation-mode>AUTO</validation-mode>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="none"/>
      <property name="javax.persistence.schema-generation.scripts.action" value="none"/>
    </properties>
  </persistence-unit>
</persistence>
```
```${ENTITY_CLASS.java}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table (name="${TABLE_NAME}", schema="${SCHEMA_NAME}")
@NamedQUery (name="${CLASSNAME}.findAll", query="SELECT c FROM ${CLASSNAME} c")
public class ${CLASSNAME} implements Serializable {
  @Id
  @GeneratedValue (strategy=GenerationType.AUTO)
  @Column (name="${ID_COLUMN_NAME}", unique=true, nullable=false)
  @Getter @Setter private Integer id;
  @Temporal(TemporalType.DATE)
  @Getter @Setter private Date date;
  @OneToMany (mappedBy="${X}")
  @Getter @Setter private List<${REF_TABLE_CLASS}> list;
}
```
grep,sed,awkの処理速度比較

月並みといった内容ですがご容赦下さい。

temp.txtからキーワード"e5"が含まれる行をカウントすることで、grep,sed,awkの処理速度を比較します。

temp.txtの内容

```
$ head temp.txt 
 37 7a bc af 27 1c 00 02 75 be 77 96 55 e5 9f 54
 00 00 00 00 27 00 00 00 00 00 00 00 b3 f4 0c 81
 00 44 94 05 c4 7a 27 f6 f7 ee 89 8e 50 90 88 b3
 aa d5 50 2b fc 92 c0 20 97 69 80 b6 b6 4c bd 59
 c4 1c 86 45 68 d3 8d e1 61 b1 2a df 0b 0a 12 39
 4a 80 fe 79 e1 38 9f 4f 7e b9 af f9 9d c7 57 90
 0b 2c 2d 23 96 f7 7e 15 8a 48 df 00 ef 01 ea 56
 1e 8f f4 a3 63 d8 f3 a2 ea 21 4f 6d d4 63 b9 b9
 e8 8d b6 e2 4b 6d 32 7a cf b1 6f b5 2e b5 af c1
 00 9d a2 0b 9a e6 d3 43 42 56 d8 07 a2 cb b0 6b
...以下省略
```

temp.txtのサイズ

```
$ ls -lh temp.txt 
-rw-r--r-- 1 hoge hoge 2.4G  5月  2 01:20 temp.txt
```
temp.txtの行数

```
$ wc -l temp.txt
52381654 temp.txt
```

実行結果

```
$ time grep e5 temp.txt | wc -l
3180957

real	0m4.185s
user	0m3.536s
sys	0m0.812s
$ time sed -n /e5/p temp.txt | wc -l
3180957

real	0m19.568s
user	0m18.748s
sys	0m0.968s
$ time awk '/e5/{print}' temp.txt | wc -l
3180957

real	0m12.740s
user	0m11.728s
sys	0m1.152s
```

grepが最速でした。ちなみにwcの代替手段としてawkを使う場合は次の方法でできるようでした。

```
$ time grep e5 temp.txt | awk 'END{print NR}'
3180957

real	0m4.197s
user	0m3.764s
sys	0m0.820s
```
【英単語まとめ】ソフトウェア開発工程


日本語でよく使う、ソフトウェア開発工程に関する英単語をまとめてみました。
※Code Complete 参照

| 日本語       | 英語                     |
|:------------|:-------------------------|
| 課題定義     | Problem definition       |
| 要求開発     | Requirements development |
| 開発計画     | Construction planning    |
| ソフトウェアアーキテクチャ （概略設計） | Software architecture (high-level design) |
| 詳細設計     | Detailed design          |
| コーディングとデバッグ | Coding and debugging     | 
| 単体テスト    | Unit testing             |
| 統合テスト    | Integration testing      |
| 統合         | Integration              |
| システムテスト | System testing           |
| 保守         | Corrective maintenance   |
ライブラリプロジェクト（モジュール）のBuildConfigをDebugにする方法

# この記事の概要
開発をしている上で複数のプロジェクトで使いまわしたいコードをライブラリプロジェクトとしてモジュール化して使うことがあると思います。

本体のプロジェクトのビルド設定をデバッグにすればライブラリプロジェクトもデバッグになるかと思いきや、
ライブラリプロジェクトのビルド設定はデフォルトでは常にリリースビルドになります。

これではライブラリプロジェクト内でBuildConfigを使った処理の使い分けができません。
今回はライブラリプロジェクトを本体のプロジェクト設定に合わせる方法を紹介します。

# プロジェクト構成例
以下のようなプロジェクト構成だとします。

・app //本体のプロジェクト
・module //ライブラリプロジェクト

```groovy:settings.gradle
include ':app', ':module'
```

```groovy:build.gradle(app)
//com.android.applicationを指定することで本体プロジェクトとして認識される
apply plugin: 'com.android.application' 
-- 略 --

dependencies {
    ・
　　　　　　　　・
　　　　　　　　・
    compile project(':module')
    ・
　　　　　　　　・
　　　　　　　　・
}
```

```groovy:build.gradle(module)
//com.android.libraryを指定することでライブラリプロジェクトとして認識される
apply plugin: 'com.android.library'
```

以上が特に何もしていない時の設定。

# 変更点
まずはmoduleのbuild.gradle。
publishNonDefault(true)を記載します。

```groovy:build.gradle(module)
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    publishNonDefault(true)　←これを追記
    ・
　　　　　　　　・
　　　　　　　　・
}
```

続いて、appのbuild.gradle
既存のcomplie project(':module')を消して以下のように変更。

```groovy:build.gradle(app)
dependencies {
    ・
　　　　　　　　・
　　　　　　　　・
    debugCompile project(path: ':module', configuration: ':debug')
    releaseCompile project(path: ':module', configuration: ':release')
    ・
　　　　　　　　・
　　　　　　　　・
}
```

このようにしてやると、本体のプロジェクトに合わせてモジュールのビルド設定が切り替わります。
AppleのLivePhotoをWebに埋め込む手順

Appleが公開したJavascript API **「LivePhotosKit JS」**を使って、LivePhotoを簡単に埋め込むためのサンプルを作ってみました。

参考：[LivePhotosKit JS | Apple Developer Documentation](https://developer.apple.com/reference/livephotoskitjs/)

#LivePhotoとは？
参考：[Live Photos を撮影して活用する - Apple サポート](https://support.apple.com/ja-jp/HT207310)
Live Photos は、シャッターを切った前後の 1.5 秒ずつの映像を記録してくれます。iPhone 6s 以降で使える機能です。

#LivePhotos埋め込みサンプル
[サンプルページ](https://ultimate-ez.com/livephoto-sample.html)
画面右上に「Live」のアイコンが表示され、アイコンにマウスオーバーするとLivePhotoの動画が再生されます。

##サポート
 LivePhotosKit JS playerがサポートしている端末・ブラウザは、iOS（Safari, Chrome）、macOS（Safari, Chrome, Firefox）、Android（※一部端末）（Chrome (beta)）、Windows（Chrome, Firefox, Edge, Internet Explorer 11）となっています。

##コード
```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.apple-livephotoskit.com/lpk/1/livephotoskit.js"></script>
  </head>
  <body>
    <h1 style="font-family:sans-serif;">Live Photo埋め込みサンプル</h1>
    <div
      data-live-photo
      data-photo-src="https://ultimate-ez.com/wp-content/uploads/2017/05/IMG_4199.jpg"
      data-video-src="https://ultimate-ez.com/wp-content/uploads/2017/05/IMG_4199.mov"
      style="width: 1024px; height: 768px">
    </div>
  </body>
</html>
```
CDNにある **livephotoskit.js** を読み込み、1枚のLivePhotoを構成する画像(.jpg)と動画(.mov)ファイルを、それぞれ *data-photo-src* と *data-video-src* のデータ属性に格納するだけです。

#LivePhotoの読み込み手順

素材となるLivePhotoを構成する画像(.jpg)と動画(.mov)ファイルを、iPhoneから取り出すには、Macの「写真」アプリを使うのが簡単です。

1. iPhoneとMacをLightningケーブルで接続する
2. 写真を読み込む
![スクリーンショット_2017-05-02_0_31_48.jpg](https://qiita-image-store.s3.amazonaws.com/0/86634/f0368601-7f07-36d8-cff7-52e920bda095.jpeg)

3. 読み込んだ写真を選択し、 **「ファイル」＞「書き出す」＞「1枚の写真の未編集のオリジナルを書き出す…」** を選択する。
<img width="323" alt="スクリーンショット_2017-05-01_23_52_19.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/86634/7794e8c7-3e42-e314-ec6a-b7c80d887fc4.jpeg">

4. 「書き出す」ボタンをクリックする。
<img width="290" alt="スクリーンショット_2017-05-01_23_52_37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/86634/74d8a882-cc1e-d938-7a29-b45638b99de5.jpeg">

5. 「.jpg」「.mov」のファイルが書き出されれば成功です。
![スクリーンショット_2017-05-01_23_53_00.jpg](https://qiita-image-store.s3.amazonaws.com/0/86634/86359cb1-ab58-daea-f291-90f33baa6923.jpeg)
「.jpg」「.mov」の両ファイルを適切な場所に格納し、それぞれ *data-photo-src* と *data-video-src* のデータ属性に指定すると、LivePhotoをウェブに埋め込むことができます。
[リフレクション]メソッドがstaticかどうかを判定するにはModifier#isStaticを利用する。


Javaプログラミングにおいて、少しばかり複雑なことをしようとすると、必ず頭をもたげてくるのがリフレクション。リフレクションを利用し、とあるクラスのメソッド一覧を取得するような処理を書くことは多いと思いますが、その際__取得したメソッドがstaticか否かを判定したいという場合には`Modifier#isStatic`を利用します__。以下がそのサンプルとなります。

```java
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


public class StaticTest {
    
    public static void main(String[] args) {
        Method[] methods = Sample.class.getDeclaredMethods();
        for (Method method : methods) {
            if (Modifier.isStatic(method.getModifiers())) {
                System.out.println(method.getName());
                // => privateStaticMethod publicStaticMethod
            }
        }
    }
    
    public static final class Sample {
        public static void publicStaticMethod() {};
        private static void privateStaticMethod() {};
        public void publicInstanceMethod(){};
        private void privateInstanceMethod(){};
    }
}
```

参考: [『Modifier (Java Platform SE 8 )』]( 
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/reflect/Modifier.html)
Angular でルーティングに一致する際に class を付与する書き方 (routerLinkActive の使い方)

Angular にて、現在のルーティングに一致する際に class を付与する `routerLinkActive` ディレクティブがあります。
これは、`routerLink` とセットで利用することで、`routerLink` に指定したルーティングが Active のときに、その要素に class を付与することができます。

# 基本的な使い方

以下 3 つのルーティングが定義されており、ナビゲーションで画面遷移をすることとします。

```typescript:router.ts
const routes: Routes = [
  { path: 'page1', component: Page1Component },
  { path: 'page2', component: Page2Component },
  { path: 'page3', component: Page3Component },
]
```

```:navigation.html
<ul>
  <li><a [routerLink]="['page1']">Page 1 へ</a></li>
  <li><a [routerLink]="['page2']">Page 2 へ</a></li>
  <li><a [routerLink]="['page3']">Page 3 へ</a></li>
</ul>
```

このナビゲーションの `<a>` 要素に、現在表示中のページの場合に `active` クラスを追加したい場合、`routerLinkActive` ディレクティブを使って以下のように書くことができます。 

```:navigation.html
<ul>
  <li><a [routerLink]="['page1']" routerLinkActive="active">Page 1 へ</a></li>
  <li><a [routerLink]="['page2']" routerLinkActive="active">Page 2 へ</a></li>
  <li><a [routerLink]="['page3']" routerLinkActive="active">Page 3 へ</a></li>
</ul>
```

もし複数クラスを指定したい場合は、`routerLinkActive="aaa bbb ccc"` と書くことができます。

# 別の要素にクラスを指定したい場合

例えば Bootstrap を利用する場合、`<a>` 要素ではなく親の `<li>` 要素にクラスを付与する必要があります。

その場合の対応方法は 2 通りあります。

1. `<li>` 要素に `routerLink` を移す
2. テンプレート参照変数 (Template Reference Variables) を利用する

方法 1 については特に説明も不要だと思いますので、ここでは方法 2 について説明します。

まず、`routerLinkActive` ディレクティブをテンプレート参照変数に代入します。

```:navigation.html
<ul>
  <li><a [routerLink]="['page1']" routerLinkActive #page1="routerLinkActive">Page 1 へ</a></li>
  <li><a [routerLink]="['page2']" routerLinkActive #page2="routerLinkActive">Page 2 へ</a></li>
  <li><a [routerLink]="['page3']" routerLinkActive #page3="routerLinkActive">Page 3 へ</a></li>
</ul>
```

ここでのポイントは 3 つです。

1. `routerLinkActive` ディレクティブは省略できません。
2. 上記例の `#page1` には、`#` + 任意の名前が指定できます。  
   (これがテンプレート参照変数です)
3. `#page1` 以降の `="routerLinkActive"` は省略できません。

ここまでで、`#` 以降に指定した名前で `routerLinkActive` ディレクティブを参照できるようになりました。

`routerLinkActive` ディレクティブには `isActive` プロパティが定義されており、現在のルートが `routerLink` で指定したルートと同じ場合に `true` が返ってきます。

これを利用して、最後に `<li>` 属性にクラス `active` を付与するように変更して完成です。

```:navigation.html
<ul>
  <li [class.active]="page1.isActive"><a [routerLink]="['page1']" routerLinkActive #page1="routerLinkActive">Page 1 へ</a></li>
  <li [class.active]="page2.isActive"><a [routerLink]="['page2']" routerLinkActive #page2="routerLinkActive">Page 2 へ</a></li>
  <li [class.active]="page3.isActive"><a [routerLink]="['page3']" routerLinkActive #page3="routerLinkActive">Page 3 へ</a></li>
</ul>
```

# まとめ

テンプレート内が少し複雑になってしまいましたが、TypeScript 側に 1 行も書かずにクラスの切り替えが実装できました。

少し調べると、TypeScript 側に `Router` を DI して判定する方法などもありますが、テンプレート HTML で完結するので私はこの方法を採用しています。

同じような実装をする場合に、参考にしてみてください。

# 参考リンク

* RouterLinkActive - ts - API  
  https://angular.io/docs/ts/latest/api/router/index/RouterLinkActive-directive.html
2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (1)


## 概要

- p2 はスレ一覧で「お気にスレに追加」を行い、その一覧を表示する機能はありますが、不要なスレをスレ一覧から非表示にする機能はありません（多分）。
- 自前サーバに p2 を入れ、直接 PHP を弄っての対応はできるかもしれないですが、今回はそれはできません。
- → ですので、Chrome 拡張での対応を行ってみましょう、という感じです。

## 環境構築

- [爆速でChrome拡張機能を作成する - Qiita](http://qiita.com/thr3a/items/702e58f5d793332a1001)

こちらを参考にさせて頂きました。

## スレッド一覧の改造

- p2 は今時(?) frameset/frame が使われたビューワーなのですが、Chrome 拡張を作るのが初めてなので、まずは frame 内のページを直に表示して、そのページに対して処理を加えていきたいと思います。

### スレッド非表示ボタンの追加

スレッド一覧ページです。

![スクリーンショット 2017-05-01 23.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/170980/24178f0e-1349-56e9-8841-af58639db3f0.png "スクリーンショット 2017-05-01 23.14.39.png")

ページはこんな感じに作られています。tr が一行で、td でボタンを追加すれば、各スレに対する処理が行えそうです。

![スクリーンショット 2017-05-01 23.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/170980/9c4ff3db-a4d8-8599-bdc8-dbbcfd7ab705.png "スクリーンショット 2017-05-01 23.14.45.png")


まずはコンテントスクリプトを以下のようなコードにしてみます。

```javascript:contentscript.js
$(function() {
  $('tr:not(.tableheader)').each(function() {
    $(this).append('<td class="t"><span>🗑</span></td>');
  });
});
```

拡張をリロードして、ページを再読み込みすると、以下のようにページが変化しました。

![スクリーンショット 2017-05-01 23.26.31.png](https://qiita-image-store.s3.amazonaws.com/0/170980/75bae7dd-8631-c916-431b-35b328356177.png "スクリーンショット 2017-05-01 23.26.31.png")


## まとめ

- とりあえず、ボタンを追加表示しただけですけど、Chrome 拡張面白いですね。
- 次はボタン押下して、スレを非表示・非表示にしたスレの情報を保存、といったところをやりたいですね。

## 続き

- [2ch.sc 公式 p2 の動作を Chrome 拡張で改造する (2) - Qiita](http://qiita.com/yousorojp/items/f8fe01827d5bd0cb7f69)
トゥートのマストドン外共有をらくにしてみた

<p>私もマストドンネタに乗っかってみます。n番煎じの上に、借り物のアレですが。<a href=https://github.com/DavidLibeau/mastodon-tools/blob/master/ogp-share/README.md>元ネタです。</a>これは、トゥートをOGP化して、ほかの場所への共有をし易くしているものです。ですけれども、いちいちURLを覚えられないので、共有すべきURLを表示してくれるブックマークレットを作りました。</p>
<code>javascript:(function(){window.alert('http://share.mastodon.tools/?url='+document.URL);})()</code>
<p>以上が、そのコードです。これをURL欄に入れてブックマークしてください。これをプロフィールページから。トゥートに飛んで発火してやると、共有するべきURLが表示されるので、それをコピーしてください。ほかにうまい方法があれば、随時お知らせください。</p>
<p>私自身、mastodon.cloudとfriends.nicoにアカウントがあるのでよかったらどうぞ。もしかしたら、pawoo.netにもあるかも。</p>
c言語_2次元配列を連続したメモリに割り当てる



連続にならない例：

```c:main1.c
#include <stdio.h>

int main(int argc, const char * argv[]) {

    int rows=2;
    int columns=2;
    int **matrix = (int**)malloc(rows*sizeof(int*));

    for(int i=0; i<rows; i++){
        matrix[i]=(int*)malloc(columns*sizeof(int));
    }

    for(int i=0; i<rows; i++){
        for(int j=0; j<columns; j++){
            printf("matrix[%d][%d]=%p\n", i, j, &matrix[i][j]);
        }
    }

}
```

実行結果：

```c:main1.o
matrix[0][0]=0x7fd35a4026e0
matrix[0][1]=0x7fd35a4026e4
matrix[1][0]=0x7fd35a4026f0
matrix[1][1]=0x7fd35a4026f4
```
matrix[0][1]とmatrix[1][0]の間でアドレスが不連続になっている。mallocを２回に分けて行っているのが原因である。
全てのメモリを先にmallocで割り当ててから、アドレスを分割して代入すればこれは避けられる。

```c:main2.c
#include <stdio.h>

int main(int argc, const char * argv[]) {

    int rows=2;
    int columns=2;
    int **matrix = (int**)malloc(rows*sizeof(int*));

    matrix[0]=(int*)malloc(rows*columns*sizeof(int));
    for(int i=0; i<rows; i++){
        matrix[i]=matrix[0] + i*columns;
    }

    for(int i=0; i<rows; i++){
        for(int j=0; j<columns; j++){
            printf("matrix[%d][%d]=%p\n", i, j, &matrix[i][j]);
        }
    }

}

```

実行結果:

```c:main2.o
matrix[0][0]=0x7f930c4026e0
matrix[0][1]=0x7f930c4026e4
matrix[1][0]=0x7f930c4026e8
matrix[1][1]=0x7f930c4026ec
```

matrix[0][1]とmatrix[1][0]の間でアドレスが連続になった。
　
参考：
>[詳説Cポインタ](https://www.oreilly.co.jp/books/9784873116563/)

　
　
　
どやっ！
Apex（メタデータ）


####Schema.sObjectTypeを取得する方法
```java
// 1. 静的に取得
Schema.SObjectType accountType = Account.sObjectType;

// 2. インスタンスから取得
Schema.SObjectType accountType = new Account().getSObjectType();

// 3. GlobalDescribeから取得
Schema.SObjectType t = Schema.getGlobalDescribe().get('Account');
```

####レコードタイプ名による取得
下記のように getRecordTypeInfosByName() でレコードタイプの一覧を取得した場合は Nameはラベル名になることを注意。
TranslationWorkbenchを使っている場合、ラベルはロケールによって変わるため、実行環境によって名前が変わってしまう。

レコードタイプ名（英字）でIDを取得したい場合は、SOQLクエリーでDeveloperNameを取得する。-> [ここを参照](http://qiita.com/TaigarAndDragon/items/5932966e18cc4459da70#レコードタイプ)

```java
Map<String, Schema.RecordTypeInfo> rtByNameCC = Schema.SObjectType.Contact.getRecordTypeInfosByName();
```

####メタデータを使ってオブジェクトの項目名を全て取得する

```java
private static String getAllFieldsNames(Schema.SObjecttype type) {
    String[] fieldstr = New List<String>{};

    Map<String, Schema.sObjectField> omap =
        type.getDescribe().fields.getMap();

    for(String f: omap.keySet()) {
        //一部の項目は除外
        if (f != 'IsDeleted' &&
            f != 'SystemModstamp' &&
            fieldstr.add(f);
        }
    }
    return String.join(fieldstr, ',');
}

//呼出側
Opportunity[] opps = 
  Database.query(
  ' SELECT ' + getAllFieldsNames(Opportunity.SObjecttype) +
  ' FROM Opportunity WHERE Id=\'' + oppId + '\''
  );
```
Rantly(property based testing tool)でテストデータ生成 - positive_integer

Rantly#positive_integer でランダムな数値データ（正の数）を作ります

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル

```ruby
Rantly(5){positive_integer}
# => [507870635400408911, 2019057993833328788, 2246701965649054080, 130232766830015253, 356476832243162874]
Rantly(5){positive_integer}
# => [212517806174208354, 2089730042743063642, 1116112464711445613, 985174777099065428, 1336553785691007565]
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
macOSのPython 3.xでPILのインストール

# macOSのPython 3.xではPILのインストールに失敗する

Imageing-1.1.7などのソースファイルをダウンロードしてきてインストールしようとしても失敗する。
理由： Imageing 1.xはPython 2.x用

# ImagingではなくPillowをpipでインストールして終了

```
$ pip install Pillow
Collecting Pillow
  Downloading Pillow-4.1.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (3.5MB)
    100% |████████████████████████████████| 3.5MB 385kB/s
Collecting olefile (from Pillow)
  Downloading olefile-0.44.zip (74kB)
    100% |████████████████████████████████| 81kB 7.5MB/s
Installing collected packages: olefile, Pillow
  Running setup.py install for olefile ... done
Successfully installed Pillow-4.1.1 olefile-0.44
```

macOS以外でも同じかも？
Ruby2.2からRuby2.4にバージョンアップしたときの手順と躓き解決メモ

# Ruby2.2からRuby2.4にバージョンアップしたときの手順と躓き解決メモ

- 利用環境:Bash on Ubuntu on windows Version 10.0.15063
- 変更前:ruby2.2
- 変更後:ruby 2.4.0p0 (2016-12-24 revision 57164) 
- Rails 5.0.2
- 実行日時:2017-05-01

##Rubyのバージョンアップ
- 過去にWindowsにrubyをインストールするときに、rbenvを利用していたので、それを利用した。

```
rbenv install 2.4.0
rbenv global 2.4.0
ruby -v
```


##バージョンアップ後の操作
バージョンアップ後は、自分が起動させたいアプリのパスを合わせて、`bundler`をインストールして`bundle install` 。

```
gem install bundler
bundle install
```
ここまでの参照：http://qiita.com/chimame/items/8130aa2c07a152a865b1

##Ruby2.4にすると、railsタスクでエラー
uglifierのLoad Errorが出力される。

```
Bundler::GemRequireError: There was an error while trying to load the gem 'uglifier'.
Gem Load Error is: wrong argument type Class (expected Module)
```

下記のサイトを参考にし、`Gemfile`を書き替え。

```
gem install therubyracer -v'0.12.3'
```

bin/rails sが実行可能になった。


参照：
http://www.lanches.co.jp/blog/6330
http://stackoverflow.com/questions/41461977/after-ruby-2-4-upgrade-error-while-trying-to-load-the-gem-uglifier-bundler
Google Analytics Debuggerを用いてGA設定が正しく行えているか確認する方法

![Debugerを使った計測確認.png](https://qiita-image-store.s3.amazonaws.com/0/160563/5ba76e4c-d44c-65fa-050c-eb2a1975967f.png)

# 詳細ページ
Google Analytics Debuggerの設定はもちろんGAの設定方法の詳細は下記よりご確認ください

* [Google Analytics(ユニバーサルアナリティクス)を最大限に活用する導入方法](https://business.explicit-knowledge.com/marketing/build/promotion/universal-analytics/)
* [Google Analytics4の計測設計から実装までの導入方法](https://business.explicit-knowledge.com/marketing/build/promotion/google-analytics4/)

#利用シチュエーション

* 設定したGAトラッキングが正しく動いているか確認したいとき

#確認方法
##事前準備

* ウェブストアで「[Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna?utm_source=chrome-ntp-icon)」をインストール

![GAD.png](https://qiita-image-store.s3.amazonaws.com/0/160563/b954b4b2-de94-e2be-3439-9f39cddf1772.png)


##確認手順

1. インストールした拡張機能をONにする
![拡張機能.png](https://qiita-image-store.s3.amazonaws.com/0/160563/863b1de5-e4d5-0ece-2543-5ea5a1cfcc5a.png)
2. デベロッパーツールを開く (右クリック > 検証 or 要素の検証 )
3. 「Console」タブをクリック
![TOYOTA.png](https://qiita-image-store.s3.amazonaws.com/0/160563/e4e4413d-1253-6d2e-425e-9fc4c4e33c89.png)
 
 * hitTypeはデータの送信タイプ。今回は「pageview」でデータを送信
 * referrerは参照元。今回はGoogleから

などなど...
色々なデータが送信されていることが確認できる。
それぞれの変数の意味は「[Measurement Protocol のパラメータリファレンス](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters?hl=ja)」で確認できる。

###Tips
イベントの計測を確認したい時は「ctrl(command) +　クリック」で確認。
hitType1が「event」になっている
![docomo.png](https://qiita-image-store.s3.amazonaws.com/0/160563/8565050a-b09c-cc71-a295-a139992f2c32.png)

  

#その他確認方法

Chromeデベロッパーツールの「NetWork」タブでも確認が可能。

1. 検索窓に「analytics」と入力
2. 「collect?v=...」というファイルをクリック
3. その中の「Query String Parameters」を確認

![TOYOTA2.png](https://qiita-image-store.s3.amazonaws.com/0/160563/97a412fa-6355-fad6-d6f1-5d89e6d22b84.png)
NumPyでのaxis指定

[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)という本をコツコツと読み進めているのですが。。。

数値計算ライブラリNumPyを利用した、行列に対してaxis(軸)を指定して集計を行うという以下のような式

```
> m = np.array(...)
> m.sum(axis=0)
```

これがどう動くのか、いまいち脳の処理が追いつかないので、絵にしてみました。

# ndim=2の場合

```
> m = np.array([[2,1],[3,4]])
```

## axis=0

```
> m.sum(axis=0)
array([5, 5])
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/20785/d6dceac4-bb0c-dd32-2c20-13692c5aa892.png)

## axis=1

```
> m.sum(axis=1)
array([3, 7])
```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/20785/fc466ee3-d2cd-4f74-ccb2-f5c43f3fbb10.png)

# ndim=3の場合

```
m = np.array([[[7,8],[2,1]],[[6,5],[3,4]]])
```

## axis=0

```
> m.sum(axis=0)
array([[13, 13]
       [ 5,  5]])
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/20785/0a78fd00-ea93-d9a6-c8b6-d61ef5cb9056.png)

## axis=1

```
> m.sum(axis=1)
array([[9, 9]
       [9, 9]])
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/20785/149eab9b-37dc-ec2b-3d45-5c2430c12db1.png)

## axis=2

```
> m.sum(axis=2)
array([[15, 3]
       [11, 7]])
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/20785/a1699ec6-ecfe-8d39-1d75-00d692ed3176.png)
C# はじめました メモ #02 「REST クライアント」

Twitterにだらだら書きそうだったのでちょっとまとめて。故あってMac環境なので、IDEにはRider-EAPを使ってます。やっててよかったJetBrains Toolbox！

# 2日目学習リスト

依存関係(NuGetとかRestoreとか)が少し見えてくる回か。
REST クライアント
https://docs.microsoft.com/ja-jp/dotnet/articles/csharp/tutorials/console-webapiclient

## Mac Homebrewの影響を確認する

2017/05/01現在最新のMac版 .Net core１．０．３は、openssl 1.0.2/1.0.3前提なので、Homebrewでバージョンを上げておくこと。今回はこちらを参考にした。
https://medium.com/@katopz/how-to-upgrade-openssl-8d005554401

## Rider 特有の事情
csprojファイルは、プロジェクトの二階層目をコンテキストメニューのJump to Sourceで開く。
しかしcsprojファイルにエラーが有るとコンテキストメニューからは開けなくなるので、ダブルクリックが安定のようだった。

○○型であればusingは自動補完してくれるが、Staticメソッドを使うタイプではそれは望めない。using staticで読み込まなければいけないものは注意

この一連のチュートリアルは、プロジェクトを作る段階では指定がないので、Reder利用の場合、gitに上がっているサンプル通り作りたい場合、開始する前にnamespaceの確認を行ったほうがいい。

## DataContractJsonSerializer は強力
.Net Coreの機能。
ActionScriptでもJavaScriptでも型変換きれいにするためにそれなりの工数が必要だったものだけど。

更に[DataMember]で取得するJASON上のプロパティと値を結び付けられる。(これによってプロパティとクラスのメンバが同一である必要がなくなる)

[IgnoreDataMember]をつけたプロパティはJSONに影響が受けないメンバの明示となる。

# 2日目を通して

今日の気づきは次の通り。

* ストリーミングで値を取得する場合の処理は、C#が言語として担うのでなく、.Netの機能が担う
* Macで動かす場合にはOpenSSLなどの注意が必要
* MacやRider特有の問題が存在する
[Windows]拡張子の表示・非表示

#はじめに
ここでは、Windowsの**拡張子の表示・非表示**の設定を紹介します。
なお、**Windows10**をベースに説明します。

#拡張子の表示・非表示
まず、[スタート]ボタンを右クリックします。Windowsのマークのボタンが[スタート]ボタンです。

<img width="362" alt="タスクバー" src="https://qiita-image-store.s3.amazonaws.com/0/155265/6d4072f4-1b73-3c47-1129-0ca59bdb9eb3.png">
[スタート]ボタンを右クリックしたら、[コントロールパネル]を選択します。

<img width="500" alt="コントロールパネル_1" src="https://qiita-image-store.s3.amazonaws.com/0/155265/eaab6f5b-c0be-151c-bd5d-2af935d63fd6.png">
[デスクトップのカスタマイズ]を選択します。

<img width="500" alt="コントロールパネル_2" src="https://qiita-image-store.s3.amazonaws.com/0/155265/5d616824-b3b1-95fd-a00c-23b8212311e7.png">
[エクスプローラのオプション]を選択すると、別のウィンドウが開きます。


<img width="336" alt="エクスプローラのオプション" src="https://qiita-image-store.s3.amazonaws.com/0/155265/487d39a7-311e-9978-d11a-22ed7aa82358.png">

[表示]の詳細設定から、
`登録されている拡張子は表示しない`のチェックを外すことで、拡張子を表示することができます。
もちろん、チェックを入れると拡張子を非表示にすることもできます。
Atomでタブ・スペース・改行を表示する

Eclipseの空白文字を表示する設定と同じことをAtomでも行う。
やりたいことは４つ。
これらを視覚的に見えるようにする。

* タブ
* 改行
* 半角スペース
* 全角スペース

Eclipseでは環境設定からこれらを設定している。
Version: Neon.1a Release (4.6.1)


```text
[環境設定] - [一般] - [エディター] - [テキスト・エディター] - [空白文字を表示] にチェックを入れる。
```



# 環境
OS Mac Sierra
Atomバージョン 1.16.0 x64 https://atom.io/

# 設定内容
|項目|設定箇所|
|:-- |:--|
|タブ|エディタ設定|
|改行|エディタ設定|
|半角スペース|エディタ設定|
|全角スペース|「show-ideographic-space」パッケージを入れる|

## エディタ設定
全角スペース以外はAtomのエディタ設定で行う。

1. Atomの [環境設定] を開く。Atom上に [設定] タブが開く。
2. [設定] タブの [Editor] をクリックすると [エディタ設定] が表示される。
3. 下にスクロールし、[不可視文字を表示] にチェックを入れる。

以上。
現バージョンでは標準で４つの不可視文字が設定できる。

* キャリッジ・リターン(Cr)
* 改行(Eol)
* スペース
* タブ

不可視文字はdefaultで表示する内容が決まっているが、変更することも可能。


## 「show-ideographic-space」パッケージ
全角スペースはエディタ設定ではできないため、「show-ideographic-space」パッケージを入れる。

1. Atomの [環境設定] を開く。Atom上に [設定] タブが開く。
2. [設定] タブの [Install] をクリックすると [パッケージのインストール] が表示される。
3. 「show-ideographic-space」と入力し、右の [Packages] をクリックすると画像のように表示される。
4. [インストール] をクリックする。

以上。
敵の頭上にHPバーを実装してみる

# <i class="fa fa-flag" aria-hidden="true"></i> 概要
敵を倒していくゲームでよく見るHPバーの実装をやっていきます。

まずはどういう形で実装していくのか大まかな流れを書いていきます。

1. 敵に**Canvas**を**子オブジェクト**として設置
2. そのCanvasに**Slider**を追加　(これがのちにHPバーになります)
3. Sliderを敵の頭上に配置
4. このSliderのデザインをHPバーっぽく調整
5. ダメージ与えた時にHPが減るようなスクリプトを書く
6. HPバーが常に**自分の方向を向くように**スクリプトに追加

このような流れでやっていきたいと思います。

# <i class="fa fa-flag" aria-hidden="true"></i>　Canvasを設置
敵にCanvasを設置してそこにSliderを追加します。

![Canvas.gif](https://qiita-image-store.s3.amazonaws.com/0/178971/0ac63bee-81ce-41f8-419c-e5a4fdf89853.gif)

無事に設置できましたね。

# <i class="fa fa-flag" aria-hidden="true"></i> Sliderを頭上にもっていく

無事にできましたが、これでは子オブジェクトのCanvasは敵と同じ動きをしてくれません。
HPバーは敵の頭上に常になければいけませんからもちろん敵と同じ動きをしなければいけませんよね。

そこで同じ動きをさせるためには
**今追加したCanvasのインスペクタビューにあるCanvasコンポーネントのRenderModeをWorldSpaceに変更**してください。
そうすることでアタッチしたオブジェクトと同じ動きをしてくれるようになります。
RenderModeについては[こちらのサイト](http://tech.pjin.jp/blog/2017/03/02/unity_ugui_canvas_rendermode/)でとてもわかりやすくまとめられていましたのでぜひご覧ください。

同じ動きをしてくれましたが、このCanvasにはSliderしかつけませんよね。今後の見やすさも兼ねてこのCanvasを小さくしておきましょう。
個人的には**rectTransformのScaleを(0.1 , 0.1 , 1.0)**くらいにするのがちょうどいいと思います。
Sliderの位置は適宜自分で好きな位置に調整してください。

# <i class="fa fa-flag" aria-hidden="true"></i> SliderをHPバーっぽくする
このままではSliderのつまみがあったりSliderの色がそれっぽくないのでそれを調整していきます。
### つまみを外す
ヒエラルキービューのSliderの下にある**ハンドルスライドエリア**のチェックボックスを外してください。そうすることでつまみが外れます。

### フィルエリアを調整する


Sliderのインスペクタビューにある**Value**と**MaxValue**を同じ値にしてみると、値が一番右まで行かないですよね。これを修正するためには**FillAreaのRectTransformのポジションを全て0**にしてください。

![ Slider.gif](https://qiita-image-store.s3.amazonaws.com/0/178971/e0764b87-52a9-38f6-e281-7818624ecb51.gif)

これでフィルエリアの調整も終了しました。
### HPバーっぽく色を変更する

バーの色を変えてHPっぽくしましょう。
**FillAreaの下にあるFillで体力の色**
**Backgroundでダメージ部分の色**
をそれそれ変更できます。

![ Slider2.gif](https://qiita-image-store.s3.amazonaws.com/0/178971/76e8128f-8118-92f6-9afa-1359956cee5e.gif)

それっぽい感じになってきました。あとはこれをスクリプトで動的に動かせるようにしましょう。

#<i class="fa fa-flag" aria-hidden="true"></i>　ダメージ時にスクリプトを書く
まあここら辺は自分で変数宣言とかいろいろ違うと思うので詳しくは書かないですが使用する関数だけ書いときます。
```
using UnityEngine.UI;
public Slider slider;
slider.maxValue = maxEnemyHP;
slider.value = enemyHP;
```
たったこれだけの関数だけで実装できます！簡単！

# <i class="fa fa-flag" aria-hidden="true"></i> HPバーが常に自分の方向を向くようにする
![EnemyShooting.gif](https://qiita-image-store.s3.amazonaws.com/0/178971/0eb2e5cc-0573-f54e-d7d4-7c2db6446eaa.gif)

いい感じですけどHPバーがキャラと一緒に回転してしまって見辛いので、バーを常に自分の正面を向くようにしましょう。
とっても簡単です。
```
GameObject.Find("SliderCanvas").transform.LookAt(GameObject.Find("Player"));
```

つまりはSliderがついてるCanvasをPlayerの方向に常に向けてねっていうことです。
これで終了です！お疲れ様でした！！

![Finish.gif](https://qiita-image-store.s3.amazonaws.com/0/178971/c143d533-8e90-16bd-0ee0-1820f3404ef4.gif)
jestのテストでcss、scss、less絡みでSyntaxErrorが起きる場合の対処法

# 問題

テスト対象の`.jsx`内などで`import "./abc.css"`などとかがあるとエラーになってしまう。

### 例

```
 FAIL  app/javascript/packs/locator/tests/part_item.spec.jsx
  ● Test suite failed to run

    /.../animate.css/animate.min.css:1
    ({"Object.<anonymous>":function(....jest){@charset "UTF-8";
                                              ^
    SyntaxError: Invalid or unexpected token
```

# 対処法参考

[Using with webpack](https://facebook.github.io/jest/docs/webpack.html)

> Handling Static Assets 
Next, let's configure Jest to gracefully handle asset files such as stylesheets and images. Usually, these files aren't particularly useful in tests so we can safely mock them out. However, if you are using CSS Modules then it's better to mock a proxy for your className lookups.

平たく言えば、cssとか画像とかテストする必要ないからそう言うファイル拡張子は何にもしないって事にすれば良いじゃん、という感じ

# 1つの解決方法

[Jest CSS Modules](https://github.com/justinsisley/Jest-CSS-Modules)

これを使えば楽そうだったので、

```json:package.json

  "jest": {
    //この行を追加 正規表現は適切なもに変更
    "moduleNameMapper": {
      "\\.(css|scss)$": "<rootDir>/node_modules/jest-css-modules"
    }
  },

```

これでテストを再起動させればエラーは出なくなる
Node.jsでHello, World ～'超'初心者向け～

Windows環境での「Node.jsのインストール」という行為のピタゴラスイッチ（主にPath）と、
Hello, World出力までの**超初心者**向けの記事です。

ホントの超初心者向けの記事がどうしても見つからなかったので、
もう記事を書いてしまうことにしました。

## Node.jsとは
ここでは説明しません。
というか、ググった方が良いでしょう。
そして、ググって理解できる人はこの記事は不要だと思います。

## Node.jsを入れる前に
**Node.jsが入っていないことの確認**

`Win` + `R`で「ファイル名を指定して実行」を呼び出してください。
※`Win`とはキーボード左下の`Ctrl`と`Alt`の間にあるキーのことです。

「cmd」と入力して実行してみましょう。
黒い画面が出てきましたね？
これが「コマンドプロンプト」と呼ばれるものです。


```
node -v
```
と入力し、Node.jsのバージョンを確認してみましょう。
...はい。もちろんNode.jsがインストールされていないのでエラーとなります。

**環境変数（Path）の確認**
続いて確認するのは「環境変数」です。
環境変数 is 何？はこの記事では言及しませんので悪しからず。
再び「ファイル名を指定して実行」を呼び出してください。
「sysdm.cpl」と入力して実行してみましょう。
「システムのプロパティ」が出てきましたね？
「詳細設定」タブの「環境変数」ボタンを押下してみましょう。
「○○（ユーザ名）のユーザー環境変数」と「システム環境変数」が表示されます。
**「システムの環境変数」**の「Path」という項目をダブルクリックしてみましょう。
Windows10は「謎のパスの一覧」、Windows10未満の人は「何かのパスが;（セミコロン）で連結された文字列」が表示されていますね？
それではその中に「nodejs」という文字列があるか、確認してみましょう。**目で。**
存在しないはずです。

## Node.jsのインストール
それではNode.jsをインストールしてみましょう。
公式サイトから推奨版をダウンロードします。
https://nodejs.org/ja/
※推奨版と最新版がありますが、今回は推奨版にします。違いについては今回は気にしませんし説明もしません。
ダウンロードしたファイルを実行しましょう。
特に何も指定せず、インストール完了までポチポチ進みましょう。

インストールが完了したら、
再びコマンドプロンプトからNode.jsのバージョンを確認してみてください。
**最初に呼び出したコマンドプロンプトは閉じてから確認してくださいね。**


```
node -v
```

どうでしょうか？今度はエラーにならずにバージョンの確認できたでしょうか？

続いて、環境変数を確認してみましょう。
**こちらも、最初に呼び出した環境変数のウィンドウは閉じてから確認してくださいね。**
どうでしょうか？`C:\Program Files\nodejs\`というPathが追加されていませんか？
※X86などがPathにくっついていても問題ありません。
これが通称「Pathを通す」という行為です。（今回Pathを通したのはインストーラですが、手動で通すこともあります。）
このPathにアクセスしてみると、「node.exe」という実行ファイルがあると思います。
こいつが**Node.jsの本体**です。

## Hello, Worldを出力
それではお待ちかねの「Hello, World」を出力してみましょう。
コマンドプロンプトを立ち上げて、`node`とだけ入力します。

```
node
```

続けて、以下のように入力します。

```
console.log("Hello, World")
```

どうですか？以下のように表示されましたか？

```
Hello, World
undefined
```

おめでとうございます。**Hello, World達成**です。


## 何が起きたかちょっと解説
Pathを通すと、Pathに置いてある実行可能ファイル（今回はnode.exeを呼んだ）がコマンドプロンプトから直接呼べるようになります。
「.exe」は省略可能なので上記では省略しましたが、

```
node.exe -v
```
でも実行することが出来ます。

今回はnode.exeを単独で呼び出してHello, Worldをconsoleに出力しましたが、
.jsファイルを作って遊ぶのは次の機会にしましょう。
※あるいはこの記事に追記するかもしれませんが。

## NPMのインストール
ついでなので、NPM(Node Packeage Manager)をインストールします。
NPM自体はNode.jsで作られたツールです、
Node.jsアプリケーションを開発する場合、ほぼ必須のツール（**＝つまり必須ではない**）です。
自分の手でゴリゴリ書けばNPM無しでNode.jsのアプリケーションは開発できますが、
今後の開発を見据えて入れておくと良いでしょう。

それではNPMをインストールしてみましょう。
**......もう入ってます。**
そうなのです。実は公式サイトからNode.jsをダウンロードしてインストールすると、
NPMのインストールまでやってくれます。

コマンドプロンプトで以下のように入力してみてください。

```
npm -v
```

npmのバージョンが確認できたでしょうか？
お察しの良い人はもうPathを確認しているかもしれませんね。
その通りです。npmのPathも通っているのです。
ただし、npmのPathは**「○○（ユーザ名）のユーザー環境変数」**のPathの方に追加されているはずです。
※「node」は**「システムの環境変数」**でしたね。
前述の通り、ここの違いは今回言及しませんが、今はそれほど気にすることではないでしょう。

以上、超初心者向けのHello, Worldでした。
Windows10のVimの設定(molokaiとか使う)

Vimでmolokai使いたくてmacで設定した内容をgithubに入れてwindowsでも使おうと思ったらmolokaiが反映されなかったのでメモ。

# Macの場合

一応[ここ](https://github.com/endoyuta/vim_config)に入っている.vimrcと.vimの内容でmolokaiになった。
.vimrcは下記。

```.vimrc
set ttyfast
set cursorline
set cursorcolumn
syntax on
colorscheme molokai
set title
set number
set ambiwidth=double
set tabstop=4
set noexpandtab
set shiftwidth=4
set softtabstop=0
set smartindent
set cursorline
set cursorcolumn
```

# Windows10の場合

deinというプラグイン管理ツールを使って、molokaiを入れた。

## deinのダウンロード
参考：[dein.vimを使ってみる](http://qiita.com/yoza/items/2f8bd33a18225754f346)

```
$ cd
$ mkdir .vim
$ cd .vim
$ git clone https://github.com/Shougo/dein.vim.git
```

## .vimrcの設定

```
$ cd
$ vim .vimrc
```

.vimrc

```.vimrc
if &compatible
    set nocompatible
endif
set runtimepath+=~/.vim/dein.vim

call dein#begin(expand('~/.vim/dein'))
call dein#add('tomasr/molokai')
call dein#end()

if dein#check_install()
    call dein#install()
endif

colorscheme molokai
syntax on
set t_Co=256
set title
set number
set ambiwidth=double
set tabstop=4
set noexpandtab
set shiftwidth=4
set softtabstop=0
set smartindent
````
【Coldfusion】JSON 形式のリクエストボディを処理する

AngularJSやvue.jsでサーバサイド側（ColdFusion）宛にpost通信する際、
$http.postや、axiosを使うことになるが、送られてきた値がJSON 形式のリクエストボディとして受け取るのでこれらの値をform変数に突っ込んで通常のhttp post通信と同じ感じにする。

ColdFusionにはRESTサービス用の機能とか用意されているが、それらを使わず自前で実装する。

こちらのAngularJSの場合のサンプルを参考
[Parsing AngularJS Request Data On The Server Using ColdFusion ](https://www.bennadel.com/blog/2617-parsing-angularjs-request-data-on-the-server-using-coldfusion.htm)


呼び出されるwebサービス側

```cfm:test.cfm

<cfscript>

// リクエストボディの内容を取得
requestBody = toString(getHttpRequestData().content);

if (len(requestBody)) {
    // jsonをParseしてform変数に値を挿入
    structAppend(form,deserializeJson(requestBody));
}

// クエリーを返すメソッド（メソッドの詳細は省略）
q = getItems(item_id = form.item_id);


items = [];

if(q.RecordCount > 0){
    for(row in q){
        column = {};
        column["item_id"] = row.item_id;
        column["item_name"] = row.item_name;
        column["amount"] = row.amount;
        arrayAppend(items,col);
    }
　　// レスポンスをjsonで返す
    writeOutput(serializeJSON(items));
}

</cfscript>





```

呼び出すHTMLファイル（VueJSの場合）

```html:test.html

<html>
<body>

<div id="demo">

 <ul >
  <li v-for="item in items" >
アイテム：    {{ item.item_id }}
アイテム名称：    {{ item.item_name }}
数量：    {{ item.amount | money }}円
  </li>
</ul>

</div>
<script src="/vue.min.js"></script>
<script src="/axios.min.js"></script>
<script>
window.onload = function () {
	var vm = new Vue({
	  el: '#demo',
	  data: {
            items : []
	  },
	    created: function(){
        axios.post('/test.cfm', { item_id: '123456' })
          .then(function(response){
            vm.items = response.data;
          }); 
	    }
	})
	Vue.filter('money',function(value){
	  return value.toLocaleString();
	});
  
};
</script>
</body>
</html>

```
Codingameのcoders strike backでLegendになりました

ゲームで競技プログラミングできるcodingameが凄く面白いです。
触ったことがない方は是非やってみてください。
https://www.codingame.com

codingameは様々なゲームを選べるのですが、その中のcoders strike backで最高ランクであるlegendに到達したのでやったことをメモしておきます。

#coders strike backとは

https://www.codingame.com/multiplayer/bot-programming/coders-strike-back
レーシングゲームのAIを作ります。
各リーグのボスに勝つと昇格できて、少しづつルールが追加されていきます。
最終的には2v2のレーシングゲームになります。

#やったこと
1週間でlegend到達。かけた時間は40時間くらいです。
勉強のため触ったことのないgo言語を選びました。

##goldまで
bronzeまではすぐに上がれたのですが、silverに中々上がれず、ゴールの履歴を保存しておいて2周目以降のコーナリグに使う機能を実装してようやく上がれました。
silverのボスはそれにうまい感じで減速する機能をつけて突破。

絶対もっと楽に勝つ方法があると思うので知ってる方がいたら教えて欲しいです...

##最終的に実装したもの
goldで全情報が与えられて絶望した

codingameのページで見られる動画を参考に戦略を立てました。
走行用と妨害用で役割分担する方式です。

### 走行の戦略
goldボスの走行アルゴリズムは相当優秀で、最後まで越えることが出来ませんでした
試行錯誤の末実装した機能は、

1. 速度ベクトルと目標点の方向がずれている場合、合うように目標点をずらす
1. 敵の1フレーム先の位置でシールド判定
1. 2個先のチェックポイントの位置を考慮して目標点をずらす
1. ブーストは長い直線で使う
1. 目標点の位置と機体の向きがずれている場合減速する

になりました。
特に1番の実装によって曲がりきれずチェックポイントを過ぎてしまうことがほとんど無くなって順位が飛躍的に上がりました。

### 妨害の戦略
妨害の戦略は自信があり、goldの中では一番優秀だったと思います。
実装した機能は、

2. 速度ベクトルと目標点の方向がずれている場合、合うように目標点をずらす
2. 敵の1フレーム先の位置でシールド判定
3. 先頭を走っている相手に対して妨害する
4. 相手のチェックポイントに先回りできない場合、2個先のチェックポイントで待ち伏せする
5. 自分と相手の距離、そして相手の速度を考慮して相手と衝突できる点を先読みする

4番は動画にあるトッププレイヤーの動きを真似したものです。
これをするだけで相手によってはほとんどゴールできない状態まで追い込むことができます。

# 終わりに

codingameは定期的にコンテストをやっていて賞品も出るみたいなので、次のコンテストは頑張ってみようかなと思います。
次のコンテストは5/12みたいです。
クラスの継承

##クラスの継承

- すでに定義されているクラスを拡張して新しいクラスを作ることを**継承**という。
- 継承によって新しく作られたクラスを**サブクラス**と呼ぶ
- 継承の元になったクラスを**スーパークラス**と呼ぶ。

###継承によってできること

- 既存の機能はそのままで新しい機能を追加する
- 既存の機能を定義し直して同じ名前のメソッドに違う振る舞いをさせる
- 既存の機能に処理を追加して拡張する

継承は同じような機能を持った複数のクラスを作る場合に有効なメカニズムである。
Rubyの全てのクラスはBasicObjectのサブクラスとなっている。
BasicObjectのサブクラスにはRubyの世界のオブジェクトとして必要最低限の機能が定義されている

以下は私が使用しているRubyのVersion 2.1.3における組み込みクラスの継承関係

![スクリーンショット 2017-05-01 18.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/174860/61b4c20b-141a-b7f3-6321-a065f2a9cbeb.png)

##インスタンスメソッドの確認

クラスオブジェクトに対してinstance_methodsメソッドを呼ぶとクラスに定義された
インスタンスメソッド名の一覧をシンボルの配列の形式で返してくれる。
以下はObjectクラスとBasicObjectクラスのインスタンスメソッド確認例

**Objectクラスのインスタンスメソッド一覧**

```irb:irb

>> Object.instance_methods
=> [:nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :singleton_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]

```

**BasicObjectクラスのインスタンスメソッド一覧**

```irb:irb
>> BasicObject.instance_methods
=> [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
```
R で巨大な CSV ファイルを分割して読み込む

以前、kaggle の [Outbrain Click Prediction](https://www.kaggle.com/c/outbrain-click-prediction) に挑戦しました。
このコンペはデータセットが巨大で、特に page_views.csv は 88 GB ありました。
とても一括では読み込めないので、分割して読み込む必要がありました。
そのときに R で分割して読み込む方法を調べたので、忘れないうちにメモ。

## 読み込み方

### コネクションの作成

CSV ファイルへのコネクションを作成します。
今後は、コネクションを通して CSV ファイルにアクセスします。
コネクションを通すことで、**指定した位置から指定した分だけ読み込める**ようになります。

```r
con <- file(description = "page_views.csv", open = "rt")
```

### 列名の読み込み

列名を先に読み込んでおきます。
読み込みには `readLines` を使います。

```r
col_names <- unlist(str_split(string = readLines(con = con, n = 1), pattern = ","))
```

なお、列名を（1行目を）読み込むと `con` のファイルポインタが2行目に移動します。
そのため、`con` に対して連続して `readLines` を呼び出すことで、続きから読み込むことができます。

### CSV ファイル本体の読み込み

以上で準備は整ったので、CSV ファイル本体を読み込みます。
手順は以下の通りです。

1. `readLines` で CSV ファイルの一部を文字列として読み込む
2. 文字列からデータフレームを生成できる関数（※）を使い、データフレームに変換する
3. データフレームに対して任意の処理を行う
4. 読み込み終わるまで 1～3 を繰り返す

※ `read.csv(text = *)` や `readr::read_csv(file = *)` などがあります。
以下の例では `readr::read_csv(file = *)` を使っています。

```r
library(readr)

# 一度に読み込む行数
n <- 10000000

while(T)
{
  #（続きから）n行だけ読み込む
  lines <- readLines(con = con, n = n)

  # 読み込み終わったら終了する
  if(length(lines) == 0)
  {
    break
  }

  # read_csv は改行を含まない文字列をファイルパスと解釈するため、必ず複数行にする
  if(length(lines) == 1)
  {
    lines <- c(lines, "")
  }

  # データフレームに変換する
  string <- paste(lines, collapse = "\n")
  page_views <- read_csv(file = string, col_names = col_names, col_types = "cccccc")

  # 読み込んだデータに対する処理（ここでは分割してファイルに出力）
  write_csv(x = page_views, path = sprintf("page_views_%d.csv", seek(con)))
}
```

### コネクションのクローズ

最後に、コネクションを閉じます。

```r
close(con = con)
```

### ファイルポインタの明示的な移動

ちなみに、 `seek` を使うことでファイルポインタを明示的に移動させることもできます。

```r
# 現在のファイルポインタの位置（バイト数）を返す
seek(con)

# ファイルポインタの位置を移動させる。"start" を指定すると、先頭から指定バイト数だけ移動させる
seek(con, 123456, "start")
```

## ダメな読み込み方

ところで、`readr::read_csv` は `skip` や `n_max` を指定することで読み込む範囲を指定できます。
コネクションを陽に使わずとも、これらを駆使すれば分割読み込みできそうな気がします。

しかし、`skip` は「読み飛ばす」のではなく「読み込んで破棄する」ので、無駄な読み込みが発生します。
そのため、CSV ファイル後半に行くほど読み込みが遅くなります。

また、`n_max` も「指定行数だけ読み込む」のではなく「指定行数以上を読み込み、不要な行を破棄する」ようです。
そのため、`n_max` に小さな値を設定してもメモリを大幅に消費する場合があります。
\# 読み込み効率化のため、ある程度一括して読み込む実装になっていると、どこかで読んだ気が（うろ覚え）

---

## 追記（2017年5月2日）
`readr::read_csv_chunked` を使えば分割読み込みできるっぽい。
[メモリに乗らないデータを分割して読み込んでくれるパッケージ - 盆栽日記](http://d.hatena.ne.jp/dichika/20160808/p1)
Microsoft Teamsにメッセージを飛ばす


Incoming Webhookで通知を飛ばします

## Incoming Webhookの設定

公式の説明に則ってkeyを取得します

* https://msdn.microsoft.com/en-us/microsoft-teams/connectors

1. Teamsのチームを選択
2. チャンネルを右クリックして「コネクタ」を選択
	* ![teams.png](https://qiita-image-store.s3.amazonaws.com/0/6892/1b7cdc09-05aa-21ed-d77a-0d9c29ea9bed.png "teams.png")

3. 「Incoming Webhook」を選択し、アカウントを作成する
	* 既に追加している場合は「構成済み」からたどれます
4. URLをコピーしておく

## curlで投げる

これも公式の設定に則って投げます

```bash
echo '{"text": "Hello World!"}' | curl -H 'Content-type: application/json' -d @- <YOUR WEBHOOK URL>
```

![notice.png](https://qiita-image-store.s3.amazonaws.com/0/6892/4d2da401-3080-b1fb-0b28-05d5891fad53.png "notice.png")

タイトルを付与したり、リンクを投げることもできます
[詳しいドキュメント](https://dev.outlook.com/Connectors/reference)

```bash
echo '{"text": "[Hubot-Slackの表示をリッチにする](http://qiita.com/miyay/items/c436b6ec46f61a4d6e72)", "title": "今日のQiitaのホットエントリよ！"}' | curl -H 'Content-type: application/json' -d @- <YOUR WEBHOOK URL>
```

![notice_with_title.png](https://qiita-image-store.s3.amazonaws.com/0/6892/5eb206be-3aab-733b-e1b2-209a6437c367.png "notice_with_title.png")

今のところメンションは効かないみたいです

* http://stackoverflow.com/questions/41440803/how-to-mention-a-user-group-in-a-new-message-to-a-channel

## Rubyで投げる

POSTできれば良いので、なんでも

```ruby
def post_teams(url, mes)
  uri = URI.parse(url)
  request = Net::HTTP::Post.new(uri.request_uri, initheader = {'Content-Type' =>'application/json'})
  request.body = {text: mes}.to_json

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  http.start {|h| response = h.request(request) }
end

post_teams("<YOUR WEBHOOK URL>", "Hello World!")
```
rebase以外でmasterの修正を取り込んでいて、不要なコンフリクトが多発する場合の回避方法

ブランチにmasterを取り込む時に下記のようなこともあると思います。

- masterの修正をmergeコミットで取り込んじゃってた
- コピペ＆コミットで取り込んでた

↑のとき、rebaseで綺麗にするのが大変だったりしますよね。

### 手順
---

```feature/hoge``` をターゲットとします。

- feature/hogeをコピーしてどこかにバックアップしておく
- feature/hogeを```git reset --hard コミットハッシュ```する。(masterからブランチを切った時のコミットまで巻き戻す)
- feature/hogeにmaster最新をmerge or rebaseで取り込む（この時点で、master最新と同じになる。）
- feature/hogeのフォルダの中身を.gitフォルダ以外消す。
- バックアップしておいたfeature/hogeの.gitフォルダ以外をコピーで戻す
- 最後にコミットする。（fast forward出来るはずです。）

<font color="red">注）</font>また、masterの取り込みは完了している前提です。masterの取り込みをしていないのに、上記手順をやってしまうとmasterの修正が消えてしまうので注意してください。

### 説明
---

gitは、```.git```のフォルダが本体なので、本体をmasterと同じにしてから、ワーキングディレクトリを消し去って、バックアップしておいたワーキングディレクトリをコピーする方法となります。

こうすれば、完全に修正したファイルだけコミットに持って行けます。

注意点としては、このやり方だとコンフリクトが発生しないので、最後のDiffは念入りにやらなければならない点です。
Vim チートシート

# はじめに
Vimの基本的なコマンドにしぼってまとめた.

# 起動と終了
|コマンド|動作|
|:-:|:-:|
|vim|vimの起動|
|vim [ファイル名]|ファイルを指定して起動|
|:q|vimの終了|
|:q!|vimを強制終了|
|vimtutor|vimのチュートリアルを表示|

# モード切り替え
|コマンド|動作|
|:-:|:-:|
|i|カーソルの左から挿入モードを開始|
|I|行頭から挿入モードを開始|
|v|文字単位のビジュアルモードを開始|
|V|行単位のビジュアルモードを開始|
|Ctrl + v|矩形選択のビジュアルモードを開始|
|[ESC]|ノーマルモードへ戻る|

# ファイル操作
|コマンド|動作|
|:-:|:-:|
|:w|上書き保存|
|:w [ファイル名]|指定したファイルに保存|
|:wq|上書き保存して終了|
|:e [ファイル名]|起動後に別ファイルに切り替え|

# カーソルの移動
|コマンド|動作|
|:-:|:-:|
|gg|ファイルの先頭へ移動|
|G|ファイルの末尾へ移動|
|Ctrl + f|１画面下へ移動|
|Ctrl + b|１画面上へ移動|
|w|単語単位で右方向に移動|
|b|単語単位で左方向に移動|
|^|行頭へ移動|
|$|行末へ移動|
|f + [文字]|指定した文字へ移動|
|;|f + [文字]で複数該当した場合に次の該当箇所へ移動|
|%|(括弧の上で入力すると)対応する閉じ括弧へ移動|

# 削除, コピー, 貼り付け
|コマンド|動作|
|:-:|:-:|
|x|カーソル位置の文字を削除|
|X|カーソル位置の左の文字を削除|
|dd|行単位で削除|
|[数字]dd|行数を指定して削除|
|yy|行単位でコピー|
|[数字]yy|行数を指定してコピー|
|p|貼り付け|

# 検索
|コマンド|動作|
|:-:|:-:|
|/[文字]|指定した文字列を検索する|
|n|検索結果に複数該当した場合に下方向の該当箇所へ移動|
|N|検索結果に複数該当した場合に上方向の該当箇所へ移動|
|*|現在のカーソル位置の単語を下方向に検索|
|#|現在のカーソル位置の単語を上方向に検索|

# 置換
|コマンド|動作|
|:-:|:-:|
|:s/[検索文字]/[変換文字]/|検索した文字を指定した文字に置換する(１箇所のみ)|
|:s/[検索文字]/[変換文字]/g|検索した文字を指定した文字に置換する(行内全て)|
|:%s/[検索文字]/[変換文字]/g|検索した文字を指定した文字に置換する(ファイル内全て)|
|:s/[検索文字]/[変換文字]/c|検索した文字を指定した文字に置換する(確認付き)|

# undo, redo
|コマンド|動作|
|:-:|:-:|
|u|やり直し(undo)|
|Ctrl + r|やり直しのやり直し(redo)|

# ウィンドウ操作
|コマンド|コマンド|動作|
|:-:|:-:|:-:|
|Ctrl + w + s|:sp|ウィンドウを上下に分割|
|Ctrl + w + v|:vs|ウィンドウを左右に分割|
|Ctrl + w + w|-|ウィンドウ間の移動|
|Ctrl + w + Ctrl + w|-|ウィンドウ間の移動|
|Ctrl + W + c|:close|現在のウィンドウを閉じる(ただし最後のウィンドウ以外)|
|Ctrl + W + o|-|現在のウィンドウ以外を閉じる|

# タブ操作
|コマンド|動作|
|:-:|:-:|
|:tabnew|新しいタブを開く|
|:tabe [ファイル名]|ファイルを指定してタブを開く|
|gt|タブの切り替え|
|:tabclose|タブを閉じる|
|vim -p [ファイル名, ファイル名 ...]|起動時にタブを指定する(pオプション)|
|:tabdo|タブ全体に適用|

# テキストオブジェクトの扱い
|コマンド|動作|
|:-:|:-:|
|cit|タグの中身を変更|
|cat|タグ全体を変更|
|ci"|""の中身を変更|

# 設定
|コマンド|動作|
|:-:|:-:|
|:set number|行番号の表示|
|:set nonumber|行番号の非表示|
|:syntax on|コードの色分けをする|
|:syntax off|コードの色分けをしない|
|:set tabstop=[数字]|タブの文字数を設定|
|:set ignorecase|大文字小文字の区別をしない|
|:set noignorecase|大文字と小文字を区別する|

# 組み合わせ
|コマンド|動作|
|:-:|:-:|
|gg V G|全選択|
|Ctrl + v I|矩形選択をしてまとめて編集|
|:tabdo %s/[検索文字]/[変換文字]/g|検索した文字を指定した文字に置換する(タブ内全て)|

# その他
|コマンド|動作|
|:-:|:-:|
|.|直前の操作を繰り返す|
|=|インデントを揃える|
|Ctrl + n|補完する|
Hamlでfont-awesomeにリンクを貼る方法

railsにてhamlを用いてマークアップを進めていた際に、font-awesomeを使用するのに少しつまづいたので書いておきます。
##font-awesomeとは
Web上でよく使われるアイコンを、画像ではなくテキストとして表示できるようにしてくれる機能です。
railsではgemとしてインストールすることができます。
## hamlとは
HTML/XHTMLを生成するためのマークアップ言語で、非常に簡易的に記述することができます。

## 手順を確認
### gemのインストール
Gemfileに以下の記述をします。

```ruby:Gemfile.rb
gem "font-awesome-rails"
```

ターミナル上で`bundle install`します。

### hamlのインストール
こちらもGemfileに記述します。

```ruby:Gemfile.rb
gem 'haml-rails'
gem 'erb2haml'
```
ターミナル上で`bundle install`します。

### erbファイルをhamlに変換
`gem 'erb2haml'`のジェムがしっかりインストールされていれば、`rake -T`コマンドで以下のような表示がされます。

```terminal:terminal
rake haml:convert_erbs                  # Perform bulk conversion of all html.erb files to Haml in views folder
rake haml:erb2haml                      # Convert html.erb to html.haml each file in app/views
rake haml:replace_erbs                  # Perform bulk conversion of all html.erb files to Haml in views folder, then remove the converted html.erb files
```

そこで、`rake haml:replace_erbs`と入力します。
すると、現在のディレクトリ以下のerbファイルをすべてhamlファイルに変換してくれます。

### hamlファイル内でfont-awesomeを使って見る
http://fontawesome.io/icons/
上記URLから使用したいアイコンをクリックします。
![スクリーンショット 2017-05-01 18.08.10.png](https://qiita-image-store.s3.amazonaws.com/0/177591/8781b4ed-e642-7725-d8a2-daadc332c772.png "スクリーンショット 2017-05-01 18.08.10.png")
上の画像にあるような`<i...></i>`のタグをコピーします。
通常のHTMLファイルでは、このiタグを丸ごとコピペするだけで使用することができます。
hamlで記述する際には、以下のようになります。

```haml:sample.html.haml
%i.fa.fa-cog
```

### link_to内で使ってみる
hamlにおいて、rubyの記述をする際には、以下の二通りの記述法があります。
ビューで表示しない場合は'-'を使用する

```haml:sample.html.haml
- if
- @posts.each
```

表示する場合は'='を使用する

```haml:sample.html.haml
= post.title
```

link_toには'='を適用します。

```haml:sample.html.haml
= link_to 表示する文言, URLパス, メソッド, クラス
```

このように書きますが、以下のように書いてもエラーが起きてしまいます。

```haml:index.html.haml
= link_to edit_user_registration_path .fa.fa-cog
= link_to edit_user_registration_path i.fa.fa-cog
```

コンテントタグを使用する方法もあるみたいですが、以下のように書くとコードもすっきりし、正常に表示もされます。

```haml:index.html.haml
= link_to edit_user_registration_path do
  %i.fa.fa-cog
```

ネストさせて書かずに結構な時間はまっていたので、参考までに。

## 参考資料
link_toについて
http://udemy.benesse.co.jp/development/link-to.html
font awesomeについて
http://univ.peraichi.com/39