プログラミングを完全に理解したエンジニアのメモ

チラ裏レベルのことしか書いてないインターネットの藻屑

Slimテンプレートを使った時にckeditorのエラーが出る問題

現象

テンプレートをerbからslimに変えてrails sしなおしたらエラーが出た。

ActionView::Template::Error (Unknown line indicator
  ckeditor/plugins/preview/preview, Line 11, Column 0
    }
    ^
):
    2: html
    3:   head
    4:     = render 'shared/meta_tags'
    5:     = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true
    6:     = javascript_include_tag 'application', 'data-turbolinks-track' => true
    7:     = csrf_meta_tags
    8:   body
  

解決策

gemのバージョンを3.1.1に固定する。

gem 'slim-rails', '3.1.1'

github.com

Railsのturbolinksでjavascriptが発火しない問題の解決策

$(document).on 'turbolinks:load', ->をつける

$(document).on 'turbolinks:load', ->
 $('#hogehoge').click ->
   alert "clicked hogehoge"

page:loadを使う

ready = ->
  $('#hogehoge').click ->
     alert "clicked hogehoge"

$(document).ready(ready)
$(document).on('page:load', ready)

jqueryの'ready'とTurbolinksの'page:load'の両方カバーできる。

非Turbolinks遷移時は'ready'で発火、Turbolinks遷移時は'page:load'で発火の両方をカバーするという意味。

Turbolinksをサポートしていないブラウザでも'ready'が発火するので安心。 jquery-turbolinksというgemを使うと'ready'triggerにpage:loadを追加してくれる。

webエンジニアがクラウドワークスを1ヶ月使ってみた感想

クラドワークスをつかったきっかけ

フリーランスになったのでとりあえずクラウドワークスで案件を探した。 4月中旬に初めて案件受けて、4月末までに5案件受けた。

実際どれくらい稼げるのか

クラウドワークスは稼げるのか否かは結構いろんなブログとか記事になってるけど、運と実力と案件次第だと思う。

実力という点でいえば、クラウドワークスで安定して案件受けるなら、クラウドワークスウケする言語や知見を持ってないと厳しいのかなと思う。 運という点では収入は案件ありきだから、コンスタンスに数十万の案件がとれる保証がない。

実績なしのアカウントで2週間で5案件、累計40万の契約がとれた。 で月間ランキングが20前半、週間ランキングがランキング1桁台。

どっかの記事になってた、20万円以上稼いでいるのは111人というのはほとんどエンジニアなのかなと思う。

大変なこと

  1. 案件の詳細について話す(チャット)する時に相手のITリテラシーが分からないから、どこまで専門用語を使っていいのかが分からない。
  2. 納品の最後に星5つで評価されるが理不尽な評価をされることがある。

サーバー構築からwebフロントまでできるから、クラウドソーシングレベルなら技術的に不安な点はないし。 そもそもできなさそうなのは受けないし。

クラウドワークスはいいのか悪いのか

クラウドワークスへの批判・擁護記事があるけど、そもそもブロガー( or ライター)から見たクラウドワークスとエンジニアからみたクラウドワークスは見え方が違う(はず)。 受けるカテゴリーも単価も納品までの時間も違うし。

開発案件でがっつり稼ぐなら、10〜15万の案件を数件、隙間に数万を挟むのが一番いいと思う。 案件次第であたり外れがあるから一概には言えないけど、クラウドワークス使わないで適正価格で案件受けれるなら幸せだよねっていうレベル。

wordpressで410を返す方法

サーバーの.htaccessで設定してもうまく動かなかったのでメモ

RewriteEngine on
〜略〜
RewriteRule ^/tag/.*?[G]

と書いたがcssが適用されないようなページになるだけだった。

プラグイン

ja.wordpress.org

このプラグインを使う

導入

wpの管理画面にログインして、〜〜略〜〜

新規追加できたら「有効化」すると左カラムに"410 for WordPress"のタブができるので選択。

「Manually add URLs」のテキストエリアにhttps://…..と指定すればオーケー

httpステータスコードチェックツール

httpstatus.io

ここでちゃんとステータスが返ってくるかチェックした。

ってやったけど410が帰ってこない

ドキュメント読むと404のページにしか410を設定できない(らしい?)

410はあきらめて404にを返すようにした

function.phpに書いた.

あとでコードかく

参考サイト

shantiworks.info

Railsで画像アップロードで使うGemのメモ

完全にメモ

Carrierwave

Github : carrierwaveuploader/carrierwave

rmagick

Github : rmagick/rmagick/

dropzonejs-rails

Dropborn.js : dropborn.js

Github : ncuesta/dropzonejs-rails

jQuery-File-Upload

Github : jQuery-File-Upload

jquery-fileupload-rails

jQuery-File-UploadのGem

Github : tors/jquery-fileupload-rails

gem install するときrmagickでこける

$ sudo yum -y install ImageMagick
$ sudo yum -y install ImageMagick-devel

fogを使うとbundle installでエラーがでた

Fetching ovirt-engine-sdk 4.2.4
Installing ovirt-engine-sdk 4.2.4 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/centos/app_name/vendor/bundle/ruby/2.4.0/gems/ovirt-engine-sdk-4.2.4/ext/ovirtsdk4c
/home/centos/.rbenv/versions/2.4.0/bin/ruby -r ./siteconf20180924-32416-iap465.rb extconf.rb
checking for xml2-config... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
  --with-opt-dir
  --without-opt-dir
  --with-opt-include
  --without-opt-include=${opt-dir}/include
  --with-opt-lib
  --without-opt-lib=${opt-dir}/lib
  --with-make-prog
  --without-make-prog
  --srcdir=.
  --curdir
  --ruby=/home/centos/.rbenv/versions/2.4.0/bin/$(RUBY_BASE_NAME)
  --with-libxml2-config
  --without-libxml2-config
  --with-pkg-config
  --without-pkg-config
extconf.rb:29:in `<main>': The "libxml2" package isn't available. (RuntimeError)

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /home/centos/app_name/vendor/bundle/ruby/2.4.0/extensions/x86_64-linux/2.4.0-static/ovirt-engine-sdk-4.2.4/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /home/centos/app_name/vendor/bundle/ruby/2.4.0/gems/ovirt-engine-sdk-4.2.4 for inspection.
Results logged to /home/centos/app_name/vendor/bundle/ruby/2.4.0/extensions/x86_64-linux/2.4.0-static/ovirt-engine-sdk-4.2.4/gem_make.out

An error occurred while installing ovirt-engine-sdk (4.2.4), and Bundler cannot continue.
Make sure that `gem install ovirt-engine-sdk -v '4.2.4' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  fog was resolved to 2.0.0, which depends on
    fog-ovirt was resolved to 1.1.2, which depends on
      ovirt-engine-sdk

gem を fogからfog-awsに変えて

config.fog_provider = 'fog-aws'

を追加。

CarrierWave.configure do |config|
  config.fog_provider = 'fog-aws'
  config.fog_credentials = {
    (略)
  }
end

大学生のUseragent教えます。

大学の授業に関するサイトのUser agentをまとめたのではてぶにメモとして残しておきます。

講義のサイトと言っても対したものではないですが、出席確認も兼ねているので学業への意識とか学年とかの偏りはなく平均的な値が取れていると思います。(無作為抽出に近い)

大学の偏りは仕方ないです。。。(大学関係なくみんなに使ってもらえるサービス作りたいですね)

サイトの内容

f:id:fujitora:20161231015604p:plain

  • テキストボックス×2
  • ラジオボタン×1
  • セレクトボックス×1
  • 400字以上の文字制限があるテキストエリア×1

Ruby(Rail)で監視にnewRelic入れてます。自分のGMOVPSサーバーにデプロイしています。

集計方法

ほんとはelasticsearchに流してリファラとかゴミ除去したかったんですけど、サーバーのスペック低すぎて動かなかったので諦めました。

fujitora.hatenablog.jp

結局EC2に構築する時間もなく授業が終わってしまった...

googleアナリティクスで計測した4回の授業分の数値です。

提出タイミング

f:id:fujitora:20161229013411p:plain 日ごとのセッションです。きれいですね。1つ目の頂点が授業日、2つ目の頂点が締切日です。

バイ

カテゴリ セッション
mobile 2582
desktop 957
tablet 4

バイル上位10機種

バイ セッション
Apple iPhone 2135
Sony SOV32 Xperia Z5 44
Sony SO-01H Xperia Z5 43
(not set) 32
Sony SO-01G Xperia Z3 23
Sony SO-03G Xperia Z2 SO-03F for DoCoMo 22
Asus Z00ED Zenfone 2 Laser 20
Microsoft Xbox One 20
Samsung SC-05G Galaxy S6 19
Sony SO-02G Xperia Z3 Compact 19

OS

os セッション
iOS 2139
windows 744
Android 425
Macintosh 235

ブラウザ

ブラウザ セッション
safari 1980
chrome 864
Edge 281
safari(in-app) 170
IE 147
Android Webview 55
Firefox 23
Android Browser 17
opera 6

まとめ

iphone多いですね笑

個人的に400字はスマホよりパソコンで打ってる人が多いと思ってたのですが圧倒的にスマホからの提出が多いです。 使用ブラウザはiphoneユーザーが多いからかsafariが多いですね

もっとツールとして使用される大学の生徒用サイトはさらにスマホからの利用が多そうです。 大学のシステムはスマホにも対応してないし、見にくいしクソ。どうにかしてくれ素晴らしい

(注)リファラアクセス等ゴミ除去してないから完全に正確ではないです。 新しいmacbookpro(非タッチバー)買ったらちゃんと15回分集計するつもりです。買ってください

クリスマスにBoostrapのformタグに苦しめられた話

qiita.com

の24日目の記事です。リア充してたら1日遅れました

shibuya

昨日は男2人で渋谷の焼肉に行きました🍖🍖🍖

BoostrapはCSSを書かなくても最低限のデザインができるのでとても便利です。

が、フォームに<form>というタグを使うとsubmitされない現象が起きました。

Railsで投稿フォームを以下のように作りました。(わかりやすいようにいらないタグは消しました。)

<form>
  <%= form_for @post, :url => {:action => :create} do |f| %>
    <%= f.text_field :title , class: 'form-control', placeholder: 'タイトル' %>
    <%= f.text_area :content , class: 'form-control' %>
    <%= f.submit "投稿" %>
  <% end %>
</form>

ただのテキストボックスとテキストエリアとsubmitボタンしかないめっちゃシンプルなerbです。

controllerも書くまでもない普通のcontrollerです。 がこれでsubmitしてもviewは変わらずURLのところが

http://localhost:3000/admin/post/new?utf8=%E2%9C%93&authenticity_token=XXXXX&post%5Btitle%5D=XXXXX&post%5Bcontent%5D=XXXXX&commit=%E6%8A%95%E7%A8%BF

となるだけでcontrollerのcreateメソッドにも入っていませんでした。

原因が<form>タグを使っていたことでした。

なんでこんな仕様なのかは(まだドキュメント読んでないので)分かりません、、、

誰か知ってたら教えてください。

postできないのはRailsでなんかミスってると思ってずっと悩んでた。

ES2インスタンスにMacターミナルからssh接続する時のメモ

環境

手順

1.権限変更

ダウンロードしたキーペアの権限を変更

chmod 400 aaaaaa.pem


2. ログイン

ssh -i "aaaaaa.pem" root@ec2-??-???-???-??.us-west-2.compute.amazonaws.com

気をつけること

EC2の接続の方法の解説にはrootになってるけどcentosなところに注意

仮説検定ではサンプル数を決めてからやらないとダメですよ!!!!!

大学の授業で気づいたことがあった。ある授業でクラウド会計の認知度が増加していると言っていたグループがあった。 引用先のデータはこのサイトのページ中段の認知度の表である。 www.m2ri.jp

この数値(認知度のパーセンテージ)をみて増加している => クラウド会計の認知度は増加していると判断している。 たしかに認知度のパーセンテージだけ見れば認知度は増加している。

が、あまり認知度は増加していないかなと思う。

簡単に表すとこのようになる。

知っている 知らない 知っている人の割合
2015 12,705 9,420 22,125 57.4%
2016 12,328 7,785 20,113 61.3%

一応カイ二乗で見てみると

> prop.test(c(12705,12328),c(22125,20113))

    2-sample test for equality of proportions with continuity correction

data:  c(12705, 12328) out of c(22125, 20113)
X-squared = 65.199, df = 1, p-value = 6.769e-16
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.04811520 -0.02928403
sample estimates:
   prop 1    prop 2 
0.5742373 0.6129369 

この時の帰無仮説は認知度は変わらない、対立仮説は認知度が変わった(増加した)となる。

p値は限りなく0に近いし、パッと見、有意差があるように見える。 しかし、サンプル数が多すぎていわゆる「第一種の過誤」を起こしている。

過誤をせずに仮説検定をするには必要なサンプル数を見積もってから行う必要がある。 今回の例ではどのくらい割合が増加すれば認知度が増加したと判断できるかが難しいが、 (かなり少なめに見積もって)5%くらい上がれば少し認知度が上がったと判断できる(と思う)。

> power.prop.test(p1 = 0.57,p2 = 0.62,sig.level = 0.05,power = 0.8,alternative = "one.sided")

     Two-sample comparison of proportions power calculation 

              n = 1190.827
             p1 = 0.57
             p2 = 0.62
      sig.level = 0.05
          power = 0.8
    alternative = one.sided

すると適切なサンプル数は1191であると判断できる。

今回のデータを単純に適切なサンプル数に圧縮するとこのようになる。

> n = 0.05; prop.test(c(n*12705,n*12328),c(n*22125,n*20113))

    2-sample test for equality of proportions with continuity correction

data:  c(n * 12705, n * 12328) out of c(n * 22125, n * 20113)
X-squared = 3.1096, df = 1, p-value = 0.07783
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.08154433  0.00414509
sample estimates:
   prop 1    prop 2 
0.5742373 0.6129369 

2015年と2016年ではあまり差がないようという結果になる。

まとめ

ちゃんとサンプル数を見積もってから検定をしよう!!! おかしなところがあったらコメントかtwitter(@fuji_and_tora)まで

Elastic Stack 5.0がリリースされたのでログの可視化をしようとしたらできなかった話

この間elastic stack 5.0系が出たので使ってみようと頑張ったログです。 技術系のアウトプットは基本的にQiitaにするけど収集できなかったのではてぶに投稿、、、

使うもの

https://www.elastic.co/jp/products

  • Beats
  • Logstash
  • Elasticsearch
  • Kibana
  • GMOVPSサーバー2台(CentOS6.2 x64/メモリ1G/SSD50GB/CPU 2Core)

週に500ユーザーくらいのwebサーバーだからBeatいらない気もするけどせっかくなので構成に入れてみた。

したかった構成

f:id:fujitora:20161031175613p:plain

共通の環境構築

java

sudo yum update -y
sudo yum remove -y java-1.7.0-openjdk
sudo yum install -y java-1.8.0-openjdk-devel
sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

yum

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vi /etc/yum.repos.d/elastic.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

ELKサーバーの構築

Elasticsearch

sudo yum install -y elasticsearch

Kibana

sudo yum install -y kibana
sudo vi /etc/kibana/kibana.yml
#server.host: "localhost"
を
server.host: "XXX.XXX.XXX"
に書き換え

起動

sudo service elasticsearch start
sudo service kibana start

elasticsearchの起動確認コマンド

$ curl 'localhost:9200'

{
  "name" : "qLGo9hB",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "XETXNZ0kQTWiw_dFNZWMhg",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T04:37:51.531Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}

Elasticsearch起動エラー

サーバーのメモリが少なすぎてElasticsearch起動時にエラーが出た

Starting elasticsearch: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006d0660000, 4019847168, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 4019847168 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /tmp/hs_err_pid21456.log
                                                           [FAILED]

5.0ではES_HEAP_SIZEをelasticsearch.ymlに書けない

sudo vi /etc/elasticsearch/jvm.options

サーバーのスペックに合わせて設定

-Xms1000m
-Xmx1000m

Kibanaにアクセス

http://XXX.XXX.XXX.XX:5601にアクセスするとKibanaの画面がでる スクリーンショット 2016-10-30 18.18.03.png

Logstash

sudo yum install -y logstash
sudo vi /etc/logstash/conf.d/logstash.conf

動かしてないから雰囲気で

input{
  beats{
    host => "YYY.YYY.YYY.YY"
    port => 5044
  }
}

output{
  elasticsearch{
    hosts => ["localhost:9200"]
    index => "accesslog-%{+YYYYMM}"
  }
}

起動

sudo initctl start logstash

webサーバー(Railsアプリケーション)

filebeatsでELKサーバーにログを流す

sudo yum install -y filebeat
sudo vi /etc/filebeat/filebeat.yml

動かしてないから雰囲気で

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/nginx/access.log

output.logstash:
  hosts: ["http://XXX.XXX.XXX.XX:5044"]
  index: filebeat

起動

sudo /etc/init.d/filebeat start

できなかった理由とかまとめ的な

  • そもそもfilebeatから直で別サーバーのlogstashに流せない(?)
  • [logfile -> filebeat -> logstash] -> [logstash -> elasticsearch -> kibana]が正しい構成(?)
  • サーバーのスペック問題 => AWSのEC2インスタンスを作る
  • logstashとbeatの書き方がわからん => 試しに実行するとESが止まっちゃう
  • sslでじゃないとforwardできないみたいな情報を見た気がする

free -tmコマンドでメモリ使用量をみるとこんな感じ Logstash elasticsearch kibana起動しただけでの使用量

f:id:fujitora:20161031171731p:plain

AWS EC2で構築しなおします。

参考サイト

acro-engineer.hatenablog.com

snickerjp.blogspot.jp

www.elastic.co

仮説検定の判断をp値でする危険性

仮説検定とは

「母集団に差がない」とする帰無仮説とそれの逆である「母集団に差がある」という対立仮説をもとに検定を行うことである。

  • 帰無仮説(H0)…比較対象に差がない(A=B)
  • 対立仮説(H1)…比較対象に差がある(A≠B)

p値とは

検定の結果が偶然か偶然じゃないかを決定する値 => 「まぐれ」な確率 「棄却域の確率」とか「有意水準」という。

検定

検定統計量(求めたp値) < 有意水準 => 帰無仮説(H0)を棄却 = 対立仮説(H1)を採用 => 有意差があるよ!

有意水準を0.05とした時に、「p < 0.05」だった場合は、「5%以下の確率で偶然って判定されるよ(まぐれは5%以下だよ)」= 「95%の確率で偶然じゃなよ」ということである。

有意水準は一般的に0.01 , 0.05 , 0.1が使われる。

データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは?

そこで疑問に思った。データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは? 母集団のサンプル数が増え、p値が0に近づくということは p < 0.05 が成り立ち、どんな検定でも帰無仮説が棄却されて有意差があると判断できてしまうのではないかと思った。 そこで身近な例をもとに検証する。

(例)広告のABテストの母平均の差の検定

  • 帰無仮説...AとBに差がない
  • 対立仮説...AとBに差がある

有意水準5%で検定する。(5%というのも様々な議論があるが一旦放置)

インプレション数 クリック数 クリック率
広告A 99 49 49%
広告B 102 50 49%
> prop.test(c( 49 , 50 ),c( 99 , 102 ))

  2-sample test for equality of proportions with continuity correction

data:  c(49, 50) out of c(99, 102)
X-squared = 1.1651e-30, df = 1, p-value = 1
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.1382439  0.1477508
sample estimates:
   prop 1    prop 2
0.4949495 0.4901961

p > 0.05なので差がないといえる。

データ数を1000倍に増やしてみる。

インプレション数 クリック数 クリック率
広告A 99000 49000 49%
広告B 102000 50000 49%
> n = 1000; prop.test(c( n*49 , n*50 ),c( n*99 , n*102 ))

  2-sample test for equality of proportions with continuity correction

data:  c(n * 49, n * 50) out of c(n * 99, n * 102)
X-squared = 4.5226, df = 1, p-value = 0.03345
alternative hypothesis: two.sided
95 percent confidence interval:
 0.0003718071 0.0091350259
sample estimates:
   prop 1    prop 2
0.4949495 0.4901961

p < 0.05なので帰無仮説が棄却されて差があると判断される。

サンプル数が多くなるとp値が限りなく0に近くなり有意(p < 0.05)になってしまい、採用する仮説が異なって( = 結果が逆になる)しまう。

まとめ

  • データ数でいくらでも操作できるのでp値だけで判断できない
  • サンプル数が多いときに仮説検定をすること自体間違っている

アメリカ統計学会も勧告を出している AMERICAN STATISTICAL ASSOCIATION RELEASES STATEMENT ON STATISTICAL SIGNIFICANCE AND P-VALUES

  1. P-values can indicate how incompatible the data are with a specified statistical model.
  2. P-values do not measure the probability that the studied hypothesis is true, or the probability that the data were produced by random chance alone.
  3. Scientific conclusions and business or policy decisions should not be based only on whether a p-value passes a specific threshold.
  4. Proper inference requires full reporting and transparency.
  5. A p-value, or statistical significance, does not measure the size of an effect or the importance of a result.
  6. By itself, a p-value does not provide a good measure of evidence regarding a model or hypothesis.

面白かったサイト

tjo.hatenablog.com

abrahamcow.hatenablog.com

abrahamcow.hatenablog.com

www.gixo.jp

techlife.cookpad.com