OmniAICreator/Qiita-1.07M huggingface dataset:
railsのテンプレート変数、構文一覧



```ruby:hensuu

# 1,テンプレート変数・・・テンプレート変数とはテンプレートファイルに埋め込める変数の事でviewのhtml.rbとかによく入っている。アクションメソッドとビューで値をやり取りする際に必要なもの。

def view
  @msg = "はじめまして！"
end

# 2,rubyスクリプトを埋め込みたい時

<% 任意のコード %>
<%= なんらかの値を返すもの %>

# 3,テンプレートファイルの埋め込み

<%= yield %>

# 4,コメントアウト

<%#
コメントアウト
%>

<% ここはされない
# %>

<% if false %>
<% コメントアウト %>
<% コメントアウト %>
<% end %>

# if falseでコメントアウトすることで複数のコメントアウトをまたいでコメントアウトすることができる。

<% =begin %>
<% コメントアウト %>
<% コメントアウト %>
<% =end %>

# =beginでも複数行をコメントアウトできます。


```
railsでページ作成をする

# railsでページが表示されるには

* View
* Controller
* routing

上記３つがrailsでページを表示させる上で必要です。

# viewの作成

ブラウザからリクエストが飛んできてルーティング→コントローラーが受けます。その後どのviewを表示させるのかコントローラが決め、表示させます。viewはviewsフォルダに置かれています。html.erbが多く、erbはembedded rubyの略でhtmlにembeddedさせているrubyファイルになります。

# コントローラの作成

コントローラファイルはapp/controllersの中に格納されています。

# ルーティングの設定

ルーティングはURLのリクエストが飛んだ際にどのコントローラのどのアクションを行うかを決める箇所です。config/routes.rbが対応箇所になります。

例

```ruby:config/routes.rb
Rails.application.routes.draw do
 get "home/top" => "home#top"
end
# get URL => "コントローラ名#アクション名"
```
# 上記３点をコマンドで作成する


```ruby:terminal
rails generate controller home top
# rails generate controller コントローラ名 アクション名
```

https://www.javadrive.jp/rails/controller/index1.html

controllerの命名は上記記事が分かりやすい

>なおRailsでは1つのモデルを扱うために1つのコントローラを作成する場合が多いのですが、その場合コントローラ名はモデル名を複数形にしたものを付ける場合が多いです。

modelがあるものの場合、基本複数形と考えていい。

# ページをカスタマイズする

## 表示されるのはビューにあるerb

実際に表示されるのはerbというembeded rubyと呼ばれるファイル形式のものです。そのままの意味でHTMLなどにrubyのコードが混ざっているものになります。

* 基本は<% %>で囲ったrubyのコードが入る
* もしrubyのコードで生成したものを表示させたい場合<%= %>で囲う

## リンクの設定

```ruby:test
<a href="/">TweetApp</a>
```
上記のようにルーティングと同じ値をhref内に記入する。

## CSSをカスタマイズする

CSSもrails gコマンドで生成される。

## 画像の保存場所

画像はpublicフォルダの中に格納される

## アクションで定義された変数をビューに持っていきたい時

アクションで定義された変数は基本ビューで使えないが@をつけると持ってこれる。
がばがばscala独学-クラス(2)

# はじめに

下記のテキストを通して、基本的な書き方を学びつつ、個人的に気になったことを検証していくメモ代わりです。
https://dwango.github.io/scala_text/basic.html
本当にありがとう、dwango様・・・

# クラス

* ざっくりまとめ
    * 継承は実装の再利用や処理の共通化をするために使用
    * override漏れがあった場合はコンパイルエラーとなるため安心して実装可能

## 継承

* 継承の目的
    * スーパークラスの実装による、サブクラスでの実装の再利用
    * スーパークラスのインタフェースによる、複数サブクラスでの処理の共通化

* 一般型

    ```scala
    class SubClass(....) extends SuperClass {
      ....
    }
    ```
* override
    * 既存メソッドの上書き処理
    
    ```scala
    scala> class PrinterSuperClass() {
         |     def print(): Unit = {
         |         println("super class")
         |     }
         | }
    defined class PrinterSuperClass


    scala> new PrinterSuperClass().print
    super class

    --------------------------------------

    scala> class PrinterSubClass() extends PrinterSuperClass{
         |
         | }
    defined class PrinterSubClass

    scala> new PrinterSubClass().print
    super class

    --------------------------------------

    scala> class PrinterSubClass() extends PrinterSuperClass{
         |     def print(): Unit = {
         |         println("sub class")
         |     }
         | }
    <console>:9: error: overriding method print in class PrinterSuperClass of type ()Unit;
     method print needs `override' modifier
               def print(): Unit = {
                   ^
    --------------------------------------

    scala> class PrinterSubClass() extends PrinterSuperClass{
         |     override def print(): Unit = {
         |         println("sub class")
         |     }
         | }
    defined class PrinterSubClass

    scala> new PrinterSubClass().print
    sub class
    ```
    * 同名関数をoverrideせずに定義すると `needs override modifier`と出るためオーバーライド漏れはない
ServiceNowでチケットを見ながらチャットする

Version: Istanbul

# やること

チケットを見ながらチャットします

![FireShot Screen Capture #183 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/1984bb37-1d89-bc88-cb67-29de729073ca.png)

# 複数人でチケットを確認

おばあさんが自分が担当のチケットを確認しています

![FireShot Screen Capture #174 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/fee3ab0a-948b-544c-2b27-2e093851c736.png)

おや誰か同じチケットを確認しているようで画面上部に(お)の文字が出ています

![FireShot Screen Capture #175 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/ab2aa032-1a25-63c9-8825-2241ac3bdfd8.png)

おじいさんでしたダイレクトメッセージを送信してみます

![FireShot Screen Capture #176 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/3a0bf21e-ef3f-af60-0aff-322ba4d7df3b.png)

チャットウインドウが開きました

![FireShot Screen Capture #177 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/773fe42a-f925-0e81-bf64-82edaead7eba.png)

# メッセージ送信

話しかけてみます

![FireShot Screen Capture #178 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/f1c4f8d7-995c-8a7e-cc2e-8a19bba0c846.png)

メッセージが送信されました

![FireShot Screen Capture #179 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/9a00834a-eaa8-0079-5d24-038f437a4bc6.png)

# メッセージ受信

おじいさんがチケットを確認していたら画面右上に(1)の通知が届きました

![FireShot Screen Capture #180 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/b68816aa-137f-a403-8c33-6ac78e46e47f.png)

クリックするとチャットのペインが画面右に表示されます

![FireShot Screen Capture #181 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/5cf6d568-2533-2661-84be-3fceed7e4804.png)

クリックするとチャットウインドウが表示されました

![FireShot Screen Capture #182 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/2bc102b5-b427-74eb-1d0b-ad2e9a64e56f.png)

メッセージを入力して送信します

![FireShot Screen Capture #183 - 'INC0010022 I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_pinkie_smile_do%3Fsys_id%3Dbdc9.png](https://qiita-image-store.s3.amazonaws.com/0/193272/fd39656b-c284-fcac-22a5-00cd4a7476d9.png)
python-fu ファイル一括処理サンプル

指定ディレクトリ内の画像ファイルをGIMP形式で保存する。GIMPバンドルPythonではTkinter・PYGTKが正常に動作せず、選択ダイアログが使えない為、ディレクトリパスは直接入力する。

    # -*- coding: utf-8 -*-

    import os
    
    def makeGimp():
	
    # ディレクトリパスの取得
	dirPath = 'C:\'
	
	#ファイル名の取得
	fileList = os.listdir(dirPath)
	
	#ファイルリストから順に処理
	for file in fileList:
		#ロード
		filename = dirPath + os.sep + file
		raw_filename = filename
		image = pdb.gimp_file_load(filename, raw_filename)
		display = pdb.gimp_display_new(image)
		
		#xcf形式で保存
		index = raw_filename.find(".")
		filename = raw_filename[0:index] + ".xcf"
		raw_filename = filename
		drawable = pdb.gimp_image_get_active_layer(image)
		pdb.gimp_xcf_save(0, image, drawable, filename, raw_filename)
		#画像をクローズ
		pdb.gimp_display_delete(display)
datastoreの名前空間を使ってみた


## 背景
同一プロジェクト内のDatastoreでテスト環境・本番環境のデータを分ける必要があった。
その時、名前空間について調査することがあったので、備忘録としてまとめる。

## 名前空間とは？
1つのアプリケーションを異なるデータセットに対して動作させることを簡単にできるようにする仕組みのこと。
例えば、名前空間Aの場合は名前空間A用のDatastore、名前空間Bの場合は名前空間B用のDatastoreにアクセスできるようになります。

Datastoreの他にも以下も対応しています。

- Memcache
- Task Queue
- Search

参考：https://cloud.google.com/appengine/docs/java/multitenancy/multitenancy

## 使い方
以下のようにcontext.Contextにnamespaceを設定するだけで使用準備完了です。

```go:example.gp
c := appengine.NewContext(r)
c = appengine.Namespace(c,"your-namaspace-name")
```

Datastoreへアクセスする時に名前空間対応したcontext.Contextを渡すだけで、データを切り替えることができます。

```go:example.gp
func GetBeaconList(c context.Context) ([]Beacon, error) {
	var tmp []Beacon
	// 名前空間をセットしたcontextを渡すだけ
	_, err := datastore.NewQuery("beacon").GetAll(c, &tmp)
	if err != nil {
		return nil, err
	}
	return tmp, nil
}
```
『２週間でできる！スクリプト言語の作り方』のStone言語で遊んでみた

表題の本を購入したので著者のWebサイトからソースコードをもらってきて遊んでみました。

https://www.csg.ci.i.u-tokyo.ac.jp/~chiba/site/?ScriptingBook
https://github.com/chibash/stone

で、本ではビルドや実行をEclipseで行うことを前提としており、また、各章ごとにソースコードがバラバラに分かれていた(本の内容がインクリメンタルに開発していくような進め方になっているため)ので少し整理して、githubに置いておきました。
使い方は察してください。

コードが読みやすいように、高速化などに手をつける前の第10章までのソースコードだけを含みます。

https://github.com/ryogrid/Stone_minus_lang

Stone言語がどんなシンタックスを持っているかは、サンプルコードを眺めてみてください。
https://github.com/ryogrid/Stone_minus_lang/tree/master/example

件の本では、パーサジェネレータは使わずに、パーサコンビネータを使ってパーシングを行ったり、アスペクト指向を活用(GluonJというライブラリを利用)したり、またクロージャやクラスに対応する等、既存の書籍に比較してモダンに、モダンな言語を実装しています。

気合を入れれば本がなくともコード理解できるかもしれないですが、良書なので是非購入して、本を片手にソースコードの読解を進めるとよいかと思います。

本の目次などはこちらをご参照のこと。
http://gihyo.jp/book/2012/978-4-7741-4974-5

以上。
clearfixの使い方

#cssファイルによるページデザイン

※長文になりますので、本題である「clearfixの使い方」が手っ取り早く知りたい方は右のページ内リンクより飛んでください(^ ^;)

cssを使ってhtmlにて作成したインターネットのページをデザインする際、２カラムや３カラムというような、縦に２列、３列というように要素を作っていくデザインを作ろうと思った際、以下のようにfloatを使うことがよくあります。

```index.html
<!DOCTYPE html>
<html>
 <head>
~中略~
  <link rel="stylesheet" href="css/index.css" type="text/css" />
 </head>
 <body>
  <div class="header"></div>
  <div class="left"></div>
  <div class="right"></div>
  <div class="footer"></div>
 </body>
</html>
```
```css/index.css
.header {
  background-color: blue;
  width: 400px;
  height: 100px;
}
.left {
  background-color: skyblue;
  width: 150px;
  height: 250px;
  float: left;
}
.right {
  background-color: red;
  width: 250px;
  height: 250px;
  float: left;
}
.footer {
  background-color: yellow;
  width: 400px;
  height: 100px;
}
```
上のようなデザインをした場合、以下のような内容が、**ブラウザの左上に詰められた状態で**表示されます。

---
　　|　　　　　　ヘッダー：青　　　　　　|
　　|　メイン左:水色　　|　　メイン右:赤　|
　　|　　　　　　フッター：黄色　　　　　|

---

画像じゃなくてわかりにくいとは思いますが、その場合は上のをそのままコピペして試していただければ実体験もできてわかりやすいかな・・・と。
・・・・・すみません。
スクショを撮る手間を嫌っただけの、ただの手抜きです(>_<;)

ただ、これを「ブラウザ上で中央に寄せたい」と思った際には、**margin: auto;**を使うこととなりますが、ただ使うと以下のような内容になります。

#ただ各要素にmargin: auto;を使った場合
htmlは変わらないので省略します。

```css/index.css
.header {
  background-color: #141f40;
  width: 400px;
  height: 100px;
  margin: auto;
}
.left {
  background-color: #80bfa8;
  width: 150px;
  height: 250px;
  float: left;
  margin: auto;
}
.right {
  background-color: #8c2727;
  width: 250px;
  height: 250px;
  float: left;
  margin: auto;
}
.footer {
  background-color: #d98d30;
  width: 400px;
  height: 100px;
  margin: auto;
}
```

---
　　　　　　　　　　　|　　　　　　ヘッダー：青　　　　　　|
　　|　メイン左:水色　　|　　メイン右:赤　|　フッター：黄色　|

---

俗に**「まわり込み」**と呼ばれる現象で、フッター部分がメインの右側に行ってしまっている上、メイン以下、フッターは中央に寄っていません。

#まわり込みの解除
フッターがメインの横にきてしまっている現象をまず直しましょう。
とはいえ、結構簡単です。
以下のように、フッター部分に**clear: both;**を追記しましょう。

```css/index.css
~前略（変わるのはfooterの最後の行だけです）~

.footer {
  background-color: #d98d30;
  width: 400px;
  height: 100px;
  margin: auto;
  clear: both;
```
これで、まわり込みは解除でき、同時にフッターはmargin: auto;の効果で中央に寄せられます。
簡単ですね(^_^)
ただ、この段階では、メインは左寄せのままです。

#お待ちかねのclearfix！
さて、途中も読んでくださった方、長文失礼しました。
リンクできてくださった方もいますかね？

メイン部分(というか、指定した要素)も中央に寄せようとする場合、これが非常に便利です。

clearfixは、**指定したい要素の親要素**にclassで指定し、使用します。
今回、中央に寄せたいのはleftとright・・・メインの部分です。
今、この二つだけに対する親要素がありませんので、今回はhtmlにも手を加える必要があります。

```index.html
<!DOCTYPE html>
~中略~
 <body>
  <div class="header"></div>
  <div class="main clearfix">
   <div class="left"></div>
   <div class="right"></div>
  </div><!-- main clearfix -->
  <div class="footer"></div>
 </body>
</html>
```

上のように、中央に寄せたいleft、rightの両要素を囲う形で新たにdivを作り、ここでは仮にmainとclassを指定しています。
そのmainにもう一つ。
肝心要のclearfixを指定します（mainとの間にインデント一つ入れてそのまま書く形でOKです）。

その後、cssに対し、bodyとclearfixを指定した変更を加えます(変更ない部分は略してます)。

```css/index.css
body{
  margin: 0 auto;
  width: 400px;
}
~中略~
.clearfix::after{
  content: "";
  display: block;
  clear: both;
}
```
::afterが擬似要素だとか、その後にはcontentが必須だとかなんだとか細かい部分の説明は省きますが、ここでは仮に全体のwidth、つまり幅を400pxとしていたので、bodyにもそのように指定。

これで、中央に寄せられないでいた左右のメイン要素も、中央によせられます。

より細かいところの説明は現在の僕にはちょっと難しいので、別のところで調べていただくか、そのうち更新されるのを期待してくださると幸いです(^ ^;)
SonarQube を使って5分で試す継続的インスペクション

![sonarqube-projects.png](https://qiita-image-store.s3.amazonaws.com/0/67627/2c9706b3-d029-c900-08ab-1dbfeae36efa.png)

Java・JavaScript・C#・Python・PHP など20言語以上（一部有料）に対応した継続的インスペクションツールの [SonarQube](https://www.sonarqube.org/) を5分以内にローカル環境で試す方法をメモっとく。

なお本稿は macOS 環境を前提にしている。

# SonarQube をインストールする

Homebrew で SonarQube をインストールする。

```shell-session
$ brew install sonarqube
```

# SonarQube を起動する

SonarQube は `brew services start sonarqube` で起動できる。

```shell-session
$ brew services start sonarqube
==> Successfully started `sonarqube` (label: homebrew.mxcl.sonarqube)
```

# SonarQube のダッシュボードにアクセスする

SonarQube のダッシュボードにブラウザーからアクセスしてみる。初回のアクセスは少し時間がかかる。

http://localhost:9000

![sonarqube-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/67627/75a8a296-d636-4647-5b1b-3ffbb9e3bed0.png)

# SonarQube Scanner をインストールする

Homebrew で SonarQube Scanner をインストールする。SonarQube Scanner がプロジェクトを解析して解析結果を SonarQube に登録してくれる。

```shell-session
$ brew install sonar-scanner
```

# サンプルプロジェクトを解析する

Martin Fowler 著『リファクタリング』の例題である VideoStore をベースにした Java のサンプルプロジェクトをクローンして SonarQube Scanner で解析してみる。

```shell-session
$ git clone https://github.com/takuya0301/videostore.git
$ cd videostore
$ ./gradlew test
$ sonar-scanner \
    -Dsonar.projectKey=videostore \
    -Dsonar.sources=src/main \
    -Dsonar.tests=src/test \
    -Dsonar.jacoco.reportPaths=build/jacoco/test.exec \
    -Dsonar.java.binaries=build/classes
```

## 解析パラメーター

|キー|説明|
|----|----|
|sonar.projectKey|プロジェクトキーはプロジェクトごとにユニークな値を指定する。|
|sonar.sources|ソースファイルが含まれるディレクトリをコンマ区切りのパスとして指定する。|
|sonar.tests|テストファイルが含まれるディレクトリをコンマ区切りのパスとして指定する。|
|sonar.jacoco.reportPaths|Java のコードカバレッジライブラリである Jacoco が生成するレポートファイルへのパスを指定する。|
|sonar.java.binaries|コンパイルされたバイトコードファイルが含まれるディレクトリをコンマ区切りのパスとして指定する。|

# サンプルプロジェクトの解析結果を確認する

SonarQube にブラウザーからアクセスすることでサンプルプロジェクトの解析結果を確認できる。

http://localhost:9000/dashboard?id=videostore

![sonarqube-videostore.png](https://qiita-image-store.s3.amazonaws.com/0/67627/85b96b0d-9c62-2597-1869-3498bda4ca81.png)

---

SonarQube を5分以内にローカルで実行してサンプルプロジェクトを解析する方法を説明した。SonarQube を操作してみたり、ほかのプロジェクトを解析してみたりして導入を検討してみるといいんじゃないかな。SonarQube Scanner は Jenkins などの CI ツール用のプラグインもあるので、実運用するときは CI ツールと連携するように設定することをオススメする。Jenkins 連携についても気が向いたら記事にしよう。

# 参考文献

https://docs.sonarqube.org/display/SONAR/Documentation
[クイズ]javascriptと仲良くなるための一歩　第７話「数値への変換」

参考：パーフェクトjavascript

## 第1問

```js
Number('100x')
//=> ?
parseInt('100x')
//=> ?
Number('')
//=> ?
Number(true)
//=> ?
Number(false)
//=> ?
Number(null)
//=> ?
Number(undefined)
//=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

```js
Number('100x')
//=> NaN
parseInt('100x')
//=> 100
Number('')
//=> 0
Number(true)
//=> 1
Number(false)
//=> 0
Number(null)
//=> 0
Number(undefined)
//=> NaN
```
どうやらElmコードは`()`使わないほどイケてるらしい


趣味で[Elm](http://elm-lang.org/)触ってて、よく分かんないけどなんか動くみたいな感じでやってる、関数型言語素人のダイナミックHTMLコーダーである私目線の内容です。
なので、浅学者が関数型を語るとアツくなってしまうタイプの方はどうかこの先を読まないでください:bow:

さて本題に入りますが、Elmは関数を適用するときに`()`を使わない言語です。
JSで、

```js
func(arg)
```

というのはElmでは

```hs
func arg
```

と書きます。
しかしこんなJSコード

```js
func1(func2(arg))
```

をElmで表現しようとするとき、

```hs
func1 func2 arg
```

と書くと違う挙動になります。これは

```js
func1(func2)(arg)
```

に相当してしまいます。
Elmは算数の式の優先順位を付ける感じで`()`を使えるので、

```hs
func1 (func2 arg)
```

と書くのが正解です。
が、熟練のElmersのコードを見てもこの書き方はあまり見かけないんですよね。
その代わりこういうのよく見るんです。

```hs
func1 <| func2 arg
```

`<|`ってなんだよ魚の頭かよキメぇなとか思いながらドキュメント読んで気づきました。
あれ、`func1 <| func2 arg`って`func1 (func2 arg)`だったんすかと。


# `<|`ってなんだよ

ドキュメントによると`<|`は後方関数適用（なんだそれ？）する関数で、こういうことなんだそうです。

### [(<|)](http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Basics#<|) : (a -> b) -> a -> b

Elmの型の見方を簡単に説明すると、
`Int`は「Intを返す関数」
`Int -> String`は「Intを引数にとりStringを返す関数」
`Bool -> Int -> String`は「BoolとIntを引数にとりStringを返す関数」
`(Bool -> Int) -> String`は「「Boolを引数にとりIntを返す関数」を引数にとりStringを返す関数」
と読めばいいみたい。また、型のとこをaみたいに小文字で書くと型変数になってジェネリックになるみたい。

ということで、`<|`とは、「任意型aを引数にとって任意型bを返す関数」と「同じ型a」を引数にとって「同じ型b」を返す関数です！なるほどわからん！
私ほどの高卒ヒモ野郎になるとガチで言っている意味がわからないのですが、要は関数適用のエイリアスなんだそうです。
しかも中置関数っつって、引数の間に書ける関数なんだそうです。自由だなぁ。

つまり`func arg` == `(<|) func arg` == `func <| arg`なんだって。
これだと使う意味なさげだけど、`func1 (func2 arg)`だと`<|`使えば、
評価の順番が変わるとかで`func1 <| func2 arg`と`()`無くせてCoolっつうわけですかね。

実際のところ、Elmにはタプルって型が`(a, b)`みたいな文法なので、それと混同して紛らわしいから確かに`()`使わない方がわかりやすいかも。

そして、この魚の頭には、前方関数適用する右バージョンもあります。ヒラメとカレイ的なことかな。

### [(|>)](http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Basics#|>) : a -> (a -> b) -> b

`func arg` == `(|>) arg func` == `arg |> func`ということらしい
`func1 (func2 arg)`を`func2 arg |> func1`と書くか`func1 arg <| func2`と書くかだけの違いだと思うんですけど、熟練Elmersの傾向としては、
`func1 (func2 (func3 (func4 (func5 (func6 arg)))))`みたいに適用しまくってる時は

```hs
func6 arg
    |> func5
    |> func4
    |> func3
    |> func2
    |> func1
```

みたいな感じでカレイを使ってるのをよく見る気がします。
JSのPromiseのチェーンみたいな感じで割としっくりくるかも。


# まとめ

ふーん、まぁ、よくわかんないけど、そう書きゃいいのね、って感じの知能ではありますが、
とりあえず`()`つけないことがカッコいいっていう、その生き様にはシンパシーを感じた、という話。
phpで問題を解いてみた【2】

#問題
私は鳩の一羽に餌をあげ始めました。一分後に二羽が飛んできて、さらに一分後には三羽が、その後には四羽が飛んで来ました（例：1+2+3+4...）。
一個の餌は鳩一羽が一分間食べ続けられる量です。十分な量の餌がない場合、最初に到着した鳩が先に餌を食べます。鳩は食事の辞め時を知らない貪欲な動物です。もし鳩の餌をN個もっていたら、何羽の鳩に少なくとも一個の小麦の餌を与えられるでしょうか？



#自分なりの回答

```php
<?php
function checkhato($esa){
    $hato = 0;
    $time = 0;
    do{
        //経過時間をプラス
        $time = $time + 1;
        //現在の鳩の数
        $hato = $hato + $time;
        //鳩が餌を食べました。（足りない可能性あり）
        $esa = $esa - $hato;
        if($esa < 0){
            if($esa*-1 < $time){
                $hato = $hato + $esa;
                break;
            }
            $hato = $hato - $time;
            break;
        }
    }while(1);
    return $hato;
}
?>


```

まだまだアルゴリズムの組み立て方が下手で結構時間が掛かってしました。



#まとめ
while文やif文で書いているので正直phpを使う意味があまりないような気もしてしまいます。。。
もっと便利な関数等使って短く美しく書けるのかもしれないと思ってしまいました。
Mavenで実行可能jarをビルドする方法

# はじめに
すこし前にMavenという壁にぶち当たり、Mavenってそもそものなんだというところから、実行可能jarファイルをビルドするところまでを勉強しました。

今回は、その時勉強したことの備忘録を兼ね、いろんなところからかき集めた実行可能jarをもっともシンプルに作る方法をご紹介します。

他にもっと簡単にできる方法をご存じだという方は、ご指摘などいただけると幸いです。
Mavenの基本的な使い方は、別に記事を書きましたので、よろしければそちらもご覧ください。

# 1. 実行可能jarとは
`java -jar <jarファイル名> `と打って実行できるjarファイルのことです。
通常javaで作ったプログラムは、実行可能jarとしてビルドしないと、実行するとき

```shell:コマンド
java -classpath <jarファイル名> <mainがあるクラス名> <コマンドライン引数>
```

のように、実行対象のjarファイルと、クラス・パスを別に指定する必要がありますが、実行可能jarとしてビルドすると、初めに紹介したコマンドだけで実行できるようになります。
Windowsなど、GUI環境であれば、ダブルクリックで実行することも可能です。
その場合は、コンソールアプリケーションだと厳しいですが・・・

話はそれますが、javaを使用したGUIプログラムを作る方法も、そのうち記事にしようと思っているので、興味のある方は首を長くしてお待ちください。

# 2. mavenによるビルド
ここからは本題の、Mavenを使って実行可能jarをビルドする方法をご紹介します。
この記事では、Eclipseを使用し、Mavenの基本的な使い方は理解している前提で話を進めます。
「Mavenって聞いたことはあるけど、なんなのかはよーわからん」というような方は、別の記事でMavenをある程度使えるようなってから続きをご覧ください。

その手の記事は筆者も一度書いていますので、よろしければ[こちら](http://qiita.com/ryota0001/items/e5667cfa857529900216)をご覧ください。

## 2.1. Mavenプロジェクトの作成
Eclipseでも、Mavenの駒野でも、どちらでもよいのですが、とりあえずMavenプロジェクトを作成します。
今回は実行可能jarがビルドできれば何でもよいので、Hello Worldのソースファイルでも作って入れておきます。

## 2.2. maven-assembly-pluginの導入
Mavenで実行可能jarファイルをビルドするには、assembly-pluginというMavenのプラグインを使用します。

pom.xmlに次の内容を記載し、プラグインを追加してください。

```xml:pom.xml
<!-- 実行可能jarファイル用のプラグイン -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>3.0.0</version>
	<configuration>
		<finalName>test</finalName>
		<descriptorRefs>
		<!-- 依存するリソースをすべてjarに同梱する -->
		<descriptorRef>jar-with-dependencies</descriptorRef>
		</descriptorRefs>
		<archive>
			<manifest>
				<mainClass>main.Main</mainClass>
			</manifest>
		</archive>
	</configuration>
	<executions>
		<execution>
			<!-- idタグは任意の文字列であれば何でもよい -->
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>
```

## 2.3. jarファイルの生成
ここまでで、Mavenの設定はすべて終了です。
あとは、おなじみのコマンドでビルドを行うだけです。
作成したプロジェクトのpom.xmlのあるディレクトリで、次のコマンドを実行してください。

```shell:コマンド
mvn install
```
すると、mavenがガリガリと動いて、targetディレクトリにjarファイルが生成されているはずです。
jarファイルは2つ生成されていると思いますが、「jar-with-dependencies」が付いているほうが実行可能jarファイルです。

そのjarファイルをコマンドで実行します。

```shell:コマンド
java -jar 生成したjarファイル
```
いかがでしょうか？jarファイルが実行されたことと思います。

# 3. 最後に
ここまででmavenを使用して実行可能jarファイルを生成する方法をご紹介しました。
mavenシリーズは、自分でもかなり時間をかけて勉強したので、また記事を投稿すると思います。
少しでも、mavenを使いたい、または使わざるを得ないけど使い方がわからない・・・というような方のお役にたてれば幸いです。
LinuxにPostgreSQLをインストール（Linux mint）

## 概要
* 構築環境はLinux mint
* localで開発用途のためにインストール
* インストールは簡単。role周りがちょっとわかりにくかった。
* Windowsとインストールの方法が若干違うところがあったのでまとめ
* Linuxへのインストール手順が以外と情報がなかったり古かったりなどしたので。

## インストール
* リポジトリに最新とまでは行かなくても安定した新しいのが提供されているので基本はそれをインストール
* 最新版を使いたい場合は公式サイトからインストール手順を参照

```
yasu@pcname> sudo aptitude update
yasu@pcname> sudo aptitude install postgresql
```

## とりあえず起動してみる
* インストールが完了したら起動してみる
* パッケージ名がpostgresqlだからコマンドもそうかと思いきやpsqlコマンドなので注意

```
yasu@pcname> psql
psql: FATAL:  role "yasu" does not exist
```

* エラーになるはず
* yasuというroleはないと言われる

## 起動できるようにする

* postgresqlのデフォルトで用意しているログインユーザーは`postgres`
* postgresqlのログインユーザーはLinuxのログインユーザーなので、基本的にそのままではログインできない
* postgresqlをインストールした時にpostgresというユーザーが自動で作成されるので切り替える
* まずはpostgresユーザーにパスワードを設定する

```
yasu@pcname> sudo passwd postgres
新しい UNIX パスワードを入力してください: 
新しい UNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
```

* postgresアカウントに切り替える

```
yasu@pcname> su postgres
password: 
```

* psqlを起動

```
postgres@pcname> psql
```

* これで起動できたはず。
* このままスーパーユーザーで作業してもいいが、roleを作ってあげたほうが安全
githubにssh接続する際の初期設定

#githubにssh接続する際の初期設定
備忘録として残しておく
##gitのインストール

```
$sudo apt-get install git
```
##git 初期設定
```
$git config --global user.name "user"
$git config --global user.email mail.com
```

+  設定確認

``` 
git config --global --list
```

## ssh鍵作成

```
ssh-keygen -t rsa -C "your_email@example.com"
```

+ 鍵ファイル保存場所はデフォルト
+ パスワードを入力
+ id_git_rsa id_git_rsa.pubが生成される

##github にkeyを登録
https://github.com/settings/keysから
 ~/.ssh/id_rsa.pub　の内容を登録する。

 + 接続を確かめる
 ssh -T git@github.com

```
 Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.
```
 が返って来れば成功

## localリポジトリ作成

```
$git init
```
+ ステージングにアップ

```
git add ファイル名
```

+ コミット

```
git commit -m "メッセージ"
```

+ ログ確認

```
git log
```

## GitHubのリポジトリ追加してpush

```
git remote add origin url
```
```
git push -u origin master
```
Pythonの三項演算子のネスト

###Pythonで三項演算子を書きたい時(備忘)
ex) 変数aが10以上の時、変数bはtrue、それ以外の時はfalseを代入したい

```python:ternary_operator.py
b = true if a >= 10 else false
```
###条件をもっと増やしたい時(備忘)
上記の場合は条件文が2つの場合に使えるが、条件がもっと増えた時にも三項演算子を使いたい場合はこうする

ex) 変数scoreが100の場合は'perfect'、60以上100未満の場合は'pass'、それ以外の場合は'fail'を出力したい

```python:nested_ternary_operator.py
print('perfect' if score == 100 else 'pass' if score >= 60 and score < 100 else 'fail')
```

elseの式の後にifを加えることでif~elif~elseを表現できる
exの状況設定がガバガバなのはご愛嬌
Googleフォームでアンケートを作ってみた

アンケート作ってみました。

#Googleフォームでアンケートを作ると何ができる？
- アンケート作るのが簡単
- 自動で集計してくれる
- 個別の回答も見ることができる
- メールアドレス自動収集もできるしOFFにして匿名アンケートとしても使える
- 回答をずっと保存できる

#Googleドライブにログイン
https://drive.google.com/ にログインします。

#Googleフォームを新規作成
新規＞その他＞Googleフォームで新規作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8d5a5e35-eccc-df68-04e0-754c1272d72a.png)

別ページに飛びます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/85854e2a-154d-e5af-eaf3-b0af1638ce8d.png)

♯デザイン決める
右上のパレットをクリックするとデザインを決められます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/ac11e22b-bc41-e332-08e1-4f3557884f6b.png)

デザインたくさんありますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/ac0c1633-2960-e530-4ca8-d27903af332e.png)

#アンケートを作成
感覚的にアンケートを作れますので大まかな操作ポイントを記載します。
いじりながらプレビューしてどのようなフォームになるのか試しながら作ることでつまずくことなく作成できました。
##各種ボタン説明
###プレビュー
プレビューボタン
目のマークをクリックすると別ページでプレビューボタンが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/334c1a2e-9d3e-421d-9415-89d97bd676b2.png)

###質問を追加
質問フォームを追加します。回答の仕方は追加されたフォームの中で記述式、ボタンなど設定が可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/2540765d-7cc3-b8fe-7640-fb8d896edbf9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/7e7a4e34-1727-4a91-12a9-ded9e289e5db.png)

###タイトル追加
タイトルとその説明を追加できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/f5f524e2-6c1c-ea96-9325-323e0e8038cd.png)

例えば、こう書くと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/3a720a81-baae-841c-4df3-a7d542aeab38.png)

こうなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/65604fe0-87c8-de40-a799-47f5199b2ee7.png)

#私はこう作りました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/57d3b521-4cf3-d85b-328d-aeb4e22ba938.png)

プレビューだとこうなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/7e417cf2-6f51-84d8-f3f7-85cf8afd39e5.png)

#送信
画面右上の送信ボタンから、ユーザへのメール送信やURL情報がわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/fcdc5c2e-5dc3-6a82-a3c5-82c8fe10b4e1.png)

メール送信画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/b9388fa1-4c16-ae65-a009-9233f14aa9f9.png)

URLは短縮してくれるので便利ですね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/dd6e4a71-66f4-2b9f-1975-05e65f14bb7c.png)


他、こんないい機能もあるよ！などあれば教えてください♪
VirtualBoxにあるCentOS7で[Insert Guest Additions CD image...]を押下したら Unable to insert the virtual optical disk となった時の確認方法

[MacのVirtualBoxに作った仮想マシンへGuest Additionsをインストールする](http://ponsuke-tarou.hatenablog.com/entry/2017/07/23/175358) をしていた時のしくじりです。

**環境**

- VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
- ホストOS : macOS Sierra Virsion 10.12.5
    - 操作は基本的にホストOSからTerminalでSSH接続して行いました。
- ゲストOS : CentOS Linux 7.3.1611(Core)

### 事象
1. [Devices] > [Insert Guest Additions CD image...]を押下したものの何も反応がない？
2. もう１度、[Devices] > [Insert Guest Additions CD image...]を押下したらエラーが発生しました。

```text
Unable to insert the virtual optical disk /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the machine CentOS7.
Could not mount the media/drive '/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso' (VERR_PDM_MEDIA_LOCKED).
```
![Screen Shot 2017-07-11 at 23.48.38.png](https://qiita-image-store.s3.amazonaws.com/0/159761/009a3e4b-4683-edaf-bbb0-3b913f9a6b3e.png)

### 原因 : 既に追加されているから:flushed:
### 確認 : 追加されていることを確認する
1. [Oracle VM VirtualBox Manager]で対象の仮想マシンを選択します。
2. [Strage]リンクを押下します。
3. [Controller IDE]に[VBoxGuestAdditions.iso]が表示されています。
![Screen Shot 2017-07-11 at 23.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/159761/557c81f2-39ea-8dba-6d44-b5b422c3b40e.png)


### 参考にさせて頂いたサイト様
- [VirtualBox 上に構築した CentOS の解像度を変える方法 - Qiita](http://qiita.com/aminevsky/items/e619669963cb68012755)
Yoctoでdnfを使う方法

Yocto 2.3 で、パッケージマネージャがsmartからdnfに変更されました。
dnfそのもののドキュメントは存在しますが、Yoctoで使う方法は情報が皆無に等しい状況です。
本稿は、あれこれ試した結果を忘れないようにメモ書きしたものです。

# dnfとは？
Fedoraで採用されている、yumの後継パッケージマネージャ。
オフィシャルドキュメントは以下にある
http://dnf.readthedocs.io/en/latest/

dnfそのものの解説はあえて書くまでもないので、以下を参照
https://ja.wikipedia.org/wiki/DNF_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

Yocto2.3の「New Features / Enhancements」に以下のような一言が書かれており、変更されたことがわかる。
* Replaced smart+rpm5 with dnf+rpm4 for more standard and widely-supported RPM functionality

# Yoctoでdnfを使う方法
Yocto Project Reference Manual の5.18.4. Using Runtime Package Managementに使い方が書かれている。
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html

パッケージ方式にrpmを採用した場合に、ビルドするPCからターゲットボードにinstallできるようにする方法を以下に記す。(マニュアルの内容を見る限りipkも同じ方法でできそう)

1. local.confもしくは、イメージレシピに以下の1行を追加して、パッケージマネージメント関連のファイルがインストールされるようにする
IMAGE_FEATURES += " package-management "

2. ビルドディレクトリのrpmディレクトリ(例:build\tmp\deploy\rpm)をhttpで公開する。

3. rpmディレクトリで createrepo . を実行しておく。本来の使い方とは異なるが、いちいちリポジトリデータを作り直すのは面倒なので、ひとつ上のディレクトリで作ってしまう。

4. ターゲットボードを起動し、
　mkdir yum.repos.d
  で、ディレクトリを作成し、次のように記述したyocto.repoファイルを格納する
　[yocto]
　baseurl=http://yourserver/rpm
　gpgcheck=0
　この方法では、リポジトリの検証用のgpgkeyを無効にしているが、ローカル接続であれば問題ない。外部公開の場合は適切に設定すること。

5. 以下の順番でコマンドを実行する
   dnf makecache
   dnf update
   dnf install インストールしたいパッケージ名

smartから移行する場合は、4の手順が変わっているところなので、そこに注意すれば比較的すんなり使えます。
React 簡単なSample集

Reactハンズオンに参加したのでその備忘録を残したいと思います。

## React初期設定

・インストール

``` command:command
$ npm install -g create-react-app
```

・作業場で環境構築

``` command:command
$ create-react-app myapp
$ cd myapp
$ npm start
```

・ルートポイント

``` javascript:src/index.js
ReactDOM.render(
  <App />,
  document.getElementById('root')
);
```

## 文字をチカチカさせる

・setInterval関数を使って文字をチカチカさせる書き方

``` javascript:src/App.js
import React, { Component } from 'react';
import Text from './Text';

class App extends Component {
  render() {
    return (
      <div>
        <Text text='チカチカ文字' />
      </div>
    )
  }
}

export default App;
```

``` javascript:src/Text.js
import React, { Component } from 'react';

class Text extends Component {
  constructor(props) {
    super(props);
    this.state = {
      showText: true,
    };

    setInterval(() => {
      this.setState({
        showText: !this.state.showText,
      });
    }, 1000);
  }

  render() {
    const text = this.state.showText? this.props.text : '';
    return (
      <div>
        {text}
      </div>
    )
  }
}

export default Text;
```

## クリックカウント

``` javascript:src/App.js
import React, { Component } from 'react';
import Button from './Button';

class App extends Component {
  render() {
    return (
      <div>
        <Button />
      </div>
    )
  }
}

export default App;
```

``` javascript:src/Button.js
import React, { Component } from 'react';

class Button extends Component {
  constructor(props) {
    super(props);

    this.state = {
      count: 0,
    }
    this._addCount = this._addCount.bind(this); // イベントハンドラでthisをbindさせるため
  }

  _addCount() {
    this.setState({
      count: this.state.count + 1,
    });
  }

  render() {
    return (
      <div>
        <button onClick={this._addCount}>
          button
        </button>
        <p>{this.state.count}</p>
      </div>
    )
  }
}

 export default Button;
```

### その他のbindの書き方

・onClickに書く

``` javascript:src/Button.js
<button onClick={this._addCount.bind(this)}>
```

・arrow functionで書く(bind不要)

``` javascript:src/Button.js
_addCount = () => {
  this.setState({
    count: this.state.count + 1,
  });
}
```


## 参考サイト

- [React Native Japan](https://react-native-meetup.connpass.com/)
- [React ハンズオン](https://github.com/YutamaKotaro/slides)
木構造の整形表示コマンド forest を作った

## これは何か

[forest][GitHub] は行指向で構造化された木構造を表すテキストを整形して出力するコマンド。

```
pattern1_root
pattern1_root/pattern2_last_leaf
root_node
root_node/pattern3_non-last_leaf
root_node/pattern3_non-last_leaf/sample
root_node/pattern3_non-last_leaf/pattern4_non-last_node's_child
root_node/leaf_node
```

上のような入力を

```console
$ cat sample1.txt | forest
├ ─ pattern1_root
│   └ ─ /pattern2_last_leaf
└ ─ root_node
    ├ ─ /pattern3_non-last_leaf
    │   ├ ─ /sample
    │   └ ─ /pattern4_non-last_node's_child
    └ ─ /leaf_node
```

こんな感じに整形して出力するコマンド。

`tree` コマンドのようだが、入力のテキストは `/` 区切りでなくともよい。行が前行に前方一致するなら、ネストする、という単純な整形をする。

こんな感じ。

```
サ
サン
サンプル
forest
forest doesn't specify any characters
forest doesn't specify any characters as separater.
```

```console
$ cat sample2.txt | forest
├ ─ サ
│   └ ─ ン
│       └ ─ プル
└ ─ forest
    └ ─  doesn't specify any characters
        └ ─  as separator.
```


## なぜ作ったか

`find` コマンドの柔軟な検索結果を `tree` コマンドのようなツリー表示で見たいなー、と思ったのがキッカケ。
この問題を解決するツールはあるだろうけど、そもそも整形表示部分だけの単機能にした方がいいんじゃないの、アレ？そういうコマンドないの？と思ったので。

それと Rust の勉強がてら。


## 使い方

パイプでつなげるだけ。オプションなし！

ダウンロードは [GitHub][GitHub] より

Linux と macOS のバイナリをビルドしてます。


## 実装で面白かった点

### アルゴリズム

最初は木構造を整形表示するなんて楽勝じゃね？と思ってたが、以外に難しかった。というのも、`tree` の表示の再現をしようとすると、親ノードが下の兄弟を持つかどうかで行の出力が変わるからだ。

```
├ parent
│ └ child
└ (ここがいるかいないかで child の先頭部分 │ の有無が変わる)
```

```
└ parent
  └ child
```

これがあるため、単純に前から入力を読んでいくだけでは出力を決定できない。(これがあるので、入力を読み終えるまで `forest` は何も出力しない。ノードの深さによっては一部出力可能だが、本質的にはできないので対応していない)

`tree` はファイルシステムへのアクセスの結果なので、ディレクトリエントリを読んだ時点で兄弟の有無が判明するはずなので、**恐らく** この問題は発生しない。`tree` の実装読んでないので予想。

内部で `tree` を全て組み立ててから出力するというのは、避けられないんだけど、読み書きをストリーム状に (= 戻りなく) 処理したいという気持ちがあったのでアルゴリズムを多少工夫した。

アルゴリズムを [README.md][GitHub] に擬似コードで載せてある。手前味噌だがいい感じになっていると思う。もっと言えば、この `forest` の価値はアルゴリズムが全てと言ってもいいんじゃないか？言いたい。

### Rust の言語仕様

私には Rust 難しいです！！！！！

書いてて実感するのが、参照さえ手に入れば書き換えられるというマインドを植え付けられてるなーと。Haskell では感じないからシンタックスの問題なんだろうけど。所有権の考え方は早く慣れたい。どの言語でも役に立つ気しかしない。

木構造を実装しようとしたとき、子と親の両方の参照を埋め込もうとしたら循環参照じゃないか、所有権どうするの！？となって発見があった。
`forest` では妥協で回避している。スマートポインタをちゃんと使いこなせるようにならないと。

`forest` の実装の範囲内だと Rust の特色が全く出ていない。Rust はこわくない、ということ学べた程度だった。

### Rust のビルド

ダイナミックリンクで苦労した。
私は真面目に C/C++ をビルドしたことがないので、`libc` ってなんじゃボケーッって言いながらバイナリ作成を頑張った。

TravisCI 上の Ubuntu がリンクしたバージョンの glibc が CentOS 上のものが古くて実行できないなど。

各ディストリビューション向けに配布ファイルを作るのは面倒くさくて嫌だったので、全て静的リンクするように Rust MUSL ターゲットを使った。


## 終わりに

「forest はこんなところで活用できるよ」と教えてくれると嬉しいです。


[GitHub]: https://github.com/KoharaKazuya/forest
Arch LinuxにGUI環境(xfce)と日本語環境を設定(2017年7月版)

## 構築する環境
 * デスクトップ環境：X Window System、xfce4
 * ディスプレイマネージャ：LightDM
 * 日本語入力：Fcitx、Mozc
 * 日本語フォント：otf-ipafont

## 既存の環境（メモ）
 * キーボード
    * US配列のHHKB
 * ロケール

```
$ cat /etc/locale.conf 
LANG=en_US.UTF-8
```

 * モニタは二枚
    * xfce立ち上げたら、勝手に認識してくれた。初期設定はミラーリングになってたので、横並びで表示するように設定変更

## 背景
公式ドキュメントをもとにOSインストールと初期設定はできた状態。次はGUI環境を作りたい。

GUI環境を作ったら、日本語環境も欲しくなる。ウェブブラウジングで日本語が表示されないのは困るし、検索バーに日本語が打ち込めないのも困る。

## 進め方

基本的には下記のページを参考に進めていけば問題ない。

 * http://note.kurodigi.com/post-0-20/
 * http://note.kurodigi.com/post-0-19/

ただし、 Arch Linuxは変化が早く、そのままではうまく行かない箇所もある。たとえば、インストールするパッケージ名が変わっていたりするので、多少は調べながら作業を行う必要がある。

## インストールしたパッケージ
 * すべて上記のページにでてきたもの。標準リポジトリからインストール可能。
 * pacmanコマンドを実行後に選択を促されるものもあったが、default=allと表示されていたので、全部いれた
 * パッケージは精査していないので、不要なものも混ざっているかも
 * 下記のパッケージは、設定後にpacman.logから抜いてきたので、正しいかわからない

### ドライバ
 * xf86-video-intel

### X
 * xorg-server
 * xorg-server-utils
 * xorg-xinit
 * mesa
 * xorg-twm xorg-xclock xterm

### xfce, LightDB
 * xfce4
 * lightdm lightdm-gtk-greeter

### 日本語入力
 * fcitx-im fcitx-configtool fcitx-mozc
 * otf-ipafont

### その他
 * chromium

## メモ
 * startxが権限周りのエラーで失敗する
    * http://qiita.com/mokrai/items/d812422623374963d39d
 * runlevelを知りたい

```
$ systemctl get-default 
```
【Ubuntu16.04】ConohaのDBサーバー接続用ネットワークを使ったのでメモ

# はじめに
- Qiitaの投稿初めて
- MarkDown真面目に使ったの初めて
- 超初心者

なので、見づらかったらすいません(´・ω・｀)

# 追記
2018年一発目でこれ参考にしてやったらうまく行かなかったので、間違っていたところを訂正しました。

# きっかけ
Conohaで自鯖のデータベースをVPSじゃなくてDBサーバーとして別で建てたので、せっかくだから便利な「DBサーバー接続用ネットワーク」で接続できるようにしたい。
実はこれやるの2回目で、先日権限ミスってOSぶっ壊したので再設定をするのだが、前回のやり方を忘れてしもうた(；´Д｀)

[公式のガイド](https://www.conoha.jp/guide/dbnetwork.php)にはCentOSしか書いてなかったので、Qiitaを覗いてみたが、うまく行かなかった...

なんやかんややってたらできたので、またやらかしたときのために結果をメモしておく。

# まず参考にしたところ

リンク切れ ~~http://blog.3oku.net/entry/2015/06/25/094531~~
http://qiita.com/yo1000/items/9d70dcfd5c4b26effa03
これらを参考にファイルも一通り編集しまたが、うまくいかない...

```
$ sudo ifdown eth1
ifdown: interface eth1 not configured
```

```
$ sudo ifup eth1
Cannot find device "eth1"
Failed to bring up eth1.
```

ファイルに書いたじゃんか！
それじゃ駄目なのかよ！

# そもそも別であるんじゃないか

http://nemupm.hatenablog.com/entry/2014/09/20/035935 を参考に。

`ifconfig -a` を実行。

![awerbawebybway wy.PNG](https://qiita-image-store.s3.amazonaws.com/0/124224/4fe60ea7-651d-c35a-a134-6318cbaff395.png)
![awerbawerbway bay.PNG](https://qiita-image-store.s3.amazonaws.com/0/124224/d3e4d2d3-b0ac-3d76-131c-7845f07d9a34.png)

ハードウェアアドレスとMacアドレスが一致。
ということは、「eth1」とかは適当だと思っていたが実は超重要で、この場合は「ens4」と書かなければいけないということ。

ここからは参考文献通りですが、一応書いておきます。
(ほぼ引用です)

## インターフェースの追加
```
$ sudo vi /etc/network/interfaces
```

```text:/etc/network/interfaces
auto ens4
iface ens4 inet static
address [sharedに書いてあるIPアドレス]
netmask [sharedに書いてあるサブネットマスク]
```

## 静的ルーティングの設定
```
$ sudo vi /etc/network/if-up.d/static-routes
```

```text:/etc/network/if-up.d/static-routes
#!/bin/sh
/sbin/route add -net 172.21.74.0 netmask 255.255.254.0 gw [sharedに書いてあるゲートウェイ] dev ens4
```
※172.21.74.0の部分は東京リージョンの場合です
※eth1 → ens4 の間違いでした

```
$ sudo ifup ens4
$ sudo chmod +x /etc/network/if-up.d/static-routes
$ sudo /etc/network/if-up.d/static-routes
```

# 接続テスト

Javaでテストしてみました、正常にできましたね。
![awerbwethnwyawbny.PNG](https://qiita-image-store.s3.amazonaws.com/0/124224/1000a09a-5ebe-8b0b-7fe6-adcccc164862.png)
AppEngineのサービス単位でサブドメインを設定する


## 概要
dispatch.yamlを使って、サブドメイン設定をする。

## 対象
- 1プロジェクトのAppEngine内で複数のサブドメインを運用したい人

## 前提条件
「App Engine」>「設定」>「カスタムドメイン」でサブドメインの設定が完了していること

## 対応内容
### 設定するサブドメイン
カスタムドメインの設定で以下のドメイン設定が完了していることとします。

  - abc.example.jp
  - def.example.jp

### app.yamlの修正
それぞれのサービスのapp.yamlにserviceプロパティを設定する。

- サービス「abc」

```yaml:app.yaml
application: your-project-name
service: service_abc
version: 1
runtime: go
api_version: go1
```

- サービス「def」

```yaml:app.yaml
application: your-project-name
service: service_def
version: 1
runtime: go
api_version: go1
```

### dispatch.yamlの追加
以下のように設定します。
※プロジェクト内で共通で使うものなので注意。

```yaml:dispatch.yaml
dispatch:
  - url: "*abc.example.jp/*"
    service: service_abc

  - url: "*def.example.jp/*"
    service: service_def
```

### デプロイを行う
以下のコマンドでデプロイを行う

```shell
goapp deploy
```

dispatch.yamlがアップされない場合は更に以下コマンドを実行する。

```shell
gcloud app deploy dispatch.yaml --project your-project-name
```
メソッドのhookは正しいタイミングで行おう【RxSwift/RxCocoa】

## メソッドのhook?
RxCocoaでは`sentMessage`と`methodInvoked`というメソッドをフックするオペレータがあり、「ある関数が呼ばれたらこの処理をしたい」ということが実現できます。　

## sentMessage
ある関数が呼ばれる直前をhookすることができます。

## 例
(数値の順番通りに処理されます)

```swift
import UIKit
import RxSwift
import RxCocoa

extension UIViewController {
    func doSomething() {
        defer { print("3") }
        print("2")
    }
}

final class ViewController: UIViewController {

    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        rx.sentMessage(#selector(UIViewController.doSomething))
            .subscribe(onNext: { _ in
                print("1")
            })
            .disposed(by: disposeBag)

        doSomething()
        print("4")        
    }    
}
```

## methodInvoked
ある関数の処理が終わった直後をhookすることができます。

## 例
(数値の順番通りに処理されます)

```swift
import UIKit
import RxSwift
import RxCocoa

extension UIViewController {
    func doSomething() {
        defer { print("2") }
        print("1")
    }
}

final class ViewController: UIViewController {

    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        rx.methodInvoked(#selector(UIViewController.doSomething))
            .subscribe(onNext: { _ in
                print("3")
            })
            .disposed(by: disposeBag)

        doSomething()
        print("4")
    }
}
```

## 面白いこと :coffee: 
`sentMessage`と`methodInvoked`はそれぞれ関数に渡ってくる引数を取得することができます。戻り値が`Observable<[Any]>`となっているため引数ラベルなどは使えませんが、引数が先頭から何番目かを指定することで引数を取得できます。

## つまりどういうことなのか? :thinking: 

使い道としては指定した関数内の同期処理が完全に終わってるタイミングを保証できるのが`methodInvoked`です。なので、指定した関数内の処理後でないと特定のプロパティが更新されていない可能性があるなどのものは全て`methodInvoked`を使います。反対に指定した関数が呼ばれたタイミングで関数内の処理とは無関係に処理したい場合は`sentMessage`を使います。

:warning: 
注意として指定した関数内に非同期処理があった場合にはそれは関数オブジェクトの生存期間と別管理となるため無視されます。`sentMessage`と`methodInvoked`の内部実装ではSelectorが呼ばれるタイミングと関数がdeallocatedされたタイミングで通知を行なっているので関数がdeallocatedになっても処理が継続するものについては通常通りcompletion等で対応するしかありません。

参考:
https://github.com/ReactiveX/RxSwift/blob/102424379fb8d6c69b33b95c67504679042f44cc/RxCocoa/Foundation/NSObject%2BRx.swift
UbuntuにCUDAをインストール

#はじめに
そろそろ DeepLearning に手を出したくて CUDA を入れることに。先人が多く、既にUbuntuにCUDAを入れる記事が多く見つかるが、記事に従ってもすんなりとインストールに成功しなかった。筆者がインストールに成功した方法をまとめるので、苦労している誰かに役立てば幸いである。

#目的
Ubuntu 16.04LTS (GeForce GTX 750搭載) に CUDA 8 をインストールする。

[Download Ubuntu](https://www.ubuntu.com/download/desktop)
[Download CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)

#CUDA Toolkit インストール方法
Ubuntu のインストールが既に完了しているとする。
##1. 事前準備
  nouveauが有効になっていると正常にインストールできないため、nouveauを無効にする。
  [CUDA Toolkit インストールマニュアル](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau)より、nouveauを無効にする方法を引用する。

1. ファイル /etc/modprobe.d/blacklist-nouveau.conf を作成し、以下の文字列を書き込む

>```Ini:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```

　
2. Initramfsを再構築する

>```Bash
$ sudo update-initramfs -u
```

　
3. 再起動

```Bash
$ sudo reboot
```
　
4. BIOS設定でUEFI無効またはセキュアブートを無効にする

##2. CUDA Toolkit インストール
1. [Download CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit) から、 runfile(local) をダウンロード
2. 2. ディスプレイマネージャが起動しているとインストールできないため、停止させる

```Bash
$ sudo service lightdm stop
```
　
3. Ctrl+Alt+F1 でCUIモードログインをし、1. でダウンロードした runfile(local) を実行してインストール
4. [Ubuntu 16.04へのCUDAインストール方法](http://qiita.com/yukoba/items/3692f1cb677b2383c983) より、パスの設定を行う。設定ファイルと設定方法を以下に引用する。 

>```Ini:~/.bashrc
export PATH="/usr/local/cuda-8.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH"
```

　
5. 再起動

```Bash
$ sudo reboot
```
　
6. GUIからログインできたらインストール完了。出来ていなかったら次に進む

##3. NVidia GPUのドライバ再インストール
[UbuntuにNvidia GPUのDriver + CUDAをInstallする(GTX1080対応版)](http://qiita.com/conta_/items/d639ef0068c9b7a0cd12) の2. 3. 4. 5. 6.を行う。2. 3. 4. 5. 6. を引用し、編集したのを以下に示す
1. 古いドライバーの削除
>
```Bash
$ sudo apt-get --purge remove nvidia-*
```

　
2. リポジトリの登録

>```Bash
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
```

　
3. 搭載GPUに適したドライバーのインストール

>```Bash
$ sudo apt-get install nvidia-375
```

ドライバのバージョンは、[Download Drivers](http://www.nvidia.com/Download/Find.aspx) で該当GPUを検索した際のバージョンになる。
　
4. 再起動
>
```Bash
$ sudo reboot
```

　
5. 確認
>
```Bash
$ nvidia-smi
```

特にエラーが出なければOK
Chrome拡張の名前でcustomizeという文字列を使ってはいけない

概要
=====

先日、公開していた Chrome 拡張の半数が急にウェブストアで見えなくなるという憂き目に遭いました。
（具体的にはウェブストアの該当ページが真っ白になってて、新規に拡張を追加してもらえなくなってた。）

この原因がわかったため回避できたのですが、Google側の問題自体はいまだ解決していないため、同様に困っている人もいるだろうと思い、共有することにしました。


結論
=====

Chrome は拡張名に `customize` という文字を使ってはいけません。
もし既に使っていて、画面が真っ白になっているなら、名前を変えれば解決です。
（URL に名前が入っているため、URL が変わります。ご注意ください。）


何が起こっているのか
===================

Chrome 拡張のページの URL 文字列の中に `customize` という文字列がどこであれ入っていると、ページが真っ白になります。
具体的には下記の JavaScript エラーが発生していてページの表示に失敗してます。

```
Refused to load the script 'https://chrome.google.com/webstore/polymer/cc_store_app/（中略）/cc_store_app.html' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-（中略）' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval'". 'strict-dynamic' is present, so host-based whitelisting is disabled.
```

内部的なページの HTML も微妙に変化します。

想像ですが、customize という隠しコマンドか何かが最近仕込まれて、それに反応して特別なページになるが、特別な環境でないとエラーが出てしまうのではないか。よく解りませんが。


簡単な再現方法
===================

興味がありましたら拡張のページの末尾に `?customize` をつけてみてください。
真っ白の画面をみることができます。
（ちなみにスマホから見た場合は正常に表示されます。）

↓サンプル (大丈夫な方)
https://chrome.google.com/webstore/detail/pre-sending-checker-for-g/amfjacgcdefoiliginkjnebdamdomeig

↓サンプル (真っ白になる方)
https://chrome.google.com/webstore/detail/pre-sending-checker-for-g/amfjacgcdefoiliginkjnebdamdomeig?customize


最後に告知
===========

2017-08-05(土) に builderscon tokyo というイベントで 「Chrome拡張を使って様々なWebサービスをハックする」 というネタで登壇します。
https://builderscon.io/tokyo/2017/session/9e8711fb-7f56-44ea-b550-0d48ff756e1d

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/29899/42de238d-a5c8-eb64-07bc-c7d3eb7f51ed.png)](https://builderscon.io/tokyo/2017/session/9e8711fb-7f56-44ea-b550-0d48ff756e1d)

ご興味ある方がいらっしゃいましたら、ぜひとも聞きにきてください。
バッキバッキに割れたiPhone6のフロントパネルを自力で交換してみた

ある日、、、酔っ払いながらiPhoneを見ていたら、手が滑って…（中略）
iPhone6が、バッキバッキに画面が割れてしまいました。
AppleCareに加入していないし、そろそろiPhone8にしようと思っていたので、自力でフロントパネルを交換してみました。フロントパネルは約３,０００円と、特にiPhone6はとてもお安いようです。

私が購入したのは、YPLANGというメーカー
http://amzn.to/2tqSj9G

![IMG_8437.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/2a6a2033-4103-c3de-05ec-0a6e3f89e639.jpeg)

###箱の中身はこんな感じ。

説明書が入っています。いきなりスタートせずに、じっくり説明書を読んで、どんな準備が必要なのかをイメージしておくと良いと思います。

![IMG_8442.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/2de523be-2d52-5ac6-776a-1a76fbc6928a.jpeg)


###個人的に、あらかじめ用意しておいた方が良いと思ったもの
- ドライヤー（接着剤を緩める）
- 大きなお盆（ネジが落ちないように）
- マスク（咳程度で飛んでしまう小さなネジなので。）
- 釣り具や化粧品などを入れる道具箱（ネジの長さが微妙に異なるので混ざらないように。）
- カメラ（分解したものを、同じように順番ずつ戻すので、分解する前に写真を撮るとよい）

###分解風景

![DSC03799.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/953d3e0b-aa3f-a9d1-4d2d-c9cf7977f3ad.jpeg)

![DSC03800.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/621e5887-c478-dcf1-4eff-44bff96f406a.jpeg)

![DSC03801.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/1f6d17c3-d059-f12e-323d-1379594b35ef.jpeg)

![DSC03802.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/e1c3db1d-ace1-a01f-1a80-236c051c9503.jpeg)

![DSC03803.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/34e3c322-8077-239b-6b28-db763ac0e170.jpeg)



![DSC03807.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/44ce5a42-ce78-68cb-0132-1af5aac37583.jpeg)

![DSC03808.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/8442927d-8af0-293a-1c1c-ca97475f0037.jpeg)

![DSC03809.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/0a9bc4b4-fbf6-4eee-22e5-d0cb6326203e.jpeg)

![DSC03810.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/933d0b57-0c1b-9ef2-1619-f8b547f9c075.jpeg)

###分解し終わったら、時間を巻き戻すように、新しいパネルに部品を取り付けていきます

特に難しかったのは、ケーブルが重なっている部分。部品が幾重にもなっているのですが、重ねる順番を忘れてしまうので、YouTubeの動画を参考に元に戻しました。


下が、修理後のパネル。たぶん業界の人でなければ、純正のものと見分けがつかないほど発色や解像度が良いです。修理時間は、約１時間。２〜３回修理を経験すれば１５分くらいで修理できるかもしれません。

![DSC03814.JPG](https://qiita-image-store.s3.amazonaws.com/0/190178/1711e60e-85ed-c95b-b35f-2fb5611380b5.jpeg)

再掲：YPLANGのフロントパネル
http://amzn.to/2tqSj9G

おわり。
Githubで使うgif動画をなるべく高品質で書き出す

#はじめに
GitHubで使うgif動画をなるべく高品質で生成するための手順について備忘のためにメモします。

品質のためにパレットを適用するのですが、この一手間をかけないと仕上がりがザラザラになってしまいます。

#手順

###1. 元の動画を作成します。
　仮に、"SwiftyPickerPopover_movie.mov"というファイル名のmovファイルがあるとしましょう。
　QuickTimePlayerやSnapz Pro xを利用して生成したものです。

###2.  品質のために変換用パレットを作ります。
(ffmpegを利用できる前提で説明します。インストールしてください。)
カレントディレクトリに"SwiftyPickerPopover_movie.mov"がある状態で、ターミルナルから実行します。

```Terminal.app
ffmpeg -i SwiftyPickerPopover_movie.mov -vf palettegen palette.png
```

このような小さな画像が生成されます。これがパレットです。
↓
![palette.png](https://qiita-image-store.s3.amazonaws.com/0/84185/90940a3f-28e9-98d0-c462-fe2822b47aff.png)

###3. パレットを使ってgifに変換します。

```Terminal.app
ffmpeg -i SwiftyPickerPopover_movie.mov -i palette.png -filter_complex paletteuse SwiftyPickerPopover_movie.gif
```

こうして生成されたgifをGithubなどで利用します。パレットは生成時のみ使うので不要です。

#比較

Before: つぶつぶザラザラ感がひどい。
![SwiftyPickerPopover_movie.gif](https://qiita-image-store.s3.amazonaws.com/0/84185/794b44d0-d0f4-2963-23bc-f9a450de2dc9.gif)

After: よりスムースな仕上がりに。
 ![SwiftyPickerPopover_movie.gif](https://qiita-image-store.s3.amazonaws.com/0/84185/a1936dae-39b6-5ed1-794d-e0fd2aa793fa.gif)

つぶつぶザラザラ感がなくなり、よりスムースな仕上がりになりました。ただし、グラデーションが段々になって見えるのは残念なところです。

#関連
[ffmpegでGIFアニメを作る](http://fftest33.blog.fc2.com/blog-entry-69.html)
[ffmpegの使い方](http://tech.ckme.co.jp/ffmpeg.shtml)
実際の例 [SwiftyPickerPopover](https://github.com/hsylife/SwiftyPickerPopover)
[BUKURO.swift]空配列

<p>関東swift勉強会2017-7 で発表した小ネタ。各言語での個数0の空配列を宣言する方法だ。</p>

<p>Java</p>

<pre><code>String[] array = new String[0];
</code></pre>

<p>C#</p>

<pre><code>string[] array = new string[] {};
</code></pre>

<p>Objective-C</p>

<pre><code>NSArray *array = [[NSArray alloc] init];
NSArray *array = @[];
</code></pre>

<p>Swift</p>

<pre><code>var array: String[] = []
var array: Array<String> = []
var array = String[]()
</code></pre>

関連情報
<a href="https://cocoa-kanto.connpass.com/event/61475/">関東swift勉強会2017-7</a><br />
<a href="https://cocoa-study.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://cocoa-kanto.connpass.com">Swift勉強会 関東 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="https://mosa.connpass.com">MOSA BUKURO.swift (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />