OmniAICreator/Qiita-1.07M huggingface dataset:
jQuery だけで CSVファイル作成とダウンロードを実装する

firebase で作ったシステムの管理画面に csvをダウンロードする 機能をつける必要があったので調べて実装したコード。

#環境
- [jQuery 3.2.1](https://jquery.com/)
- [jQuery CSV](https://github.com/evanplaice/jquery-csv)

#コード
クリックイベント等で下の内容を実装するとjavascriptだけでファイルダウンロードが実装できました。jQuery  CSVで作ったCSV文字列を Blob に入れて Aタグのhrefとして処理するコードです。

```js
//CSVダウンロード処理
const serialcode = "ABCDEFG";
const details = [{key:"codeAAAAA",value:"AAAA"},{key:"codeBBBB",value:"BBBB"}];
const content = $.csv.fromObjects(details);
const blob = new Blob([ content ], { "type" : "text/csv" });
$("<a></a>", {href: window.URL.createObjectURL(blob),
              download: serialcode+".csv",
              target: "_blank"})[0].click();
```

```csv:ABCDEFG.csv
key,value
codeAAAAA,AAAA
codeBBBB,BBBB
```
Rails5とknockでAuth0のJWTトークンを検証しようとしたが401になる

おそらくAuth0の管理画面上のclient_secretがbase64_encodeされていたものがされなくなったのが原因だったのだが、knockでエラーメッセージが何も出なくて、binding.pryしながらソース読んだりわりと大変だったのでメモ

binding.pryしてknockを実行していくと、JWTのでコードのところで以下のようになる。

``` ruby
JWT::VerificationError: Signature verification raised
from /bundle/gems/jwt-1.5.6/lib/jwt.rb:156:in `verify_signature_algo'
```

``` ruby:config/initializers/knock.rb
...

config.token_secret_signature_key = -> { JWT.base64url_encode(JWT.base64url_decode Rails.application.secrets.auth0_client_secret) }

...
```

こんな感じにしたら動いた



http://stackoverflow.com/questions/40721209/having-trouble-decoding-an-auth0-token
Windows Application Driver を利用した Windows アプリケーションの自動テスト作成方法


# はじめに
Windows Application Driver を利用した `xunit` のテストプロジェクトの作成方法を示します。

Windows Application Driver が何であるかとかは示していません。

# この記事を読んでできるようになること
![movie1.gif](https://qiita-image-store.s3.amazonaws.com/0/16341/7a0f4f75-6b25-127b-c52b-dacefe91ffab.gif)

# 事前準備
- [Windows Application Driver の GitHub ページ](https://github.com/Microsoft/WinAppDriver/releases)から、インストーラーをダウンロードして、インストールする
- Visual Studio 2017 をインストールする

# 手順
* Visual Studio 2017 のプロジェクトを新規作成する
 C# のクラスライブラリ(以降、デフォルトのClass1.csを想定)として作成する
* Nuget Package で、xunit をインストールする(v.2.2.0)
* Nuget Package で、xunit.runner.visualstudioをインストールする(v.2.2.0)
* Nuget Package で、Appium.WebDriver(v.3.0.0.2)をインストールする
* Class1.cs に以下のコードを張り付ける(namespaceは適宜変更のこと)

```csharp
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Remote;
using System;
using Xunit;

namespace WindowsApplicationDriverUnitTest
{
 
    public class TestClass
    {
        [Fact]
        public void WindowsApplicationTest()
        {
            DesiredCapabilities appCapabilities = new DesiredCapabilities();
            appCapabilities.SetCapability("app", @"C:\Windows\System32\notepad.exe");
            var NotepadSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appCapabilities);

            NotepadSession.FindElementByClassName("Edit").SendKeys("This is some text");

            var NotepadResult = NotepadSession.FindElementByClassName("Edit");

            Xunit.Assert.Equal(NotepadResult.Text, "This is some text");
        }
    }
}
```
* `WinAppDriver`を実行する
C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe
* テストエクスプローラーで、テストを実行する。Notepadが起動して、自動的に"This is some text"が入力されることが確認される

# 補足
Step 5 のコード中に、以下の記述がある。

`FindElementByClassName("Edit")`

これによって、自動操作するコントロールを取得している。

"Edit"というキーワードは、inpsect.exe を実行することで取得できる。

詳細は、GitHubの公式サイトに記述されている。

* [WinAppDriverCalculatorOverview](https://www.youtube.com/watch?v=XAJVpvaEchY)
inspect.exeを実行してIDを取得している動画
* [Inspecting UI Elements](https://github.com/Microsoft/WinAppDriver#inspecting-ui-elements)

# 参考にさせていただいたサイト
* [Windows Application DriverでWindowsアプリケーションのテストを自動化しよう](http://qiita.com/ootaken/items/33099fcbd730e775e4db)
* [Windows Application Driverを試してみました。](https://www.ka-net.org/blog/?p=6879)
HPを作る前に正しくDesign(計画)しよう[実践]

# さいしょに
新人教育用のメモです。僕自身くそへっぽこwackデザイナーなので、おかしい点が多々あると思います。。。
指摘していただけると幸いです。
こちらは実践なので、まずは[理論](http://qiita.com/YamadaTakahito/items/020ad7f67626eaf7e42a)から。

今回は、何を作るかあまり思い浮かばなかったので私山田を『自己紹介』するHPを作りたいと思います。

# 1.問題設定をし、それをどのように解決するか明らかにする
> まずはどのような問題に直面しているかを整理する。クライアントさんから話を聞き出し、どのような情報を伝えたいのかを明らかにする。

今回は自分自信がクライアントなので、自分に問いかけます。
『どんな風に自分を伝えたいですか？』
『ネット上で知名度が0です。だから、頭が良さように見えて、イケてる人間に見えるように。このサイトを見たらtwitterでDMしたくなるか、mailで仕事をオファーをしたくなるような感じで。』

よって、今回は **『知名度がない』という問題に対して、『頭が良さそうでイケてる人間に見えるような』デザイン(設計)** とする。

# 2.ターゲットを定める
> **『どのような人に見てもらいたいか』『どのような人がみるのか』** を定める。これによってデザインの方向性がある程度決まる。

1.を鑑みるに、ターゲットは『若い女性とIT企業の人事』としましょう。本当は一つに絞った方がいいですが...。

# 3.データ集め
> このとき注意したいのは **『この商品の強みは何か？』『弱みは何か?』** を聞き出すことだ。強みは前面に押し出す必要があり、弱みはできるだけ隠す（一概にそれがいいとは言えないが）必要があるだろう。

今回は自分自信がクライアントなので、自分に問いかけます。
『強みはなんですか？』
『......???』
『弱みはなんですか?』
『身長の低さ、食べ方が汚い、人として痛い、体型、』

というのは冗談ですが笑。一応マインドマップのような感じでたくさん自分の情報を書きました。拡大しないで  
![Screen Shot 2017-05-05 at 17.56.20.png](https://qiita-image-store.s3.amazonaws.com/0/119783/989dfa91-1bf2-79c4-d75f-29ad24d4d9c8.png)


まあ強みほどではないですが、『海外旅行にまあまあ行くこととプログラミングがそこそこできること』を強みとします。  

# 4.なんの情報を載せるか
> データを集めたあとはそれを取捨選択する。基本的にユーザーがWebサイトに滞在してくれるのは数秒なので、厳選した情報だけを載せよう。その際 **『どのような情報を載せるべきか？』は、一番最初に『設定した問題を解決できているか』を元に考えよう**。  

『人気がない』という問題に対して、『頭が良さそうでイケてる人間に見えるような』デザインを作成すると定めました。  
頭が良さそうに見えるように、自分の好きな本とか思想を乗せましょう。また、イケてる人間を演出するために、たくさん画像を載せようと考えました。
また最初に述べたように、仕事をオファーしてもらうために自分のポートフォリオを乗せましょう。

# 5.競合調査
> だいたい同じようなことを考えている人は世界にごまんといるので、似たようなWebサイトを調べる。  
このとき注意したいのは、ただ綺麗か汚いかの二元論で考えるのではなく、そのWebサイトを作った人が **どのような意図でデザインしたかを考える** ことだ。

今回は自己紹介HPということで、有名人のHP、ないしは写真家のポートフォリオサイトを参考にしました。(参考文献参照)

# 6.ワイヤーフレーム(下書き)
> 紙に書いてもいいし、パワポかkeynoteかSketchでもいいので、デザインを下書きをする。  

こんな感じか。。。
![Screen Shot 2017-05-05 at 17.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/119783/e8d83e77-e7af-b59d-f789-31152e19b064.png)
![top.png](https://qiita-image-store.s3.amazonaws.com/0/119783/b93f6969-4b2b-750d-766b-c7a9d2045eda.png)
![photos.png](https://qiita-image-store.s3.amazonaws.com/0/119783/83b86080-7c11-9f3c-5b1a-562ef2a5815d.png)


色味としては黒と白を貴重とした落ち着いたデザインを。差し色にオレンジ(暖色)を入れることで親近感を演出。また、高級感のあるフォントと細めのフォントで上品さを出した。
ちょっとまだ爪が甘くダサいが、まあ初心者レベルではこれくらいでも合格点かなと。

# 7.コード
> コードをカキカキ。初心者はここを重要視しがちだが、実際そこまで重要ではない。

頑張りましょう。(今回は省略)

# 8.おしまい
お疲れ様でした。これでデザインの流れはだいたいわかったでしょうか？
あとは経験です！いろんな設計方法を考えて、スーパーデザイナーになりましょう笑。
デザインに慣れてきたら、いろんなデザイン系のイベントに行くことをおすすめします。

# 参考文献・参考サイト
- [About Nagi Yoshida - Nagi Yoshida（ヨシダ ナギ）Official Web Site](http://nagi-yoshida.com/wordpress/about-nagi-yoshida)
参考にしたというより、ただヨシダナギが好きなだけです笑。

- [嵐~ARASHI~ オフィシャルサイト / J Storm 公式](http://www.j-storm.co.jp/arashi/)
参考にしようとしたが、素材の質が違った...
rails5.0.1から5.1へのアップデートした記録

develop環境のみですがアップデートした記録をここに置いときます

## 動作環境
docker for mac
docker image ruby:2.4.1

## アップデート手順

### yarnとnodejsのインストール

新たに追加したのは curl apt-transport-https wget yarn nodejs

```Dockerfile:Dockerfile
RUN apt-get update && \
    apt-get install -y mysql-client build-essential libpq-dev --no-install-recommends 
RUN apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get -y install -y yarn
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && apt-get install nodejs
```

### Gemfileを更新

- railsのバージョン指定を5.1.0
- vuejsやreactを使用するならwebpackerを追加
- その他gemを追加とバージョン指定を修正

もしかしたらrailsとその他のgemは別々にアップデートしなければならないかも

```diff:Gemfile
~/D/rails5_template_project ❯❯❯ git diff Gemfile                                                                                                                                                                                                                              ⏎
diff --git a/Gemfile b/Gemfile
index c2efb80..8647fdf 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,6 @@
 source 'https://rubygems.org'

-gem 'rails', '~> 5.0.0'
+gem 'rails', '~> 5.1.0'

 # view
+gem 'webpacker'

 group :development do
   # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
-  gem 'web-console'
-  gem 'listen', '~> 3.0.5'
+  gem 'web-console', '>= 3.3.0'
+  gem 'listen', '>= 3.0.5', '< 3.2'
+  gem 'capybara', '~> 2.13.0'
+  gem 'selenium-webdriver'
  end
```

### dockerの起動

dockerを起動すると上記で変更したGemfileの内容に従ってbundle installを行うようになっているので、dockerを起動する

```console:console
$ docker-compose up --build
```

### railsアップデート

下記コマンドを実行するとenvronmentやroutesファイルを上書きしてしまうと現在の設定が全て吹き飛ぶので
消えた後にgit diffで再度設定しなおしました。

```console:console
$ cd your/rails/project/root
$ bundle update
$ ./bin/rails app:update
```

### vue.js
vue.jsを使用するのであれば以下のコマンドでインストールを行う

```console:console
$ ./bin/rails webpacker:install:vue
```

## 出来上がったやつ
いつも新しいプロジェクトを作る時にテンプレとして作ってあるやつを今回はrails5.1にアップデートしてみたので、参考になればどうぞ
https://github.com/kkyouhei/rails5_template_project

## 参考にしたサイト

- [Webpackerのディレクトリ構成をRailsから切り離す形に変える方法](http://qiita.com/y-temp4/items/917fd541676bd04b78a9)
- [Railsアップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
- [Rails 5.0からRails5.1へのアップデート](http://kikeda1104.hatenablog.com/entry/2017/05/04/165530)
Sidekiqを2系→3系にアップデートした際にQueueが処理されない時

オプションの指定の仕方が変わっているので注意。


Sidekiqバージョン

* 変更前: 2.16.1 
* 変更後: 3.2.6

変更前

```ruby
bundle exec sidekiq -q queue1,queue2
```

変更後

```ruby
bundle exec sidekiq -q queue1 -q queue2
```

* https://github.com/mperham/sidekiq/wiki/Advanced-Options#queues
Laravel 5.4 でreCAPTCHAを実装する

# 前提
1. Laravel 5.4の利用方法が一通り分かっていること
2. Laravel Collective を使ってFORMを実装済み
3. 実装済みのFORMにreCAPTCHAを追加する

# reCAPTCHAの準備

```shell-session
$ composer require anhskohbo/no-captcha
$ vi config/app.php
```
```php:config/app.php
（前略）
    'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
（中略）
        /*
         * Forms & HTML
         */
        Collective\Html\HtmlServiceProvider::class,

        /*
         * reCAPTCHA <= ここを追加
         */
        Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class,
    ],
（後略）
```

# reCAPTCHAのSECRETとSITE KEYの発行
以下のサイトにアクセスし、ドメインなどを登録。
https://www.google.com/recaptcha/admin#list

# .envの修正

```php:.env
NOCAPTCHA_SECRET={発行されたSECRET}
NOCAPTCHA_SITEKEY={発行されたSITE KEY}
```

# viewの修正
適した場所に以下を挿入。自動的にreCAPTCHAのコードが展開されます。

```php:foobar.blade.php
    {!! app('captcha')->display()!!}
```

# コントローラ（バリデーション）の修正
バリデーションルールとメッセージを追加します。

```php:FoobarController.php
// ルール
$rules = [
    'email'                => 'required|email|max:255',
    'g-recaptcha-response' => 'required|captcha',
];

// メッセージ
$messages = [
    'email.required'                => 'Eメールは必須です。',
    'email.email'                   => 'Eメールの形式が正しくありません。',
    'email.max'                     => 'Eメールは255文字以内で入力してください。',
    'g-recaptcha-response.required' => '「私はロボットではありません」の左にチェックを入れてください。',
    'g-recaptcha-response.captcha'  => '「私はロボットではありません」のチェック結果が確認できませんでした。',
];
```

# 動作確認
1. 画面表示して「私はロボットではありません」の文言が表示されていることを確認
2. reCAPTCHAのチェックボックスをチェックせずに送信ボタンを押下しエラー表示を確認
3. reCAPTCHAでわざと間違い送信に進めない事を確認
4. reCAPTCHAを成功し送信、正しく登録できる事を確認
php artisan migrate で実行されるSQLが確認したい！


「migrate時の実行SQLがみれればいいのになー」とか思ってたらたまたま別の問題の原因を調べているときに↓の記事に行き着いた。
2年前のエントリで若干古い感は否めないが「こんな便利な機能が！」となったのでメモ代わりに書いておく。

[Laravelでプライマリキーを使った1:1関連のテーブル分割で自動採番をしないようにする](http://localdisk.hatenablog.com/entry/2014/03/05/Laravel%E3%81%A7%E3%83%97%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%AA%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F1%3A1%E9%96%A2%E9%80%A3%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%88%86)

> ### 最後に
> migrate の SQL を確認したいときは pretend オプションをつけると確認できます。
> 上記 2 テーブルのマイグレート SQL はこんな感じです。
> 

> ```
> $php artisan migrate --pretend
> 
> CreateUsersTable: create table `users` (`id` int unsigned not null auto_increment primary key, `email` varchar(255) not null, `password` varchar(255) not null, `created_at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8mb4
> CreateUsersTable: alter table `users` add index users_email_index(`email`)
> CreateUsersTable: alter table `users` add unique users_email_unique(`email`)
> CreateUsersTable: ALTER TABLE users MODIFY email varchar(255) CHARACTER SET ascii COLLATE ascii_bin
> CreateUsersTable: ALTER TABLE users MODIFY password varchar(255) CHARACTER SET ascii COLLATE ascii_bin
> CreateProfilesTable: create table `profiles` (`id` int unsigned not null, `name` varchar(255) null, `gender` tinyint null, `birthday` datetime null, `created_at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8mb4
> CreateProfilesTable: alter table `profiles` add primary key profiles_id_primary(`id`)
> ```

ということで```--pretend```をつけて実行するとSQLが確認できるみたいだ。
DBの実行ログとかみればいいだけの話ではあるんだけどその場で実行されたSQLだけが確認できるので省力化されてるように感じる。
Capistrano 3.7 以降の Custom SCM Plugin

Capistrano 3.7 以降では Custom SCM Plugin という方法で、任意の SCM を追加できるようになっています。

* http://capistranorb.com/documentation/advanced-features/custom-scm/

上記のガイドを参考に、Custom SCM を作ってみました。

* https://gist.github.com/tachesimazzoca/95110218bc12edeec0b163300dedd8b6

## Capistrano::SCM::Plugin

リリース物のディレクトリ `releases/#{release_name}` を作るだけで何もしない SCM を例にすると、以下のようになります。

```ruby:capistrano-scm-nope.rb
require "capistrano/scm/plugin"

class Capistrano::SCM::Nope < Capistrano::SCM::Plugin

  def register_hooks
    # 最低限、実装が必要なフック
    after "deploy:new_release_path", "nope:create_release"
    before "deploy:set_current_revision", "nope:set_current_revision"
  end

  def define_tasks
    namespace :nope do
      # ディレクトリ release_path が作成されていることが必要
      task :create_release do
        on release_roles :all do
          execute :mkdir, "-p", release_path
          # TODO: release_path 以下にリリース物を配備
        end
      end

      task :set_current_revision do
        # "#{release_path}/REVISION" に書き出す文字列
        set :current_revision, 'deadbeef'
      end
    end
  end
end
```
```ruby:Capfile
require_relative "path/to/capistrano-scm-nope.rb"
install_plugin Capistrano::SCM::Nope
```

SCM Plugin として最低限の実装は以下になります。

* [deploy:new_release_path](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/deploy.rake) タスクの後に、ディレクトリ [release_path](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/dsl/paths.rb) 以下にリリース物を配備する
* [deploy:set_current_revision](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/deploy.rake) タスクの前に `#{release_path}/REVISION` に書き出す文字列 `:current_revision` をセットしておく

ビルトインの SCM Plugin (Git/Subversion/Mercurial) の実装が参考になります。

* https://github.com/capistrano/capistrano/tree/master/lib/capistrano/scm

## Capistrano::Configuration::SCMResolver

[Capistrano::Configuration::SCMResolver](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/configuration/scm_resolver.rb) の実装を見ると分かるように、従来方式の SCM タスクも読み込めるように、以下の順番で判定されています。

1. SCM を使わない: `fetch(:scm) == nil`
2. Custom SCM Plugin
  * `Capistrano::Configuration#scm_plugin_installed?`
  * `:scm` 値の設定は不要。設定していてもクリアされる
3. ビルトインの SCM Plugin `(git|svn|hg)`
  * `capistrano/scm/#{scm_name}.rb`
4. 従来方式の SCM タスク
  * `capistrano/#{scm_name}.rb`

SCM を使わない場合は、単に `:scm` に `nil` をセットすればよいようです。

```config/deploy.rb
set :scm, nil
```

deploy タスクを利用せず、単に [SSHKit](https://github.com/capistrano/sshkit) のサポートツールとして Capistrano を使う時にも便利です。

* https://github.com/capistrano/capistrano/issues/722#issuecomment-274858047
AIDEを使ってファイルの改竄検知を行う。

# はじめに
ファイル改竄検知に [AIDE(Advanced Intrusion Detection Environment)](http://aide.sourceforge.net/) というのがあります。
オープンソースでAmazon Linuxにもリポジトリが存在するのでyumで簡単に導入することが可能です。


# インストール
リポジトリが存在するのでyumコマンドで簡単にインストールできます。

```bash:インストール
$ sudo yum install aide
```


# データベースの初期化
インストールできたらまずは初期化を行います。

```bash:初期化
$ sudo aide -i

AIDE, version 0.14

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
```

初期化が完了すると _aide.db.new.gz_ というファイルが作成されますが、デフォルトの参照ファイルは _aide.db.gz_ であるため、リネームします。

```bash:データベース配置
$ sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
```


# 改竄チェック
それではチェックしてみましょう。

```bash:改竄チェック
$ sudo aide --check

AIDE, version 0.14

### All files match AIDE database. Looks okay!
```

okayとあるため特に問題はないみたいですがそりゃそうですよね。何もしてないですからw
ということで、 _/root_ 配下に適当にファイルを作成してみます。

```bash:ファイル配置
$ sudo touch /root/aide-test.txt
```

それではもう一度チェックしてみましょう。

```bash:改竄チェック
$ sudo aide --check
AIDE found differences between database and filesystem!!
Start timestamp: 2017-04-28 17:36:55

Summary:
  Total number of files:	60760
  Added files:			1
  Removed files:		0
  Changed files:		1


---------------------------------------------------
Added files:
---------------------------------------------------

added: /root/aide-test.txt

---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /root

--------------------------------------------------
Detailed information about changes:
---------------------------------------------------


Directory: /root
  Mtime    : 2017-04-28 17:28:16              , 2017-04-28 17:36:47
  Ctime    : 2017-04-28 17:28:16              , 2017-04-28 17:36:47
```

先ほど作成したファイルが表示されました。追加/削除/変更が確認できるので便利ですね。


# 更新
このままだとチェックするたびに変更が増えていってしまいますね。
なのでデータベースを更新する必要があります。更新は初期化してあげればOKです。

```bash:データベース更新
$ sudo aide --init

AIDE, version 0.14

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
```

```bash:データベース更新
$ sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
```

これだと毎回「チェック → 更新」を繰り返さないといけないので面倒です。
そんな場合はupdateオプションを利用すれば解決です。


このオプションはチェックを行なった後、データベースの更新をしてくれます。


# オプション
主要なオプションについてまとめました。

|オプション           |説明                 |
|:-----------------|:--------------------|
|--init または -i   |データベースの初期化      |
|--check または -C  |データベースのチェック      |
|--update または -u |データベースのチェックと更新 |


# おわりに
これをcronとかで定期実行すればファイル改竄検知が手軽にできてとても便利ですね。
Laravel5.3のmigrateでパーティションを作成したらハマった罠


## 対応策:

- ```DB:statement("ALTER TABLE [テーブル名] DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `created_at`)");```で主キーをDROPして複合主キーを発行
- ```$table->timestamps()```を削除して```$table->dateTime('created_at')```に変更

## 原因:

### 自動で発行される主キーの罠
```
$table->increments('id')
```

完全に盲点だったのだが↑のコードを実行すると自動的に主キーが発行される。
AUTO_INCREMENT値はだいたいの場合主キーに設定するのでわからなくはないが主キーにしない、というオプションが存在しない模様。
なのでこの状態で「主キーを複合主キーにすればパーティション作成できるじゃん！」とか考えていて痛い目をみた。

```
Syntax error or access violation: 1068 Multiple primary key defined
```

```$table->primary(["id", "created_at"])```を呼び出してもすでに主キーがあるため↑のエラーが吐かれる
(上書きしてくれたりはしない、~~めんどくせえ…~~)

--

### ```created_at```の型がパーティショニングに対応していない

Laravelのmigrationファイルを作成するときに```php artisan make:migration --create=[テーブル名]```をすると思うんだけど
migrate側が自動的に生成してくれる```$table->timestamps()```で定義されているデータ型がパーティショニングに対応していない。

具体的にはMySQLのパーティショニングがサポートする日付、時間関連のデータ型はDatetime、もしくはDate型のみサポートしているためTimestamp型はサポート対象外となる。

```
Syntax error or access violation: 1067 Invalid default value for 'created_at' (SQL: ALTER TABLE [テーブル名] DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `created_at`))
```

```
Field 'created_at' is of a not allowed type for this type of partitioning
```

[Laravel4で複合プライマリーキーを設定する](http://shinbashi.hatenablog.com/entry/2014/04/17/232728)ではtimestampsでイケた！とあるが少なくともLaravel(5.3)+MySQL(5.7.18)ではエラーになる。

--

## まとめ

ちなみにスキーマビルダーではパーティションの作成はできないのでmigrationファイル内で```DB:statement("ALTER TABLE [テーブル名] PARTITION BY RANGE COLUMNS(`created_at`) ([省略])");```みたいな泥臭い実装をする必要がある。

パーティションは割りとよく使う部分の機能だと思うがサポートするのは面倒そうだしわからなくはないが```increments()/bigIncrements()```なデータ型から主キーを外すオプションは欲しい。
AWS Windows Server 2016でのJMeter環境構築（分散環境編）

この記事では、AWS ec2のWindows Server 2016に、JMeter3.2の環境構築をしました。また、CentOS7と組み合わせた分散環境を構築します。Windows側をマスターに、CentOS側をスレーブにします。リモートデストクップクライアントは、Microsoft Remote Desktop for Mac Beta version 8.2.31を利用しています。

# 1. Windows単独環境でのJMeter構築

単独環境での構築については、「[AWS Windows Server 2016でのJMeter環境構築] (http://qiita.com/toast-uz/items/8bd8d766e2aa3a6824e5)」を参考にしてください。

# 2. CentOSでのJMeter構築

ec2でのCentOS7の初期セットアップについては省略します。

必要なコンポーネントを追加します。

```bash
$ sudo yum update -y
$ sudo yum install wget -y
$ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
$ sudo wget http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-3.2.tgz -P /opt/
```

ダウンロードしたJMeter3.2をインストールします。

```bash
$ sudo tar zxvf /opt/apache-jmeter-3.2.tgz -C /opt/
```

自動起動を設定します。IPアドレスは環境に合わせて指定してください。

```bash
$ sudo vi /etc/rc.local
ファイル末尾に
/opt/apache-jmeter-3.2/bin/jmeter-server -Djava.rmi.server.hostname=172.31.27.62 &
を追加します。
$ sudo chmod +x /etc/rc.local
```

同時接続数を大きくしてもよいように、ファイルディスクリプタの最大数を拡張します。

```bash
$ sudo vi /usr/lib/systemd/system/rc-local.service
ファイル内の [Service] の配下に
LimitNOFILE=64000
を追加します。
```

再起動して動作確認します。

```bash
$ ps -ax | grep jmeter
  760 ?        S      0:00 /bin/sh /opt/apache-jmeter-3.2/bin/jmeter-server -Djava.rmi.server.hostname=172.31.27.62
  767 ?        S      0:00 /bin/sh /opt/apache-jmeter-3.2/bin/jmeter -Dserver_port=1099 -s -j jmeter-server.log -Djava.rmi.server.hostname=172.31.27.62
  905 ?        Sl     0:01 java -server -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=250 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -jar /opt/apache-jmeter-3.2/bin/ApacheJMeter.jar -Dserver_port=1099 -s -j jmeter-server.log -Djava.rmi.server.hostname=172.31.27.62
 9107 pts/0    R+     0:00 grep --color=auto jmeter
$ cat /proc/`pgrep java | head -1`/limits | grep 'open files'
Max open files            64000                64000                files     
```

同様の環境を計4セット構築します。

# 3. マスター設定

Windwosファイアウォールをオフにします。これをしないと、スレーブとうまく通信できません。

Windows側のJMeterのインストールフォルダ配下binにある、jmeter.propertiesを設定します。IPアドレスは環境に合わせてください。

```:jmeter.properties
remote_hosts=172.31.27.62,172.31.26.37,172.31.20.153,172.31.28.111
```

# 4. Jmeterの実行

JMeterを起動して、「[AWS Windows Server 2016でのJMeter環境構築] (http://qiita.com/toast-uz/items/8bd8d766e2aa3a6824e5)」で作成したテストシナリオを呼び出します。

![スクリーンショット 2017-05-05 16.54.00.png](https://qiita-image-store.s3.amazonaws.com/0/156600/d28ba01d-9e90-4279-f203-3442c6572e93.png)

今度は、右上の緑矢印が２つ書かれているボタンをクリックします。
すると、4台分に相当する、約4000リクエスト/秒の性能が測定されていることがわかります。

![スクリーンショット 2017-05-05 16.57.22.png](https://qiita-image-store.s3.amazonaws.com/0/156600/8549c9ef-5e4f-7a66-54a3-ea1a04319b5c.png)
Publisher VBA Startセット(2) Startセット

```vb:PublisherStartMacro
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

Sub PublisherStartMacro()
Const StLine = 9 'Input This Line Number
Dim pbDoc As Publisher.Document: Set pbDoc = Publisher.Application.ActiveDocument
Dim pbView As Publisher.View: Set pbView = pbDoc.ActiveView
Dim pbWin As Publisher.Window, WSz As pbWinSize: Set pbWin = pbDoc.ActiveWindow: WSz.h = pbWin.Height: WSz.l = pbWin.Left: WSz.w = pbWin.Width: WSz.t = pbWin.Top
Dim pbPages As Publisher.Pages: Set pbPages = pbDoc.Pages
Dim pbPage As Publisher.Page, pbPSet As pbPageSet: Set pbPage = Publisher.ActiveDocument.ActiveView.ActivePage
Dim pbShps As Publisher.Shapes, pbShp As Publisher.Shape
Dim pbtFrame As Publisher.TextFrame, pbtRng As Publisher.TextRange
Dim pbTStyles As Publisher.TextStyles, pbTstyle As Publisher.TextStyle
Dim Sz As pbShapeSize, FS As FontSetting, Para As ParagraphSet, PSz As pbShapeSize, Tss As pbTableSet, SS As pbStroySet, TFS As PbTextFrameset, TRS As PbTextRangeset
Debug.Print StLine + 10 'Line:0012 <StLine Use Like This. Show Relative Row Position.And Add Remark Line Number Like "'Line:0012" is Readabily.
End Sub
```
##Publisherのスタートセット

変数の宣言が毎回面倒ですがこのパターンで可能となります。
ただし前回のTypeステートメントを忘れないようにしてください。
別モジュール等Typeステートメントがないと作らないとエラーを起こします。
前回はこちら
Publisher VBA Startセット(1) Typeステートメントと関数
http://qiita.com/Q11Q/items/c8a1e05457722d0092f2

##Pageのセット
 Set pbPage = Publisher.ActiveDocument.ActiveView.ActivePage
AcitivePageかCurrentというのがあるのが常ですが、PublisherはActivePageです
しかしDocumentではなくDocument.ActiveViewというViewオブジェクトの下になります。
これが嫌なとき、Page数を指定するときは
Set PbPage= PbPges(1)
のようにします。

##ShapeはPageの下
つまりPages Page Shapes Shapeのように並んでいます。
したがってShapesオブジェクトはページとごとに設定する必要があります。

#このほかにこんなのもあります
設定を書きだすマクロを作成しました
[Publisher VBA Publisherの設定を書きだす](https://qiita.com/Q11Q/items/5493d2e9fdf5f4a44c17)
縦中横を実現するマクロ
[Publisher VBA 縦中横 を実行して数字を並べるマクロ](https://qiita.com/Q11Q/items/a2c84c8c5ae08df844ab)
Docker+node+express且つnodeユーザー+80番ポートでexpress起動できなかった件

自分用の覚書

# 環境

||ver|
|---|---|
|Docker|1.11.2|
|node|7.9-alpine|
|express|4.15.2|

# 症状

```bash
$ docker run --rm -it --user node node:7.9-alpine ash

$ cd /home/node
$ yarn add express
$ node -i
> const express = require('express');
> const app = express();
> app.listen(80, () => { console.log('listen on port 80'); });
Server {
~ 割愛 ~
  maxHeadersCount: null }
> Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:1050:11)
    at exports._exceptionWithHostPort (util.js:1073:20)
    at Server.setupListenHandle [as _listen2] (net.js:1247:19)
    at listenInCluster (net.js:1304:12)
    at Server.listen (net.js:1402:7)
    at Function.listen (/opt/node_modules/express/lib/application.js:618:24)
    at repl:1:5
    at ContextifyScript.Script.runInThisContext (vm.js:23:33)
    at REPLServer.defaultEval (repl.js:339:29)
    at bound (domain.js:280:14)
```

# 参考

* http://stackoverflow.com/questions/35068712/error-listen-eacces-0-0-0-080-osx-node-js

ポート番号を変えると良い的な

# 対処

```bash
$ docker run --rm -it --user node node:7.9-alpine ash

$ cd /home/node
$ yarn add express
$ node -i
> const express = require('express');
> const app = express();
> app.listen(18081, () => { console.log('listen on port 18081'); });
Server {
~ 割愛 ~
  _connectionKey: '6::::18081' }
> listen on port 18081
```

# 最後に

rootユーザーなら起動できる
Chrome Extension で Vue.js を使いたい

Chrome Extension は [Content Security Policy (CSP)](https://developer.chrome.com/extensions/contentSecurityPolicy) に準拠した JavaScript しか動かせない。
Vue の eval が unsafe だとかで警告が出る（たぶん `vue.min.js` だと警告すら出ないので原因に気づきづらい）。

## 対策
### 対象の html を SandBox として指定する

```
"sandbox":{
    "pages": [
        "main.html"
    ]
}
```
- ただしここで指定した html では Chrome Extension の API が使用できない。 API を使用する必要がある場合は別ページにメッセージで値を渡したりする必要がある。

### CSP 準拠ビルドの Vue を使用する
- https://github.com/vuejs/vue/tree/csp/dist
- npm だったら `npm install npm@csp` でいける

## 参考
- [CSP環境でVue.jsを使う](http://qiita.com/namazu510/items/5225c487cacaa71d34a3)
- [ChromeAppsのSandBox化について](http://qiita.com/koki_cheese/items/c6e4b50c50964ba52f8a)
- [Instllation -- CSP-environments](https://vuejs.org/v2/guide/installation.html#CSP-environments)
- [Vue.js in Chrome extension](http://stackoverflow.com/questions/34615503/vue-js-in-chrome-extension)
Remove AlertView Title in UIWebView

# Background

The app uses webview to load web-page in iPad. When javascript call the function `alert`, iPad will call a message, e.g.
![IMG_0187.PNG](https://qiita-image-store.s3.amazonaws.com/0/114282/ccbd263e-a7dd-7109-0e24-287669feeb85.png)
As you can see, the title of alert view is the domain name of this page, but it's ugly or should be in secrecy. So the task is to hide or remove the title of the alert view.

# Solution

We can add category to UIWebView to catch up the alert and show another new alert with no title.

```objc:
@interface UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;

@end

@implementation UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
    
    
    UIAlertView* customAlert = [[UIAlertView alloc] initWithTitle:@""
                                                          message:message
                                                         delegate:nil
                                                cancelButtonTitle:@"OK"
                                                otherButtonTitles:nil];
    
    [customAlert show];
    [customAlert release];
    
}

@end
```

Now we will get a new alert view with no title, but notice that the message will be in bold font.
![IMG_0188.PNG](https://qiita-image-store.s3.amazonaws.com/0/114282/6d4cf9ea-b46c-6708-121e-273de7158e5d.png)


# Reference
[Apple API Reference](https://developer.apple.com/reference/webkit/wkuidelegate/1537406-webview?language=objc)
[Relevant problem on stackoverflow](http://stackoverflow.com/questions/1565102/can-i-handle-alert-inside-uiwebviewdelegate)
[Another solution on stackoverflow](http://stackoverflow.com/questions/10681381/change-javascript-alert-dialog-title-in-ios)
Laravel MixでReactとMobxを使う

## はじめに
LaravelでReactとMobxを使いたかったのだが、なるべくLaravelで準備されているものを使いたかったので、フロントエンドのトランスパイル周りはLaravel Mixを使うことにした。これはその時の設定の備忘録となる。なお、最小限動くだけに留めている。

Laravel Mix:
https://readouble.com/laravel/5.4/ja/mix.html

## package.json
Laravelにデフォルトで入っているものに最小限のものだけ追加したもの。

```js.package.json
{
  "private": true,
  "scripts": {
    "dev": "npm run development",
    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch-poll": "npm run watch -- --watch-poll",
    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "prod": "npm run production",
    "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
  },
  "devDependencies": {
    "axios": "^0.15.3",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-1": "^6.24.1",
    "bootstrap-sass": "^3.3.7",
    "cross-env": "^3.2.3",
    "jquery": "^3.1.1",
    "laravel-mix": "0.*",
    "lodash": "^4.17.4",
    "vue": "^2.1.10"
  },
  "dependencies": {
    "mobx": "^3.1.9",
    "mobx-react": "^4.1.8",
    "react": "^15.5.4",
    "react-dom": "^15.5.4"
  }
}
```

## webpack.mix.jsの設定
プロジェクトのルートディレクトリに`webpack.mix.js`があるのでこれを編集する。`mix.js`のところを`mix.react`に書き換えるだけでよい。なお、実際のプロジェクトでは複数のjsをトランスパイルしたかったので、`mix.react`を複数書いている。
#### 編集前
```js:webpack.mix.js
mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');
```

#### 編集後
```js:webpack.mix.js
mix.react('resources/assets/js/foo.js', 'public/js/foo.js')
mix.react('resources/assets/js/bar.js', 'public/js/bar.js')
mix.sass('resources/assets/sass/app.scss', 'public/css')
```

## babelrcの設定
Laravel Mixは内部でbabelの設定を持っているようだが、ルートディレクトリに`.bablerc`を作成するとそれが優先的に使用される。以下はその設定となる。

```json:.babelrc
{
  "presets": [
    "react",
    "es2015",
    "stage-1"
  ],
  "plugins": ["transform-decorators-legacy"]
}
```

## おわりに
あとは`package.json`で定義されているscirpit(npm run prodとか)をデフォルトのまま使用すれば正常にトランスパイルされる。
【C】自作のヘッダファイルの小さなメモ

# コード

```C:test.c
#include <stdio.h>
#include "plus1.h"

int main(int argc, const char * argv[])
{
    // insert code here...
    int x = 1;
    x = plus1(x);
    printf("x = %d\n", x);
    return 0;
}
```

```C:plus1.c
#include "plus1.h"

int plus1(int x) {
    int y;
    y = x + 1;
    return y;
}
```

```C:plus1.h
#ifndef PLUS1_H_
#define PLUS1_H_

int plus1(int x);

#endif // PLUS1_H_
```


# 実行
```
# gcc plus1.c test.c
# ./a.out
x = 2
```

# 参考
一週間で身につくC言語の基本|第7日目：ファイル分割 http://c-lang.sevendays-study.com/day7.html
動くObjectの速度の測り方[Unity]

既出ですが速度の測り方を2つ紹介します
#velocityで測る

超簡単

```C# 
Rigidbody rigid;
Vector3 speed;

void Start(){
  rigid = GameObject.Find("playerObject").GetComponent<Rigidbody>();
}

void Update(){
  speed = rigid.velocity.magnitude;
}
```

velocityは速度ベクトル。それのmagnitudeでベクトルの長さ、つまり速度を測れます。
これはRigidbody必須なのでRigidbodyをつけていない物体の速度を測りたい時は次の測り方を利用してください。

#フレーム間での移動距離で測る

```C#
Vector3 latestPos;
Vector3 speed;
GameObject player;

void Start(){
  player = GameObject.Find("playerObject");
}

void Update(){
  speed 
    = ((player.transform.position - latestPos) / Time.deltaTime).magnitude;
  latestPos = player.transform.position; 
}
```

playerの座標を毎フレーム最後に取得して、次フレームで移動したplayerの座標と比較してその差分を1フレームの時間Time.deltaTimeで割ると速度を得られます。

#感想
やっぱvelocity使う方が書く量も少ないし、可読性高いし便利だねっていうお話でした。
Railstutorial 4版　覚書 第７章

私が理解しづらかったところをまとめます。
#createアクションの実装

画面遷移順にしてみた。

```app/controllers/users_controller.rb
class UsersController < ApplicationController


  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])  # 1　実装は終わっていないことに注意!
    if @user.save
      redirect_to @user  # 2
    else
      render 'new'
    end
  end

  def show
    @user = User.find(params[:id])
  end

end

```

- 重要1

```
@user = User.new(params[:user])
=> セキュリティのためこう書かないとダメ
@user = User.new(params.require(:user).permit(:name, :email, :password, :password_confirmation))
```
user_paramsという外部メソッドを使用するのが慣習になっているので、

```
  def create
    @user = User.new(user_params)
          .
          .
          .

  end

  private

    def user_params
      params.require(:user).permit(:name,:email, :password, :password_confirmation)
    end
```
とする。

- 重要2
 
```
redirect_to user_url(@user)
=> railsがよしなにやってくれるので、下のように書くほうがよい
redirect_to @user
```

#本番環境用のpumaの設定

第１章に書いたことがここに！！



**追記**
今回、テストは軽くやってしまった。
次の一周は理解できるように頑張る。
LaravelでFormのプルダウンで「選択してください」を追加する方法

本当に簡単なことですが、始めてやったときに解決策がわからず、先輩に助けてもらったので、
僕のような人のために書きます。

## やりたいこと
formのプルダウンで年月を選択させる場合に、「年」、「月」や「選択してください」といった
項目を作る。

## 環境
laravel5.4
formヘルパー使用

## 書き方

```php
{!! Form::selectRange('year', date('Y')-10, date('Y')+10, old('year'), ['class' => 'form-control', 'placeholder'=>'年']) !!}

{!! Form::selectRange('month', 1, 12, old('month'), ['class' => 'form-control', 'placeholder'=>'月']) !!}
```

ただ単に**placeholder**を使用すればいいだけです。
上記方法でplaceholderに選択した値のままにすれば　valueは空になるので、
selectboxで何も選択しないということができます。
iPhoneからiTunesへ音楽を転送する方法

#iPhoneからiTunesに音楽を転送する簡単な方法

PCがウイルスで初期化して、iTunesに入っていた曲が全部なくなったという経験がありましたか？その場合は、もしiPhoneには同期していた曲が残っているなら、直接iPhoneからiTunesに音楽を移すと、音楽データをiTunesに保存できます。

でも、iTunesは、iPhoneの音楽データをPC・iTunesに転送することを支持しないです。なので、iPhoneからiTunesに音楽を転送するため、ここで、専門のデータ転送ソフト　-　AnyTransをおすすめします。

**AnyTransとは**
AnyTransは、逆転送を可能にする便利なデータ転送ツールで全世界で850万ダウンロードを突破します。このツールを使えば、iPhoneからiTunesに音楽を転送できるだけでなく、次の利点もあります：
１、iTunesの音楽をiPhoneに同期することもでき、iTunesより使いやすい。
２、音楽のアーティスト、レート、コメント、アートワークや再生回数などの個人データも維持
３、音楽のほか、プレイリスト、着信音、ビデオ、写真、アプリ、連絡先、メッセージ、メモやリマインダーなどほとんどのファイルをサポート
４、必要に応じて、音楽のプレビューと選択ができる
５、高速な転送スピードで、1分間に200曲を転送できる
６、データの紛失はなく、音質も劣化しない

次は、AnyTransを使って、iPhoneからiTunesに音楽を転送する方法をご紹介します。
##iPhoneからiTunesに音楽を移行する
ステップ１：　AnyTransをパソコンに無料ダウンロード＆インストール　＞　　iPhoneをパソコンに接続　＞　AnyTransの管理画面が表示される　＞　マウスでスクロールして、インターフェースを変えます。
テップ2：　「オーディオ」から「音楽」を選択します。
ステップ3：　iTunesに同期したい楽曲を閲覧＆選択（レ点チェックを入れる）　＞　右上の「iTunesへ」アイコンをクリックすると、iPhoneの音楽がiTunesに転送されます。

詳しくはこっちへ：
https://www.imobie.jp/support/how-to-transfer-music-from-iphone-to-itunes.htm
[Ruby入門] 連載目次


この連載は、他言語経験者である自分がRubyを学ぶ過程を記したものです。
Rubyの基本や特徴的なトピックを、コンパクトかつ網羅的に整理しています。
良かったら見ていってください！

## [Ruby入門]  連載目次

[01. 導入（Macに最新版のRubyを入れる）](http://qiita.com/prgseek/items/ff037cc6134ff9303c67)

[02. エディタの準備（Visual Studio Code で Ruby書いてデバッグ）](http://qiita.com/prgseek/items/3a24548b485220dd9bc5)

[03. 数値を扱う（リテラルと変数と演算。ついでに定数の話も）](http://qiita.com/prgseek/items/b8ec7adae13ba413578f)

[04. 文字列を扱う（リテラルとStringクラス。あと正規表現）](http://qiita.com/prgseek/items/92b49fe6b0a579f9cdd8)

[05. 制御構文（条件分岐、繰り返し処理）](http://qiita.com/prgseek/items/4140ea928be40f55c68e)

[06. 配列を扱う](http://qiita.com/prgseek/items/1871a9cd60ba00827e91)

[07. ハッシュを扱う](http://qiita.com/prgseek/items/5bb3c90dbf922ff7d2ee)

[08. メソッドを定義する](http://qiita.com/prgseek/items/f91f71349164c3376acc)

[09. クラスを定義する① 基本的な定義方法と継承（あとクラスメソッドとかクラスインスタンス変数とか）](http://qiita.com/prgseek/items/46bd7cfa6f13a386f46c)

[10. クラスを定義する② メソッドと変数へのアクセスを制御する](http://qiita.com/prgseek/items/798d899cdaf5d0a2fec8)

[11. クラスを拡張する① モジュールのお話](http://qiita.com/prgseek/items/7d173441a9b366e79e46)

[12. クラスを拡張する② 特異クラス、特異メソッド、オープンクラス](http://qiita.com/prgseek/items/9ada71b30119bef5d896)

[13. 例外処理](http://qiita.com/prgseek/items/bd63a6081b811c0deb33)

[14. 日付と時刻を扱う（全パターン網羅）](http://qiita.com/prgseek/items/c0fc2ffc8e1736348486)

[15. ファイルとディレクトリを操作する](http://qiita.com/prgseek/items/38f74d99b74baa3b42f7)

[16. Proc と lambda（処理ブロックと空間をオブジェクト化する）](http://qiita.com/prgseek/items/26aa90dfba168082d2d7)

[00. その他のトピック（とりあえず未分類なもの）](http://qiita.com/prgseek/items/99bb1089d610878fd948)
任意の型の分解

C#7で***ValueTuple***とともに導入されて一緒に語られることが多い機能に分解代入があります。これは***ValueTuple***限定ではなく、***Deconstruct***メソッドを定義しておくと任意の型を分解することができます。

```csharp
// 例えば、Pointに対する拡張メソッドを定義しておくと
public static void Deconstruct(this System.Windows.Point p, out double x, out double y)
{
    x = p.X;
    y = p.Y;
}
```
```csharp
// 分割代入ができるようになります。
var (x, y) = new System.Windows.Point(2, 3);
Console.WriteLine($"{x}:{y}");
```

ILSpyでデコンパイルすると***Deconstruct***拡張メソッドを呼び出してるのが確認できます。そして、***ValueTuple***に非依存であることも確認できます。

```csharp
double num;
double num2;
new Point(2.0, 3.0).Deconstruct(out num, out num2);
double arg_28_0 = num;
double num3 = num2;
double x = arg_28_0;
double y = num3;
Console.WriteLine(string.Format("{0}:{1}", x, y));
```

ただし、実行モジュールは***ValueTuple***に非依存なのですが、コンパイルにはValueTupleが必要になるようです。下記コンパイルエラーが出ます。
>定義済みの型 'System.ValueTuple`2' は定義、またはインポートされていません

仕様かバグかはよくわかりませんが、コンパイルも通ればいいのにとか思いました。
iOSでlocal htmlファイルを読み込むときに表示されなくてハマったのでメモ


## やりたいこと
とある画面のバックグラウンドでアニメーションを再生したい。
アニメーションネイティブ実装が面倒で、iOS, Android共通で表示したかったので、htmlファイルをwebviewで表示させる方法を選択しました。

## 完成イメージ
webviewイメージとしてはこんな感じ。
![Simulator Screen Shot 2017.05.05 14.10.14.png](https://qiita-image-store.s3.amazonaws.com/0/143374/31b90237-b213-d6c2-8016-923dd9939ef0.png "Simulator Screen Shot 2017.05.05 14.10.14.png")

## 今回ハマったこと
出来たhtmlファイルはchrome等では表示されるのに、iOSでは読み込むと表示されませんでした。

結論から言うとhtml側のpathの問題でした。
xcodeに取り込んだ場合、フォルダ構成が異なるようです。


## 取り込んだhtmlソースのフォルダ
html, jsのフォルダ構成はこんな感じ。
![スクリーンショット 2017-05-05 14.06.54.png](https://qiita-image-store.s3.amazonaws.com/0/143374/e8cceed5-8ef4-4c8a-c424-b20aad474d62.png "スクリーンショット 2017-05-05 14.06.54.png")

## 問題のhtmlファイルのパス
```bubble.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <link rel="stylesheet" type="text/css" href="css/common.css" media="all">
    <link rel="stylesheet" type="text/css" href="css/bubble.css" media="all">

    <script type="text/javascript" src="js/jquery.1.11.1.js"></script>
    <script type="text/javascript" src="js/bubble.js"></script>
</head>
<body>
    <div class="field"></div>
</body>
</html>

```
フォルダ構成的に```href="css/common.css"```, ```"js/bubble.js"```で正しそうなのですが（実際はローカルにフォルダおいてchrome等で見てたときはこれでOKだった）、インストールされるアプリを見てみると、パッケージディレクトリでは異なるそうで、パスの変更が必要です。

以下、パスの変更版

```bubble.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <link rel="stylesheet" type="text/css" href="./common.css" media="all">
    <link rel="stylesheet" type="text/css" href="./bubble.css" media="all">

    <script type="text/javascript" src="./jquery.1.11.1.js"></script>
    <script type="text/javascript" src="./bubble.js"></script>
</head>
<body>
    <div class="field"></div>
</body>
</html>

```





## veiwcontrollerの実装
ローカルファイルなのでwkwebviewにはしてません。
```viewcontroller
class ViewController: UIViewController {
    
    let bubblePath = Bundle.main.path(forResource: "bubble", ofType: "html")
    
    var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        webView = UIWebView(frame: self.view.frame)
        
        self.view.addSubview(webView)
        // Do any additional setup after loading the view, typically from a nib.
        
        let request = URL(fileURLWithPath: bubblePath!)
        let req = URLRequest(url: request)
        webView.loadRequest(req)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

これでうまく表示されます( ❛⃘ ∨ ❜⃘⃘ )੭⁂
FileMaker-Let関数でフィールド内容を変数に入れておくとどれくらい計算結果が速くなるか？_計算フィールド編

前記事
[FileMaker-Let関数でフィールド内容を変数に入れておくとどれくらい計算結果が速くなるか？_テキストフィールド編](http://qiita.com/Hi_Noguchi/items/857ebb08a5466a6151f4)

上記、前記事からの続きです。
[FileMakerのLet関数とは？](http://qiita.com/Hi_Noguchi/items/857ebb08a5466a6151f4#let%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%AF)　とか、その他諸々の前提については前記事をご参照ください。


## 検証にあたっての環境・条件等
実行環境ですが、

* Windows7 64bit
* FileMakerPro15 Advanced

です。

条件としては、

#### 前回と同じ条件
* テキストフィールド a, b, c の3つを用意
* a には文字列「ピティナ開発者ブログ」を格納(全角10文字)
* b には文字列「方丈記の全文」を格納(全角およそ9400文字)
* c には文字列「a」を格納(半角1文字)

#### 今回の条件
* 計算フィールド c_a, c_b, c_c の3つを用意
* c_a, c_b, c_c はすべて索引設定をおこなわない（計算結果を保存せず必要時に再計算）
* c_a, c_b, c_c それぞれに対して、変数resultに値を格納することを1,000回ループ
* 変数resultの中身は、c_a, c_b, c_c それぞれを改行区切りで10回繰り返したもの

#### 計算フィールドの中身
* c_a
 * 単にテキストフィールド a, b, c を連結したもの。

```
a & b & c
```

* c_b
 * テキストフィールド b からFilter関数を用いて平仮名だけ抽出したもの。

```
Filter ( b ; "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん" )
```

* c_c
 * 計算フィールド c_a, c_b を連結したもの。

```
c_a & c_b
```

これで、何秒かかるのかを計測してみます。
なるべく、余計なif分岐で計測ノイズを混ぜないように、スクリプトはあえて全部分けて作っています。


## Let関数を使わずにやってみる
まずはLet関数を使わずにやってみましょう。

### Let関数を使わない場合の速度結果

|フィールド|文字数                             |時間      |
|:--------|:---------------------------------|:--------|
| c_a     | a, b, c 連結                      | 12.28秒 |
| c_b     | b にFilter関数かけて平仮名のみにする| 33.45秒 |
| c_c     | c_a, c_b 連結                     | 45.61秒 |

非常にわかりやすい結果が出ました。
Filter関数かけるとやっぱりそれなりに時間かかるのは予想通りです。
また、 c_a, c_b を連結すると、単純に、それぞれの計算にかかっていた時間の和になっています。
計算式内で別の計算フィールドを複数使っても、複雑度が増して余計に時間がかかる、ということはなく、単なる加算でしかないようです。

さて、上記の数字が出たということは、Let関数を使った場合の結果も、既におおよその予想はつくのではないでしょうか。
計算を10回繰り返しているわけですから、Let関数を使って計算を最初の1回きりにしてしまえば、理屈上、1/10の速度で済むという話ですよね。


## Let関数を使ってやってみる
さあ、それでは、Let関数を使ってみます。

### Let関数を使った場合の速度結果

|フィールド|文字数                             |時間      |
|:--------|:---------------------------------|:--------|
| c_a     | a, b, c 連結                      | 01.83秒 |
| c_b     | b にFilter関数かけて平仮名のみにする| 03.88秒 |
| c_c     | c_a, c_b 連結                     | 05.36秒 |

はい、まさしく予想通りの結果になりました。
ストレートに1/10になったわけではないですが、そこは、最初の1回に少し時間がかかるってことでしょうかね。


## 結論
繰り返し使用するフィールド内の値が重ければ重いほど、Let関数を用いて変数定義して使った方が、計算結果が速くなります。
……という、前回に続いての結論と全く同じなわけですが、より、論の強度が増した、といえますね。

で、続編としてもう一つ、「_外部フィールド編」で検証を続けてみたいと思います。
前回・今回と、単一テーブル内だけで見ていましたが、「リレーションを組んだ別テーブル」そして「リレーションを組んだ別ファイルの別テーブル」にあるフィールドを参照する場合、どうなるか、というのを見てみます。
しばしのお待ちを（書いたらリンクつけます）
dockerメモ

## Dockerメモ備忘録（常に追記）
### dockerコンテナ取得
```
docker pull kaixhin/cuda-caffe
# https://hub.docker.com/に色々ある
```

### dockerイメージ一覧取得
```
docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
lasagne_image4        latest              386ab9f1c3d2        7 days ago          1.85 GB
lasagne_image3        latest              34fd018c5f54        7 days ago          1.83 GB
lasagne_image2        latest              2cd1f55da8b2        9 days ago          1.78 GB
lasagne_image1        latest              9e4228d01df1        9 days ago          1.78 GB
pycharm_helpers       PY-171.3780.115     e64bec1a86c4        3 weeks ago         25.8 MB
<none>                <none>              61456b2b077f        3 weeks ago         797 MB
mathewlee11/pycaffe   latest              aeb933d9e92c        2 years ago         1.76 GB
# pullしたやつがここに入る
```

### dockerイメージからコンテナ起動
```
docker run -it mathewlee11/pycaffe
# -iと-tは、標準出力などをローカル上に表示するためのオプションで必須。
```

### コンテナの確認
```
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c9f8dfb8c26b        lasagne_image4      "/bin/bash"         2 days ago          Up 51 minutes                           jovial_blackwell
# -aで止まってるコンテナも合わせて確認できる。
```

### dockerコンテナからイメージを保存(作業した状態を保存)
```
# docker上で作業した後、CTRL-p+CTRL-qでコンテナをdetach(exitしちゃダメ)
# コンテナIDを確認
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c9f8dfb8c26b        lasagne_image4      "/bin/bash"         2 days ago          Up 51 minutes                           jovial_blackwell
# docker commit。使い方は、docker commit -m 'some comments' <container id> <image name>
docker commit -m 'caffe_work' c9f8dfb8c26b caffe_test1
sha256:b2a54bfcff38534b586f569530d12a6ad9aeaf868e7db73360325cbaea308713
# 保存したイメージを確認
docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
caffe_test1           latest              b2a54bfcff38        2 days ago          2.67 GB
# 次からは、docker run -it caffe_test1で利用可能。
# detachしたイメージは、docker attach <container id>で再開可能。
```

### dockerコンテナの削除
```
# docker ps -aで調べたidを使って
docker rm <container id>
```

### dockerイメージの削除
```
# docker imagesで調べたREPOSITORYを使って
docker rmi <REPOSITORY>
```

### ローカルとdockerコンテナ間のファイル共有
```
# 起動時に-vオプションで指定 -v local_dir:remote_dir
docker run -it -v /path/to/local/:/path/to/remote/ caffe_test1
# オプションの順番を守らないとダメ。docker run -it hoge -v hoge:fugaだと怒られる。
# あと、ローカル側は、/tmp,/Users,などじゃないとダメっぽい。(公式ドキュメントをどっかで見た記憶があるけど、どれかわからなかったｗ)
```

### docker時のbashrcについて
何故か変更が反映されなかった。ただし、中で呼んでいる別のファイル(ex ~/.bash_aliases)の変更は反映されたので、これを変えてログイン時の処理を記述した。
eclipse Neon(4.6)にTomcatプラグインをインストールする方法

# 概要
マーケットプレースでインストールしようとしたら
「　http://tomcatplugin.sf.net/update/content.xml のリポジトリーを読み取ることができません。　」
とかエラーでて、ハマったのでeclipseNeonでのTomcatプラグインインストール方法備忘録。

# 環境
- eclipse: 4.6.2(日本語化済み)

# 方法
## 1.以下URLからTomcatプラグインzipをダウンロード。
https://sourceforge.net/projects/tomcatplugin/files/
![FireShot Capture 7 - Eclipse Tomcat Plugin -_ - https___sourceforge.net_projects_tomcatplugin_files_.png](https://qiita-image-store.s3.amazonaws.com/0/75324/496c5362-d633-74bb-4286-bdb90f35c2d7.png)

## 2.eclpseのメニュー「ヘルプ」→「新規ソフトウェアのインストール」。

## 3.「追加」→「アーカイブ」でダウンロードしたzipファイルを選択。
![無題１.png](https://qiita-image-store.s3.amazonaws.com/0/75324/a1c2a1c6-879d-eda0-0d40-aea898560b5e.png)

## 4.Tomcat Pluginが表示されたらチェックしてインストール。

## 5.eclpse再起動。

以上。
単体テスト環境を作ってみる


C言語での単体テスト環境になかなかいいのがないので自作してみる。

### 目的

-  通常のビルド環境とは別に単体テストを簡単に実行できる環境を作る。("make test"でテスト実行)
- テストコードは関数を追加するだけにしたい。


### 実装結果

テスト対象

```main.c 
#include <stdio.h>

static int func1(int parm)
{
    if (parm > 0)
        return 1;
    return 0;
}

int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    printf("arg test %d\n", func1(argc));
    return 0;
}
```

テストコード

```ut_main.c 
#include <stdio.h>
#include <dlfcn.h>
#include <stdbool.h>

/* test function prototype */
typedef bool (*Test)(void);

#define main __original_main

#include "main.c"

#undef main

#define UT_ASSERT(f) {if (!(f)) {printf("%s:%u: '%s' is NG\n", __FILE__,__LINE__,#f);return false;}}

bool test001(void)
{
    UT_ASSERT(func1(1) == 1);
    return true;
}

bool test002(void)
{
    UT_ASSERT(func1(0) == 1);
    return true;
}

bool test003(void)
{
    UT_ASSERT(func1(-1) == 0);
    return true;
}

int main(int argc, char *argv[])
{
    Test t;
    bool ret;
    int i;
    char func_name[100];
    unsigned int count_ok = 0, count = 0;
    
    for (i = 0; i < 100; i++) {
        sprintf(func_name, "test%03d", i);
        t = (Test) dlsym(RTLD_DEFAULT, func_name);
        if (t != NULL)  {
            count++;
            ret = (*t)();
            if (ret)
                count_ok++;
            else
                printf("test NG %s\n", func_name);
        }
    }
    printf("result %u/%u \n", count_ok, count);
}
```

Makefile

```Makefile 

all: main

#TARGETS
PROGRAM = main
OBJS = main.o
TEST = ut_main
TEST_OBJS = ut_main.o

# ENVIRONMENT
CC ?= gcc
CFLAGS ?= -Wall -O2

# suffixes
.SUFFIXES: .c .o

# target
$(PROGRAM): $(OBJS)
	$(CC) -o $(PROGRAM) $^

# サフィックスルール
.c.o:
	$(CC) $(CFLAGS) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
	$(RM) $(PROGRAM) $(OBJS) $(TEST) $(TEST_OBJS)

.PHONY: test
test: $(TEST)
	./$(TEST)

$(TEST): $(TEST_OBJS)
	$(CC) -o $(TEST) $^
```	

### 実行例

MAC OS X(10.12.4)

```
% make test
cc -Wall -O2 -c ut_main.c
cc -o ut_main ut_main.o
./ut_main
ut_main.c:24: 'func1(0) == 1' is NG
test NG test002
result 2/3 
```



## 技術的な話

- dlsymを使ってテスト用関数の名前(文字列)から関数ポインタを取得する。test0xxという名前で適当に追加すれば実行される。dlsymはposix準拠(*1)のはずなので移植性も問題ない（と思いたい）
- テスト対象を#include することで、staticメンバにもアクセスできるようにする。
- Makefile内でtestというターゲット名を作り、コンパイルしたテストコードをそのまま実行(emacs内での実行を想定、NG箇所に飛べるように出力形式を合わせる)

参考
1: https://linuxjm.osdn.jp/html/LDP_man-pages/man3/dlsym.3.html
googleカレンダーから予定を取得する

### 概要
スプレッドシートにgoogleカレンダーの予定を出力する。

```calendar.gs
function fetchSchedules() {
  // メールアドレス
  var EMAIL = 'xxxxxx@gmail.com';

  // スプレッドシート：シート名
  var SHEET_NAME = 'schedule';
  // スプレッドシート：開始位置
  var RANGE = 2;  
  // スプレッドシート：時間フォーマット
  var FORMAT_TIME = 'hh:mm';

  // シート情報を取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME).clear();
  // カレンダー情報を取得
  var calender = CalendarApp.getCalendarById(EMAIL);
  // 当日の予定を取得
  var schedules = calender.getEventsForDay(new Date());
  
  // 予定を繰り返し出力する
  for(var index = 0; index < schedules.length; index++) {
    var range = RANGE + index;
    // 開始時間を出力
    sheet.getRange(range, 3).setValue(schedules[index].getStartTime()).setNumberFormat(FORMAT_TIME);
    // 終了時間を出力
    sheet.getRange(range, 4).setValue(schedules[index].getEndTime()).setNumberFormat(FORMAT_TIME);
    // 予定名を出力
    sheet.getRange(range, 5).setValue(schedules[index].getTitle());
  }  
}
```