OmniAICreator/Qiita-1.07M huggingface dataset:
「Rails5 x Nginx x Unicorn」かんたん環境構築

### yum モジュールインストール
```bash
$ sudo yum install -y openssl-devel
$ sudo yum install -y readline-devel
$ sudo yum install -y sqlite-devel ## MySQL 使用するならいらないかも
```

### Rails アプリケーション雛形作成
```bash:
$ cd /www/
$ rails new your_app -d mysql
```

### nginx インストール
```bash
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum -y install nginx
```

### 1. unicorn の設定
```bash:/www/your_app/config/unicorn.rb
# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true  # 更新時ダウンタイム無し

listen "/www/your_app/tmp/unicorn.sock"
pid "/www/o/tmp/unicorn.pid"

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
```

### 2. nginx の設定を行います。
/etc/nginx/conf.d/ 配下は自動でロードしてくれますので、下記 "service.conf" の service の文字列は適宜変更して下さい。

```bash:/etc/nginx/conf.d/service.conf
server {
  listen 80 default_server;
}

server {
  listen 80; 
  server_name your_app.com; 

  access_log /var/log/nginx/your_app_access.log;
  error_log /var/log/nginx/your_app_error.log;

  root /www/your_app/public;

  location ~ ^/assets/ {
    root         /www/your_app/public;
    access_log   off;
    expires      max;
    add_header   Cache-Control public;
    add_header   ETag "";
  }

  error_page 404 /404.html;
  location = /404.html {
    root /usr/share/nginx/html;
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    proxy_pass http://unicorn-unix-domain-socket; # unix domain socketを使う場合
    # proxy_pass http://unicorn-tcp;              # tcpを使う場合
  }
}
```

```bash:unicornを起動
$ ./bin/bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```
これで本番環境の 80 番ポートでのアクセスが可能になります。

### 開発環境 3000 番ポートの対応
```bash:/etc/nginx/conf.d/local.conf
server {
  listen 3001; # 3001 番で受け付ける
  server_name upsnap.jp;
  root /www/upsnap;
  location / {
      proxy_pass http://localhost:3000;
  }
}
```
開発サーバ起動

```bash
$ ./bin/rails s
```

その後、http://your_domain.com:3001/ にアクセスし開発環境のページが表示されれば成功

以上の設定で環境構築が終了し、アプリケーションの開発に取り掛かる事ができるかと思います。
コマンドでjoin

##背景
データ量が大きく、Rなどで読み込めない
かつ、sqlのテーブルは作るのめんどくさいなあ　と思ってやってみました。

##やってみる
aaa.csvから、bbb.csvのなかにidが存在する行だけを抽出します。
（aaa.csvとbbb.csvをINNER JOINします）


###こんなデータです
aaa.csv

|name|age|id|
|:-----------|------------:|:------------:|
|tanaka|20|1|
|ito|16|4|
|yamada|31|6|
|sasaki|24|10|


bbb.csv

|id|name|
|:-----------|:------------:|
|1|tanaka|
|11|kondo|
|6|yamada|
|1|tanaka|
|13|ishida|


###ソート
まず、joinコマンドを使用するためには、
joinキーがソートされている必要があります。
※aaa.csvのキーは昇順になっているので今回はパス。

csvファイルの3列目を抽出して、ユニークにしてからccc.csvに格納

```
cut -d "," -f "3" bbb.csv | sort | unique >ccc.csv
```

cut の　-d オプションで区切り文字の指定(csvなので、ここではカンマ)
-f オプションで抽出する列を指定します（左から何列目か）
パイプ(|)でつないで、sortで並び替え、
パイプ(|)でつないで、重複レコードが出ないようユニークにしておきます

#####こんなデータになったはず
|id|
|:------------:|
|1|
|6|
|11|
|13|


###joinしよう
ソートが完了したのでjoinしましょう。

```
join -1 3 -2 1 aaa.csv ccc.csv
```

-1 はひとつめのデータの意味（ここではaaa.csv）の3列目
-2はふたつめのデータの意味(ここではccc.csv)の1列目


#####こんなデータになった

|name|age|id|
|:-----------|------------:|:------------:|
|tanaka|20|1|
|yamada|31|6|

aaa.csvとccc.csvの共通idのものだけ抽出できた！
Rails で resource ベースに確認画面を設計する

# 概要

Rails で確認画面を作るとき `confirm` みたいな action を定義してしまうのですが
Rail から外れている気がしてメンテナンス性を欠いているように思います.

そこで [DHH 流 Controller](http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/) をベースに確認画面を設計します

# 方針

「確認」は 登録/編集 という作業 resource の create/show であると考えます.

よって 作業 resource に対して Controller を定義する

# 例１. ユーザー登録

## Controller


```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def create
    @user = User.register!(params[:user])
  end
end
```

```ruby:app/controllers/user_registrations_controller.rb
class UserRegistrationsController < ApplicationController
  def new
    @user = User.new(params[:user])
  end

  def create
    @user = User.new(params[:user])
    unless @user.valid?
      render action: :new
      return
    end
    render action: :show 
  end
end
```

# 例2. ユーザー編集

## Controller

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    @user.revise!(params[:user])
  end
end
```

```ruby:app/controllers/users/revisions_controller.rb
class Users::RevisionsController < ApplicationController
  def new
    @user = User.find(params[:user_id])
  end

  def create
    @user = User.find(params[:user_id])
    @user.assign_attributes(params[:user])
    unless @user.valid?
      render action: :new
    end
    render action: :show
  end
end
```

# 例3. ユーザー一括編集

管理画面などで複数のユーザー情報を一括編集したい場合.
しかも確認画面を通して確認してから確定したい場合

## Controller

```ruby:app/controllers/user_bulk_works_controller.rb
class UserBulkWorksController < ApplicationController
  def new
    @user_bulk_work = UserBulkWork.new(params[:user_bulk])
  end

  def create
    @user_bulk_work = UserBulkWork.new(params[:user_bulk])
    if @user_bulk_work.valid?
      render action: :show
    else
      render action: :new
    end
  end
end
```

```ruby:app/controllers/user_bulk_revisions_controller.rb
class UserBulkRevisionsController < ApplicationController
  def update
    @user_bulk = UserBulk.new(params[:user_bulk))
    @user_bulk.revise!
  end
end
```

## 考え方

ユーザー一括作業 という resource を定義して `create` で `show.html.erb` を `render` して作業内容を表示する.

一括編集処理は `UserBulkRevisionController#update` が担う

## 今後の拡張

作業内容を好きなときに(URLを叩けば)確認したい...となった場合は `UserBulkWork` を Model　にして DB に作業内容を保持させてそれを表示する.
`show` が確認画面となる

```ruby:app/controllers/user_bulk_works_controller.rb
class UserBulkWorksController < ApplicationController
  def create
    @user_bulk_work = UserBulkWork.register!(params[:user_bulk])
    redirect_to user_bulk_work_path(@user_bulk_work)
  end

  def show
    @user_bulk_work = UserBulkWork.find(params[:id])
  end
end
```

一括編集 resource は nest して定義する

```ruby:app/controllers/user_bulk_works/revisions_controller.rb
class UserBulkWork::RevisionsController < ApplicationController
  def update
    @user_bulk_work = UserBulkWork.find(params[:user_bulk_work_id])
    @user_bulk_work.revise!
  end
end
```

# まとめ

作業に対して resource を定義することで 確認画面を 作業 resource の show と捉える
centos7 自動順位チェック serposcope インストール決定版

今まではGRCを使っていたが、GRCが値上げしたためserposcopeにする。
googleのランキングがチェックできればそれでいいし。


#javaをインストール
yum install java-1.8.0-openjdk.x86_64

#serposcope用のフォルダを作成
cd /var/www/html/
mkdir serposcope
cd /var/www/html/serposcope/

#本体ファイルを取得
wget https://serposcope.serphacker.com/download/2.6.0/serposcope-2.6.0.jar

#ポート開放 3てんセット
firewall-cmd --add-port=7134/tcp --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-all --zone=public

※まだこの時点ではポート開放チェックサービスとか使っても
開放されていないのはOK

#起動
java -jar /var/www/html/serposcope/serposcope-2.6.0.jar


#アクセス
163.44.999.216:7134

ここまでで起動できればとりあえずOK。

#DB使うように設定

vim /root/serposcope/serposcope.conf

以下を追加
your の部分は適宜変更

serposcope.db.url=jdbc:mysql://localhost/serposcope?user=your&password=your&allowMultiQueries=true

#DBを作成
serposcope を作成。
テーブルは作成する必要無し。
ここでは設定ファイルを読み込みながら起動。
毎回、起動するたびに設定ファイルを読み込む必要があるので注意。


java -Dserposcope.conf=/root/serposcope/serposcope.conf -jar /var/www/html/serposcope/serposcope-2.6.0.jar

これでテーブルが自動で作成される。
再度
163.44.999.216:7134

にアクセスして正常に動くか確認。

#永続動作
nohup java -Dserposcope.conf=/root/serposcope/serposcope.conf -jar /var/www/html/serposcope/serposcope-2.6.0.jar

このコマンドをうち、 右上の x マークよりターミナルを閉じる。
これで永続的に動作する処理が完了。

#最後に
今回ハマった点は
・ポートが開かない
これはポートを開いたあと、.jar を起動してからでないとポートが開かないので、
起動前にポートチェックツールやっても無意味。

・テーブルあるのに・・・起動できない
serposcope テーブルがあっても制約などをいじると起動することができなくなる。
よって、起動してから制約などを変更しよう。
すでに制約をいじったテーブルが有る場合は
・一度 serposopeDBのバックアップを取得（bupserposope）
・serposcopeDBを新規作成
・永続的起動をする
・serposcopeDB を削除し、 bupserposopeDB を serposcope に変更

って感じでやりましょう。
monorepo ツールメモ

Lerna 的な monorepo の管理ができるツールのメモです。

---

# [lerna](https://github.com/lerna/lerna)

もともとは [babel](https://github.com/babel/babel) の開発用に作られたツール。現在はかなり採用例が多い。

- inception: 2015

# [repo-man](https://github.com/motion/repo-man)

- 開発元: motion
- inception: 2017

# [oao](https://github.com/guigrpa/oao)

Yarn ベース

- 開発元: [個人](https://github.com/guigrpa/oao)
- inception: 2017

# [yerna](https://github.com/palantir/yerna)

Lerna + Yarn

- 開発元: palantir
- inception: 2017
Phoenix で layout を使わない方法

layout 使わずにテンプレートを書きたいときには `put_layout` に `false` を指定する

## 実装
```ex
  def home(conn, _params) do
    conn
    |> put_layout(false)
    |> render("home.html")
  end
```

または

```ex
  def home(conn, _params) do
    render conn, "home.html", layout: false
  end
```


## seealso
- https://hexdocs.pm/phoenix/Phoenix.Controller.html#put_layout/2
- http://stackoverflow.com/questions/33408394/how-to-just-load-inner-view-in-phoenix-framework
ぼくの考えた最強のタスク管理レシピ（Workflowアプリ）

Trelloで時間が来たら通知させたい！とずっと思ってたのですが、なぜか通知されない…ということから事件は起こりました。
単純に、iOSの通知設定でTrelloを完全に通知オフにしていた、というオチを除いて。

とはいえ、ですよ。
iOSの標準カレンダー、標準リマインダーもっと使いたいなーと思ったわけです。
良い使い道ないかなーと考えた結果、Workflowというアプリとの連携が一番しっくり来たので、レシピの使い方を兼ねて、ご紹介しようと思います。

当記事はiOS向けに作られています。

# 始めに

以下のアプリを入手します。

- [Workflow](https://itunes.apple.com/app/workflow-powerful-automation/id915249334)
- [Web版Trello](https://trello.com/) もしくは [アプリ版Trello](https://itunes.apple.com/jp/app/trello/id461504587?mt=8)

## Workflowとは

そもそもWorkflowとはなんぞ、という話ですが、少し前にIFTTTというアプリが便利だ！すごいぞ！と話題になり、一世を風靡したのですが、WorkflowはIFTTTのアプリ版です。
違いを以下に示しましょう。

- IFTTT
	- URLスキームや提携フォームを利用し、Webアプリやアプリ間連携を行える
	- サーバがあり、定期的にレシピを実行している
- Workflow
	- URLスキームや提携フォーム、変数、条件分岐を行い、iOSアプリ間で連携できる
	- 場合によっては文字列置換や入力させたり、選択肢を用意したりできます
	- ウィジットに配置したり、ホーム画面に置いたり、Apple Watchから実行できる

見ていただいた通り、Workflowはできることの幅が広いです。

## レシピとは何なのか

簡単に言えば、料理で言うところの調理方法が記載されたモノです。
Workflowで言えば、アプリから受け取ったデータ(画像、日付、URL、テキストなど何でも良い)をどう処理したいかを記載したものがレシピというわけです。
（最近、dockerとかでもレシピって聞くようになったんですけど、何でだろ…）

## Workflowでのレシピの作り方

実際のレシピを見ていただいた方が早いと思いますので、以下のレシピを使ってみてください。

- [標準リマインダーから全ての完了タスクを削除する](https://workflow.is/workflows/d3733839f86f4176bb2ea0fe7a938aae)
- [Trelloから今日こなすタスクを標準のカレンダーとリマインダーに登録する](https://workflow.is/workflows/3e6134ee27584e2bb369fd038877cc0e)

上は標準リマインダーで完了したタスクを単純に消し去ってくれるレシピです。
下はちょっと複雑なことを行なってますが、TrelloのBoard内のListから日付が設定されている、今日こなすべきCardを全て取得し、標準リマインダーと標準カレンダーに登録してくれるレシピです。
標準カレンダーの15分前に通知を一回、カレンダー終了予定は30分後に設定していますが、完了時刻を入力して決めていくこともできます。
だいたい何時頃からできてどれぐらいかかるっていうのはタスクによって様々なので、とりあえずこれで設定していますが、超絶便利です。（タスクの量が多くなると入力が面倒臭くなるのでこれぐらいがベスト。むしろ、重いタスクは時間を開ければ良いという発想です。）

## 実際の使い方

朝起きたらガジェットにいる、「to remind from trello」をタップします。
すると、タップした日のタスクがどさっとリマインダーとカレンダーに登録されます。
リマインダーに登録している時間になり、完了したタスクはリマインダーから完了済みにしましょう。
リマインダーから通知が届き、実施できなかったタスクも完了済みにしちゃいましょう。
実施できなかったものは、Trello上のCardに新しい日時を登録すればOKです。
夜寝る前にガジェットにいる、「Completed Remind delete」をタップして寝ます。

ビューティフォー！
過去に何やったかも一目瞭然なので、すごい助かる…。
あれっていつ何やったっけが振りかえれるんですよ、すごくないですか。
Trello単品だとListの数次第ではとんでもなく捜査量が多くなるので、Listの数をTodoとDone程度にしておき、Todoにはこなすタスクを置いていく、Doneは完了したらタスクを置いていく、ぐらいの使い方が良さそうです。

どうっすか、このレシピ。よくないっすか。
今のところ個人的な最適解ですが、もっといい改善案が欲しいっす。コメントお待ちしてます。
プロジェクト単位で使う場合はこの使い方が推奨されません。
自分担当のタスクを引っ張ってくる、ということができません。
iTerm2 + Vim：マウスでテキストを選択するとビジュアルモードになってしまうのを防ぐ

# やりたいこと

iTerm2 + Vimの環境でマウスでテキストを選択すると、ビジュアルモードでの選択になってしまう。Vimを起動していないときのように普通にテキストを選択したい。

# 対策
下記いずれかの方法でできる。
私は、mitmproxyなど他のアプリでも無効化したいので、iTerm2の方法にした。

## 方法1：iTerm2の設定

Preferences -> Profiles -> Terminal -> Enable mouse reportingのチェックを外す

## 方法2：Vimの設定

```
set mouse=
```

## 方法3：iTerm2での操作方法

Enable mouse reportingがオンであっても、Optionキーを押しながら選択することで一時的にマウスレポーティングをオフにして選択できる。
NCL > 実行時引数を使う > ncl -Q test_ncl_argument_170315 ti=314 > 変数ti

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

NCL(NCAR Command Language)関連。

実行時引数の渡し方を学習。

参考 https://www.ncl.ucar.edu/Document/Manuals/Ref_Manual/NclCLO.shtml
> % ncl nyrStrt=1900 nyrLast=1968 modelRun.ncl

試した。

```txt:test_ncl_argument_170315 
begin
	print("hello")
    print(ti)
end
```

```txt:実行と結果
$ ncl -Q test_ncl_argument_170315 ti=314
(0)	hello


Variable: ti
Type: integer
Total Size: 4 bytes
            1 values
Number of Dimensions: 1
Dimensions and sizes:	[1]
Coordinates: 
(0)	314
```

これを使って、任意のインデックスの値を取得するように検討中。
Java で NEologd の前処理 neologdn-java

ちゃお・・・†

@ragion さんの協力もあって、ついにJavaでのNEologdの前処理モジュール neologd-java をリリースしました！

## これはなに？
https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja
> 辞書データを冗長にして異表記を吸収するのにも限界がある。
> 辞書データを生成する際には以下で述べる正規化処理を全て適用しているため、 解析対象のテキストに対して以下の正規化処理を適用すると、辞書中の語とマッチしやすくなる。

と上記のページにあるように、MeCabで解析する前に正規化処理 (前処理) を行うことは重要です。そこで、JavaでのNEologdの前処理モジュール neologd-java を作りました。

## どう使うの？
### Mavenの場合
Maven Central に登録されているので `pom.xml`に下記を加えます。

```xml
    <dependency>
      <groupId>io.github.ikegami-yukino</groupId>
      <artifactId>neologdn</artifactId>
      <version>0.0.1</version>
    </dependency>
```
そして、

```java
package yukinoi.neologdn_example;
import io.github.ikegamiyukino.neologdn.NeologdNormalizer;


/**
 * neologdn-example
 *
 */
public class App
{
    public static void main(String[] args)
    {
        NeologdNormalizer normalizer = new NeologdNormalizer();
        String text = "　　　ＰＲＭＬ　　副　読　本　　　";
        String normalizedText = normalizer.normalize(text);
        System.out.println(normalizedText);
    }
}
```
のように使います。

## Contributeしたい！
以下のGitHubリポジトリで開発してます。
https://github.com/ikegami-yukino/neologdn-java

Contributions are welcome!
VMware Workstationで他のゲストOSの画面を監視する方法

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

VMware WorkstationにはゲストOSを切り替える「タブ」があるのでクリックするだけでゲストOSの切り替えができますが、常時他の(現在選択して表示・操作しているOS以外の)OSの画面を見張りたいことってありますよね。スクリーンショットを使って、他のゲストOSの画面を監視するための操作手順をご説明します。

~~あまり大きな画像(サムネイル)ではないので、インストーラー(画面)の進行状況を見るぐらいにしか役立たないかもしれませんが、とりあえずご紹介しておきます。~~

* 追記(2017/03/15): サムネイル表示領域との境界線をドラッグすることで、サムネイルを大きくすることができました(ただし、OSの表示・操作領域が圧迫されますが)。

# 操作手順

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/f7444376-fd47-45d2-26e0-474b22a619fd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/cddcfcfb-6fc4-e6b0-a3e9-b911b4c40816.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/fa374d44-fad8-4144-6ea4-3f5540b715cd.png)

# 以上です

もしかして、やっぱり・・・ご存じでしたか?
残念ながら、フルスクリーン表示モードの時は使えませんが、新規にゲストOSをインストールしている時などはこの機能を使って画面のサムネイルを見張りながら、他のゲストOSで作業したり遊んだりできますね！

細かいTIPsですが・・・知ってるとちょっと得するかもでした！

# 参考(スクリーンショットについて)

* この記事のスクリーンショットは「[Screenpresso](https://goo.gl/66wA5x)」というソフトを使って撮りました。(参考記事 ⇒ [機能はSkitch超え！画像に美しい注釈を加えられる「Screenpresso」がスゴい](https://goo.gl/66wA5x)) [※](https://goo.gl/#analytics/goo.gl/66wA5x/all_time)
* また、この記事を書く際には、スクリーンショットを画像ファイルに保存することなくクリップボードからQiitaに画像を直接(魔法で！)アップロードしました。(参考記事 ⇒ [http://qiita.com/javacommons/items/344c752ccd46f485126c](https://goo.gl/li0DFh)) [※](https://goo.gl/#analytics/goo.gl/li0DFh/all_time)

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>

```
    2017/03/19 133views
    2017/03/17 121views
```
Laravelからアップロードしてs3に格納した画像が直アクセスするとダウンロードされる

Laravelアプリのファイルアップロードからアップした画像ファイルの配信サーバーとしてAWSのS3を利用する場合、いくつか留意事項がある。

# s3バケット以下へのアクセス許可

デフォルトだと、バケット以下のファイルはpublicではないので、バケットのプロパティ設定の「アクセス許可」「バケットポリシーの編集」を設定する

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[バケット名]/*"
        }
    ]
}
```

# 格納画像ファイルのMimeType指定

Laravel側でアップロードした画像をS3に格納するには、config/filesystems.phpでs3の設定をした上で、Controllerでこんな感じ。

```
public function store($request)
{

    ...

    if ($request->hasFile('photo'))
        $stored_path = $request->photo->store('photos', 's3');

    ...

}
```

s3で公開されるURLは、Storage::url($stored_path)で得られる。

HTMLのimgタグのsrcに指定すると問題なく表示されるが、そのURLにブラウザから直接アクセスすると、MimeTypeが指定されていないので、デフォルトの「octet-stream」扱いになって、ダウンロードされてしまう。

これを回避するには同じくS3側のファイルのプロパティから、メタデータとして適切なMimeType設定をすればいいが、S3へのファイル保存時にアプリでやるには、Laravel5.4〜の場合、上のstoreメソッドをこのように書く。

```

$options = [
    'visibility' => 'public',
    'mimetype'   => 'image/jpeg'
];
if ($request->hasFile('photo'))
    $stored_path = $request->photo->store('photos', 's3', $options);

```

storeメソッドの第3引数が、filesystem Adapter（この場合s3)へ渡すオプションとなる。ちなみに visibilityは上で書いた公開設定をpublicにするという設定。

（参考）
https://laravel.com/api/5.4/Illuminate/Http/UploadedFile.html#method_store

5.3だとこれができないので困る。てか、困った方々による議論の末に、上のstoreオプションが5.4に取り込まれたよう。その経緯はこちら。

（参考）
https://github.com/laravel/framework/pull/16416

5.3で同じことをするには、UploadedFileのstoreメソッドと、そこから呼ばれるfilesystemのAdapterクラスの書き込みメソッドを自前でoverrideするような形になる。

```

public function store($requset)
{
    ...

    if ($request->hasFile('photo'))
        $stored_path = $this->_storeUploadFile($request->photo);

    ...

}

private function _storeUploadFile($uploadFile)
{
    $driver = Storage::disk('s3')->getDriver();

    $mimeType = $uploadFile->getClientMimeType();
    $stream = fopen($uploadFile->getRealPath(), 'r+');
    $path = trim('photos/'. $uploadFile->hashName(), '/');
    $result = $driver->putStream($path, $stream, [
            'visibility' => 'public',
            'mimetype'   => $mimeType
        ]);
    if (is_resource($stream)) fclose($stream);
    return $result ? $path : false;

}

```

MimeTypeの判定は UploadFileの親クラスがgetClientMimeTypeというメソッドを持ってるようなんでそれを利用。精度は知らない。
php から phantom.js を使い、透明の背景色を白にする

phpphantom.js を使ってみたが、

背景をすべて白にする
背景が透明な場合は黒にする

のどちらかになってしまう。
また、細かいところに手がとどかない。


ということで、今回は phantom.js を php から使って
背景色が 透明なら 白にしてスクリーンショットを取得します。

・まずはキャプチャスクリプト

```sc.js

var system = require('system');
var args = system.args;
var url = args[1] ;//argsは 1から始める

//console.log('dousa');


var page = require("webpage").create();


//ブラウザサイズ
page.viewportSize = {width: 1200, height: 1200};


page.open(url, function(status) {

//背景色を調べて、透明なら白にする。
page.evaluate(function() {



if (getComputedStyle(document.documentElement, null).backgroundColor === 'rgba(0, 0, 0, 0)') {
    console.log('document.documentElement backgroundColor is transparent, setting color to white');
    var style = document.createElement('style'),
    text = document.createTextNode('body { background: #fff }');
    style.setAttribute('type', 'text/css');
    style.appendChild(text);
    document.documentElement.insertBefore(style, document.documentElement.firstChild);
}



});



//任意のファイル名で保存。 絶対パスにしておかないとphpで保存時バグるので注意
    if (status === "success") {
        page.render("/var/www/html/sately.net/webroot/img/nira.png");
    }


    phantom.exit();
});




```

で、コマンドラインから

```

/var/www/html/yourdir/bin/phantomjs /var/www/html/yourdir/webroot/img/sc.js "http://yahoo.co.jp"


```

これでスクリーンショットが nira.png として保存される。

これをphp から動かす場合は

```

$cmd = '/var/www/html/sately.net/bin/phantomjs /var/www/html/sately.net/webroot/img/sc.js "http://google.co.jp"';
exec($cmd.' 2>&1', $output);


```

さらに permission denied が出る場合は、
パスを /var/www/ の代わりに /home/hideki/ みたいな感じで home から指定すると
permission エラーになるので注意すること。
社外へメール送信するときにメッセージボックスを出したい。

#やらかしましてね
社内用のメールを意図せず社外に送ってしまう人がいましてね。
「気を付けましょう」って通達来たけどクソの役にもたたんので
プログラムで確認をうながすことにしました。

#環境
使用するソフトウェア：Outlook(Microsoft Office Standerd 2010)
言語：VBA

#機能
社外へのメール送信時にメッセージを出して送信先を確認させる。

#できた

```vbnet
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Const FLAG_LOCAL = 1
    Const FLAG_EXTDOMAIN = 2
    
    Dim strInHouse As String
    Dim strOutSide As String
    Dim strMsg As String
    Dim iFlag As Integer
    Dim objRec As Recipient
    Dim strDomain As String
    '
    strInHouse = ""
    strOutSide = ""
    iFlag = 0
    
    'ドメインを確認
    For Each objRec In Item.Recipients
        ' ドメイン部を切り出し
        strDomain = Mid(objRec.Address, InStr(objRec.Address, "@") + 1)
        
        If strDomain = "local.co.jp" Then
            '自社
            iFlag = iFlag Or FLAG_LOCAL
            strInHouse = strInHouse + objRec.Name
        Else
            '他社
            iFlag = iFlag Or FLAG_EXTDOMAIN
            strOutSide = strOutSide + objRec.Address + vbNewLine
        End If
    Next
    
    'メッセージ表示
    Select Case iFlag
        
        Case FLAG_LOCAL
            strMsg = strMsg + "社内のみの送信です"
        
        Case FLAG_EXTDOMAIN
            strMsg = strMsg + "社外ドメインへの送信です" + vbNewLine
            strMsg = strMsg + vbNewLine + "[社外]" + vbNewLine + strOutSide + vbNewLine
        
        Case FLAG_LOCAL Or FLAG_EXTDOMAIN
            strMsg = strMsg + "社内および社外への送信です" + vbNewLine
            strMsg = strMsg + vbNewLine + "[社内]" + vbNewLine + strInHouse + vbNewLine + "[社外]" + vbNewLine + strOutSide + vbNewLine
   
    End Select
    
    strMsg = strMsg + "[!!!注意!!!]" + vbNewLine + "社外に送信するときは、情報システム規則により" + vbNewLine + "上司を送信先(宛先/CC/BCC)に加える必要があります"
    
    If iFlag <> FLAG_LOCAL Then
        
        Dim rc As VbMsgBoxResult
        rc = MsgBox(strMsg, vbOKCancel)
        
        If rc = vbCancel Then
            Cancel = True
        End If
    End If
End Sub
```

###ところで
コードのシンタックス対応にVBAってないんだね
Rails + slimの環境でGretel使おうとすると、'<Gretel::Renderer...>'のように中身が出ちゃう

Rails使ってて、テンプレートエンジンにslimを採用して進めてたら、Gretel(パンくずリストのgem)を使うときに問題が発生した。

パンくずリストが表示されている辺りに以下のようにオブジェクトの中身が出現。

```
<Gretel::Renderer:0x007fdf69e6a8c0>
```

これは自分がslimを理解してなかったことで発生してた。

結論から言うと以下の変更で解決。

```
= breadcrumb :users
↓                 
- breadcrumb :users
```

GretelはERBの場合、テンプレートに以下のような記述をすることでパンくずが表示される。

```
<%= breadcrumb :users %>
```

なので、slimだと以下のようになる。

```
= breadcrumb :users
```

しかし、slimだと中身が出ちゃう。(ERBでやってないので、もしかしたらERBでも同じ...?)

そもそも、ERBは `<%= >` のようにイコールをつけると、中身を評価した結果をHTMLとして表示してしまう。
それはslimも同じで `= breadcrumb :users` と書くことで、Gretelのオブジェクトがそのまま出ちゃってる。

なので、評価した結果をHTMLとして表示しない書き方、ERBでいうと以下の記述。

```
<% breadcrumb :users %>
```

これをslimで書くと

```
- breadcrumb : users
```

このように書けば、中身は出ない。

以上だす。


追記

・公式のドキュメントに ERB の場合でも イコールはつけないよう書いてあるみたいです。
Rails x HerokuでPDF出力した時に「𠮷」を表示する方法


# はじめに

Railsでサービスを作っていると印刷を前提とした帳票を作ることがあります。
そんな時には、便利なGemを使えば簡単に実装することができます。
しかし、一部の文字がPDFで表示されない問題に遭遇しました。
今回はその時の解決方法を書きたいと思います。

# 今回の環境

```
Rails (4.2.7.1)
wkhtmltopdf-binary-11 (0.1.0)
wicked_pdf (1.1.0)
```

# PDFで表示されなかった文字は?

それは、「𠮷」という文字です。
「つちよし」と呼ばれたりするようです。
「吉（きち）」ではなく、上が「土」になっています。

この「𠮷」という文字が厄介なのがWeb画面で見たときには正しく表示されます。
しかし、PDFで表示すると文字がまるごと消えてしまいます。

※ 以下は"𠮷田士郎"さんをPDF出力した結果です。
![スクリーンショット 2017-03-15 13.48.53.png](https://qiita-image-store.s3.amazonaws.com/0/4529/2d6adb9e-f1a4-8f4c-5602-49b9f42a44d5.png "スクリーンショット 2017-03-15 13.48.53.png")



# 「𠮷」という文字について

調べてわかったのが、「𠮷」はサロゲートペアという文字のようです。
サロゲートペアについては下記の記事に詳しく書かれているので読んでみてください。

Unicode のサロゲートペアとは何か - ひだまりソケットは壊れない
http://vividcode.hatenablog.com/entry/unicode/surrogate-pair

サロゲートペアが今回の直接的な原因では無いかもしれませんが「すこし特別な文字」ということのようです。

# 解決方法はNoto Fontsを指定する

いきなり解決策に行くとNoto Fontsを入れてCSSでfont-familyを指定してあげると正しく表示されるようになりました。

Noto FontsはGoogleが提供するフォントファミリーです。
このフォントファミリーには日本語も提供されています。

Noto Sans CJK JP
https://www.google.com/get/noto/#sans-jpan

上記のフォントをダウンロードします。

注意すべき点としてはローカルの開発環境とHerokuではフォントの保存先が異なります。
ローカルの開発環境は「~/Library/Fonts」配下にダウンロードしたフォントを入れます。

```ローカル開発環境
~/Library/Fonts
├── NotoSansCJKjp-Black.otf
├── NotoSansCJKjp-Bold.otf
├── NotoSansCJKjp-DemiLight.otf
├── NotoSansCJKjp-Light.otf
├── NotoSansCJKjp-Medium.otf
├── NotoSansCJKjp-Regular.otf
├── NotoSansCJKjp-Thin.otf
├── NotoSansMonoCJKjp-Bold.otf
├── NotoSansMonoCJKjp-Regular.otf
```

Herokuでは「RAILS.root/.fonts」配下にダウンロードしたフォントを入れます。

```Heroku
.fonts
├── NotoSansCJKjp-Black.otf
├── NotoSansCJKjp-Bold.otf
├── NotoSansCJKjp-DemiLight.otf
├── NotoSansCJKjp-Light.otf
├── NotoSansCJKjp-Medium.otf
├── NotoSansCJKjp-Regular.otf
├── NotoSansCJKjp-Thin.otf
├── NotoSansMonoCJKjp-Bold.otf
├── NotoSansMonoCJKjp-Regular.otf
└── ipaexg.ttf
```

Herokuではfontconfigに対応しているのでデフォルトのフォントディレクトリが.fontsになるようです。

herokuで日本語フォントを奇麗に使うには？ - Qiita
http://qiita.com/ssuzuki@github/items/58be855f909f29c05ae6

# CSSでNoto Fontsを指定

あとはPDFに適用するCSSでNoto Fontを指定してあげると「𠮷」が正しく表示されます。

``` app/assets/stylesheets/pdf.sass
@font-face
  font-family: 'Noto Sans JP'
  font-style: normal
  font-weight: 400
  src: local('Noto Sans CJK JP')
  
html
  font-family: 'Noto Sans JP', sans-serif
  text-rendering: optimizeLegibility
```

※ 以下は"𠮷田士郎"さんをPDF出力した結果です。
![スクリーンショット 2017-03-15 13.48.34.png](https://qiita-image-store.s3.amazonaws.com/0/4529/fd9c18b1-38c3-7cda-8234-3cb68762b836.png "スクリーンショット 2017-03-15 13.48.34.png")


# おまけ

今回のNoto Fontsの指定をWebフォントとして読み込もうと試みたんですが、結果としてはローカル開発環境では表示できたが、Herokuでは「𠮷」が表示されませんでした。
CSSを見る限りはNoto Fontsが適用されてはいたのですが原因が特定できず断念しました。https or http周りが怪しい気はしていますが、何かご存知の方がいればコメントで教えてください。
wordmoveを使ってwordpressのソースコードを持ってきてテーマの編集を行う。

レンタルサーバーの自動インストールやらサーバーで直接wordpressを置いたりした後に「この部分の表示を調整したい」時が多々ある。wordpressの管理画面上からテーマの表示調整は可能だが、テーマの更新があった時に調整した分が消えてしまう。「そうならないように子テーマを作りましょう」とは言われるのは解ってはいるのだが何だか面倒に思えた。

だけど実際に手順をまとめて見たら1コマンド打つだけなのでとても簡単でした。手順を忘れるためにも書いておく。

ちなみに公開環境からローカル環境に持って来て表示確認するのを目的としているが、本番環境で子テーマを作るコマンド1つ打って子テーマの編集を直接やるのもありかもしれない。Windowsだとローカル環境の構築が面倒だからそれやる人もいるかもだけど当方Mac、Windowsユーザーはそこらへん読み替えて実行してください。vccwとかがいいのかな。Macならvccwなくても開発可能。

    gem i wordmove
    wordmove init
    vi Movefile

```
local:
  vhost: "http://localhost:8080"
  wordpress_path: "/current/path/wp" # use an absolute path here

  database:
    name: "wordpress"
    user: "root"
    password: ""
    host: "127.0.0.1"

production:
  vhost: "https://example.com"
  wordpress_path: "/home/example/example.com/public_html/wp" # use an absolute path here

  database:
    name: "wp_db"
    user: "wp_user"
    password: "pass"
    host: "wp_host"
    # port: "3308" # Use just in case you have exotic server config
    # mysqldump_options: "--max_allowed_packet=1G" # Only available if using SSH

  exclude:
    - ".git/"
    - ".gitignore"
    - ".sass-cache/"
    - "node_modules/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "wp-config.php"
    - "wp-content/*.sql"

  # paths: # you can customize wordpress internal paths
  #   wp_content: "wp-content"
  #   uploads: "wp-content/uploads"
  #   plugins: "wp-content/plugins"
  #   mu_plugins: "wp-content/mu-plugins"
  #   themes: "wp-content/themes"
  #   languages: "wp-content/languages"

  ssh:
    host: "example.com"
    user: "example"
    #password: "password" # password is optional, will use public keys if available.
    port: 22 # Port is optional
    rsync_options: "--verbose" # Additional rsync options, optional
    #gateway: # Gateway is optional
    #  host: "host"
    #  user: "user"
    #  password: "password" # password is optional, will use public keys if available.

  # ftp:
  #   user: "user"
  #   password: "password"
  #   host: "host"
  #   passive: true
  #   scheme: "ftps" # default "ftp"

# staging: # multiple environments can be specified
#   [...]
```

    mysql -uroot -e 'create database wp_db;'
    wordmove pull -e production --all
    wp core config --dbname=wp_db --dbuser=root --dbpass='' --dbhost='127.0.0.1' --locale=ja_JP
    wp server

ローカル環境に持ってくるまでの手順。これで <http://localhost:8080> でアクセスが可能になる。子テーマの作成コマンドは以下 `first` のテーマを親として `first-child` の子テーマを作成するコマンド。

    wp scaffold child-theme first-child --parent_theme=first

`wp-content/themes/first-child/` が作成されるので管理画面からテーマ有効にしたり編集したいファイルを持って来て変更したりして上書きしましょう。

以下がデプロイ

    wordmove push -e production --all
PHPでTwitterに画像を投稿する処理を書く際のハマリどころまとめ

TwitterAPIと連携して、画像付きのツイートを行う処理をする際に結構はまったので、基本的な知識などをまとめました。

TwitterOAuthなどのライブラリを使う前提ですが、ライブラリのAPI連携部分がcURL経由なのであれば他のライブラリでも同じことが言えると思います。

# 参考にしたサイト
[PHPでcURLのクソ仕様 "@" を回避する](http://qiita.com/mpyw/items/c2d2f9cf67072e926721)

# 前提

-  「画像データをPOST」と「画像を添付するツイートPOST」で2回のAPI送信が必要
- 画像データはバイナリ化された実データを送る必要がある
  - `@ファイル名` 記法を使用する (PHP5.5以前)
  - [CURLFile](http://php.net/manual/ja/class.curlfile.php)クラスを使用する (PHP5.6以降)

# 画像データの指定方法

普段あまり使わない、画像の実データの送信が必要になるため、個人的に難しく感じたところです。
基本的にはCURLFileを使用する方法が良いと思います。

``` php

$connection = new TwitterOAuth($apiKey, $apiSecret, $token, $tokenSecret);

$param = [
    'media' => new CURLFile('/tmp/my/image.jpeg','image/jpeg', 'tweet.jpg')
]

$connection->postImg('media/upload', $param);

```

`media`パラメータとして、CURLfileオブジェクトを送るのがミソです。
クラスインスタンスを引数として指定しなければいけないのはちょっとライブラリの使い方として不親切な感じもしますが、もともとは `'@/tmp/my/image.jpeg'` みたいな記法で、cURL送信のファイルが指定できたために、ライブラリ側も「＠マーク付き文字列で指定してね☆」という感じでやっていた経緯があるみたいです。

# 動かない時に試してみること
## URLの指定方法がそもそもわからない

ライブラリにさらにラッパークラスを噛ませたり、MVC系のフレームワークを使用していると、そもそも画像ファイルをどう指定していいかわからなくなったりします。そんな場合は、 組み込み関数`getcwd()`を使用してみましょう。

## そもそも指定したファイルが存在しているかどうかをチェックする

一見エラーとかが帰ってこないのに、画像が投稿されない場合は、そもそもファイル指定が間違っている可能性があります。
そんな場合は、組み込み関数`file_exists()`で、curlで指定したファイルが本当に存在しているかチェックするといいでしょう。

## media/uploadの戻り値をチェックする
前述の通り、「画像アップロード」と「画像添付してツイート」の2段階になるため、うまく送信できない場合にどちらのAPIでこけたのかわからないこともあると思います。そういった場合はAPIの戻り値をチェックしましょう。


# 最近はもっと簡単にできるっぽい

今回の実装にあたって、すこし古いバージョンのTwitterOAuthを使用する必要があったのですが、
[最新のTwitterOAuth](https://twitteroauth.com/)では、Curl系のオブジェクトをこちらで使用しなくても、単に画像URLで投稿できるようになるみたいですね。

```php
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);
$media1 = $connection->upload('media/upload', ['media' => '/path/to/file/kitten1.jpg']);
$media2 = $connection->upload('media/upload', ['media' => '/path/to/file/kitten2.jpg']);
$parameters = [
    'status' => 'Meow Meow Meow',
    'media_ids' => implode(',', [$media1->media_id_string, $media2->media_id_string])
];
$result = $connection->post('statuses/update', $parameters);
```
TypeというiOS用のMarkdownエディタを作った

# TypeというiOS用のMarkdownエディタを作った

![t9MjPQIm9Db4yrim/UKy8q20DCpqrFuQT.jpg](https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/t9MjPQIm9Db4yrim%2FUKy8q20DCpqrFuQT.jpg?alt=media&token=d4a0c168-6518-4dd2-8af1-1d7bbfb82c73)


この度個人的に **Type** というMarkdownエディタをiOS用にリリースしました🎉

[AppStore](https://itunes.apple.com/jp/app/type-simple-markdown-editor/id1214613873?l=en&mt=8)

## 大まかな機能

機能はざっとこんな感じです。

- Extension対応
- 素早いプレビュー
- 自動保存
- ツールバーからMarkdownの記号を簡単入力
- 3Dタッチのサポート
- SpotlightからMarkdownの検索
- Qiitaへの投稿

Markdownのパースは `marked.js` というファイルにテキストを食わせればHTMLを吐き出してくれるのでそれをWebViewに表示してます。  
いつか独自パーサー作りたいなと目論んでいます。

また、あまり大々的に謳っては無いですが画像のアップロードにも対応しています。  
こちらはFirebase Storageに画像をアップロードする様にしています。

![t9MjPQIm9Db4yrim/2TZUgAZvyjy0H2pg.jpg](https://firebasestorage.googleapis.com/v0/b/type-c1c71.appspot.com/o/t9MjPQIm9Db4yrim%2F2TZUgAZvyjy0H2pg.jpg?alt=media&token=d997d456-de4b-456c-86e9-ace2eabdc330)

## 自分で欲しかった物を作る

作り始めた背景としては少しずつ登壇の機会が増えてきたのが大きいです。資料は基本的にMarkdownでスライドが作成出来るDecksetというアプリで作成しているんですが、MarkdownファイルをiCloud Driveに保存し、どこからでも編集出来る様にしています。  
しかし、ちょっとした時にMacをわざわざ出すのって面倒でなかなか資料の作成が捗らないので、iPhoneでも編集出来る様にしたかったのが開発を始めたきっかけです。

開発期間は凡そ半年。休日や帰宅後等の業務の合間にポチポチと進めてましたが、2016年下半期中にはリリースしたかったので後半は少し頑張りました（笑）  
今回意識したのは普段の業務ではなかなか利用する事の無いiOSの新機能をなるべく取り入れる様にする事です。  
意識しないと一生触らない可能性もあるのでこういう所でトライは必要だなと感じました。

## 苦労した事

アプリがほとんど出来てくると **もういいや** となってしまう病との闘病生活の始まりです。  
なんとか頑張ってほとんどリリース出来るかなという所まで来ると次はAppStoreに掲載する内容の調整です。  
プログラミングは楽しいんです。これまで存在しなかったものがどんどん出来上がって行き自分の思い通りに動いている。  
反対に、もう出来たものを説明したり、スクリーンショットを撮ってAppStore用の画像を作るのは普段やらない作業なので意外に心理的負担が大きいです。
今回ラッキーだったのはMarkdownアプリだったのでアプリのテストを兼ねて文章を作成出来た事です。  
基本的に文章は通勤時間を使って作成出来たので本当に **Type** を作って良かったなと思いました。  
(この記事も **Type** で書いています)

スクリーンショットに関しても最大サイズで作っておけば他のサイズて使い回し出来る様になっているので時代の進化を感じました（笑）

## 今後

会員機能を付けて端末を変えても同期出来る機能は最低限で欲しいなと思っています。  
また、Qiita以外へのアウトプットをしたいです。  
リクエストあればご連絡下さい。(可能な範囲で対応します。)  
また、オススメの `UIActivity` があれば教えてる下さい！

というわけで簡単にですが久々に1人でアプリを作ってみました！  
良かったら使ってみて下さい！

[AppStore](https://itunes.apple.com/jp/app/type-simple-markdown-editor/id1214613873?l=en&mt=8)
技術英語 > No one wants to [be left out]

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2384 / 12833)

> No one wants to **be left out**, so even sets have comprehensions.

Listがcomprehensionsを持ち、Dictionaryがcomprehensionsを持ち、Setはどうかという文章。

https://www.merriam-webster.com/dictionary/omit
> 1 :  to leave out or leave unmentioned 

別途、Generator comprehensionsもある。
自分に必要なもの。

※今回はソースコードとか技術的なことは書いてません。
今の自分は何をするべきかって考えた大ざっぱなメモです。

僕には将来的には**フリーランス**でやっていきたいっていう願望があります。

理由としては、**人の下にたたなくていいから！**

基本自分のやりたいようにしたい、明らかに自分にとっては効率がいい方法なのに、

皆こうやってるんだからこうやって！みたいなことを過去に言われたことがある。

もちろん尊敬する人とかなら下にたつのは全然かまわない。理不尽なのが嫌だ。

（まぁ気が弱くて何かあっても自分がはっきりいえないってことがほとんど）

でも現実は、**仕事がたくさん来るときもあれば、全然来ないときもある**し保険とか**その他諸々めんどくさい**部分もあると思う。

でもやっぱり**自分のやりたいように出来るっていうのは素晴らしい**ことだとおもう。

今はPythonを勉強しているけど、いろんな人の話を聞いてるうちに**あった方が良いかもしれない**って思うようになったのがいくつかあったので箇条書きする

- HTML
- CSS
- JavaScript
- Unity
- C#

今まで勉強してきたPython（まだそんなに勉強できてないが）に加えてこれらもできるようにしていこうと思う。

**HTML/CSS/Javascript**は
ホームページを自分の好きなように作るため。
フリーになればマーケティングとかも必要になるし、オリジナルの物を作れば人の目にも止まりやすいと思うから。

**Unity/C#**はこれからの時代、**AR, VR, MR**などの視覚的な物が自分が楽しいと思えるものを作れるようになるため。

**最終的にはスキルを最大限に生かして自分の作りたい人工知能を作れるくらいになりたい。**
webpack2 + Gulpで作るES2015開発環境

初めての投稿です。ちょっとずつアップデートしていきます。

<img width="1000" alt="webpack.png" src="https://qiita-image-store.s3.amazonaws.com/0/170377/d1787611-21fa-0432-c18b-9b3ac39fc373.png">

先日、バージョン1からバージョン2へアップグレードされたwebpack。
webpackは複数ファイルのJavaScriptやCSS、画像をモジュールとして扱うためのツールです。

Gitリポジトリ：
https://github.com/xpics/demo-webpack2-gulp-es2015

# セットアップ

プロジェクト用のディレクトリを作成し、package.jsonを生成する。

```
% mkdir demo-webpack2-gulp-es2015
% cd demo-webpack2-gulp-es2015
# npm init -y
```

# Gulp, webpack, webpack-stream

Gulp本体、webpack本体、GulpとwebpackをつなぐためのGulpプラグインwebpack-streamをインストールする。

```
% npm install --save-dev gulp webpack webpack-stream
% touch .babelrc gulpfile.babel.js webpack.config.js

```
## Gulpタスクを記述

gulpfileをES2015（ES6）にて記述するため、.babelrcを以下のように設定する。

```
{
  "presets": ["es2015"]
}
```

``` gulpfile.babel.js
import gulp from 'gulp';
import webpackStream  from 'webpack-stream';
import webpack from 'webpack';


import webpackConfig from './webpack.config';
gulp.task("webpack", () => {
    return webpackStream(webpackConfig, webpack)
        .pipe(gulp.dest("dist"));
});
```

## webpack設定ファイルを記述

```webpack.config.js
module.exports = {
    entry: "./src/app.js",
    output: {
        filename: "./bundle.js"
    },
    module: {
        rules:[
            {
                test: /\.js$/,
                use: [
                    {
                        loader: "babel-loader",
                        options: {
                            presets: [
                                ['es2015']
                            ]
                        }
                    }
                ]
            }
        ]
    }
}
```
Babelの動作に必要なnpmモジュールとbabelのプリセットをインストールする。

```
% npm install --save-dev babel-loader babel-core babel-preset-es2015
```

package.jsonのscript以下に追記する。

```package.json
"scripts": {
    "gulp": "gulp"
}
```

# 動作確認

## ソースファイルの準備

```./src/app.js
import sub from "./sub";

sub.hello();
```

```./src/sub.js
module.exports.hello = () => {
    alert("Say! Hello!");
}
```

## 動作確認用ファイルの準備

```./dist/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>webpack2 + Gulp でつくるES2015開発環境</title>
    </head>
    <body>
        <script src="./bundle.js"></script>
    </body>
</html>
```

## webpackの実行

```
npm run gulp webpack
```

## ブラウザにて動作を確認

```
% open ./dist/index.html
```

<img width="653" alt="webpack2 + Gulp でつくるES2015開発環境.png" src="https://qiita-image-store.s3.amazonaws.com/0/170377/f5f82bf3-0dfa-85a1-c017-c8d51912e660.png">

# 参考サイト

サンプルで学ぶwebpack 2入門：Web開発を超効率化する必須ツールの使い方 - WPJ
https://www.webprofessional.jp/beginners-guide-to-webpack-2-and-module-bundling/

Gulpで始めるwebpack 2入門
http://qiita.com/tonkotsuboy_com/items/2d4f3862e6d05dc0bea1
PlantUML で Swift のクラス図を書いてみる

PlantUML 使ったらテキストでクラス図書けて素敵やんってことで、Swift の標準ライブラリをちょっとだけ書いてみた。継承、準拠関係を見るだけなら protocol は interface (ただし、シンボルは P)、struct は class (ただし、シンボルは S)としてこんな感じですかね？

```
@startuml
' s(構造体, ...) と書くためのマクロ
!definelong s(x)
class x <<(S,orange)>> {
}
!enddefinelong

!definelong s(x,y1)
class x <<(S,orange)>> {
}
y1 <|-- x
!enddefinelong

!definelong s(x,y1,y2)
class x <<(S,orange)>> {
}
y1 <|-- x
y2 <|-- x
!enddefinelong

!definelong s(x,y1,y2,y3)
class x <<(S,orange)>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
!enddefinelong

!definelong s(x,y1,y2,y3,y4)
class x <<(S,orange)>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
!enddefinelong

!definelong s(x,y1,y2,y3,y4,y5)
class x <<(S,orange)>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
y5 <|-- x
!enddefinelong

' p(プロトコル, ...) と書くためのマクロ
!definelong p(x)
interface x <<(P,violet>> {
}
!enddefinelong

!definelong p(x,y1)
interface x <<(P,violet>> {
}
y1 <|-- x
!enddefinelong

!definelong p(x,y1,y2)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
!enddefinelong

!definelong p(x,y1,y2,y3)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
!enddefinelong

!definelong p(x,y1,y2,y3,y4)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
!enddefinelong

!definelong p(x,y1,y2,y3,y4,y5)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
y5 <|-- x
!enddefinelong

!definelong p(x,y1,y2,y3,y4,y5,y6)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
y5 <|-- x
y6 <|-- x
!enddefinelong

!definelong p(x,y1,y2,y3,y4,y5,y6,y7)
interface x <<(P,violet>> {
}
y1 <|-- x
y2 <|-- x
y3 <|-- x
y4 <|-- x
y5 <|-- x
y6 <|-- x
y7 <|-- x
!enddefinelong

' 型定義
p(Comparable, Equatable)
p(ExpressibleByIntegerLiteral)
p(SignedNumber, Comparable, ExpressibleByIntegerLiteral)
p(AbsoluteValuable, SignedNumber)
p(CustomStringConvertible)
p(ExpressibleByFloatLiteral) 
p(Equatable) 
p(Hashable, Equatable) 
p(Stridable, Comparable)
p(IntegerArithmetic, Comparable)
p(BitwiseOperations)
p(Integer, ExpressibleByIntegerLiteral, CustomStringConvertible, Hashable, IntegerArithmetic, BitwiseOperations, Equatable, Stridable)
s(Decimal, AbsoluteValuable, CustomStringConvertible, ExpressibleByFloatLiteral, Hashable, Stridable)
p(SignedInteger, Integer, SignedNumber)
p(UnsignedInteger, Integer)

@enduml
```

![test.png](https://qiita-image-store.s3.amazonaws.com/0/110491/e8c5b35c-ab8b-8094-5542-fcae882bea25.png)
Railsから外れたmigrationを再びRailsに乗せる

# Railsから外れたmigrationを再びRailsに乗せる
[渋谷.rb\[:20170315\]](https://shibuyarb.doorkeeper.jp)
kaiba @ twitter
お金がなくて居酒屋北海道には行けない :weary: 

---
# 注意
このスライドは個人の見解であり、関連する組織・業務とは無関係です。

---

# Railsのmigrationとは?
- RubyっぽくDB定義の変更を書ける
    - rails g migration xxxx
    - db/migrate/20170314123456_xxxx.rb
- DB環境構築、gitで管理

---

# migrationの仕組み
![image](https://qiita-image-store.s3.amazonaws.com/0/21799/12569789-e2a8-bbac-4a26-fd3b61b8022b.png)

---

# メリットは大きい! Railsに乗るなら是非使いたい機能の一つ！

---

# しかし

---

# `rake db:migrate`を叩かず`alter table`でお願いします。

---

# どうしてこうなった?

---

# migrationを知らなかった?
- migration知ってたけどalter table叩いちゃった?
- 知ってる人はいたけど、知らない人が叩いちゃった?
- Railsを効果的に使うには使い方を知ってないと難しい
- 実は他の言語で作られたDBを持ってきた?

---

# 再びmigrationできるようにしたい

---

# 作業手順
1. 開発環境で新規に`rake db:create db:migrate`して作り、migrationから作られるテーブル定義を得る
2. 現状の本番環境のテーブル定義を得る
3. 1,2を比較する
4. **なんとかして、`db:migrate`の結果が、本番と一緒なるように頑張る**

---

# テーブル定義の比較(MySQLの場合)

---

# 開発環境にて
```sql
mysql -uxxxx -p information_schema -e "
select * from COLUMNS 
where TABLE_SCHEMA = 'dev_db';" > dev_db.txt
```
- information_schema に全部入ってる

---

# 本番環境にて
```sql
mysql -uxxxx -p information_schema -e "
select * from COLUMNS 
where TABLE_SCHEMA = 'prod_db';" > prod_db.txt
```

---

# 男は黙ってdiff
```sh
diff -u dev_db.txt prod_db.txt
```

---

# …だとちょっと辛いのでGUI
macだとXcodeのFileMergeが好き。
WindowsだとWinMergeが好き。
![diff.png](https://qiita-image-store.s3.amazonaws.com/0/21799/1acdefae-2a2d-c329-525b-3707f4b37628.png)

---

# ここまではよいが…
![a_1567078_5245a8140f14c5f93ce197812d1b171a4fa9bbaa_jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/ce9e3cff-f708-d96f-fb94-291cd0a6f023.jpeg)

---

# 方針を決める。気持ちを作る。
- **本番が正しいだろ…だって動いてるし…という気持ちを強く持つ。**
- だいじょうぶなんじゃないかな。たぶんだいじょうぶだろ。

---

# 足りないmigration
migrationを作ってやる。
indexがない、制約がない、型が違う、エンコードが違う、など…。

---

# 実行されてないmigration

- 強い意志で基本捨てる。migrationファイルを消す。

---

# 実行されてないmigrationだけど…
- 本番に反映したほうが良いやつは`alter table`実行
- メモっといて別のバグ対応としてやるのも良いと思う

---

# 何度も `rake db:reset`を行い、差分がないことを確認していく

---

# 差分がなくなったら、開発環境のschema_migrationsの内容を本番環境に入れてやる
- migration実行済みの状態にしてやる
 
```sql
insert into schema_migrations
(versions) values
(20170123...),(20170124...),(20170125...);
```

---

# migration職人の夜は遅い
- 単調だが集中力のいる作業
- 精神的負担(ミスったらサービスが死ぬ可能性もある)
- こうしてひとつひとつ丁寧に作られたmigrationファイルには温かみがある。

---

# どうしてこうなった？しないためには
- Railsチュートリアルやる
- レビューする
- 誰でもDBに`alter table`できる状態にしない

---

# Thanks!
[Shibuya.rb](https://shibuyarb.doorkeeper.jp)

---

# 逆にQuestion
- RailsじゃないアプリのDBをRailsでも見たい。
- そんなことしちゃダメ?

![image](https://qiita-image-store.s3.amazonaws.com/0/21799/e6c87224-57ed-7ecf-b5a4-76b72402f0fa.png)

---

# 勉強会あとにもらったアドバイス
- 本番が正なら`rake db:schema_dump`というのがあり、本番のmigrationを作り、それをｶﾞｯと正としてしまうのもいいかも。
- RailsのDBは、id、updated_at、created_atは必須ではない。RailsじゃないDBを見るのもありだと思う。
【Java】新しいThreadの生成方法その②

＃①に続き

①が継承という方法のため、利用上色々不便がある。その替わりに、②の方法の方がスレッド生成する際に多く使われているだろう。

方法②：　Runnableインターフェースを実装したクラスを利用してスレッドを作成する

ステップとしては：

・runnableインターフェースを実装したサブクラスを作成
・run()メソッドのオーバーライド
・作成したrunnableクラスのインスタンス化
・生成したrunnableインスタンスを引数に、Threadのコンストラクタで新しくThreadのインスタンスを生成する
・Threadのインスタンスでstart()メソッドを呼び出し

実際書いてみた：
public class ThreadTest2 implements Runnable{

	@Override
	public void run(){
		for (int i = 0; i < 5; i++){
			System.out.println("新規のスレッドから出力します");
		}
	}
}

public class Sample2 {

	public void main (String[] args){
		ThreadTest2 th1 = new ThreadTest2();
		Thread thread = new Thread(th1);
		thread.start();
		
	}
}

ここでポイントとなるのが、
Thread thread = new Thread(th1);

上記のコードは、Threadクラスのコンストラクタを利用し、新しくスレッドを生成する方法である。
runnableインターフェースを実装したクラスを引数にすれば、新しくThreadクラスを生成することができる。

Thread(Runnable target) 
          新しい Thread オブジェクトを割り当てます。

Threadクラスが新しくできれば、残りは①と同じく、start()メソッドでスレッドを起動し、スケジューラに実行を任せるだけ。
【Java】新しいThreadの生成方法その①

Javaで新しいスレッドの生成方法について、ちょっと難しかったので、自分なりにまとめてみた。

方法①：　Threadクラスを継承してスレッドを生成する

ステップとしては、以下のように：
・Threadクラスを継承したサブクラスを作成
・run()メソッドのオーバーライド
・作成したサブクラスのインスタンス化
・生成したインスタンスでstart()メソッドの呼び出し

継承したThreadクラスは、Runnableインターフェースを実装したクラス。
ドキュメントではこう定義している：
public class Thread
extends Object
implements Runnable

*link: https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html

実際書いてみた：

```java
//継承するクラス
class ThreadTest1 extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("新規のスレッドから出力します");
		}
	}
}

//呼び出しする側
public class Sample1 {

	public static void main (String[] args){
//インスタンスの生成

		ThreadTest1 th = new ThreadTest1();
//start()メソッドを実行し、スレッドが生成され、実行可能状態になる

		th.start();

		System.out.println("mainスレッドが終了します");
	}
}
```

実行結果：

```text
【
mainスレッドが終了します
新規のスレッドから出力します
新規のスレッドから出力します
新規のスレッドから出力します
新規のスレッドから出力します
新規のスレッドから出力します
】
```

☆ここでポイント：
run()メソッドが直接呼び出されていないが、start()により、新しくできたスレッドが実行可能状態になり、それがスケジューラにより実行状態にされた場合、run()メソッドが実行されるわけ。
つまり、start()で新しいスレッドをキックしたと思いきや、実は起動しただけ。実際の実行はスケジューラに委ねられている。
Mapの中身をfor文を使って取得する方法　備忘録

## 概要
　学習サイトの課題を解くうえで、Mapの内容を取得する方法をいろいろ調べながらやったので、備忘録としてまとめてみました。


以下の内容を取り出していきます。

```java
       Map<String, String> fruit = new LinkedHashMap<String, String>();
       
       fruit.put("りんご", "apple");
       fruit.put("みかん", "orange");
       fruit.put("ぶどう", "grape");
       fruit.put("バナナ", "banana");
```

## keyのみを取得
 `keySet()`を使います。

```java
       for (String japanese : fruit.keySet()) {
           
           System.out.println(japanese);
           
       }
```

結果は以下の通りです。

```text
   りんご
   みかん
   ぶどう
   バナナ
```

## valueのみを取得
 `values()`を使います。

```java
       for (String english : fruit.values()) {
           
           System.out.println(english);
           
       }
```

結果は以下の通りです。

```text
   apple
   orange
   grape
   banana
```

## keyとvalueを取得
 `entrySet()`を使います。

```java
        for (Map.Entry<String, String> fruitName : fruit.entrySet()) {
            
            System.out.println(fruitName.getKey() + "は、英語で" + fruitName.getValue());
            
        }
```

結果は以下の通りです。

```text
   りんごは、英語でapple
   みかんは、英語でorange
   ぶどうは、英語でgrape
   バナナは、英語でbanana
```




非常に簡単なまとめ方になってしまいましたが、今回は以上です。

この他にも方法はあると思いますが、今後勉強していきたいと思います。
SQL Workbench/J を複数起動する

#SQL Workbench/J でウィンドウを二重に開く
- `File` > `New Window`

![NewWindow.png](https://qiita-image-store.s3.amazonaws.com/0/126976/940d1a65-dcc0-2cde-0fb1-25f32165d3e0.png)

これだけ！
同時に異なるデータベースに接続して作業したいときに重宝。
Hyper-V 仮想マシンのオフラインパッチ適用

Windows 10 / Windows Server 2016 では更新プログラムが累積的な更新プログラム（CU）として提供されるようになり、適用状態の管理はしやすくなったものの Windows Update からアップデートを実行するとネットワークが異常に重くなることがあります。自宅の仮想環境でしばしばありました。

Windows Update でアップデートするのではなくて、Microsoft Update Catalog から CU をダウンロードしてきてローカルで適用したほうがネットワークを圧迫せず、結果的に適用も早く終わったので、なるべくオフラインでアップデートするようにしてます。仮想マシン上に CU を配置してダブルクリックして適用しても良いのですが、せっかくなのでオフラインで適用する PowerShell スクリプトを作ってみました。

# 最新 CU のダウンロード
Hyper-V への OS インストールが終わったら、最新の CU をダウンロードします。最新の CU はここから確認できます。

[Windows 10 および Windows Server 2016 の更新履歴](https://support.microsoft.com/ja-jp/help/4000825)

上記のページで KB 番号を確認したら、Microsoft Update Catalog から検索して該当の CU をダウンロードします。

[Microsoft Update Catalog](https://www.catalog.update.microsoft.com/home.aspx)

ダウンロードしたファイルは Hyper-V サーバーの適当な場所に置いておきます。

# オフラインパッチ適用
CU の適用には DISM を使います。VHD をマウントして CU を適用してコミットしてアンマウントする、という一連の流れを簡単ですが PowerShell スクリプト化します。

```ps1:offlinePatch.ps1
param(
    [Parameter(Mandatory=$true)]
    [string]
    $VhdPath,

    [Parameter(Mandatory=$true)]
    [string]
    $MountDirectory,

    [Parameter(Mandatory=$true)]
    [string]
    $UpdateFilePath
)

DISM /Mount-Image /ImageFile:$VhdPath /Index:1 /MountDir:$MountDirectory
DISM /Image:$MountDirectory /Add-Package /PackagePath:$UpdateFilePath
DISM /Unmount-Image /MountDir:$MountDirectory /Commit
```

\$VhdPath には仮想マシンの VHD ファイルのパスを、\$MountDirectory にはマウント用のフォルダーを、\$updateFilePath には Microsoft Update Catalog からダウンロードしてきた更新プログラムファイルのパスを指定します。（ファイルを Shift キーを押しながら右クリックして「パスのコピー」を選択すると簡単にフルパスがコピーできます）マウント用のフォルダーは適当に空のフォルダーを作って指定してやれば OK です。仮想マシンはシャットダウンしておいてください。

```ps1
.\offlinePatch.ps1 -VhdPath <vhd ファイルのパス> -MountDirectory <マウント用フォルダーのパス> -UpdateFilePath <更新プログラムファイルのパス>
```

CU はサイズが大きいので適用には時間がかかります。お茶でも飲んで待ちましょう。当たり前ですが壊れたら困る仮想マシンの場合は適用前に VHD のバックアップを取っておきましょう。

# まとめ
累積的な更新プログラムになってサーバー管理者的には管理しやすくなって良いのですけど、もうちょい安定するとよいですな。
サーバ【自分用】


###Listenされているポートの確認

```
netstat -tlnp
```

###プロセスが完全であるか確認

```
ps auxwwwf | grep -i "httpd"
```

※nginxを使用している場合

```
ps auxwwwf | grep nginx
```


###同時接続数の上限に引っかかっていないか確認

```
ps axuxwwwf | grep httpd
grep -i "include" /etc/httpd/httpd.conf
netstat -tanp | grep -i "ESTABLISH" | wc -l
```

###データベースの処理時間の確認

```
top -d 1
```

どのプロセスがCPUを使用しているか確認

```
mysql -u root -p
ERROR 1040 (00000): Too many connections
```
VSCodeでファイルを開いた時にタブが上書きされる問題を回避する

# はじめに
VSCodeを使っていると、新しいファイルを開く時に現在のタブが上書きされて表示される場合があるのでなんとか回避したい。

どんな現象かは以下のリンク先のGIFアニメを見ると分かりやすい。
[Visual Studio Codeの謎ペインの仕様はユーザ離れを起こす原因となり得そうな件 - 文系プログラマによるTIPSブログ](http://www.bunkei-programmer.net/entry/2015/11/25/190000)

# 対処方法
上書きされるタブはファイルの中身をちら見するためのPreview modeで開かれている。
そのため他のファイルを開こうとすると、ちら見していたタブが上書きされ新しいファイルの中身が表示される。
現在のタブがPreview modeで開かれているか知りたい場合は、タブのタイトルがイタリックになっているかをチェックする。

この挙動を回避する為には以下のいずれかを行う。

- ファイルをダブルクリックして開く
- 設定に`"workbench.editor.enablePreview": false`を追加する

# 参考
[How to config vscode to open files always in a new tab? - Stack Overflow](http://stackoverflow.com/questions/38713405/how-to-config-vscode-to-open-files-always-in-a-new-tab)
VMware Horizon 仮想デスクトップ画面の解像度の固定


接続プロトコルとしてPCoIPを使用している場合は、Horizon Client GPO(ADMテンプレート)内の 『Locked Guest Size』 にて設定が可能である。
PCoIPは接続元端末の解像度に合わせて画面を自動調整するので通常必要とならないが、
アプリケーションによっては解像度の固定が必要とされる場合があり、そういったケースで使う。

Horizon Clientに対して適用するGPOであるため、アクセス元の物理端末が所属しているドメインへGPO追加が必要となる。