OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant was unable to mount VirtualBox shared folders. 

Mastodonの開発環境を構築しようとしたところ、
下記のコマンドでGuest Additions更新してもmountができない問題があった。
$ vagrant plugin install vagrant-vbguest

環境情報
vagrant -v
Vagrant 1.9.4

VirtualBox
Version 5.1.22 r115126 (Qt5.6.2)

Windows 7 x64

vagrant vbguest --status
[default] GuestAdditions 5.1.22 running --- OK.

エラー情報
==> default: Machine booted and ready!
[default] GuestAdditions 5.1.22 running --- OK.
==> default: Checking for guest additions in VM...
==> default: [vagrant-hostsupdater] Checking for host entries
==> default: [vagrant-hostsupdater] Writing the following entries to (C:/Windows
/system32/drivers/etc/hosts)
==> default: [vagrant-hostsupdater]   192.168.42.42  mastodon.dev  # VAGRANT: d8
3a4963734989b7b4ab2b030407da34 (default) / cefc03c7-ef2f-44fa-95f0-9d2e88e61068
==> default: [vagrant-hostsupdater] This operation requires administrative acces
s. You may skip it by manually adding equivalent entries to the hosts file.
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => E:/dev/mastodon
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o rw,vers=3,tcp,uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

  fmask     =<arg> umask of regular files

いろいろ調べましたが、
こちら　http://stackoverflow.com/questions/42074246/vagrant-error-unable-to-mount-virtualbox-shared-folders-guest-additions-vboxs
と
こちら https://github.com/fideloper/Vaprobash/issues/92
を参照しながら、
Vagrantfileに下記の定義がありますが、NFSがwindowsサポートされていないので、mountできません。
    config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp']

下記2つ解決案があります。

解決案①
windowsでNFSをサポートするようなVagrant pluginをインストールすること。
https://github.com/winnfsd/vagrant-winnfsdにより vagrant-winnfsdをインストール
$ vagrant plugin install vagrant-winnfsd

解決案②
上記の定義を下記に修正すること
config.vm.synced_folder ".", "/vagrant", {:mount_options => ['dmode=777','fmode=777']}

両方とも問題が解決できることを確認しました。
また、http proxy設定する場合、vagrant-proxyconfのpluginをインストール必要です。
$ vagrant plugin install vagrant-proxyconf

設定：
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.proxy.http     = "your http proxy"
  config.proxy.https    = "your https proxy"
  config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
省略

以上。
cordova で「Failed to load resource」

#概要
今まで正常に動作していた cordva アプリが急にエラーを履き動作しなくなった

#現象
iOSアプリは正常に動くが、Androidアプリでエラーになる
コンソールログは「Failed to load resource」と出力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175762/97e41827-0017-c8fd-5a37-31a4f2e20365.png)

#対応方法
下記にありました
http://stackoverflow.com/questions/33861413/apache-cordova-failed-to-load-resource-the-server-responded-with-a-status-of-4

一旦、プラットフォームからAndroidを削除し、再度追加すると解決した

```
$ cordova platform remove android
$ cordova platform add android
```

プラグインの追加や削除、config.xmlの変更などをしたからなのか、原因はよくわかりません。
[Visual Studio Code] 言語設定の変更

Visual Studio Code の言語設定の変更方法

言語設定が英語の環境で日本語UIのVSCodeが使いたいユースケースがあったため調べたメモです。

# [一時的] 起動オプション
VSCodeにCLIでの起動時に指定する。

```console:設定例
$ code . --locale=ja 
```

# [永続] 設定ファイルで変更

起動後、コマンドパレットで `Configure Language` と入力
開いた設定ファイル( `locale.json` )内の設定を変更

```json:locale.json
{
	"locale":"ja"
}
```

# 参考
[Visual Studio Code の言語設定 - 1.21 jigowatts](http://sh-yoshida.hatenablog.com/entry/2016/04/17/120334)
RTVSでR projectが開けなくなったときの対処方法

Rのプロジェクトを含むプロジェクトファイルが開けなくなりました。タイミングはVisual Studio 2017 Preview (15.2) -> Visual Studio 2017 Release (15.2)への切り替え時なのですが、原因は判然としません。

以下こうやったら、治ったという１ケースでしかないので、参考までに。

# R Project が開けなくなったときにやること

## 再現環境

何度も入れなおしましたが、基本的にはVisual Studio 2017 (15.2) の

## なぜそうなった？

調べてみると、プロジェクトファイルが壊れたとかではなく、単純にRTVSからR ランタイムへの接続ができなくなったのが原因のようです。

例の右下のRランタイム接続プルダウンがどのランタイムとも未接続となっており、再接続というボタンがアクティブになっている状態でした（今は復旧したので、以下は通常の例ですが）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/7d890ec6-981a-96d5-a383-ae96c33ebe4f.png)

なぜこうなったかは、不明ですが、VS Preview -> RTMへの切り替え時にごっそり再インストールしたのと、背後でSQL Server VNextを入れたりが影響したのかもしれません。R3.4.0もこのタイミングだったかも？

## どうすれば治った？

ソリューション/プロジェクトを開く前にR Interactiveのみを開きます。この時点でRランタイムが接続されていないことに気づきました。ほかのランタイムはだめで、RClient 3.3.2.0 をつないだところ、うまく接続が回復し、同時にプロジェクトが開けるようになりました。

めでたしめでたし、と思いましたが、ここから、他のランタイムへの接続は今だに無理のようです。

一応似たような報告があったので、便乗しておきました。
[Cannot connect to R Workspace. VS 2017 just hangs at connection](http://developercommunity.visualstudio.com/content/problem/56316/cannot-connect-to-r-workspace-vs-2017-just-hangs-a.html)
twig で {% if hoge is defined and hoge is not empty %} ってやるのめんどくさい

```
{% if hoge|default('') is not empty %}{{ hoge }}{% endif %}
```

```
{% if hoge|default('') != ''}{{ hoge }}{% endif %}
```

```
{% if hoge|default('') %}{{ hoge }}{% endif %}
```

```
{{ hoge|default('') }}
```

```
{{ hoge|default }}
```

※ちなみに DateTimeとかに対してうっかり|default すると現在時刻が入ってしまうので注意だ
Gitでindex.lockある時pull, commit, pushできないエラー

[Screen Shot 2017-05-16 at 15.08.43.png](https://qiita-image-store.s3.amazonaws.com/0/178655/3e64072c-a5af-1a7d-70b6-f03c9c20ed05.png)


エラーの原因としては、
projectの中でindex.lockファイルがあるのでです。
index.lockファイルを削除必要です。

削除方法は!
1)　Finderで削除する方法
　 index.lockファイルはhiddenファイルタイプなのでFinderで見られないです。
    見られるため Optionを更新必要です。

2) Terminalで削除する方法
　　“rm -f .git/index.lock”を　projectPathの中で実行したらindex.lockファイル削除できます。

index.lockファイルを削除終わったらもういっかいpull, commit, pushやって見てください。
もし、出来ない場合もう一回　1 or 2　をやってください。
custom-configプラグインの利用

#概要
「info.plist」の設定値を「config.xml」から指定できるようになります

「cordova-custom-config」を利用します
基本的にはこちらに書いてある通り
https://github.com/dpa99c/cordova-custom-config

#プラグインの導入

```
$ cordova plugin add cordova-custom-config --fetch --save
```

#使い方
###config.xmlの編集
今回は「info.plist」の「Localization」を「config.xml」から指定します

```
<platform name="ios">

[その他のiosの設定がずらずら]

  <config-file parent="CFBundleLocalizations" platform="ios" target="*-Info.plist">
    <array>
      <string>en</string>
      <string>ja</string>
    </array>
  </config-file>
</platform>
```

parentの値、stringの値は、実際に「info.plist」ファイルをテキストエディタで確認して指定

ビルドを実行すれば「info.plist」に反映される

```
$ cordova build ios
```

反映された「info.plist」の一部

```
<key>CFBundleLocalizations</key>
<array>
  <string>en</string>
  <string>ja</string>
</array>
```

XCode上の表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175762/eefc7d48-a48b-8aaa-4e70-6e4cbfcd5e15.png)

#その他
「config.xml」ファイルは各 platform ごとに生成される
[プロジェクト名]/platforms/ios/[プロジェクト名]/config.xml

ちなみにplistは
[プロジェクト名]/platforms/ios/[プロジェクト名]/[プロジェクト名]-Info.plist
MySQL | データディレクトリの場所を確認する ( select @@datadir )

# 例

こんな感じ。

```bash
mysql> select @@datadir;

+-----------------------+
| @@datadir             |
+-----------------------+
| /usr/local/var/mysql/ |
+-----------------------+

```

# 環境

- mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using  EditLine wrapper








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Opsworks で EC2 インスタンスに保持されるリリースの数を制限する


## はじめに
とある Rails アプリで EC2 インスタンスの HD の容量が足りなくなり、それによってエラーが出ることがあったので、いろいろと原因はあるものの、リリースって５つも保持してなくてもよくね？となったので EC2 インスタンスに保持するリリースの数を制限しました。

## 実装
Stack の設定の中の Custom JSON に下記コードを加えるとリリースの保持数が３になる。

```
{
  "deploy": {
    "app_name": {
      "keep_releases": 3
    }
  }
}
```

## まとめ
本当はしっかりとどこで容量食ってるのかとか見た方がいいとは思いますが、
リリース数の制限したことなかったのでとりいそぎこちらやってみました。
ruby install CentOS Ubuntu

#rubyのインストール方法備忘録
rbenvを使用したrubyのインストールメモ

##CentOS
rbenvはgithubからとってくるためgitをインストールする

```
sudo yum -y install git
```

rbenvをcloneしてくる

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

pathを通す

```
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

ruby-buildをインストールする

```
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

rubyのインストールに必要なものをインストールする

```
sudo yum install bzip2 gcc-c++ openssl-devel readline-devel zlib-devel
```

rubyのバージョンを確認

```
rbenv install --list
```

rubyをインストール

```
rbenv install -v x.x.x(先ほど確認したバージョン)
```

確認

```
rbenv rehash
rbenv versions  #インストールされているrubyのバージョンを確認できる
```

使用するrubyのバージョンを設定

```
rbenv global x.x.x
```

確認

```
ruby -v
```

設定したバージョンになっていれば成功

##Ubuntu

yum -> apt-get

以上
Mina 部署 Rails (rbenv + nginx + mysql + puma)

nginx 和 mysql 环境需要事先搭好

1) 服务器上创建用户，修改登录shell为 bash `chsh deploy -s /bin/bash`

2) 添加操作机的 ssh key 到服务器上实现免密码连接

3) 安装 rbenv (请查看官方文档)

    git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    exec $SHELL
    git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    rbenv install 2.2.3

因为 cdn 被墙，所以需要修改下载地址

    find . | grep 2.2.3
    vi ./.rbenv/plugins/ruby-build/share/ruby-build/2.2.3

可以顺便禁掉 rdoc

    echo "gem: --no-ri --no-rdoc" > ~/.gemrc

ruby-build 依赖

    apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

还要安装 bundler

    gem install bundler

4) 如果部署在非用户目录，创建目录并设置权限（如 `/var/www/`）
执行 `mina init` 并修改配置文件

5) `mina setup`，然后编辑生产环境的配置文件 (如 `database.yml`, `secrt.yml`, `puma.rb` 等）
执行 `rake secret` 生成密钥

6) 添加服务器的 ssh key 到 git 仓库获取访问权限

7) 数据库手动创建

    CREATE DATABASE `rails_app` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

修改字符集

    ALTER DATABASE report
       CHARACTER SET utf8
       COLLATE utf8_general_ci

8) 配置 nginx 和 puma

9) `mina deploy`


## Puma

    # Gemfile
    gem 'mina-puma', require: false

    # deploy.rb
    require 'mina/puma'


必须 `puma.rb` 中添加下面的配置才能够通过 mina 来重启 puma

    state_path "#{application_path}/shared/tmp/sockets/puma.state"
    activate_control_app "unix://#{application_path}/shared/tmp/sockets/pumactl.sock"

参考

* http://ruby-journal.com/digesting-pumactl/
* https://github.com/sandelius/mina-puma/issues/11


## 自定义任务

通过依赖 environment 加载 ruby 和 bundle

    desc "rake db:seed"
    task :seed => :environment do
        queue "cd #{deploy_to}/#{current_path}"
        queue "bundle exec rake db:seed RAILS_ENV=production"
    end
そもそもHTMLのコメントってどう書けばいいんだ？～ハイフンNGなんて知らなかった～

#コメントとは？
**ブラウザでは表示されない**、HTML内で書き込んで置ける**メモ**のことです。
一旦非表示にしておきたい内容や、保守や引継ぎの為に注意書きとして残せるものです。

##コメント構文
```html:一行コメント
<!-- コメント -->
```

```html:複数行コメント
<!--
コメント
複数行も書けます
-->
```

#HTML4.0以降、コメントはハイフンNG

```html:NG構文
<!-- ----- コメント -------------------------------------------------- -->
<!-------- コメント --------------------------------->
```

##コメントアウトの中でハイフン使っちゃダメなの？
**コメントの中でハイフン"-"は使用できません。**
数年間そうと知らず、ついつい書いてしまっていました……。
HTML2.0ではハイフンを使うことが許されていましたが、HTML4.0以降はハイフン使用を避けるようにと勧告されました。
これはHTMLのもとになったSGMLに由来しているそうです。
>A common error is to include a string of hyphens ("---") within a comment. Authors should avoid putting two or more adjacent hyphens inside comments.
[W3CによるHTML4.0勧告：3.2.4 Comments の項目](https://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.4)

エラーの原因になる可能性があるため、使用を控えるようにとのことですね。
理由として、**ハイフンの連続をコメントの終了と解釈するブラウザがある**からなどが挙げられるそうです。

#これなら大丈夫

```html:構文
<!-- ========コメント================================================ -->
<!-- ▽▽▽▽コメント▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ -->
```
Online Compilerについて

# Online Compilerについて

サイト構築で、オンラインでコード入力とオンラインコンパイルをする必要があって、いろいろ調べながら自分の懸念も書いて起きます

## Security issue

* システムコールで環境、コマンド実行が可能じゃないか

```
# pathの内容が丸見え
import os
print os.getenv('PATH')

# user detial
import subprocess
print subprocess.check_output(['id'])
```

* bridgeになる可能性は

```
# url 訪問するか
import urllib.request
print urllib.request.urlopen('http://template.com')
```

* 言語バージョンの脆弱性をつく攻撃

## 既存のサービスがとっている体制

### [Codepad](http://codepad.org/about)

* chrootでroot監獄を作る
    * [chroot module](https://github.com/mh5/simple-chroot)
* ptrace supervisor
    * [supervisor](http://supervisord.org/)
    * [ptrace supervisor](https://github.com/paf31/supervisor)
* heavy firewall 


## その他

* Virus制作

```
# 簡単な例
無駄なバイトを生成するviursを作った場合どうなる、65535 * 10^10 bit
```

* ... (思いついたら書く)
ssh2のextensionをphp７にインストールする方法

 
ssh２ extensionを PHP7にインストールした手順です。

## 必要ライブラリ

すでにこの辺のライブラリがある場合は重複ですが

```
yum install make gcc glibc-devel zlib-devel openssl-devel php-devel
```

## libssh2のインストール

```
wget https://libssh2.org/download/libssh2-1.8.0.tar.gz
tar vxzf libssh2-1.8.0.tar.gz
cd libssh2-1.8.0
./configure
make
sudo make install
```

## ssh2-1.0のインストール

```
wget https://pecl.php.net/get/ssh2-1.0.tgz
tar vxzf ssh2-1.0.tgz
cd ssh2-1.0
phpize
./configure --with-ssh2
make
sudo make install
```

インストール後は以下のディレクトリに配置されます

```
/usr/lib64/php/modules/
```

## extensionに追加

```
echo "extension=ssh2.so" > /etc/php.d/ssh2.ini
```


めでたし

```
php -m | grep ssh2
ssh2
```


ちなみによくあるpeclでやるとErrorになったので・・・。
そりゃ、php7ですものね。

```
sudo pecl install -f ssh2
warning: pecl/ssh2 requires PHP (version >= 4.0.0, version <= 6.0.0), installed version is 7.0.19
downloading ssh2-0.13.tgz ...
Starting to download ssh2-0.13.tgz (28,984 bytes)
.........done: 28,984 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version:         20151012
Zend Module Api No:      20151012
Zend Extension Api No:   320151012
libssh2 prefix? [autodetect] :
building in /var/tmp/pear-build-rootCu926Z/ssh2-0.13
running: /var/tmp/ssh2/configure --with-php-config=/usr/bin/php-config --with-ssh2
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
checking for icc... no
checking for suncc... no
checking whether cc understands -c and -o together... yes
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for PHP prefix... /usr
checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib
checking for PHP extension directory... /usr/lib64/php/modules
checking for PHP installed headers prefix... /usr/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking for ssh2 support... yes, shared
checking for ssh2 files in default path... not found
configure: error: The required libssh2 library was not found.  You can obtain that package from http://sourceforge.net/projects/libssh2/
ERROR: `/var/tmp/ssh2/configure --with-php-config=/usr/bin/php-config --with-ssh2' failed

```
Unity でスクリプトやプレハブを参照しているプレハブを検索する

# はじめに

* Unity でスクリプトやプレハブの meta ファイルに記載されている guid を利用して参照しているプレハブを検索するコマンドのメモ
* mac で Unity の meta のフォーマットが force text に設定されている環境を想定している

# コード

```sh:find-prefab.sh
#!/bin/sh
GUID=$(find . -name ${1}.meta | xargs perl -lne 'if (m/guid: (.*)/) { print $1; }')
find . -name '*.prefab' | xargs -n 10 grep $GUID 2>/dev/null
```

# つかいかた

* スクリプトやプレハブの名前を渡して検索する

```sh
$ find-prefab.sh UILabel.cs
```
[Git LFS][Gitlab][Windows] Git LFSの環境作成

Git LFSの環境作成方法メモ

# 環境作成
## Git for Windows のインストール
Git本体として、本記事では `Git for Windows` をインストールします。

[Git for Windows](https://git-for-windows.github.io/)

## Git LFS のインストール
`Git LFS` はGit標準機能ではないため、別途インストールする必要があります

[Git Large File Storage | Git Large File Storage (LFS) replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents on a remote server like GitHub.com or GitHub Enterprise.](https://git-lfs.github.com/)

```bash:git-lfsの初期設定
$ git lfs install
```

# 既存のGit LFSを使用したリポジトリのクローン

```bash:
$ git lfs clone <gitリポジトリ>
```

TODO: 公式ドキュメントではSSH経由でのクローンが出来ると記載されているが、どうもできない様子(503エラーになる)

# 使用方法
## 特定の拡張子のトラッキング

```bash:特定の拡張子のトラッキング
$ git lfs track "*.so"
```

## Git LFSの管理対象の確認

```
$ git lfs ls-files
```

# 参考
[Git LFS - GitLab Documentation](https://docs.gitlab.com/ee/workflow/lfs/manage_large_binaries_with_git_lfs.html)
[GitLab Git LFS Administration - GitLab Documentation](https://docs.gitlab.com/ee/workflow/lfs/lfs_administration.html)
Ruby の ObjectSpace を利用して、オブジェクト名からクラスオブジェクトを探す

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/09/22/000000)からの転載です。

Ruby で例えば `"String"` という文字列からその名前の__クラスオブジェクト__を取得したい場合があるとします。
そういう場合は `ObjectSpace` から逆算して検出することができます。

```ruby
# クラスオブジェクトの一覧を取得する
classes =ObjectSpace.each_object(::Class)

# クラスオブジェクトの一覧から該当するクラスオブジェクトを探す
target = "String"
result = classes.find { |klass| klass.name == target }
p result == String
# => truk
```

また、Rails では `String#constantize` というメソッドが定義されており、上記と同等の機能があります。

```ruby
"String".constantize   
# => String
```


## [参照]
http://railsdoc.com/references/constantize
git の merge, rebase, revert で衝突した際の ours, theirs はどんな状態になるか

# はじめに

* 他のブランチを merge しようとしてコンフリクトした時、他のブランチを rebase しようとしてコンフリクトした時、他のブランチの merge を revert しようとしてコンフリクトした時、それぞれ `git checkout --ours` と `git checkout --theirs` した際にファイルがどのブランチの状態になるかを確認した。

# 先に結論

* 他のブランチを merge しようとしてコンフリクトした時
  * ours: 現在のブランチの状態になる
  * theirs: merge しようとしているブランチの状態になる
* 他のブランチを rebase しようとしてコンフリクトした時
  * ours: rebase しようとしているブランチの状態になる
  * theirs: 現在のブランチの状態になる
* 他のブランチの merge を revert しようとしてコンフリクトした時
  * ours: merge 後に変更した状態になる
  * theirs: merge 前の状態になる

# 準備

```
mkdir remote
cd remote
git init --bare myrepo.git
cd ../
git clone /Users/dchiba/Project/git_test/remote/myrepo.git/ local1
git clone /Users/dchiba/Project/git_test/remote/myrepo.git/ local2
cd local1
vi file1
git add .
git commit -m "add file1"
git push origin master
cd ../local2
git pull origin master
git checkout -b br1
```

# merge の検証

## master と br1 ブランチで file1 を変更

### 変更前の file1 

```
aaa
bbb
ccc
ddd
eee
```

### master で変更した file1

* 1 行目を削除

```
bbb
ccc
ddd
eee
```

### br1 ブランチで変更した file1

* 1 行目を変更

```
a1a
bbb
ccc
ddd
eee
```

## master で br1 ブランチを merge する

### merge の実行

```
git fetch
git merge origin/br1
```

### file1 のコンフリクト

```
$ git diff

diff --cc file1
index 3462243,2d53893..0000000
--- a/file1
+++ b/file1
@@@ -1,3 -1,4 +1,7 @@@
++<<<<<<< HEAD
++=======
+ a1a
++>>>>>>> origin/br1
  bbb
  ccc
  ddd
```

### master ブランチで git checkout --ours file1

* master ブランチの file1 になる

```
bbb
ccc
ddd
eee
```

### master ブランチで git checkout --theirs file1

* br1 ブランチの file1 になる

```
a1a
bbb
ccc
ddd
eee
```

# rebase の検証

## file1 を変更 

* merge の場合と同様に file1 を変更

## br1 ブランチで master をリベースする

```
git pull --rebase origin master
```

## file1 の diff

```
$ git diff

diff --cc file1
index 3462243,2d53893..0000000
--- a/file1
+++ b/file1
@@@ -1,3 -1,4 +1,7 @@@
++<<<<<<< 428e75c53eebe68d1bda63a5a032adbf9b784d62
++=======
+ a1a
++>>>>>>> update file1
  bbb
  ccc
  ddd
```

### br1 ブランチで git checkout --ours file1

* master ブランチの file1 になる

```
bbb
ccc
ddd
eee
```

### br1 ブランチで git checkout --theirs file1

* br1 ブランチの file1 になる

```
a1a
bbb
ccc
ddd
eee
```

# revert の検証

## br1 ブランチを master に merge 

```
git merge origin/br1
```

## file1 の状態

### merge 前の file1

```
bbb
ccc
ddd
eee
```

### merge した直後の file1

* br1 の変更を受け入れた

```
a1a
bbb
ccc
ddd
eee
```

### merge 後に master で file1 を変更する

```
a2a
bbb
ccc
ddd
eee
```

## master で br1 の merge を revert する

### revert 実行

```
git revert -m 1 b2a72be909fa938ef4dde72d0f211452c59412b1
```

### file1 の diff

* merge 前の master と revert 後のもので conflict している

```
$ git diff

diff --cc file1
index c350386,3462243..0000000
--- a/file1
+++ b/file1
@@@ -1,4 -1,3 +1,7 @@@
++<<<<<<< HEAD
 +a2a
++=======
++>>>>>>> parent of b2a72be... Merge remote-tracking branch 'origin/br1'
  bbb
  ccc
  ddd
```

### master で git checkout --ours file1

* revert 後の変更を受け入れる

```
a2a
bbb
ccc
ddd
eee
```

### master で git checkout --theirs file1

* revert 前の状態を受け入れる

```
bbb
ccc
ddd
eee
```
laser + servo by openFrameworks + Arduino

laser + servo by openFrameworks + Arduino
です. 

thetaを変数としてparametric plotをArduinoと連携してやってみようというもの. 
データの送信方法はserial通信:
http://qiita.com/keitasumiya/items/44908da606c8da1a635c
です. 


# variables
## t
t ∈ [0,1023] で単調増加. 
境界条件としてt>1023でt=0にしています. 

```
if (t > 1023){
   t = 0;
}
```

## theta
theta ∈ [0, 2 pi]

```
float theta = 2*PI*(float)t/1023;
```

## x, y
基本的には

```
x = cos(x)
y = sin(y)
```
です. 
が, Arduinoのservoは90を中心に[0,180]で変化します. 
さらに, 2軸とも[0,180]で動かしてしまうと, 天球状のスクリーンが必要になります. 
今回は垂直な壁にプロジェクションの予定だったので, x, yを[60, 120]に絞りました. 

```
float x = 60*(cos(theta)+1)/2 + 60;
float y = 60*(sin(theta)+1)/2 + 60;
```

# codes

```serial_read_2-2bytes_servo.ino
#include <Servo.h>

const int val_size = 2;
int values[val_size] = {0, 0};
bool isValids[val_size] = {false, false};
const int OUT_PINs[val_size] = {5, 3};
Servo myservos[val_size];

void setup(){
  Serial.begin(115200);
  myservos[0].attach(OUT_PINs[0]);
  myservos[1].attach(OUT_PINs[1]);

}

void loop(){
  bool isValids[val_size] = {false, false};
  if (Serial.available() >= 3*val_size) {
    int head = Serial.read();
    for (int i=0; i<val_size; i++){
      if (head == 128+i) {
        int high = Serial.read();
        int low  = Serial.read();
        values[i] = (high<<7) + low;
        if (0 <= values[i] <= 1023) {
          myservos[i].write(values[i]);        
          isValids[i] = true;
        }
      }
    }
  }
}
```

```serial_write_multi-2bytes_change_servo/src/ofApp.cpp
#include "ofApp.h"

ofSerial mySerial;
const int val_size = 2;
int values[val_size] = {0, 0};
bool isValids[val_size] = {false, false};
int t = 0;

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetFrameRate(120);
    mySerial.setup("/dev/cu.usbmodem1421",115200);
}

//--------------------------------------------------------------
void ofApp::update(){
    t += 4;
    if (t > 1023){
        t = 0;
    }
    float theta = 2*PI*(float)t/1023;
    float x = 60*(cos(theta)+1)/2 + 60;
    float y = 60*(sin(theta)+1)/2 + 60;
    values[0] = round(x);
    values[1] = round(y);
    
    bool isValids[val_size] = {false, false};
    for (int i=0; i<val_size; i++){
        int high = (values[i] >> 7) & 127;
        int low  = values[i] & 127;
        bool byteWasWritten1 = mySerial.writeByte(128+i);
        bool byteWasWritten2 = mySerial.writeByte(high);
        bool byteWasWritten3 = mySerial.writeByte(low);
        if ( byteWasWritten1 && byteWasWritten2 && byteWasWritten3 ) {
            printf("value is %d \n", values[i]);
            isValids[i] = true;
        } else {
            printf("an error occurred \n");
        }
    }
}
```

# results
動画:
こんな感じです. 
https://youtu.be/xR1X-ubHmPs

Anisotropic Kepler problem(AKP)で軌道を書いてみた例もあります
https://youtu.be/40Fag5gq5fU
GitlabをMicrosoft Teamsと連携させてみる

# 概要

Microsoft TeamsがOffice365で使えるようになり、だいぶ経ちました。
HipChatやSlackに飛ばしていたという人も、会社が公式に使っていいよと言うMicrosoft Teamsに連携してみようという人も多いかもしれません。

ようやく、やっとこさ、使っていいよというお達しがきたので、本日一通りの設定を確認してみようということです。

# Microsoft Teamsでの設定

チームの「一般」や任意のチャネルの横にある「・・・」部分をクリックし、「コネクタ」を選択します。

## コネクタの作成

![0.png](https://qiita-image-store.s3.amazonaws.com/0/111676/8d8290dc-f154-7bf0-5f06-744a2d155804.png)

## Webhookの作成

「Incomming Webhook」を選択して、「追加」ボタンをクリックします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/111676/73428e50-ecb7-d37a-c004-a33815a6ecb3.png)

## コネクタの設定

名前（Teamsに投稿したときに表示される名前）、ロゴを指定し、「作成」ボタンをクリックすると、URLが生成されます。
このURLをコピペしておきます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/65e80e74-6a84-d810-3f89-e361a390023d.png)

# Gitlabでの設定

## Serviceの有効化

連携させたいプロジェクトを開いて「SEttings」の「Integrations」を選択します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/111676/62eeee0b-b72e-fdb1-f62b-994d7f3e6671.png)

下の方にスクロールすると、「Microsoft Teams Notification」という項目があるので、このリンクをクリックします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/111676/3906c055-02ec-a6b8-d7fe-462307835a46.png)

Activeのチェックボックスにチェックが入っていなければ、チェックをいれます。
Webhookの欄に、Microsft Teamsのコネクタの追加で行ったときに取得したURLを入力します。
終わったら、「Save changes」で保存します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/111676/cb91eebf-c241-118a-ae3c-7b1ac702bb36.png)

保存されたら、「Test settings]のボタンが出現します。
これをクリックすることで、設定の確認ができます。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/111676/8ff33fbf-39a4-4297-16f6-a97c0a7010d6.png)


# pushしたりissue発行したり

pushしたり、issueを発行したりするとTeamsの画面にメッセージが投稿されます。
こんな感じ。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/111676/0cda97de-5903-6575-c9c4-8cbe50cc7622.png)



# 雑感

Yammerだと、Botを作るのにも一苦労（誰かの名前で出てしまっていたり）していたところが、Microsoft Teamsだと
連携も簡単、設定も簡単、すぐに繋げられる。
ソースコードを貼り付けたときに、インデントが壊されるところが苦痛でしかたなかったYammerとも、これでさよならできそう。
Javaの勉強 - 7

# if文
条件に一致したときだけ実行したい処理があるときに使ったりする。

```
if ( 条件式 ){
	条件に一致したときに実行する内容
} else {
	条件に一致しなかったときに実行する内容
}
```

基本はたぶん↑のような形。

条件に一致しなかったとき、何もしなくていいなら
「else」の部分は省略できる↓。

```
if ( 条件式 ){
	条件に一致したときに実行する内容
} 
```

逆に、複数の条件で処理を分けたいときは「else if」を使う↓。

```
if( 条件式 1 ){
	条件 1 に一致したときに実行する内容
} else if ( 条件式 2 ) {
	条件 2 に一致したときに実行する内容
} else if ( 条件式 3 ) {
	条件 3 に一致したときに実行する内容

<略>
		
} else {
	全ての条件に一致しなかったときに実行する内容
}
```

形として覚えておくのはこんなところか。

気を付けるのは
**「else」の後ろに条件式をつけてはいけない**
条件をつけたいときは「else if」にする。ってことかな。

# 条件式に使う演算子
「if」や「else if」の条件式で使うやつ。

・「>」⇒ 左側の数値が右側より大きいとき
・「>=」⇒ 左側の数値が右側と同じか、大きいとき
・「<」⇒ 右側の数値が左側より大きいとき
・「<=」⇒ 右側の数値が左側と同じか、大きいとき
・「==」⇒ 左右の数値が同じとき
・「!=」⇒ 左右の数値が等しくないとき

まぁ、一般的な感じはする。

「==」が2個続けて「=」を書く必要があるのと
「>=」や「<=」、「!=」の順番くらい気を付けておけば良さそう。

例えば、
『変数**a**が**10**以上のとき、変数**b**に**2**を足す。
変数**a**が**5**以上,10未満のとき、変数**b**に**1**を足す。
それ以外の時は、何もしない。』
みたいな内容にしたいときは

```
if ( a >= 10 ){
	b = b + 2;
} else if ( a >= 5 ) {
	b = b + 1;
}
```

こんなところか。

・ifは上から順に判定される。
・最初に正になったところの処理のみを実行する。

なので、10以上の数値を判定するとき、
上記の場合は最初に正となる「if」のみ実行処理される。

# ifの中に複数の条件を設定する
論理演算子を使って複数の条件を組み合わせることができる。

・「&&」⇒ かつ（いわゆるand）
・「||」⇒ または（いわゆるor）

『変数aが5以上で、変数bが3以下の時に』
とかしたければ↓

```
if ( a >= 5 && b <= 3 ){
	// 処理内容を書く
}
```

これで2つの条件をまとめられる。
もちろん2つ以上の条件を設定しても良い。

何と書いたらいいか分からないけど
「( )」をつけた条件も使える。

『変数**b**が**3**か**2**で、変数**a**が**5**のとき』

```
if ( a == 5 && (b == 3 || b == 2) ){
	// 処理内容を書く
}
```

説明しづらいけど、そんな感じ。

# 条件式に否定を入れるとき
でもって、条件式を**否定**もできる。

・「!」⇒ 〇〇ではないとき（いわゆるnot）

```
if ( !(a >= 5 && b <= 3) ){
	// 処理内容を書く
}
```

否定したい部分の前後を「( )」で囲んで、前に「!」をつける。

この場合は
『（変数aが5以上で、変数bが3以下）以外の時に』
ということになる。

ifは覚えること多い。。。
これで無駄な社内手続きともおさらばできる！？ngrokを使って超簡単に公開サーバを手に入れる

# はじめに
スマホやガラケー向けにサイト構築したり、WEB APIを作って公開する場合、
そのテスト環境には、社内の色々な決済をかいくぐってサーバを用意するのではないでしょうか？

近頃だとWifiで繋げるローカル環境なんかも簡単に作れますが限りなくグレーゾーンだったり、
結局決済を回さないといけなかったりします。

また、SaaS型のサービスを使う機会も、これからはどんどん増えていくことでしょう。
SaaS型のサービスを使うとよく出てくるのがWebhookというやつで、
SaaSのサービスに、とあるアクションが起きると、自分たちのアプリに通知してくれ、
自分たちが実装した処理を実行できるというものです。

こういう開発が当たり前になってくると、手軽に公開サーバが用意できないと、
社内決済をまわしたり、インフラ待ち時間が発生したりと無駄な時間がかかって、
今までよりも開発に時間がかかるようになって無駄な費用が増えた！
なんてことになるかもしれません。

このページでは無駄なことは省いて、
自分のふだん使いのPC上のWEBサーバを一気に公開しちゃおうぜ！
ということをやります。

# 使うもの
ngrok
Vagrant(+ virtual box)

## ngrokとは
インターネットに公開できないサーバ(社内ローカルPCとか)を、トンネル経由で外部に公開できてしまう素敵ツール。
以下からzipダウンロードできます。
https://ngrok.com/download

unzipするとexeがあるので、PATHを通しておいてください。

## Vagrantとは
仮想端末の設定をVagrantfileというものに書いておいてあげて、
vagrant upコマンドを打つとそれ通りの環境が一発手に入る仮想化支援ツール。
(本番環境を作るようなものではない)
sandboxモードを使うと思った通りの環境にできるまで、ロールバックできたりする。

https://www.vagrantup.com/
※有名なので特に触れませんが、この環境だと1.9.2よりも新しいものは不具合があるため動かないと思います。
　1.9.5で諸々直っていることを期待・・・。

# 構成
![構成.png](https://qiita-image-store.s3.amazonaws.com/0/56851/45c2312c-ef77-c05c-c5e0-1e1f2015e903.png)

ngrokをホストOSの10080ポートに飛ぶようにし、そこからゲストOS上の80にPortフォワーディングしてApacheに接続するようにしてみます。
Vagrant上にしているのは、ホスト上にアクセスさせないようにするという、気休めです。

また、Webhookのサービスとngrokにある間のURL内のxxxxxxは、ngrokを再起動すると毎回変わります。

# 各種ソース
## Vagrantfile

```rb
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|

  config.vm.box = "centos7.2"
  config.vm.network "forwarded_port", guest: 80, host: 10080
  config.vm.network "private_network", ip: "1.0.0.1"
end

```

超シンプル

## index.html

```html
Welcome sh-ogawa
```

# 起動
```text
# vagrant up
仮想端末が上がる・・・

# ngrok http 10080

```
ngrokuが立ち上がると、以下が表示されます。

![ngrok.png](https://qiita-image-store.s3.amazonaws.com/0/56851/75f785a5-1e38-319f-0c8a-88afc28b96fa.png)

Forwardingのhttpの方のURLに、スマホなどのWEBブラウザからアクセスしてあげれば、お目当てのページが表示されます。
※ドメインの部分は毎回変わります。

URLを打つのめんどくさいので、昔作った産物でQRコード生成しました。
https://github.com/sh-ogawa/qr-tool

## アクセスの様子
![Screenshot_2017-05-16-12-59-59.png](https://qiita-image-store.s3.amazonaws.com/0/56851/9e84f18f-7ff7-6a46-5038-5dad09a29217.png)

# 終わりに
これで簡単に公開サーバが手に入るので、開発がちょっと楽になりますね。
また、オーバープロキシしたい場合は、以下をお試しください。
私の会社はプロキシがないので試せませんが。
[Windows版ngrokでプロキシ超え](http://qiita.com/k_ori_dev/items/2ff43d4f8c9d102ce1d0)
openコマンドで、ファイルを開かずにただFinderで表示する - Mac


ほぼ備忘録です。

open便利ですよね。
よく使うのですが、ただファインダーで表示したかっただけなのに、デフォルトで開くソフトウェアで開いてしまったりというミスもよくしてしまいます。

たとえば、`public/images/sample.jpg`というファイルの置いてあるディレクトリをファインダーで表示したい場合。
シチュエーション的には、その画像をエディタなどで開いてパスをコピーしたときとかによく発生してます。

```
open public/images/sample.jpg
```

とかやるとPhotoshopが開いてしまったりして、あーまちがえたがよくあります。

```
open public/images/
```

とやれば、一応ディレクトリが表示されるので問題ないことはないんですけど、文字列を消す作業がだるいですし、ディレクトリの中のファイル量が多いとどこだよってなってました。

## open -R ファイルを開かずにファインダーで表示する

```
open public/images/sample.jpg -R
```

とやることで、そのファイルが選択された状態のファインダーを表示できます。

![Kobito.FukUbU.png](https://qiita-image-store.s3.amazonaws.com/0/58800/2695b996-a7ad-e0e4-07ba-1aad43ede635.png "Kobito.FukUbU.png")

こんな感じで、便利なので覚えておこうと思います。
Promise再入門② ~async/await編~

# 概要

[前回](http://qiita.com/gcfuji/items/1dfe4265c36bea903ab3)の続きです。
今回はPromiseを同期処理っぽく書ける「async/await」編です。

# async/awaitの背景

ES6で実装されたPromiseの誕生により、
非同期処理がすごく簡単に書ける様になりました。

ただ、書き方はどうしても特殊で、
普段のプログラムでは見ない形です。
(モダンJSに慣れている人なら違和感はないと思いますが。)

そこで、Promiseをよりシンプルに且つ可読性が高まる様にとラッピングされたのが、
「 **async/await** 」の記法です。

何か特別な新しい考え方という訳ではなくて、
あくまでも、非同期をより読みやすくする新文法ぐらいの認識で問題ないと思います。

async/awaitはES7(ES2016)で実装されています。

# async/awaitの使い方

## async

asyncは関数宣言の前に記載します。
asyncが記載された関数は、必ずPromiseを返す様になります。



```js
const func = async () => {
  return 23;
};

```

上のコードをasyncなしで書くと以下になります。

```js
const func = () => {
  return new Promise((resolve) => {
    resolve(23);
  });
};
```

## await

awaitはasync関数内でのみ使える文法です。
awaitは```Promise.then(result => result))```のラッパーで、
thenチェーンを使わずに、同期処理の様な記述で非同期処理を記載できます。
それにより可読性がグンと上がります。
(トップレベルでのawaitの使用は不可能)

```js
const func = async () => {
  return 23;
};

const awaitFunc = async () => {
  // resolveが23のPromiseオブジェクトが出力される
  console.log(func());
  // func().then(result => result)で23が出力される
  console.log(await func());
};

awaitFunc();
```

awaitで同期っぽく書いている例が以下になります。
(awaitの付与でPromiseの完了を待っている状態)

```js
const sleep = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(23);
    }, 3000);
  });
};

const awaitFunc = async () => {
  await sleep();
  // awaitでPromise終了を待ってから、logが出力される。
  console.log('done!!!');
};

awaitFunc();
```

awaitはPromiseの結果を返すので、以下の様な書き方もできます。

```js
const sleep = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(23);
    }, 3000);
  });
};

const awaitFunc = async () => {
  const result = await sleep();
  // 23が出力される。
  console.log(result);
};

awaitFunc();
```

ちなみに、awaitを使わずに書いた場合こうなります。

```js
const sleep = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(23);
    }, 3000);
  });
};

const awaitFunc = async () => {
  sleep()
    .then((result) => {
      console.log(result);
    });
};

awaitFunc();
```

これだけではいまいち良さはわかりませんが、
コールバック地獄や、Promiseのthen地獄、Promise.allでの並列処理などをたくさん書いている人は、
恩恵がイメージ出来るのではないかと思います。

# 終わり

async/awaitを使う事で、同期処理っぽく非同期処理が書けるイメージができたかと思います。

前回の冒頭で書いた通りで、
モダンJSでは非同期の取り扱いが非常に重要です。

async/awaitでしっかり可読性をあげれば、
「あれ？undfinedになってる...」のあるあるパターンともおさらばかと思います。

ES7での実装ですが、今後のスタンダードな書き方になると思うので、
積極的に利用していこうと思います。
Vagrantチュートリアル(2)

前回からの続きで書いてます [ < Vagrantチュートリアル(1) > ](http://qiita.com/piyomarudayo/items/37881d2dd184d1723eb7)

# FTP Connect

vagrant上の仮想マシンのファイルを操作できるようにします

### VagrantFileでIPを指定
・ VagrantFileを開いて次のコメントアウトを外します
<img width="764" alt="スクリーンショット 2017-05-16 11.53.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/cc85bb2b-ee83-bf01-8f6f-4ed14732338c.png">
　　　　　　　　　　　　　↓
<img width="719" alt="スクリーンショット 2017-05-16 11.54.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/a2fef972-43ca-1a05-25c2-190c9c0ed483.png">

・Vagrantを立ち上げる、または立ち上げなおします

```
vagrant up
または
vagrant reload
```

# FTP Client 

・クライアントソフトを用意
好きなクライアントソフトを使いましょう
ここではfilezillaを使います - [ダウンロード先](https://filezilla-project.org/download.php?platform=osx)
<img width="1051" alt="スクリーンショット 2017-05-16 12.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/3604eeb1-b199-0299-772e-73cb5bd149db.png">

・ダウンロードしたらインストールします
<img width="701" alt="スクリーンショット 2017-05-16 12.04.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/4ba71513-8834-d297-25c8-601aa2cf77de.png">

・インストールが終わったらfilezilla開きます
<img width="1436" alt="スクリーンショット 2017-05-16 12.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/100ffa35-f521-c1aa-c738-bc0902e698b4.png">

# Connect
・左上のアイコンをクリック
<img width="1436" alt="スクリーンショット 2017-05-16 12.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/e77e211e-f603-2fcd-2e0c-289edb21113a.png">

・設定をしていきます
1. [新しいサイト]をクリック
2. [ホスト]に先ほどのVagrantFileで設定したIPを入れます
3. [プロトコル]はSFTPを選びます
4. [ログオンの種類]は通常
5. [ユーザ]は`vagrant`です（これはvagrantの初期時に用意されているもの）
6. [パスワード]も`vagrant`です（これもvagrantの初期時に用意されているもの）
7. [接続]を押下します

※接続に関するセキュリティの設定した場合はまた変わってきます

<img width="735" alt="スクリーンショット 2017-05-16 12.11.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/b7b26cc2-a4a7-7209-4eb9-d5c05d03c674.png">

・接続が成功します
<img width="1439" alt="スクリーンショット 2017-05-16 12.20.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/beb5f788-2d2b-bcb5-f6a5-594a43a88b6c.png">

# Synced Folders
vagrantにすでにローカルとの同期フォルダが存在します
同期ファイルを作成します

・vagrantにログインをします

```
$ vagrant ssh
```

・同期フォルダを確認

```
$ ls / vagrant
あるいは
$ cd ../../vagrant
```


・fooという空のファイルを作成します - [touchコマンド](http://www.atmarkit.co.jp/ait/articles/1606/14/news013.html)

```
$ touch /vagrant/foo
あるいはcdで移動していたら
$ touch foo
```

・するとローカルのvagrantフォルダにも同様のファイルができます
<img width="1435" alt="スクリーンショット 2017-05-16 12.43.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/10f98d79-3817-95ac-5c3b-e1ada7b74ecc.png">

・試しにローカルで編集すると反映されます

# あとがき
自分用に公式のチュートリアルをまとめてみようと思ったものです
詳細は公式また他にもわかりやすい記事は色々あるのでご参考に
[Vagrant公式](https://www.vagrantup.com/intro/index.html)
[ドットインストール](http://dotinstall.com/lessons/basic_vagrant)
BigQueryのstandardSQLでexportしようとしたらMaterialize output size (xxxxx) exceeded size limit (134217728)

## 前提
- rubyのgcpのapi(https://github.com/GoogleCloudPlatform/google-cloud-ruby) 使ってます
- query_jobでexportしてます

## 結論
large_results: trueオプションをつければいい

```rb

query_job = @api.query_job sql,
       table: result_table,
       standard_sql: true,
       write: 'truncate',
       create: 'never',
       large_results: true, <- これ
       params: params
```

## はまりどこ
- standardSQLはAllowLargeResultが常にtrueって書いてあるけど、そんなことなかった
  - https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs
init upstart systemd supervisord の違い

起動時にコマンドを実行する昔ながらの単純な方法: /etc/rc.local にコマンドを追加する。Ubuntu なら今でも動くが他の Linux では起動方式によって色んな設定を書く。

* SystemV init: 昔からあるやつ
    * 設定ファイル例: /etc/init.d/ssh
    * 起動停止: service
    * 自動起動停止: chkconfig
* upstart: Ubuntu 12 ではこれになっていた
    * 設定ファイル例: /etc/init/ssh.conf
    * 起動停止: start ssh
    * 自動起動停止: initctl
* systemd: Ubuntu 16 ではこれになっていた
    * 設定ファイル例: /lib/systemd/system/ssh.service
    * 起動停止: systemctl
    * 自動起動停止: systemctl
* supervisord: ユーザ権限でも設定出来る。
    * 設定ファイル例: /etc/supervisor/conf.d/*.conf
    * 起動停止: supervisorctl stop
    * 自動起動停止: 起動のみ、停止は出来ない。

supervisord 設定例

```
cat <<EOT > /etc/supervisor/conf.d/web3001.conf
[program:web3001]
command=/usr/bin/python -m SimpleHTTPServer 3001
stdout_logfile=/var/log/web3001.log
redirect_stderr=true
directory=/
EOT
```

参考

* https://wabuntu.wordpress.com/2016/03/15/linux%E3%81%AFupstart%E3%81%8B%E3%82%89systemd%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%82%8B%E3%82%89%E3%81%97%E3%81%84/
* https://eng-entrance.com/linux_startup
* http://qiita.com/yushin/items/15f4f90c5663710dbd56
Ansibleでsystem wideなrbenv環境を構築する(for jenkins)


#はじめに
社内のjenkinsサーバでrbenvを使うための環境をAnsibleで構築しました。

##参考
http://qiita.com/moriokumura/items/36aa573891a6ab17b26d
http://qiita.com/semind/items/8e973a544b592376a07e


#要件
- rbenvはシステムワイドにインストール
- jenkinsユーザはログインシェルがない

#前提
- gitなど、rbenvインストールおよびrubyをビルドするために必要なパッケージはインストール済み
- jenkins環境は構築済み
- jenkinsユーザの環境変数はjob内で設定


#ポイント
- Ansibleのタスクはrootで実行されるので、rbenvの環境変数はrootに設定する
- shellモジュールはデフォルトでは`~/.bash_profile`を読まないので、`bash -lc`で環境変数を読み込んでrbenvコマンドを実行する
- インストール済みrubyのバージョンをチェックし、指定バージョンをインストール

#Sample

##ディレクトリ構成

```bash:ディレクトリ構成
├── roles
│   └── rbenv
│       └── tasks
│           └── main.yml
├── site.yml
└── vars
    └── vars.yml
```

##Role


```yaml:roles/rbenv/tasks/main.yml
---
- name: does rbenv exist?
  stat:
    path: "{{ my_vars.middlewares.rbenv.install_dir }}"
  register: dir_stat

- name: install rbenv
  git:
    repo: https://github.com/sstephenson/rbenv.git
    dest: "{{ my_vars.middlewares.rbenv.install_dir }}"
  when: dir_stat.stat.isdir is not defined and not ansible_check_mode

- name: install ruby-build
  git:
    repo: https://github.com/sstephenson/ruby-build.git
    dest: "{{ my_vars.middlewares.rbenv.install_dir }}/plugins/ruby-build"
  when: dir_stat.stat.isdir is not defined and not ansible_check_mode

- name: permit using rbenv to group
  file:
    path: "{{ my_vars.middlewares.rbenv.install_dir }}"
    group: "{{ my_vars.middlewares.rbenv.user_group }}"
    mode: "2775"
    state: directory
    recurse: yes

- name: set env
  blockinfile:
    dest: /root/.bash_profile
    insertafter: '^PATH=\$PATH:\$HOME/bin$'
    content: |
      export RBENV_ROOT={{ my_vars.middlewares.rbenv.install_dir }}
      export PATH="$RBENV_ROOT/bin:$PATH"
      eval "$(rbenv init -)"

- name: Check rbenv version
  shell: bash -lc "rbenv versions | grep {{ my_vars.middlewares.rbenv.ruby_version }}"
  register: rbenv_check_install
  changed_when: False
  ignore_errors: yes

- name: install ruby
  shell: bash -lc "rbenv install -v {{ my_vars.middlewares.rbenv.ruby_version }}"
  when: rbenv_check_install|failed

- name: rbenv rehash
  shell: bash -lc "rbenv rehash {{ my_vars.middlewares.rbenv.ruby_version }}"
  when: rbenv_check_install|failed

- name: Check ruby version
  shell: bash -lc "rbenv version | grep {{ my_vars.middlewares.rbenv.ruby_version }}"
  register: rbenv_check_default
  changed_when: False
  ignore_errors: yes

- name: Set default ruby version
  shell: bash -lc "rbenv global {{ my_vars.middlewares.rbenv.ruby_version }}"
  when: rbenv_check_default|failed
```

##vars

```yaml:vars/vars.yml
---
my_vars:
  middlewares:
    rbenv:
      install_dir: /usr/local/rbenv
      ruby_version: 2.1.2
      user_group: jenkins
```
##site.yml
```bash:site.yml
---
- hosts: targethost
  roles:
    - role: rbenv
  vars_files:
    - ./vars/vars.yml
```

#まとめ
権限周りと環境変数設定あたりを修正すれば、通常のユーザ単位のrbenv環境構築にも使えると思います。
リスト内包表記で文字列マッチ(python)

メモがてら

```python3
>>> x = ["aaa","bbb","ccc","aaa","abc"]
>>> y = [element for element in x if element.find("aa") != -1]
>>> y
['aaa', 'aaa']
```

あんま使ってなかったけどリスト内包表記ちょう便利
Javascript内でThymeleafを使う方法

scriptタグ内で、Tymeleafを使いたいことがあったので共有。

Thymeleaf 3.0から使えます。

（例）こう書きたい

```html

<script>
  <th:block th:if="${!isAlive}">
   if(true){
     console.log('true');
   }
  </th:block>
</script>
```

しかしエラーになる。

なので、以下のように書く

① `th:inline="javascript"` を記入
② `[#name ...]` or `[# ...]` に変更


```html
<script th:inline="javascript">
  [#th:block th:if="${!isAlive}"]
   if(true){
     console.log('true');
   }
  [/th:block]
</script>
```

省略して、こう書くことも可能

```html

<script th:inline="javascript">
  // 省略系
  [# th:if="${!isAlive}"]
   if(true){
     console.log('true');
   }
  [/]
</script>
```

#参考
https://github.com/thymeleaf/thymeleaf/issues/395
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html
Synology NASでcron

#　既存サービスの設定コマンドは`synoservicecfg`でした。

crontabを更新したら以下のコマンドで読み込み。

```bash
$ sudo synoservicecfg --restart crond
```

忘れそうなのでメモメモ。
QNAPに比べて普通のLinuxなのでこういう時にrc.dが無いと焦る

#参考文献
https://www.synology.com/ja-jp/support/developer#web_developer
JavaScriptとCSSでマイクのボリュームをおしゃれにプレビュー

# 概要
下みたいなやつ(マイク入力の音量をプレビューするやつ)をJavaScriptとCSSを使って作る.
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/91558/22c9894f-1a9d-54fa-95da-d4b167c5b666.gif)

# 中身
マイクの画像は[Font Awesome](http://fontawesome.io/)のアイコン,マイクの音量取得とかは[AudioManager.js](https://github.com/tnker/AudioManager.js/tree/master)をつかってます.

```html:test.html
<!DOCTYPE html>
<html>
<head>
  <link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'>
  <style>
    .volume-viewer {
      margin: 50px auto 0;
      width: 128px;
      height: 128px;
      position: relative;
      text-align: center;
      line-height: 140px;
      font-size: 80px;
      border: 3px solid #888;
      border-radius: 50%;
      color: #888;
    }
    .volume-viewer-volume {
      width: 140px;
      height: 140px;
      position: absolute;
      border-radius: 50%;
      border: 4px solid #888;
      top: -10px;
      left: -10px;
      z-index: -1;
    }
  </style>
</head>
<body>

  <div class="volume-viewer">
    <i class="fa fa-microphone" aria-hidden="true"></i>
    <div class="volume-viewer-volume"></div>
  </div>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <script src="./audioManager.min.js"></script>
  <script>
    var manager;
    manager = (new AudioManager({
      useMicrophone: true,
      onEnterFrame: function() {
        var volume = Utils.sum(this.analysers.mic.getByteFrequencyData());
        var size = (140 + volume/1000); // 1000は適当(小さくすると円が大きくなる)
        var adj = (128-size)/2 - 4; // 4はborderの大きさ

        $('.volume-viewer-volume')
          .css('height', size + 'px')
          .css('width', size + 'px')
          .css('top', adj + 'px')
          .css('left', adj + 'px')
      }
    })).init();
  </script>
</body>
</html>
```

# 雑な説明
1. AudioManagerで音量を拾ってくる.
2. 音量を適当な大きさに変換したりして,jQueryで外枠の大きさを変える.

# 結論
[AudioManager.js](https://github.com/tnker/AudioManager.js/tree/master)を使えばかなり簡単にマイク音量とか見れる.

# その他
http://\*だとセキュリティ云々でマイクやビデオの取得ができない罠があるのでご注意.
わりとこの仕様にはまって動いていないサンプルサイトとかかなり多いです.
(https://\*,localhost,ローカルファイルならマイクの取得はできる)

# 宣伝
フォローお願いします:japanese_goblin: [@redshoga](https://twitter.com/redshoga)
[数学] 外積行列

あまり知られていない気がするのでメモ書きします。
理解が進んだらもう少し実用的な使い方について追記したいと思います。

# 外積行列

ベクトルの外積は、**外積行列**と呼ばれる行列をベクトルにかけることでも表現できます。

```math
\begin{equation}
\boldsymbol{a} \times \boldsymbol{b} = \boldsymbol{A}\boldsymbol{b} \\
\end{equation}

```

ここで、$\boldsymbol{a} = \left(\begin{array}{ccccc}a_1&a_2&a_3\end{array}\right)^t$とすると、$\boldsymbol{A}$は

```math

\boldsymbol{A} = 

\left(
\begin{matrix}
0 & -a_3 & a_2 \\
a_3 & 0 & -a_1 \\
-a_2 & a_1 & 0
\end{matrix}
\right)
```

と表せます。

外積行列は、交代行列とういものに分類でき、$\boldsymbol{A} = -\boldsymbol{A}^T$を満たします。
ls コマンドの使い方

```
隠しファイルを表示
# ls -a 

.              .config          .imsettings.log      data          ダウンロード
..             .cshrc           .local               diary.txt     テンプレート
.ICEauthority  .dbus            .mozilla             fuga          デスクトップ
.abrt          .esd_auth        .nautilus            fushigi.txt   ドキュメント
.anthy         .gconf           .pulse               hoge.txt      ビデオ
.bash_history  .gconfd          .pulse-cookie        ifeq.sh       音楽
.bash_logout   .gnome2          .recently-used.xbel  jssystems.sh  画像
.bash_profile  .gnome2_private  .tcshrc              memo.txt      公開
.bashrc        .gtk-bookmarks   .viminfo             rose.txt
.cache         .gvfs            .xsession-errors     sample.txt
```
assembly の opcode を調べる、またはその逆 on macOS

泥臭い方法だけど、特に何も追加インストールする必要なくお手軽。

## assembly -> opcode

アセンブルしてディスアセンブルする。`otool` の `-j` オプションで opcode も表示できる

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

require 'tmpdir'

asm = ARGV.join(" ")
Dir.mktmpdir do |dir|
  File.write("#{dir}/tmp.S", asm)
  system("as #{dir}/tmp.S -o #{dir}/tmp.o")
  system("otool -tvj #{dir}/tmp.o")
end
```

実行例

```shell-session
$ opcode.rb 'nop; mov $0x2,%rax'
/var/folders/.../tmp.o:
(__TEXT,__text) section
0000000000000000 90    nop
0000000000000001 48 c7 c0 02 00 00 00 movq $0x2, %rax
```

## opcode -> assembly

`.byte` で詰め込んでアセンブルしてディスアセンブルする。

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

require 'tmpdir'

asm = ".byte 0x" + ARGV.join.scan(/[0-9a-fA-F]{2}/).join(",0x")
Dir.mktmpdir do |dir|
  File.write("#{dir}/tmp.S", asm)
  system("as #{dir}/tmp.S -o #{dir}/tmp.o")
  system("otool -tvj #{dir}/tmp.o")
end
```

実行例

```shell-session
$ disas.rb 48c7c00200000090
/var/folders/.../tmp.o:
(__TEXT,__text) section
0000000000000000 48 c7 c0 02 00 00 00 movq $0x2, %rax
0000000000000007 90    nop
```
【php-fpm】サーバーチューニング パラメーター備忘録


```ini:/etc/php-fpm.d/www.conf
#動的
pm = dynamic

#dynamicの場合必須、作成される子プロセスの最大数
#同時に処理できるリクエストの最大数
pm.max_children = 300

#起動時に作成される子プロセスの数
pm.start_servers = 75

#アイドル状態のサーバープロセス数の最小値
pm.min_spare_servers = 20

#アイドル状態のサーバープロセス数の最大値
pm.max_spare_servers = 150

#各子プロセスが、再起動するまでに実行するリクエスト数
#メモリリークの回避策に、再起動させない場合は0
pm.max_requests = 500
```
Delphi / C++Builder でサポート対象となるオペレーティング システムとデータベースの一覧 

#Delphi / C++Builder でサポート対象となるオペレーティング システムとデータベースの一覧 
エンバカデロのDocwikiには、オペレーティングシステムの対応バージョンを一覧にした対応した「Platform Status」wikiがあります。また、最近、データベース接続ミドルウエアであるFireDACでサポートされるデータベースバージョンの一覧も作成されました。

こちらのプラットフォームステータス ページは [Marco Cantu のブログ](blogs/entry/new-firedac-database-status-page)によると、去年(2016年）から追加されている模様。
OSサポート一覧ページも、データベースサポート一覧のページも比較的新しいDocwikiページで、開発者にとって必要な対応バージョン情報がまとめらているので、その閲覧方法などご紹介します。

##プラットフォームサポートページ　(対応OS情報ページ）
プラットフォームのメインページはこちら。
URL : http://docwiki.embarcadero.com/PlatformStatus/ja/メインページ

ちょっとわかりにくいですが、Dockwikiのトップページの下記赤いマークの「Platform Status]のリンクをクリックしても到達できます。
![dw.PNG](https://qiita-image-store.s3.amazonaws.com/0/145847/62907d58-7467-9880-5c11-9c552a2865af.png)


このページでは、各RAD StudioのバージョンでサポートされているOSのバージョン一覧と、リリースされたオペレーティングシステムに対するアップデートおよび修正、回避策に関する情報や、不具合情報がリストアップされています。

こんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/ca13af4d-55d5-55e6-fe5e-cec8506e5950.png)

既知の問題の回避策についても、こんな感じで記載されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/8e987b21-4d8c-08d7-5854-d1e9d8ac06df.png)


最新のiOSバージョンに対して、最新のXcodeを使って何度やってもデプロイできない…。なんでドはまりをする前に、相性問題・不具合がないか一度ご確認ください。（申し訳ございません…）



##FireDAC データベースサポートページ　
RAD Studio各バージョンで公式にサポートされる、FireDAC接続対象のRDMBSのバージョンをリストアップした新しいページが追加されました。

FireDAC データベースサポートのページはこちら
URL : http://docwiki.embarcadero.com/Status/en/FireDAC_Database_Support

![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/befffa5a-89e9-0e47-5bd2-a7ee54d84130.png)


まだ追加されたばかりのページで情報は少ないですが、今後、OSサポートのページ同様に、既知問題や回避など情報が追加される予定とのこと。
twigだけで特定のProductデータ取得を行う

## 概要
PHP側でデータ取得を行わず、twigのみでProductデータを取得する方法を説明します。
（デザイナーさんなど、テンプレートのみ編集される方に便利な機能です。）

## 使い方
 - 非公開データを含む取得の場合  
   `{% set Product = app['eccube.repository.product'].find(1) %}`
 - 非公開データを除く場合  
   `{% set Product = app['eccube.repository.product'].get(1) %}`

## 補足
上記だとデータが取得できない場合、システムエラーになります。
システムエラーを回避するための、関数の提供が以下PullRequestで上がっているので、
時期バージョンに期待しましょう。
https://github.com/EC-CUBE/ec-cube/pull/2305
Bash　if編

```code:ifeq.sh
#!/bin/bash
hoge="A"
fuga="A"
if [ $hoge = $fuga ]; then
  echo "入力文字列は同じです"
else
  echo "入力文字列は違います"
fi
```

⇒文字列は同じです

## hogeとfugaに文字列を渡して比較する場合

```code:ifeq.sh
#!/bin/bash

hoge="$1" # $1が第1引数として利用される
fuga="$2" # $2が第2引数として利用される

if [ $hoge = $fuga ]; then
  echo "入力文字列は同じです"
else
  echo "入力文字列は違います"
fi
```
コマンドの実行
./ifeq.sh A A
⇒文字列は同じです

./ifeq.sh A B
⇒文字列は同じです