OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで11sかかるリクエストを0.5sにした話

# 高速化の手筈を整える
リクエストを高速化するためには、まず遅い原因を見つけることが大事！

# rack-mini-profilerの導入
コードの実行からレンダーまでの内訳を分析できるので、Rails高速化の分析には必須

# rack-mini-profilerの恩恵
- N + 1問題
- 実際のSQL
- slow query
Railsで実装するとActiveRecordがSQLをよしなに組み立ててくれるため、ちょっと違和感のあるSQLが多々ある。

# 具体的に何が確認できるの
ここで確認できることは
- SQL の中身と時間
- レンダーにかかる時間


``` 
$ vi Gemfile


gem 'rack-mini-profiler', require: false

```

# rack-mini-profilerの開発環境での準備 

```
 $ bundle exec rails g rack_profiler:install
```

# rack-mini-profilerの設定ファイル

```
$ vi config/initializers/rack_profiler.rb

if Rails.env == 'development'
  require 'rack-mini-profiler'

  # initialization is skipped so trigger it
  Rack::MiniProfilerRails.initialize!(Rails.application)
end

```

# 準備は整ったので分析開始
Rails serverを再起動すると画面左上にページのロードにかかった時間が表示されるようになる。


# あれ、画面左上にないよ！
僕の環境の場合、htmlファイルじゃないと表示されなかったので、
実際の該当ページをリロードして、そのあと別タブで自分のサイトの404のURLを叩いて確認しました！


# あれQueryが以上に多い
そ、それは、N+1 問題の可能性が大きい。
具体的に話すとeach分の中でexists?などオブジェクトの検索がかかると再度Queryが走るため要注意。

サンプルコード

```
articles.each do |article|
  if article.comments.exists? # ここでN+1です
    puts article.comments.author
  end
end
```



# あとは遅いクエリーを徹底的に速くする
雑に書くと

```
class ArticleService
  def recommend_article_first
    article = Article.recommend_article.first
    #ここでarticleがN回呼び出される
    {
      id: article.id,     
      url: article.url,
      title: article.title,
      category_id: article.category_id,
    }
  end
end
```

#なんでこれがだめか

文法的におかしいだろは置いといてObjectを生成してみると分かる通り、毎回違うObjectが生成されていることがわかります。


# だめな例
``` 

class Onigiri
  def hello
    puts "Hello"
  end
end

puts Onigiri.new.object_id
70283626235260
=> nil
puts Onigiri.new.object_id
70283622696580
=> nil
puts Onigiri.new.object_id
70283626251680
=> nil

```

オブジェクトが再生成されないことがわかる

# 良い例
``` 

class Onigiri
  def hello
    puts "Hello"
  end
end

@onigiri = Onigiri.new
=> #<Onigiri:0x007fd85d264110>
puts @onigiri.object_id
70283626225800
=> nil
puts @onigiri.object_id
70283626225800
=> nil
puts @onigiri.object_id
70283626225800
=> nil

```
毎回同じObjectが使われていることがわかります。

#実際の使い方
```
class Onigiri
  # 例1
  def hello  
    @hello ||= puts "Hello"
  end
  
  # 例2
  def world
    @world ||= Begin
      world= puts "World!"
    end
  end
end
```

# 最後に言いたいこと

高速化には、実際の遅い要因を把握することが大事で、それに対して必ず適切な方法があるので、頑張って見つけることが重要！
Rubyは幸いにもドキュメントが充実してるので比較的高速化しやすい言語かと！
nginx rails さくらVPSのデプロイ 自分用

初めてさくらVPSのレンタルして、Railsデプロイをキメこんだので置いとく。 基本的にはリンク集の方針

ドットインストールのさくらVPSの項目:https://dotinstall.com/lessons/basic_sakura_vps
ファイアウォールの設定くらいまでは、良かったのでほぼそのまま使いました。

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

nginx 起動
# /etc/init.d/nginx start
```

railsのインストール:http://blog.otsukasatoshi.com/entry/2016/08/07/180633

nginx&unicornでrails new:https://qiita.com/noraworld/items/c8acf4bb981c8d8535df

nginxのエラーはここにある

```
/var/log/nginx/error.log
```
Permissionがどうみたいなエラーがでたら:
https://qiita.com/madaran0805/items/a5b064105852656cca0e
どっかしらProcessのnameが一致していないから。
私のところではnginxのnameがrootになっていたので、↓で設定
```
/etc/nginx/nginx.conf
```

たぶん再デプロイしたらこれが必要↓

```
bundle exec rails unicorn:restart
sudo /etc/init.d/nginx restart
bundle exec rails s RAILS_ENV=production
bundle exec rails assets:precompile RAILS_ENV=production
```

```

##使ったやつ
https://qiita.com/akito1986/items/56198edcafc222b320a8
https://qiita.com/a_ishidaaa/items/74de8bdaecd637063c40
Amazon Alexaで日本語のスキルが検索できない時のトラブルシュート

やっと抽選があたり、Amazon Echo dotを手に入れました！
さっそく設定して使用を開始したところ、問題が。

- 「アレクサ、今日の天気は？」の回答がなぜか、"ウェストレイク"の天気。
- スキルのページをアプリで表示させると、英語のスキルしか表示されない。
- スキルを検索しようと日本語スキル名をいれても、検索結果0件。
- アレクサアプリで、所在地設定を変更しようとしても「設定が保存できませんでした。」

調べても、全然情報がなくて、困りました。。。

結論としては、アレクサアプリで紐づけたAmazonアカウントがおかしかったようです。
自分もよくわかってなかったのですが、私は「Amazon.com」のアカウントと「Amazon.co.jp」のアカウントを両方持っていたようです。
しかも、同じメールアドレスで登録していて、パスワードだけが違う、という状態だったため、
無意識にAmazon.com側のパスワードを入力してアレクサアプリにログインしてしまい、
はまったようです。

注意点は以下の通り。

- Amazon.comとAmazon.co.jpの両方のアカウントを持っている人は要注意。
- 確認するには、Amazon.co.jp側の「コンテンツと端末の管理」を見に行きましょう。
- 端末の一覧に、「Echo Dot」が表示されていれば、問題なし！

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/46882/a7e82f70-80fc-d5c1-c221-44ad34b58e69.jpeg)
CakePHP3 コンポーネント、ヘルパーまとめ

## 問題

以下のような書き方は、もう deprecated


```php:Controller/HogeController.php
class HogeController extends AppController
{
    public $components = [
        'Foo',
        'Bar',
    ];

    public $helpers = [
        'Form',
        'Html',
    ];
```
https://api.cakephp.org/3.5/class-Cake.Controller.Controller.html#$components
https://api.cakephp.org/3.5/class-Cake.Controller.Controller.html#$helpers

## 対応

### コンポーネント

You should configure components in your Controller::initialize() method.

```php:Controller/HogeController.php
class HogeController extends AppController
{
    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('Foo');
        $this->loadComponent('Bar', [
            'some' => 'option',
        ]);
    }
```

### ヘルパー

You should configure helpers in your AppView::initialize() method.

```php:View/AppView.php
class AppView extends View
{
    public function initialize()
    {
        parent::initialize();

        $this->loadHelper('Foo');
        $this->loadHelper('Bar', [
            'ore' => 'motion',
        ]);
    }
```

または

```php:Controller/HogeController.php
class HogeController extends AppController
{
    public function beforeRender(Event $event)
    {
        parent::beforeRender($event);

        $this->viewBuilder()->helpers(['Foo']);
    }
```

> CakePHP やアプリケーションにあるヘルパーを明示的に読み込む必要はありません。 これらのヘルパーは、初回の使用時に遅延ロードされます。
https://book.cakephp.org/3.0/ja/views/helpers.html#configuring-helpers


## ビヘイビア

```php:Model/Table/HogeTable.php
class HogeTable extends Table
{
    public function initialize(array $config)
    {
        $this->addBehavior('Baz');
    }
}
```

## モデルとか

```php:Controller/HogeController.php
class HogeController extends AppController
{
    public function initialize()
    {
        parent::initialize();

        $this->loadModel('Foo');
    }

    public function index()
    {
        $foos = $this->Foo->find()->all();
        $this->set(compact('foos'));
    }
```

とか

```php:Controller/HogeController.php
class HogeController extends AppController
{
    public function index()
    {
        $foos = TableRegistry::get('Foo')->find()->all();
        $this->set(compact('foos'));
    }
```

### コントローラ上での使い分け

コントローラ上での`Controller::loadModel()`と`TableRegistry::get()`の使い分け

* ~~気分~~
* コントローラ全体で使う場合は`Controller::loadModel()`　
* その場しのぎは`TableRegistry::get()` 
* ごにょごにょしたい場合は`TableRegistry::get()` 

## 環境

- CakePHP: 3.5.7
品質系エンジニアが統計学をまなぶとき

# はじめに
本稿は[オープンストリーム Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opst-advent2017)の17日目の記事です。

自分自身が品質系エンジニアとして、「統計を学んだほうが良さそう」と思ったときに、どのあたりを学ぶべきかは手探りだったなぁと思ったので、本稿でまとめてみることにしました。統計的手法の計算式や考え方の説明はここではしません。
また、統計の手法について、具体的な使い方がイメージできないと言っている方もいたので、使い方の例もあげてみます。
ただし、あくまで、私の意見なので、「これも必要」とか「これは要らない」などご意見ありましたら、お寄せいただければ、幸いです。

# 業務別に書きます
業務によって必要なものも異なると考え、「テスト実施」「品質保証」「品質管理」という業務別にまとめてみます。

「品質保証」「品質管理」は、いろんな定義がありますが、
ここで各業務が指しているものは、以下のものとします。

- テスト実施　テスト設計、テスト実装、テスト実施を含みます。
- 品質保証　製品が決められた品質であることを保証する業務。テストの管理も含みます。
- 品質管理　製品が必要なプロセスでつくられていることを管理する業務。プロセス改善なども含みます。

# テスト実施
必要なものは以下の通り

- 平均
- 棒グラフ

### 平均
例えば、１日当たりのテストケース消化件数などに、平均を使うことで、
いつまでに対象のテストケースが消化できるか、予定を立てることができます。

### 棒グラフ
「バグの原因別件数」を作成し、バグの原因分析などに役に立つでしょう。
※バグの原因別の件数をグラフにする場合は、ヒストグラムではなく、棒グラフです。

# 品質保証
必要なものは以下の通り

- テスト実施で書かれたもの
- 分散
- 箱ひげ図
- ヒストグラム
- 管理図

## 平均
プロジェクトごとの平均を出して、その他のプロジェクトの平均と比較することで、そのプロジェクトがどんなプロジェクトであるか判断することができます。
例えば、レビュー指摘件数、レビュー実績工数、規模当たりのテストケース数、規模当たりの検出バグ数などの平均を使います。

## 分散
分散を知ることで、その集団の技術力がわかると言われています。
例えば、ある組織の開発プロジェクトの「規模当たりの検出バグ数」の分散が大きいということは、「バグが沢山検出されるプロジェクト」もあれば、「あまりバグが検出されないプロジェクト」もあるということになります。
そのように、プロジェクトごとのブレが大きい場合は、技術力に幅があるとも考えられます。
しかし、その組織が多岐にわたったプロジェクトを扱っている場合もあるので、本当の状況を把握するためには、詳細データを見る必要があります。

## 箱ひげ図
例えば、「組織別のデータの分布の違い」や「ツールを使っている場合と使っていない場合の分布の違い」などを見ることができます。

## ヒストグラム
例えば、「どの規模のプロジェクトがどれだけあるか」など、データの形を見ることができます。
平均や箱ひげ図だけを見ているとわからないデータの形も、ヒストグラムにすることでわかります（例えば、山が二つあるようなの分布の場合）

## 管理図
例えば、バグの検出数が管理指標の範囲内にあるかどうかを管理することができます。


# 品質管理
最低限必要なものは以下の通り
（プロセス改善をするなら、他にも必要なものはある）

- 品質保証でかかれたもの
- 散布図
- 相関係数
- 回帰分析
- t検定

## 散布図
例えば、複数プロジェクトの「規模当たりのテストケース数と規模当たりの検出バグ数」のデータの分布をみるのに使うことができます。

## 相関係数
例えば、ある組織内の複数プロジェクトを対象として「レビューで指摘された欠陥数とテストで抽出されたバグ数」などの相関係数を出したりします。

## 回帰分析
予測に使うことができます。
「レビューにかけた時間数からバグ検出数を予測する」など。

## t検定
例えば、「プロジェクトの規模当たりの検出バグ数」を「あるツールを利用した場合と利用しなかった場合」で統計的検定を行うときに使用します。
プロセス改善では「プロジェクトの何らかの値」について「ある施策を実施した場合」と「実施しなかった場合」の比較をするために使用します。

## おまけ
最後の品質管理に関しては、正直、書ききれていません。
本当に状況を把握して、必要な検討をして、施策を打って、効果があったかを見るためには、実験計画法や、統計学の歴史的に知られてきた陥りやすい罠のようなもの（シンプソンのパラドックスとか）も含め学んだほうが、結果的には正しいことに近づける気がしています。
また、陥りやすい罠に対しては、業務で日々感じていることにより気づけることもあります。
統計学の知識を、品質系エンジニアが持つからこその気づきがあると思います。

# さいごに
もしかしたら、棒グラフやヒストグラムなどが出てきて、意外に思われた方もいるかもしれません。
しかし、いろんな勉強会に行くと、統計を専門にしている方や、統計をちゃんと勉強している方ほど、「グラフにしてデータの形を見ることの重要性」を説かれます。

これから統計を勉強される方は、まずは、グラフを書いて、データの形を見るところから始めても良いと思います。
また、世の中にはいろんなデータのいろんなグラフがあり、間違ったグラフ、形を歪めているグラフもたくさんあります。日々、目にするグラフを、よーく見るようにするだけでも、グラフを見る力は上がるはずです。

私としては、第二弾が書けるように、統計学についても、業務についても学んでいきたいと思います。
WebViewアプリをiPhone X対応させる際のハマりどころなど

## TL;DR
- 今までステータスバーを`20px`としていた場合は`constant`と`env`を追加で書きましょう  
- `viewport`は忘れず書きましょう
- UIWebViewのバグがなかなかつらいのでWKWebViewに移行しましょう
 
## はじめに
今年のMashupAwardsで応募した「[IoT](https://hacklog.jp/works/51023)」のiOSアプリの実装はほとんどWebViewです。
このアプリを作っている途中にiPhone Xが発売されて、対応するときにハマった点などを書きました。

## 今回iPhone X対応させるアプリについて
<img width="228" alt="スクリーンショット 2017-12-17 0.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/5b7eb285-4121-f41d-39b4-8db122765c26.png">

こんな感じのなんてことないアプリです。
全面にWebViewをベタッと貼って、[WebViewJavascriptBridge](https://github.com/marcuswestin/WebViewJavascriptBridge)を使ってネイティブとデータのやり取りを行います。

## Safe Areaについて
iOS 11から新しく導入された概念です。
iPhone 8では以下の画像のようにステータスバー以外の領域がSafe Areaとなります。
<img width="419" alt="iphone8-safe-area.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/07c96f8e-891c-0f5b-4fd6-50d0384b2459.png">

iPhone Xではステータスバーとホームインジケーター以外の領域がSafeAreaです。
<img width="481" alt="iphonex-safe-area.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/1fbef242-4731-7322-258e-6ccd58d82d66.png">

ちなみに横画面にすると、センサーハウジングが横にくる都合上、横に空白ができます。  
下側のホームインジケーターまわりはそのままです。
<img width="668" alt="iphonex-safe-area-landscape.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/91bf9a9c-a338-1c13-da54-7aa4b9543129.png">

## iPhone XのCSS対応

今まではステータスバーが絶対に20pxだったので、CSSでも決め打ちで書いていることが多かったですが、
iPhone Xが発売されてしまった以上そうするわけにはいきません。
ということで…

```html
<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
```

```css
.content {
  padding-top: 20px;/* iOS 10 以下の互換性を保つために20px */
  padding-top: constant(safe-area-inset-top);/* iOS 11.2未満用 */
  padding-top: env(safe-area-inset-top);/* iOS 11.2以上用 */
}
```
と書けばいい感じになりそうです。
今回はCSSについて深く掘り下げていきます。
### constantとenvについて
[WebKitのブログ](https://webkit.org/blog/7929/designing-websites-for-iphone-x/)にもあるように、
iPhone Xで変わってしまったステータスバーの高さをCSSで動的に変更できるように
`constant()`がiOS 11から導入されました。しかし、この`constant()`が短命で
iOS 11.2からは`env()`を使わなくてはいけません。なのでたくさん書きました。

書き忘れるとナビゲーションバーとタブバーがめりこみます。
<img width="283" alt="スクリーンショット 2017-12-17 0.54.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/3f2955f8-32f2-fbd0-75bc-343661c6b320.png">


### safe-area-inset-xxxについて
Safe Areaが画面の上下左右端からどれだけ離れているかを取得できます。
`padding` 以外にも `margin, top, right, bottom, left`などに使えます。
`calc`でも普通に使えちゃうので結構便利。

## UIWebViewのバグについて
iPhone X対応する際に必須なこれらのコードですが、
UIWebViewだと画面を回転させて戻すと正しい値に更新されないバグがあります。
タブバーがめり込んでいるのがおわかりいただけるでしょうか :joy: :joy: :joy: 
WKWebViewだとこのバグは発生しないので、おとなしく乗り換えましょう :pray:

![yY2gWmXWQA.gif](https://qiita-image-store.s3.amazonaws.com/0/30152/32404de6-999d-f1d7-4556-e5a5e6c566b3.gif)
Moodleサイトの移行方法

# Moodleサイトの移行と問題
何らかの理由によりMoodleのサイトURLが変わる場合がある。例えばホスト名が変わった時（http://currentmoodle.yourdomain/ から http://archivemoodle.yourdomain/ ）や、後で年度毎に異なるURLを使いたくなった時（ http://moodle.yourdomain/ から http://moodle.yourdomain/2017/ ）、HTTPSを使うように変更した時（ http://moodle.yourdomain/ から https://moodle.yourdomain/ ）などである。
Moodleではコンテンツ中の文字列でサイト内URLを絶対パスで保存している。そのため、これらの変更があった場合にconfig.phpの *$CFG->wwwroot* を変更しただけでは既存のMoodleサイト中でリンク切れとなってしまう。
この問題を解決するためにDBに保存されているURLを変換する必要がある。

# 対策方法
## DB内のテキストをリプレースする
サイト管理者としてログインした状態で http://moodle.yourdomain/admin/tool/replace/ にアクセスすると「[データベース全体のテキスト検索および置換](https://docs.moodle.org/34/en/Search_and_replace_tool)」というページが表示される。ここで古いURLと新しいURLを指定することでデータベース内の文字列置換を行うことができる。ミスしたときのダメージが大きいので慎重に行う必要がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63695/936cc420-6c97-de84-c985-6f5d20d74e43.png)

Moodle 3.4からはHTTPからHTTPSへの移行の場合に http://moodle.yourdomain/admin/tool/httpsreplace/ の「[外部コンテンツURLをHTTPSにアップグレードする](https://docs.moodle.org/34/en/admin/tool/httpsreplace/index)」というツールを利用することもできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63695/38dd84e3-a15c-de80-206b-d74f6855e11b.png)

## Moodleのフィルタを使う
MoodleのフィルタとしてURLを置換する。単純なフィルタだがたぶん自作する必要がある。若干のシステム負荷が掛かるが、問題は起きにくい。

## mod_substituteを使う
httpdを利用している場合は[mod_substitute](https://httpd.apache.org/docs/2.4/mod/mod_substitute.html)を使うことができる。nginxなら[nginx_substitutions_filter](https://www.nginx.com/resources/wiki/modules/substitutions/)。
AllowOverride FileInfo してあるディレクトリの中に .htaccess を置くか httpd の設定ファイル中に直接記述する。

```
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|archivemoodle.yourdomain|currentmoodle.yourdomain|n"
```
金！経費！精算！

AdventCalendar、解散カレンダー16日目
文句垂れるのもめんどくさくなってきました。

さて今回は経費に関する話です。

事を成すには金がいる、プログラム開発、勉強するにも金
そして一番いざこざが起きやすいのも金
きちんと管理しないと厄介事が絶えないデリケートな問題

面倒を起こさないように管理を徹底したいですね
そんな面倒な物の管理についてのお話

#まずは決めよう
そもそも誰が管理するんだよ、いくらかかるんだよなどを決めなくてはなりません。
もちろん全部をすぐに決めることなんて出来ません(できたら管理とかいらんしね)
ので最低でもこれは決めておきましょう

・ 管理者　
そこそこ(お金に対して)信頼できる人に任せましょう、押し付けはお勧めしません。
また管理者は出来れば一人にしましょう、お金に絡む人間は少ないに越したことはありません。

・おおよその必要経費
過去の事例、経験などを元に経費を出しましょう。
上記の管理者はこれが上手い人だとより良いでしょう。

・徴収方法
方法は様々ですが資金、人数、環境などから独自で考える必要があります。
規模によってはとても複雑になる可能性もあります。
因みに今回私たちは"予めお金を徴収しそこから清算する"という方法を取りました。

# 徴収だ！
まずはお金を集めなければ何も出来ませんね。
徴収の仕方も様々ですが共通して言える事は最低でも必ず**徴収一週間前ぐらい**には全員に連絡をしましょう、
突然「金集めるぞオラァ！」といっても用意できませんしね。
徴収の際は誰が何時いくら徴収したかなどの情報及び証拠を残しておきましょう。

#買う前に
さぁ経費も集まったので早速買い物をしましょう。
でも何を買うのか不透明のまま買い物をするのはよくないですね、買って無駄になってしまっては困ります。
経費はメンバー全員のお金買う前に「**"何を""いくらで"**」買うのかを全体に連絡しましょう。
その時もしかすると誰かがすでに持っていたりする場合もあり経費が浮く可能性もあります。
事前に確認し無駄やいざこざを減らしましょう

#まだまだ続くよ
さてようやく買い物に行けそうですがまだまだやる事があります。
結構この先が長いので別の日に書こうと思います。
今回はここまで、次回に続く　( ◔ ౪ ◔)･･･
JS prototype サンプル


## JS prototype サンプル

```javascript

function ClassName(param){
  this.param = param;
  console.log('construct');
}

ClassName.prototype.action1 = function(){
  console.log(this.param + 'アクション1');
}

ClassName.prototype.action2 = function(){
  console.log(this.param + 'アクション2');
}

ClassName.prototype.action3 = function(){
  this.action1();
  this.action2();
}

var classLists = [];
console.log(1);
classLists.push(new ClassName('foo'));
console.log(2);
classLists.push(new ClassName('bar'));
console.log(3);

for(var i = 0; i < classLists.length; i ++){
  console.log(4);
  classLists[i].action3();
  console.log(5);
}

```

### Console表示

```javascript

1
construct
2
construct
3
4
fooアクション1
fooアクション2
5
4
barアクション1
barアクション2
5
```
Unity2D:衝突処理をTagで管理する

#はじめに
UnityのTagを使うと処理の管理がわかりやすくなると思ったので記事を書くことにしました。
Unityの衝突処理はOnColliderを使う方法とOnTriggerを使う2通りの方法がありますが、
この記事ではTriggerを使った方法で解説します。
#OnTriggerについて
Unity スクリプトリファレンス
(https://docs.unity3d.com/jp/540/ScriptReference/Collider2D.OnTriggerEnter2D.html)
OnTriggerについてはここが詳しく説明してくださっています。
(http://seesaawiki.jp/app/d/%BE%D7%C6%CD%C8%BD%C4%EA%28Trigger%29)

BoxColliderコンポーネントのIs Triggerをオンにしたオブジェクトは、他のオブジェクトに衝突しても影響を受けないので(Triggerオブジェクト専用のイベントが起こる)、特定のものに衝突したときのみ働く処理を書くときに有効です。

#Tagを使って衝突後の処理を管理する
今回は"Wall"タグのついたオブジェクトにあたったときのみ消失し、他のオブジェクトは貫通する弾を作りたいと思います。

弾のオブジェクトに下のようにコンポーネントを設定します。
Is Triggerのチェックを入れるようにしてください。
弾の速度によってはCollision DetectionをDiscreteにしてもOKです。
![2017-12-16.png](https://qiita-image-store.s3.amazonaws.com/0/191689/f503f650-0072-4e16-0780-f87d7b520f8a.png)

弾には以下のようなスクリプトをアタッチします。

```C#:Bullet.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "Wall")
        {
            Destroy(gameObject);
        }
    }
```
OnTriggerEnter2Dメソッドは、他のオブジェクトに接触した時に呼び出されます。
引数で渡されるcolには、スクリプトをアタッチしたオブジェクトに衝突したオブジェクトが入ります。

次に貫通させたくないものの設定です
"Wall"タグとBoxCollider2Dを付けます。Is TriggerのチェックはどちらでもOKです。

![2017-12-16 (2).png](https://qiita-image-store.s3.amazonaws.com/0/191689/00c24036-f38c-2461-6093-88368455b3fa.png)

以上のように設定すれば、Wallタグが付いたオブジェクト以外は貫通する弾が出来ると思います。

同じ処理を行いたいものがたくさんあり、いちいちタグ付けするのが面倒なときなどは[このサイト](http://gomafrontier.com/unity/230)のようなスクリプトを書けば、親オブジェクトのタグのみを変え、他は子オブジェクトにするようなことも出来ると思います。

#参考
http://freiheitp.hatenablog.com/entry/2014/10/28/014511
http://0310unity.hateblo.jp/entry/collision_detection_1
JuliaでSymPyを使って回路のインピーダンスを計算してみる

この記事は[Julia Advent Calendar 2017](https://qiita.com/advent-calendar/2017/julialang)の21日目の記事です。

# やりたいこと
SymPyを使って、回路インピーダンスの周波数特性のボード線図を描いてみます。
JuliaにはSymPy.jlというパッケージがあり、Pythonの代数計算ライブラリSymPyを簡単に使うことができます。SymPyをPythonではなくJuliaで実行するメリットは今のところわかりませんが、Juliaで計算した結果と一緒に扱いたい場合には、SymPy.jlを使うと便利だと思っています。
今回の例は簡単な内容ですが、もうちょっと式が複雑になると、SymPyのLambdifyが非常に便利なので、Lambdifyは便利だよ、という意味もあります。

また、実行結果は[GitHubのJupyter notebook](https://nbviewer.jupyter.org/gist/tatssuki/c757484bc0f6445e3e9d4387c485ed3d)を参照ください。

# RLC直列共振回路
今回考える回路は、RLC直列共振回路です。回路図は以下のURLにあるような回路です。
http://wakariyasui.sakura.ne.jp/p/elec/koukairo/kyousinn.html

RLCに適当にパラメータを与えたものをPlotするのは、以下のようなソースになります。また、回路の並列接続の計算は関数化すると楽なので、とりあえず関数にしています。

```julia:
using SymPy, Plots

parallel(z) = 1/sum(map(x->1/x, z))
serial(z) = sum(z)

@syms L1 R1 C1 omega s z_inv z_inv2 T

ZR1 = R1
ZL1 = s * L1
ZC1 = 1/(s * C1)
r1, l1, c1 = 1, 1e-3, 1e-6

eq1 = serial([ZR1, ZL1, ZC1])
eq2 = simplify(subs(eq1, (R1, r1), (L1, l1), (C1, c1), (s, im * omega)))
eq3 = lambdify(eq2)

x = logspace(-2,10,1000)
p1 = plot(x, 20*log.(abs.(eq3(2pi*x))), xscale=:log10, label="gain")
p2 = plot(x, rad2deg.(angle.(eq3(2pi*x))), xscale=:log10, label="angle", ylims=(-90, 90))
plot(p1, p2, layout=(2,1))
```

こんな感じで、Lambdifyを使うとSymPyで導出した式を関数化することができ、計算を高速化することができます（どれくらい早いかはちゃんと調べてませんが）。


# RLC直列共振＋一部並列共振回路
先の、RLC直列共振回路のコンデンサ部分に並列で、更にRLC直列回路が接続された場合を考えます。
その場合、先ほどのコードのeq1が以下のようになります。

```julia:
eq1 = serial([ZR1, ZL1, parallel([ZC1, serial([ZR1, ZL1, ZC1])])])
```

eq1以外同じコードにして、実行すればOKです。
共振周波数が２つになります。こんな感じで直並列の関係が増えてくると、自分で計算するのはミスが増えたり面倒だったりするので、普通は回路シミュレータの周波数特性解析機能を使ったりするんじゃないかなと思います。しかし、SymPyを使うと簡単に計算ができるので、ちょっとした計算ならばSymPyで十分じゃないかと思っています（回路シミュレータの方が楽な気もしますが）。
更に、入力信号電圧波形をFFTして周波数特性に変換して求めたインピーダンスに突っ込んでやれば、流れる電流の周波数特性がわかります。この辺りをやる場合は、わざわざ回路シミュレータを使用するよりも、Juliaで計算した方が楽なような気もします。

ちなみに、JuliaのControlSystemsパッケージがあるため、ボード線図はそのあたりを使えば簡単に書けますが、個人的には、ControlSystemsの描画機能を気に入っていないので、logspaceで自分で描く方が自由に調整できて良いと思っています。

# 自己紹介
メーカーで、電気関係の仕事をやっています。
この業界では有償ツールを使用して、目的達成のために近道をするのが一般的なのですが、近道をし過ぎると原理が疎かになるため、できる限りは自力で計算式を入力してみるのが良いように思っています。そっちの方が、長中期的にみると目的達成の近道のようにも感じています。
というのは言い訳で、勤務時間中にJuliaで遊びたいだけだという気もしています。
短縮URLサービスをつくった

# はじめに

自身の趣味として短縮URLサービス [wq8pw](https://wq8.pw/) を作成しました。
これの使い方と技術的な色々について書きます。

Q. なんで記事書いたの？
A. サービス開始してから2か月以上経つけど誰も使ってくれないから

# 使い方

URL を入力して送信するだけ。
※警告ページを表示したい場合は、チェックボックスを有効にしてください。

## 注意点

何らかの理由でサービスが継続できなくなった場合、リンク先との対応表を公開する予定です。
そのため、**機密情報が含まれる URL は入力しないよう**お願いします。

# 技術的な話

Python3 + Flask + MongoDB で構成されています。
ソースは https://github.com/rearn/wq8pw にあります。
PHPでdateクラスが使えない

# 日付に関する処理が使えなくなった。。。

案件にてPHPのソースコードを追っかけていたら、dateクラスのところで処理が止まってしまい、その対応に関してメモを残します。

# 結論: timezone設定抜けてませんか？
この通りです。あまりにも単純な原因でした。。。お恥ずかしい。。。

# 教訓
誰かが作ってくれた開発環境、設定は確認してますか？

# ここで一句

クラス処理
動かないんだ
困ったな
設定ファイルを
見直してみよう

~~みんなもポケモンゲットじゃぞ～！~~
Vuforiaを使ったUnityでのARアプリの開発方法〜導入編〜

先日身内ハッカソン的なものでUnityでVuforiaを使った簡単なARアプリを作ったのでその一連の流れをメモして起きたいと思います。今回は遅刻した上に時間が無いため実際のUnityでの実装はまた近々ここに追記します。

### 作りたかったもの
今回実装しようとしたものは、ある特定のイラストや物体をスマホのカメラが捉えた時に周りに対象物に関連するクイズが出てくるというめちゃめちゃ簡単なARアプリです。（実際の作品はもろもろの都合上後ほど載せます）

### Vuforiaを採用した理由
上記のアプリを実装する上で初めはARkitを使おうとしたのですが、操作がよくわからなかったのとARkit自体が垂直方向の判定を取れないと聞いたため断念。代わりに、平面・垂直方向ではなく、登録した画像で判定を行い且つお手軽簡単にAR開発ができるVuforiaを採用しました。

### 環境
OS: MacBook Pro 
Unity 2017.2.of3
Device: ios11


## Vuforia登録手順
１. まず以下のサイト（Vuforia公式サイト）に飛んでから、右上の「Register」ボタンをクリックし、ユーザー登録を行います。
https://developer.vuforia.com/

２. ユーザー登録をし、ログインができたら「Downloadｓ」からunity用のVuforiaSDKをダウンロードします。ちなみに、Unity用のSDKが２つのうち適当に「Download Unity Extension (legacy)」をダウンロードしてみましたが私は問題ありませんでした。

<img width="1440" alt="スクリーンショット 2017-12-16 23.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/145989/56bfc32a-4ae8-747c-3a70-760abdbfb3d0.png">

３. 「develop」→「License Manager」を選択し、「Get Development Key」ボタンをクリックしてライセンスを登録します。

<img width="1440" alt="スクリーンショット 2017-12-16 23.31.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/145989/1af53c68-45eb-97dc-151d-b93a46ac6548.png">

４. 「Target Manager」を選択し、マーカーを保存するデータベースを作成します。その後、Database一覧から作成したDatabaseをクリックします。

<img width="819" alt="スクリーンショット 2017-12-16 23.39.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/145989/23d17413-7b54-44f8-536e-e7da29938309.png">

５. 「Add Target」ボタンをクリックし、マーカーにしたい画像を登録します。widthは100でちょうどいい感じになります。この時、スマホで撮影した画像を登録しようとすると大体が容量オーバーで登録できないのであらかじめ画像サイズを少なくしておきましょう。（私はスクショをした後に切り取り加工をしたらかなり小さくなりました）

<img width="905" alt="スクリーンショット 2017-12-16 23.52.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/145989/c57ff99d-8163-b9e7-616f-b53ab80aa22e.png">


６. 画像を登録したら、マーカーとして使用したいターゲットにチェックを入れて「Download Database」ボタンをクリックし、development platformは「Unity Editor」を選択してUnity用のパッケージをダウンロードします。

<img width="689" alt="スクリーンショット 2017-12-17 0.04.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/145989/3bc4b9d0-a166-0256-c519-a575fcbaf1ca.png">

とりあえず今回でUnityにVuforiaを取り入れることができるようになりましたので、後ほど実際にUnityへインポートする際の手順とその後の実装過程を書いていこうと思います。

##参考URL

・【Unity+Vuforia】ARアプリを作ってみよう!!
http://www.eda-inc.jp/post-1476/

・UnityとVuforiaでARアプリの作成
https://qiita.com/murasan/items/b31d9deb6d8b24bd9134

・Unityでも使える無料ARライブラリVuforiaの基礎知識とライセンス登録、インストール、簡単な使い方
http://www.atmarkit.co.jp/ait/articles/1508/24/news025.html
LinuxシステムとNodeとのスマートな関係

Linuxプラットフォーム開発担当の@KoheiAkitaです。

他の弊社エンジニアも勧めているように、組み込みでNodejsを用いた開発が圧倒的にスピードが速く、去年のAdventカレンダーでNode力説記事を執筆([IoTデバイスにもスクリプト言語のススメ](http://akerun.hateblo.jp/entry/2016/12/11/234516))してから、Nodeを使った開発を継続しています。Node熱冷めやらず。

さて、Linux上でNodeを使い続けている中で気付いたことをいくつか紹介し、Node使いの皆様にほんの少しの、いろいろな短縮に繋がれば幸いですm(_ _)m

Nodeプログラム単体で動作するのでなく、Linux上の他のシステムプロセスとのやり取りをすることをしたいケースではどうやって実装してるでしょうか。
Linuxにもきちんとイベント通知をしてくれる仕組みがあるので、イベント駆動言語のNodeとは相性が良いのです！

例えば良く使う機能のWi-Fiやデバイス検知。

Wi-FiはNICが有効になった/ネットワークが接続されたなどをプログラムから検知したいことがあるでしょう。
デバイス検知ではUSB機器が挿入された時にプログラムで処理したいことがあるでしょう。

そんな時、私は良くソケットを用いてNodeとデータのやり取りをする方法を採用しています。
例えば ネットワークがup/downした時にNode側でイベントとして受け取る方法を例に上げると、こんな感じです。

### 1) ソケット通信するクライアントとサーバープログラムを用意
まずは、ソケットでやり取りするNodeプログラムを用意します。単純なサンプルプログラムを示します。

```javascript
client.js

var net = require('net');
var fs = require('fs');
var stream = null;

const SOCK_PATH = "/tmp/comm_node.sock";
var sockdata1 = process.argv[2];
var sockdata2 = process.argv[3];
var sockdata3 = process.argv[4];

stream = net.connect( SOCK_PATH );
stream.on('error', function(ex){
    //エラー処理を記述
});
stream.on('connect', function(){
　　　　　　　　//JSONデータで送信
    stream.write( JSON.stringify(sockdata)  );
    stream.end();
});
```

```javascript

server.js

const SOCK_PATH = "/tmp/comm_node.sock";
try{
    //作成されていたソケットがあったら作り直し
    if (fs.existsSync( socket_path )) {
        fs.unlinkSync( socket_path );
    }
}catch( ex ){
    console.log( ex );
}

var so = net.createServer( function(stream) {
    stream.on('data', function( sockdata ){
        //JSONデータを受信
        console.log( JSON.parse( sockdata ) );
    });
});
so.listen( socket_path );
```
### 2) フックスクリプトの実装
用意したNodeスクリプトのクライアント側を、例に出したネットワークup/downのタイミングで呼ばれるスクリプトの内部に仕掛けます。

```shell
#!/bin/sh

#
# $IFACE, $MODE, $PHASEは、システムプロセスがフックスクリプトを実行する時に
# 設定する環境変数です
#
node /path/to/script/client.js $IFACE $MODE $PHASE

```

### 3) フックスクリプトを設定
2)で作成したスクリプトを、以下のフォルダに仕掛けます

```
ifup時に通知したい時：
/etc/network/if-up.d(or if-pre-up.d)

ifdown時に通知したい時：
/etc/network/if-down.d(or if-post-down.d)
```

こうすることで、ネットワークがifup/ifdownし、有効/無効になったタイミングでシステムプロセスがフックスクリプトを実行してくれるので、フックスクリプトに仕掛けたソケット通信処理を通じてNode側でもイベントとして検知でき、且つLinuxシステムプロセスとNodeプロセスとを(比較的)きれいに疎結合できるので便利です。

Linuxではメジャーなところでは、以下がシステムプロセスの動作前/動作中/動作後にスクリプトを設定することでユーザースクリプトが仕掛けられる場所です(Raspbian Stretch上調べ)。

```
・resolv.conf更新時
/etc/resolvconf/update.d

・ppp通信時
/etc/ppp/ip-down.d
/etc/ppp/ip-up.d
/etc/ppp/ipv6-down.d
/etc/ppp/ipv6-up.d

/etc/ifplugd/action.d
/etc/udev/rules.d

・apt-get インストール完了
/etc/kernel/postinst.d

・DHCP client処理
/etc/dhcp/dhclient-enter-hooks.d
/etc/dhcp/dhclient-exit-hooks.d

・ NIC動作変更
/etc/network/if-post-down.d
/etc/network/if-up.d
/etc/network/if-pre-up.d
/etc/network/if-down.d
```

これらはあくまで一部でライブラリをインストールすることで設定できるようになったり、やり方によっては無理やり設定することも可能なものもありますが、一般的なもの、を取り上げました。

NodeをLinux上で組み込む実装の参考になれば嬉しいです。
Excelで数独を解く

# はじめに
　『Excelで関数型プログラミングに目覚めたのかもしれない』の投稿練習用の記事です。Excelで数独を解く為に作ったツールです。簡単にするために半手動です。バックトラッキング部分のロジックはありません。

~~関数型プログラミングといいながら、らしくないコードですが、分かりやすさ優先です。~~ 時間があったので、より関数型プログラミングらしく書き直しました。


# 用意した関数
```vbnet
Function DI(R, I, Optional J = 1, Optional S = "")         '
    On Error Resume Next
    If I > 0 Then S = WorksheetFunction.Index(R, I, J)
    DI = S
End Function

' MM,NN ... テーブルで定義された関数の位置情報。

Function MM(R)                          ' TABLE ROW
    MM = Application.ThisCell.Row - R.Row + 1
End Function

Function NN(R)                          ' TABLE COLUMN
    NN = Application.ThisCell.Column - R.Column + 1
End Function

' CC は　CONCAT互換関数です。

Function CC(ParamArray AA())
    On Error Resume Next
    Dim S: S = ""
    Dim I: For I = 0 To UBound(AA)
        S = S & AA(I)
    Next I
    CC = S
End Function

' 追加
Function IFC(C, V, Optional S = "")
    If C Then IFC = V Else IFC = S
End Function

Function RR(R, Optional M = 1, Optional N = 1, Optional H = 0, Optional W = 1, Optional S = "")  ' RANGE RESIZE
    On Error Resume Next
    H = IFC(H = 0, R.Rows.Count - M + 1, H)
    S = R.Offset(M - 1, N - 1).Resize(H, W)
    
    RR = S
End Function
```


# 数独を解く為の関数
```vbnet
Function BB(S1, Optional S = "")
    Dim I: For I = 1 To 9
        If InStr(S1, I) = 0 Then S = CC(S, I)
    Next I
    BB = S
End Function

Function BC(M)
    BC = Int((M - 1) / 3) * 3 + 1
End Function

' 追加
Function BD(R, Optional C = "", Optional S = "")   ' Rの範囲の文字列をCC
   For Each C In R
      S = CC(S, C)
   Next C
   BD = S
End Function

Function NUKU(S1, S2, Optional S3 = "")            ' S1からS2を１回抜く
    NUKU = Replace(S1, S2, S3, 1, 1)
End Function

' 追加した関数を使って書き直し
'
Function AA(R1, R2, Optional S = "")
    Dim M: M = MM(R2)
    Dim N: N = NN(R2)
    Dim K: K = DI(R1, M, N)
    
    If K = 0 Then
        S = BB(CC(BD(RR(R1, M, 1, 1, 9)), BD(RR(R1, 1, N, 9, 1)), BD(RR(R1, BC(M), BC(N), 3, 3))))
    ElseIf K < 10 Then
        S = K
    End If
    AA = S
End Function

Function AB(R1, R2, R3, Optional S = "")
    Dim M: M = MM(R3)
    Dim N: N = NN(R3)

    If DI(R1, M, N) = "" Then
       Dim K: K = DI(R2, M, N)
       
       If K < 10 Then
          S = K
       Else
          S = BB(NUKU(BD(RR(R2, BC(M), BC(N), 3, 3)), K))
      
          If S = "" Then S = BB(NUKU(BD(RR(R2, M, 1, 1, 9)), K))
          If S = "" Then S = BB(NUKU(BD(RR(R2, 1, N, 9, 1)), K))
       End If
    End If
    
    AB = S

End Function


```
# 使用方法
Excelシート上に　9x9のテーブルを３つ並べて用意します。
それぞれ左から、T1_,T2_,T3_と名前をつけます。
T1_は、入力用で、初期状態では、数独の問題を埋めていきます。
T2_は、関数 =AA(T1_,T2_) で全セルを埋めます。
T3_は、関数 =AB(T1_,T2_,T3_) で全セルを埋めます。
テーブルT3_には、一意に決まった数が表示されるので、それを
テーブルT1_に手動で転記します。簡単な問題だとそのまま解けてしまいますが、
難しい問題だと、途中で一意に決まる数字が表示されなくなります。
この場合、将棋の継盤のようにテーブル３つをコピーして手動バックトラック
を行って下さい。
テーブルT2_で、数字が２桁ある場所を見つけて、テーブルT1_にどちらかを転記し、
T3_からT1_への転記を続けます。超難問でも複数の継盤を用意すれば解けるようです。

問題をT1_に入力するとこんな感じになります。

![数独.png](https://qiita-image-store.s3.amazonaws.com/0/184069/c4dc197a-7b05-9626-da4c-07642ec5a826.png)

ではでは。
今更ながらTensorflow-GPUの速さに感動したのでメモ

# きっかけ

そういえば、我が家のWindowsマシン（2010年購入：何とかまだ現役）はNVIDIAのグラボを積んでいたという事を思い出したので、Tensorflow-GPUを今更ながら試してみようと思った。
ディープラーニングが目的というよりは、並列計算の速さを試すという観点。

# PCスペック

OS: Windows7 Home Edition
CPU: インテルCORE i7-860（初代のi7）
GPU: GeForce GTX 650
メモリ: 8GB DDR3

# やったこと

## tensorflowのインストール

pythonはChocolatey経由でインストール済み。
Tensorflowをインストールする。

```powershell
> pip install tensorflow
> pip install tensorflow-gpu
```

## バージョン等

python 3.6.3
tensorflow 1.4.0
tensorflow-gpu 1.4.0
matplotlib 2.1.1

## CPU vs GPUの比較をしてるサイトのソースをコピペ

[Introduction to TensorFlow — CPU vs GPU](https://medium.com/@erikhallstrm/hello-world-tensorflow-649b15aed18c)

## CUDA関連のソフトをインストール

何にも考えずに、実行しようとしたら下記を入れろとTensorflowに怒られたので、インストール。

[CUDA Toolkit 8.0](https://developer.nvidia.com/cuda-80-ga2-download-archive)
[cuDNN v6.0 Library for Windows 10](https://developer.nvidia.com/rdp/cudnn-download)
※メンバ登録（無料）が必要

## 記事のオリジナルの結果（縦軸は秒）

![Introduction to TensorFlow — CPU vs GPU](https://cdn-images-1.medium.com/max/1600/1*d1Capqf9fPHSCRyasQQ9og.png)

## 我が家の環境での実行結果（縦軸は秒）

上記サイトのソースをコピペしてそのまま実行（行列サイズを50ずつ増やしながら、1.5秒以上演算にかかるところでストップ）

![cpu_vs_gpu.png](https://qiita-image-store.s3.amazonaws.com/0/32853/781e92a4-ecab-680f-516e-dc186332c4ba.png)

少し条件を変えた実行（行列サイズを50ずつ増やしながら、5秒以上演算にかかるところでストップ）

![cpu_vs_gpu2.png](https://qiita-image-store.s3.amazonaws.com/0/32853/84b7d25d-f584-9338-68d8-c6382d7dd82f.png)

GPUのみで実行

![gpu_only1.png](https://qiita-image-store.s3.amazonaws.com/0/32853/d449ba97-b2be-e52c-bbc3-caae4015a688.png)

5000×5000の行列演算が1.5秒で終わる。

最初の一回目の演算が必ず遅くなるのはなんだろう？と思って、ipython上で連続実行してみたら2回目は以下のような結果になった。キャッシュが使われて早くなるのだろうか？
（引用元のサイトによれば”The initial GPU delay at the first iteration is perhaps due to TensorFlow setting starting up stuff.”とのこと）

![gpu_only2.png](https://qiita-image-store.s3.amazonaws.com/0/32853/c87c9241-cd0d-d549-5264-25cbc0f2b4bc.png)

ちなみに10000x10000の行列演算をしたら、GPUメモリをオーバフローしたのかエラーで止まってしまった。GPU使ってるからディスプレイがブラックアウトして心臓に悪い。

# まとめ

使い古しの骨董GPUだけど、並列計算に全然使えるレベルということが分かった。
ディープラーニングのためというよりは、普通に行列演算に使って遊ぼうと考え中。
普段コーディングで気をつけていること

#はじめに

こんにちは！

今回は業界経験が浅い方向けに、日々のコーディングで意識していることを展開してみたいと思います。
~~偉そうに言っていますがもうすぐ4年目のぺーぺーですｗ~~

当たり前だろってことを書いていますが、温かい目で見て頂けると幸いです。。。

#プログラム
###変数や関数の命名規則を守る（整える）

キャメルケースとスネークケースが混同しているソースコードをよく目にします。

```php:キャメルケース
$camelCase = checkNameStyle($inputStr);
```

```php:スネークケース
$snake_case = check_name_style($input_str);
```

プロジェクトや現場ごとにコーディング規約がある場合はもちろんですが、
実際に明確に定まっていない場合もあり、好きに書いても何も言われない場合もあります。

ですが、だからと言って自分の好きなスタイルを押し通すのではなく、
改修案件の場合は既存のソースコードに則って改修を行う、
新規案件の場合は統一性をもって事前に各メンバーに展開する等を行っています。

ちなみにですが、私が新規で開発を行う場合、
特に指定がなければ使用言語や使用フレームワークの命名規則に則ることを意識しています。

###ネスト（入れ子）を深くしすぎない

これは単純にソースの可読性を上げるために意識しています。

```php:ネストが多いソースコード
$hoge = $this->getHoge();

if (!empty($hoge)) {
	foreatch($hoge as $val) {
		if ($val == "success") {
			echo "O.K.";
		} else {
			continue;
		}
	}
} else {
	return;
}
```

```php:ネストを少なくしたソースコード
$hoge = $this->getHoge();

if (empty($hoge)) {
	return;
}

foreatch($hoge as $val) {
	if ($val != "success") {
		continue;
	}

	echo "O.K.";
}
```

どちらも出力結果は同じですが、パッとみた感じどっちが読みやすいですか？

ネストを少なくしたソースコードの方が理解しやすいんじゃないかなと思います。
今回は数行のソースコードであまり恩恵はないかも知れませんが、
実際の業務となってくると、体感できるレベルで差を感じることができると思います。
また、自分が読みやすい=他人が読んでも理解しやすい ということになるので、
自分以外の人が改修を行うときも活きてくるとおもいますよ！


###異常パターンは早めに返却

先ほどのネストの部分に通ずることが多いのですが、
ソースコードの前半で異常パターンであるならば、処理をその時点で返却している方が可読性が上がります。
異常パターンの処理をelseに入れてしまうと、ソースコードの下の辺りにいってしまい、
「あれ、この処理どこの分岐だっけ？」
と見返す手間が増えたり、そもそもネストが深く見違えてしまう可能性も0ではありません。

なので、可能な限り先に異常パターンを返すといいかなと思います。


###関数を記述する位置

これは同系統の関数を並べて配置することによって、
可読性や保守性を上げるために意識しています。

改修案件が入るたびに崩れやすい部分になります。

```php:整理されたソースコード
public function getA() {
	***********
}

public function getB() {
	***********
}

public function getC() {
	***********
}

public function setA() {
	***********
}

public function setB() {
	***********
}

public function setC() {
	***********
}

public function updateA() {
	***********
}

public function deleteA() {
	***********
}
```


```php:まとまりがなく散らばったソースコード
public function getA() {
	***********
}

public function getB() {
	***********
}

public function setA() {
	***********
}

public function setB() {
	***********
}

public function deleteA() {
	***********
}

public function updateA() {
	***********
}

public function getC() { // get?!
	***********
}

public function setC() { // set?!
	***********
}
```

#まとめ
いかがでしたでしょうか？
まだまだあると思いますが、動くものが作れるようになったら次のステップとして、
可読性や保守性を考慮したソースコードにチャレンジすることも面白いのではと思います。

それではこの辺で。

最後までご覧いただきありがとうございました。
意識低めの Magento2 on Docker

この記事は、[Magento Advent Calendar 2017](https://adventar.org/calendars/2349) 16日目担当@kzkiq2ndがお送りします。

## 更新情報
- 2019/06/09 [Magento2 on Docker が日本語化対応し、最短2コマンド起動するようになりました - Qiita](https://qiita.com/kzkiq2nd/items/8a9f698205d226ce4efc)
- 2018/12/17 [Magento2のDockerサンプルをCE2.3.0に対応させました - Qiita](https://qiita.com/kzkiq2nd/items/29f69c156f6f6e2fb215)
- 2018/03/22 Magento2.2.3 起動を確認済み。

# Maegnto2 を Docker で気軽に立ち上げたい
Docker 系 Magento2 開発環境は、既に Magento Chief Architect Alan Kent御大将が作っている"[Magento DevBox](https://github.com/magento/magento2devbox-web)"などを筆頭に github 上に様々な実装があります。しかし数GBにもなる巨大イメージをビルドしたり、6コンテナを起動してローカルマシンが悲鳴をあげるなど、Magento らしく高負荷で複雑な意識が高い（良い意味です）構成ばかりです。

しかし、そんなに複雑なキットだと、ちょっと試してみようという用途には情報量が多く、起動までの学習コストが高くなってしまい初見殺し感が否めません。

というわけで、

初心者にもやさしく手頃な意味で”意識低め”の Magento2 on Docker 環境キットを作りました。

## 要件
1. 軽量なイメージ
2. Magento2 アプリはローカルで持つ
3. 素朴な Docker 構成ファイル

## 成果物
こちらが完成した構成です。

https://github.com/kzkick2nd/magento2-on-docker

MacbookPro 2013 程の時代遅れな環境でも5分程で初回ビルドが完了し、独自ビルドイメージのサイズもだいたい 560MB と比較的軽量です。

利用方法も単純で、

1. Magento 公式から Magegnto zip をダウンロード
2. docker-compose up -d

の2ステップで完成です。
詳しい手順は[README.md](https://github.com/kzkick2nd/magento2-on-docker)を参照してください。

以下は構成をつくったときのポイントです。

### 1. Apache 入り PHP7.0 公式イメージを使う
WEBサーバー構成の手間を節約するため[php:7.0-apache](https://hub.docker.com/_/php/)を利用しM2動作に最低限必要なビルド等をおこなっています。

難しいビルドを行っているわけでも再利用するつもりもないので1ステップでRUNしています。そしてメールサーバーを忘れています。雑い。

### 2. Magento2 は zip で取得してローカルマウントする
自動化したくなる部分ですが、ここをDockerfileビルド範囲に含めるとその度に再取得・構成と時間を消費します。それを避けるためにMagento2アプリ本体ファイル群はローカルに手動で設置します。

[Magento公式](https://magento.com/tech-resources/download)から好きなMagento2のzipを取ってきて解凍し`./html/`にコピペです。

コンテナ内へのファイル同期に少し待機が必要ですが、`http://localhost/`からセットアップウィザードで初期設定を行えば完了です。

ローカル側の Composer で設置だけするのも可能な気がしますが試してはいません。

※DB周り初期状態。

| 項目 | 内容 |
|:--|:--|
| Database Server Host | `db` |
| Database Server Username | `root` |
| Database Server Password | `Passw0rd!` |

![スクリーンショット 2017-12-16 23.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/752/cf3dbe33-bf6c-1a6f-0523-2fe5e9e6a1cf.png)

## Docker ありがとう
Vagrant からの乗り換えでしたが Docker 便利です。ありがとうございます。
今後はテストプロジェクトで動かしてみつつ、使い勝手を向上させていこうと思います。
python3でリアルタイムプロット

#はじめに
私はpython触り始めて数ヶ月のペーペーです。なのでその書き方おかしいだろ！みたいなとこも多々あると思いますが、よろしくお願い申し上げます。
とりあえず、備忘録代わりに躓いたところを書きます。
#環境
python 3.6.2
matplotlib 2.1.0
#躓いたとこ
ラズパイにセンサーつけてリアルタイムにグラフ見ようと思ったのがきっかけです。
色々と参考にしてとりあえず`ion()`とか`drow()`でインタラクティブモードにしたら出来るんだなと思い
サンプルを動かすもmatplotlibが固まる・・
#解決策
参考にしたところを忘れてしまった。。
とりあえずサンプルを。。

```python3:realtimeplottest.py
# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt
import math


times = [0 for i in range(100)]
sinxs = [0 for i in range(100)]

time = 0
sinx = 0

# initialize matplotlib
plt.ion()
plt.figure()
li, = plt.plot(times, sinxs)

plt.ylim(-1,1)
plt.xlabel("time")
plt.ylabel("sin")
plt.title("sin real time plot")

while 1 :

    time += 0.1
    sinx = math.sin(time)

    times.append(time)
    times.pop(0)
    sinxs.append(sinx)
    sinxs.pop(0)

    li.set_xdata(times)
    li.set_ydata(sinxs)
    plt.xlim(min(times), max(times))
    plt.draw()

    plt.pause(0.01)
```
最後の`plt.pause()`を入れることが重要だったみたいです。
CentOS7にて、subversionのバージョンアップをする


デフォルトで入っているsubversionが1.7だったので、1.8にバージョンアップする。

```現在のsvnのバージョン確認

% svn --version
svn, version 1.7.14 (r1542130)


```

1.7であることを確認

## 現在のSVN削除

```
% yum remove -y subversion subversion-libs.x86_64


```

subversionだけ削除すればいいと思っていたけど、
subversion-libs.x86_64も必要。
svnを再インストールするときに、コンフリクトしてハマりました。
解決策は下記に記載されている通り、subversion-libs.x86_64も削除することでした。
[https://stackoverflow.com/questions/32922018/centos-7-subversion-update-to-1-8]

## /etc/yum.repos.d/subversion.repo を作成

```
[subversion]
name=subversion
baseurl=http://opensource.wandisco.com/centos/7/svn-1.8/RPMS/
enabled=1
gpgcheck=0
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

```


## yumでインストール

```
% yum install -y subversion


~~~
完了しました！

```

バージョンアップ完了しました。
念のため、バージョンの確認を実施。

```現在のsvnのバージョン確認

% svn --version
svn, version 1.8.19 (r1800620)


```

終了
データベースとテーブルについて

SQLは基本的に各データベースに接続し、その中にあるテーブルを操作してデータを使うことになる
データベースを作成するときは`CREATE DATABASE データベース名`で作成する
作成したDBは`\l`で一覧を確認できる

```
postgres=# create database goya;
CREATE DATABASE
postgres=# create database tomato;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 goya      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 tomato    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(5 rows)

postgres=# 
```

### テーブル操作
・DB接続  
`\c データベース名`で接続できる

```
postgres=# \c goya;
You are now connected to database "goya" as user "postgres".
goya=# 
```

・テーブル作成  
`create table テーブル名（カラム名 データ型);`でテーブル作成
テーブルに登録するデータにはそれぞれデータ型が存在し、データの種類によってそれを扱う必要がある。

| データ型     | 説明        |
|:-----------|:------------|
|text	       |文字列        |
|date	       |年月日        |
|integer	   |整数          |
|float	     |小数点        |
|boolean	   |真（true）/偽（false）|


```
goya=# create table crops (
goya(#        length float,
goya(#        weight integer,
goya(#        quality boolean,
goya(#        give_for text,
goya(#        date date);
CREATE TABLE
goya=# 
```

・テーブル一覧作成  
`\dt;`

・テーブル詳細確認
`\d テーブル名;`

```
goya=# \dt
         List of relations
 Schema | Name  | Type  |  Owner   
--------+-------+-------+----------
 public | crops | table | postgres
 public | price | table | postgres
(2 rows)

goya=# \d crops
          Table "public.crops"
  Column  |       Type       | Modifiers 
----------+------------------+-----------
 length   | double precision | 
 weight   | integer          | 
 quality  | boolean          | 
 give_for | text             | 
 date     | date             | 

goya=# \d price
      Table "public.price"
  Column  |  Type   | Modifiers 
----------+---------+-----------
 give_for | text    | 
 price    | integer | 

goya=# 
```

### CSVによるデータインポート
テーブルにCSVファイルを使用してデータをインポートすることができる

```
copy テーブル名 from 'CSVファイル' WITH CSV;
```
optimxを導入する

# optimxとやらを導入したい
たまたま拝見させていただいた以下のリンク先
（ http://masaqol.hatenablog.com/entry/2016/07/31/233153 ）
によると、“optimxパッケージは、Rで実行可能な最適化手法をまとめて一通り実行して、その結果を比較できる”とのこと。

使わない手はない。

```R:install.packages.R
install.packages("optimx")
```
を実行する。

```R:packages.R
packages(optimx)
```
を実行する。

```R:実行結果
 library(optimx) でエラー: 
   ‘optimx’ という名前のパッケージはありません 
```

**なんでやねん。**


ハラタツのでもう一度

```R:install.packageg.R
install.packages("optimx")
```
を実行してみる。

なんやら

```R:エラー
make: gfortran: No such file or directory
```


gfortranなるものをパソコンに入れないといけないみたい。。。

# Macにgfortranをインストール
以下のリンク先を参考にさせていただいた。
( http://www.compe.media.kyoto-u.ac.jp/syoseki/mac/mac-gfortran.html )
ターミナル経由でインストールを確認。
そのあと、install.package("optimx")でうまいこといきました。
標準的キーバインド（Emacs, vi, macOS, Windows）

こんにちは。
標準的キーバインド（キーシーケンス、キーボートショートカット）の主なものを調べて見ました。

- __emacs__ [^1]: controlキー（「A」の左）および mataキー（optionキー）（「Z」の下）を使う
- __vi__ : 主にアルファベットキーのみで操作する（修飾キー併用なし）
- __macOS__ (GUI): commandキー（「⌘」のこと：スペースキーの左）を主に使う [^2]
- __WindowsOS__ (GUI): controlキー（キーボードの左隅）を主に使う

[^1]: bashの標準キーバインド、また、macOSのAppKit準拠テキスト操作（controlキー）にも使われています（参考：「[Macに隠されたEmacsキーバインドでテキストを高速に編集](https://qiita.com/KeitaNakamura/items/dd322958db784e54d2ba)」、[知られざるショートカットキーを覚えて作業効率UP!（リンゴ印のライフハック）](https://news.mynavi.jp/article/applelifehack-64/)）。また、「[macOS のキーバインディング（ショートカット）](https://qiita.com/kkdd/items/58047859ad4305181539)」に、テキスト操作を中心に選んでまとめました。
挨拶と沈黙

![uploading-0]()
　今日は金曜日。挨拶の初めの日だから一日は挨拶から始まるのに沈黙し誰も挨拶をしない。今日は新年の初めての顔合わせだ。なのに無言で沈黙している。一般の会社なのだったらもっと明るく楽しいと思うが私のところは作業所の新年の顔合わせだ。仕方がないからと言ってはしようがないが私は最低の挨拶ぐらいはすると思っていた。しかしみんなが集まっても終始何も言わない。これが健常者と違って障害者の何も知らない欠点なのかなと思った。私は子供のころ挨拶が家族で教えてくれると思うが特別障害者だからほっといていていられたのかなとも思った。あるいはしつけをしなかったり。自分は高次脳機能障害だから挨拶ぐらいはみんなに顔を合わせてあけましておめでとうございますといったがみんなは何も言わず顔をじろっと見るだけだ。しかしみんなはぼそぼそ小さい声を言ってあいさつしたがそんなに遠慮をしなくていいと思った。でも信念だからせめてみんなが顔を合わせばせめてにぎやかに会話をするのかと思っていたがそうでなかった。ところがみんな何もしゃべらない。沈黙の時間が過ぎる。それでも職員が来ても全然沈黙している。そこが健常者と障害者の大いなる違いであるのではないか。是非一日の初めは挨拶から始まるのでそれを早く覚えてほしい。沈黙は自分自身を誤解させるのではないかと思います。仕事を通して一日も早く挨拶を覚えてほしい。そうしなければ仕事も惰性になる。明るい雰囲気の作業所にしたいので何かいい方法はないかなあと思う。一階の調理パンを作る工場は今とても雰囲気がいい。なぜかというと女の子二人が入りしごちょを覚えて皆にそれが自然に影響しているのではないか？それから母が病院へ入院していたので一か月作業所に行かなかった。それも影響しているのではないか。それまではなかなか男子は仕事をあまりしていなかった。でも自分が一か月して一時退院をして転院をしてから時々作業所へ行ったが少しづつ変化をしていた。午後の作業はいつも一時が大きく回って作業に行っていたのが一時前に起きていく準備をしている。それで母が完全に退院をしてからは決められた日に行ったが完全に変わっていた。みんな自分から仕事をしているのでそれだけでも大きな成長だなと思った。これも女の子二人の仕事を覚えて自分でどんどん仕事をしていくのでそれが影響しているのだ。それでみんなが自分から進んで仕事をしているのでびっくりいていた。だから工場はとても良い雰囲気で仕事をしている。
Sinatraでルーティングの重複をいい感じにDRYにする方法

Sinatraを使っていて、ルーティングをカテゴリごとに分けたい場合など、ベタに書くと同じ文字を重複して書いてしまうのが精神衛生上よろしくなかったので対応方法を調べました。

## やりたいこと
```ruby
require 'sinatra'

get '/product/fish' do
    'FISH !'
end

get '/product/meat' do
    'MEAT !'
end
```

上記の"/product/"を2箇所もハードコードしているのが大変気持ち悪いのでなんとかしたい。

## 試したこと(真似してはいけない例)

とりあえずお約束通りハードコードしている文字列を変数に入れてみる。

```ruby
path_product = '/product'
get "#{path_product}/fish" do
    'FISH !!'
end

get "#{path_product}/meat" do
    'MEAT !!'
end
```

やりたいことはできたけどどう見ても美しくない。
というわけでgroupみたいなメソッドがないか調べてみます。

## 結論:sinatra/namespaceを使おう

Sinatra公式の便利グッズ詰め合わせであるsinatra-contribにちょうど良い感じの機能があるようです。
[http://sinatrarb.com/contrib/](http://sinatrarb.com/contrib/)

まずはsinatra-contribをインストールします。

```ruby
gem 'sinatra-contrib'
```

こうすることでsinatraにnamespaceの機能が追加されるので、あとはそれを使って書き換えるだけ。

```ruby
# sinatra/namespaceを必ずrequireしてください
require 'sinatra/namespace'

namespace '/product' do
    get '/fish' do
        'FISH !!!'
    end

    get '/meat' do
        'MEAT !!!'
    end
end

```

はい、できました。
泥臭く変数に入れるよりも見た目もスッキリしますね。

またnamespaceごとにbeforeで何か処理をすることもできるので、
例えば/admin以下にアクセスする場合に必ず認証処理を入れるなど、いろいろな使い方ができそうです。

# 参考リンク
* [Sinatra-Contribまとめ](https://qiita.com/ma2saka/items/8e377fdc5f29bdb0ea66)
* [http://www.rubydoc.info/gems/sinatra-contrib/Sinatra/Namespace](http://www.rubydoc.info/gems/sinatra-contrib/Sinatra/Namespace)
Mac + Python + venv + vs codeで flake8を使う

# 動作環境
PC: MacBookPro　
OS: High sierra
Python3: 3.6.4
Visual studio code: 1.19.1

# 参考記事
* [Python開発環境構築 on Mac + VSCode](https://qiita.com/yum-rock/items/cd4e574d0f237c4e1356)
* [Pythonの主要なLint(pep8, pylint, flake8)の設定方法まとめ](https://qiita.com/zaki-yama/items/d05adce9d23d67144fbf)
* [Python の Lint (文法チェッカ) まとめ - flake8 + hacking を使う -](https://qiita.com/kitsuyui/items/5ab4608003a29ff7689f)
* [Python で仮想環境管理 venv の使い方](https://qiita.com/fiftystorm31/items/b2fd47cf32c7694adc2e)

# ディレクトリ構成

```
[project_dir_hoge]/
 ┣━ .vscode/
 ┃   ┗━ setting.json
 ┣━ app/
 ┃   ┗━ **.py　←これが色々弄っているファイル
 ┣━ bin/
 ┣━ include/
 ┣━ lib/
 ┣━ pip-selfcheck.json
 ┗━ pyvenv.cfg

```

# インストールとvenvの設定

```bash
# Python3 install
$ brew install python3

# virtual environment init
$ python3 -m venv [project_dir_hoge]

# virtual environment activate
$ cd [project_dir_hoge]
$ . bin/activate

## ターミナル上の表示が切替ります
([project_dir_hoge]) MBP:~ user$
([project_dir_hoge]) MBP:~ user$ python -V
python 3.x.x

# virtual environment deactivate
## 表示が元に戻る
([project_dir_hoge]) MBP:~ user$
([project_dir_hoge]) MBP:~ user$ deactivate
MBP:~ user $

# pip
$ pip search [fuga]
$ pip install [fuga]

# lint -> flake8
$ pip install flake8

```

# vs codeの準備

```bash
# project　ディレクトリに移動
$ cd [project_dir_hoge]

# プロジェクトがvenv環境にある状態でvscodeを実行
$ code
```

# vs codeの設定

Code -> 基本設定 -> 設定 -> ワークスペースの設定

```js
// .vscode/setting.json
// プロジェクト内の設定
{
    "python.pythonPath": "${workspaceFolder}/bin/python",
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true
}
```

上記を設定するとターミナルからvscodeを起動しなくてもvenv環境を認識してくれます。
合わせてlintはflake8を使うように設定しています。
Metabase使って秒速でNginxのアクセスログを可視化してみる

Metabaseを使ってNginxのアクセスログ可視化する

# TL;DR

1. nginxのアクセスログをtd-agent使ってmysqlへ格納
2. metabaseで可視化

- 自分はログをmysqlに入れるとこまでやって可視化するときkibanaを使ってましたが、kibanaはelasticsearchが前提でmysqlとの連携で最初上手くいかなかった。
- [OSSのデータ可視化ツール「Metabase」が超使いやすい](https://qiita.com/acro5piano/items/0920550d297651b04387)を読んで使ってみたらめっちゃ便利だった。

# 環境

| 環境     | バージョン   |
|----------|--------------|
| OS       | ubuntu 16.04 |
| MySQL    | 5.7.20       |
| td-agent | 2.3.6-0      |
| Metabase | 0.27.2       |

# 導入
## 前提
一応のインストールの一例
- nginxのインストール
    - [Ubuntuに最新のnginxをインストールする](https://qiita.com/hiroq/items/420424bc500d89fd1cc8)
- mysql-serverのインストール
    - [Ubuntuに最新のMySQLをインストールする方法](https://qiita.com/hiroq/items/d6f611791ae2124f0fbe)
- td-agentのインストール
    - [nginxのログをtd-agentを利用して、MySQLに突っ込んでみた 〜アクセスログのデータベース化](http://hit.hateblo.jp/entry/2016/01/11/020555)
    - ``` curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh ```

- 設定の一例
- 
```
    log_format ltsv "time:$time_iso8601\t"
                    "ip:$remote_addr\t"
                    "user:$remote_user\t"
                    "req:$request\t"
                    "status:$status\t"
                    "method:$request_method\t"
                    "size:$body_bytes_sent\t"
                    "uri:$request_uri\t"
                    "file:$request_filename\t"
                    "referer:$http_referer\t"
                    "ua:$http_user_agent\t"
                    "reqt:$request_time\t"
                    "cache:$upstream_cache_status\t"
                    "vhost:$host";
    access_log /var/log/nginx/access.log ltsv;
```

```
<match nginx.access>
        @type mysql_bulk
        host localhost
        database <データベース名>
        username <ユーザ名>
        password <パスワード>

        column_names date,ip,user,req,status,method,size,uri,file,referer,ua,reqt,cache,vhost
        key_names ${time},ip,user,req,status,method,size,uri,file,referer,ua,reqt,cache,vhost
        sql INSERT INTO <データベース名>(NULL,time,ip,user,req,status,method,size,uri,file,referer,ua,reqt,cache,vhost) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

        table <table名>
        flush_interval 5s
        port 24230
</match>
```

## Metabase
```bash
wget http://downloads.metabase.com/v0.27.2/metabase.jar

#デフォルトで3000番を使うが既に使ってたため変更
export MB_JETTY_PORT=4000
nohup java -jar /opt/metabase/metabase.jar &
```

- Adminユーザ名の設定を行う
- Admin -> databasesからデータベースの追加
- Database type等を設定
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/122949/6c35271f-f57e-aa55-41f8-342c45b3f96b.png)
- DataModelからDatabaseを選択

まずグルーピングせず1年分一覧表を出してみる
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/122949/d37ecfa8-39dd-7476-a4f0-c443a8406f8e.png)

- 日毎のアクセス数

VIEWをcount of raws
GROUPED BYをDate:dayで日毎に
VISUALIZATIONでLineへ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122949/4b590345-b08e-3c6d-669d-38578eed331f.png)
こんな感じで簡単にできました

## ダッシュボードの作成
右上のSaveからグラフ名を入手し、表示したいダッシュボードへ追加する
ダッシュボード内で、マウスでグラフを移動・サイズの変更等を行う

![1キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/122949/7543a4a6-74d6-e8fa-5d4c-2d82abfd2423.png)

- 1週間
- 上段に日毎のアクセス
- 中段にユーザエージェント・IPアドレス・ステータスコード
- 下段に生データ

超簡単にできましたｖ(´・ω・｀)ｖ
JuliaでNewton法書いてみた（1次元）

2018年始に急激なJulia熱を感じたので波に乗ってみました(｀・ω・´)

```julia:newton.jl
function nd(f, x, a)
  return (f(x+a) - f(x))/a
end

function newton(f, x0)
  x = x0 - f(x0) / nd(f, x0, 1e-7)
  if abs(f(x)) < 1e-7
    return x
  else
    return newton(f, x)
  end
end

function main()
  f(x) = x^2 - 4.0
  print(newton(f, 1.0))
end

main()
```

```
%julia newton.jl
2.0000000000000044
```

https://github.com/bicycle1885/Julia-Tutorial
ここを見て勘で書いてみましたが動いてるっぽいです！