If You Use ActiveRecord::Base.transaction Syntax, You Shoud Surround It Begin Rescue Clauses

TL;DR

If you use ActiveRecord::Base.transaction syntax, you shoud surround it begin rescue clauses.

Detail

1
2
3
4
5
6
7
8
9
10
11
12
13
class Hoge
  def self.exec
    raise "something is not good" if something_check

    ActiveRecord::Base.transaction do
      User.create(username:"moge")
      User.create(username:"moge")
    end

    rescue StandardError => e
      # if database transaction has occured, this statements will be called
      p "duplicate error"
  end

This code looks good, but includes terrible problem. It’s definetly rescue clause. In this code, something_check return true, raise “something is not good” error,
and shows "duplicate error". Terrible.

so if you use ActiveRecord::Base, I strongly recommend use begin rescue clauses implicit.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Hoge
  def self.exec
    raise "something is not good" if something_check

    begin
      ActiveRecord::Base.transaction do
        User.create(username:"moge")
        User.create(username:"moge")
      end

      rescue StandardError => e
        # if database transaction has occured, this statements will be called
        p "duplicate error"
      end
    end

  end

Ruboty を Github Private で動かす

何箇所かハマったので記録しておく

http://kentana20.hatenablog.com/entry/2014/11/02/180812

基本的には上記の記事にそって行けば大丈夫なんだけど、なんかしょかハマった。
具体的には、readme の deploy ボタンで連携できないことだ。
ただ、問題なく連携はできる。
heroku の deploy タブ の Github のところから private に clone した(fork は不可なので)やつを
指定すれば連携ができる。
あと、dotenv の設定が必要なので、環境変数の設定のために

1
heroku config:add SLACK_PASSWORD='' SLACK_ROOM="" SLACK_TEAM="" SLACK_USERNAME=""

というような感じで設定する。

あと、Add ons で Redis to go を検索して追加する。この時カードを登録してなければ、クレカ登録が促されるので、がんばる。

password の部分は xmpp の slack パスワードを使うことに注意する(https://xxx.slack.com/account/gateways) 。

bundle exec ruboty を起動させるところ(heroku の resources free dyno で edit して 変更して保存する)。
fork した ruboty-template が依存している xrc の version が 0.1.4 で、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parent.rb:41:in `each'
p/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/client.rb:249:in `block in on_features_received': undefined method `name' for "   ":REXML::Text (NoMethodError)
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parent.rb:41:in `each'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/client.rb:247:in `on_features_received'
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parsers/sax2parser.rb:142:in `call'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/client.rb:176:in `on_received'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/client.rb:217:in `block in connection'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/parser.rb:78:in `call'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/parser.rb:78:in `consume'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/parser.rb:49:in `end_element'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/parser.rb:26:in `block (2 levels) in bind'
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parsers/sax2parser.rb:142:in `block in parse'
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parsers/sax2parser.rb:142:in `parse'
from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rexml/parsers/sax2parser.rb:142:in `each'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/connection.rb:38:in `parse'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/connection.rb:34:in `start'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/connection.rb:14:in `connect'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-1.0.4/lib/ruboty/robot.rb:45:in `adapt'
from /app/vendor/bundle/ruby/2.0.0/gems/xrc-0.1.4/lib/xrc/client.rb:24:in `connect'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-slack-0.1.7/lib/ruboty/adapters/slack.rb:81:in `connect'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-slack-0.1.7/lib/ruboty/adapters/slack.rb:14:in `run'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-1.0.4/lib/ruboty/robot.rb:22:in `run'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-1.0.4/bin/ruboty:6:in `<top (required)>'
from /app/vendor/bundle/ruby/2.0.0/gems/ruboty-1.0.4/lib/ruboty/commands/run.rb:5:in `call'
from /app/vendor/bundle/ruby/2.0.0/bin/ruboty:23:in `load'
from /app/vendor/bundle/ruby/2.0.0/bin/ruboty:23:in `<main>'

こんな感じのエラーがでたので、 xrc のバージョンが古いっぽかったので
Gemfile.lock の version を 0.1.8 に編集して commit したらいけた。

以上。

model.update_attribute の罠

背景

update_attribute で一つだけupdate しようと思ってたら他の属性も変わってて意味不明だった。

ヌワー

1
2
3
4
5
6
user = User.first
p user.name  ## "vimtaku"

user.name = "hoge"
user.update_attribute(:age, 100)
##  UPDATE users SET `name` = 'hoge', `age` = 100 where `id` = 1

結局 user.reload した。

クリティカル・シンキング

クリティカル・シンキング

ベネフィット

相手によってベネフィットは変わる。
どのようにベネフィットを聞き出すのかが問題。
また、ベネフィットに答えるために、有効な実績があるのは強い。

難しさ

何かを提案、説得するためには、ベネフィットに答えることを意識すると良いと思う。
実績を作るための努力はいつも怠らないことが重要なのだと思う。
また、実績がない場合も、それに準ずる実績を提示することで、その可能性を示すことができる。

提案における顧客のベネフィットの共通項

  • お前は誰なのか。信用できるのか。
  • 困っていることを解決できるのか。
  • 実際に効果があるのか。
  • コスト感
    • 導入しやすさ
    • 値段

面接でも、何かの商品を売る場合でも、上記は必要なのだと思った。

所感

イイタイコト、キキタイコトでブレストすると、本当に相手が求める質問に辿りつけた。
たとえばプレゼンや、面接でも、相手がどういうことを聞きたいか、などをある程度想定して、
それを事前に考えてみることはかなり効果的だと思う。

Create Staging Server Using Jvm With t2.micro

Create staging server using jvm with t2.micro

jvm is required many memories

I ran command lein ring server, not-enough-memory error has raised.
I googled and found solution.
https://github.com/omcljs/om/issues/101

memo for create staging on ec2 instance(amazon linux)

something like this(picked up from history)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo yum install leiningen
wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
mkdir bin
chmod a+x lein
./lein
ssh-keygen
export MY_DATOMIC_USERNAME="moge@gmail.com"
export MY_DATOMIC_PASSWORD="datomic_password"
sudo yum install java-1.8.0-openjdk.x86_64
ll /etc/alternatives/java
cd /etc/alternatives/
sudo mv /etc/alternatives/java{,.bak}
ln -s /usr/lib/jvm/jre-1.8.0/bin/java /etc/alternatives/java
sudo ln -s /usr/lib/jvm/jre-1.8.0/bin/java /etc/alternatives/java
lein ring server

エンジニアのための 確定拠出年金

エンジニアのための 確定拠出年金

はじめに

俺だ、 vimtax だ。
今日は確定拠出年金について調べてみるぞ。

確定拠出年金について

確定拠出年金とは

1
2
3
確定拠出年金は、公的年金に上乗せするための選択肢として作られた年金制度です。  
60歳未満の自営業者(国民年金加入者)や企業等にお勤めの方(厚生年金保険加入者)を対象とし、  
公的年金等に確定拠出年金を上乗せすることで、老後の資産形成に役立てることができます。

引用:http://www.jp-bank.japanpost.jp/kojin/sonaeru/kakutei/kj_sn_kt_what.html

と書いてあるが、60歳まで下ろせない貯金で、そのままためておくこともできるし、
資産運用することもできる、っていうかんじのものだ。

対象

確定拠出年金には 個人型と、企業型がある。
個人型にもパターンがあるが、この記事では、
大抵のサラリーマンが該当するであろう個人型の第2号被保険者を扱うものとする。
自分が何型なのかとかは、上記の ゆうちょのページを読んで、判別して欲しい。

メリット

所得税、住民税の控除

このリンクによると、
年収が396万円以上695万円未満の人だと仮定すると(所得税が20%)、
月額2万3千円(これが最大)を12ヶ月払い、年末調整で申告すると、 23,000 * 12 = 276000 の 20% = 4万6千円 が
返ってくるらしい。これは馬鹿にできない。
さらに、来年の住民税も 10%分(2万3千円) やすくなるらしい。
合計6万9千円も得するようだ。
これはやらない手はないのではないか、と思わせる。

資産運用による利益に対する非課税

https://www.toushin.or.jp/dc/labo/vol2_yamasaki/
とかを見ればわかるように、資産運用で得られた利益が非課税であるのは大きい。

デメリット

手数料

http://shacho-radio.com/?p=1680
個人型の場合は手数料がかかるらしい。

SBI証券の例

SBI証券の例を見てみる。
[http://ad401k.sbisec.co.jp/kojin/0104.html](http://ad401k.sbisec.co.jp/kojin/0104.html)

最初だけかかる額

加入時に 3,857円

月額課金

50万円になるまでは、324円 + 167円 = 491円(月額)かかる。
50万円以上になると、 167円(月額)かかる。

なので、初年度だと、
491 * 12 + 3857 = 9749 円かかる。
ただ、4万6千円の税制メリットと比べれば、良さそうに見える。

60歳まで下ろせない

最大で預けたと仮定すると、基本的に 276000円(年額) が下ろせないということになる。
276000円をつかって個人的に運用だったり、なにかの活動資金に割り当てて、儲けが出たときに、 課税された上での額が5万9千円以上なら、やる価値はあるように見える。

ただ、急にお金が必要になる場合ってたぶんあるので、そこんところは考えなきゃダメだと思う。
といっておきながらも、 SBI 証券のを見ていると年1回、額の変更は可能なのであまり考えなくてもいいかも。

所感

急にお金が必要になるって、結婚式挙げるか、家買うか、病気なおすか、そのくらいじゃないのかな。
お金(貯金)に余裕があるか、老後のための貯金に自信がない人は、是非やったらいいように見える。
手元にお金があることのほうがメリットだろ!っていう人には向かないと思う。
自分の場合は奨学金とかもまだあるから、その辺を繰り上げ返済したほうがメリットあるんじゃねぇかっていうのもある。
とりあえず直近ではお金必要ないので、上限突っ込んでもいい気がするなぁ。
だけど、年取ってから使うお金と、今使うべきお金って割りと違う気もするんだよなぁ。
そういう意味で、手元にお金があるメリットっていうのは、額面通りじゃあないように思う。

こういうお金の話って向き合うのスーパーめんどいけど、休みの日とか、時間があるときに少しずつまとめていくのは、
結局得になるかもしれないとおもうと、今後もたまにはこういうのを調べていきたい。

シンプルな Wiki 「gollum」 を評価した

TL;DR

  • backlog はかなり緑だけど、よく出来てた
  • gollum は backlog と比べると、今の組織ではまだ早い
  • 気合があれば gollum を修正して使うといいんじゃないの

背景

1
【緩募】シンプルな wiki で無料で markdown がかけてデザインがイケてて添付ファイルが up できて backlog より便利なヤツ  

こういう要求があった。
今、会社で wikiシステムにも backlog を使っていて、よく出来ているんだけど、
エンジニア的な視点からは非常に使いづらい気がしていて、
markdown でもっとイイ感じのなにかが欲しかった。

はたして backlog の何が不満なのか

  • なんか全体的に緑なデザイン
  • markdown プレビューがだるい点
  • (重要)コンフルに比べて、小ページの概念がないこと
    • いま気づいたけど、これがマジでイケてない。コンフルはそれが便利だったことに今気づいた。
      • どうでもいいけど コンフルは検索がクソな印象がある。
  • (重要)なんかロックインされちゃう点
    • ぶっちゃけ疎にしておきたい。(エクスポート インポートできるようになっていてほしい(調べてない))
    • markdown という表記自体もある種ロックインだけど、markdown からの変換は期待できるし、現在のデファクトだからそれはそれでいいかと..

それで気になっていた gollum を評価した

gollum はシンプルな wiki で、かなり良く出来ていると思う。
ただ、まだ実用にはたえないと思う。足りないと感じている点は以下に述べる。

足りないと感じている点

  • pdf のファイルを添付したとき、それがプレビューにならない(pdf.js的な)。
  • ファイルを添付した場合、その画面に添付されているリストが出て欲しいが、出ない
  • ライブプレビュー機能はあるがずいぶん画面が変わってしまう。非エンジニアにとっては、ライブプレビューがない方が使いやすい(WYSWIG?だっけ、があるから)
  • だけど、ほんとはライブプレビューしたい。 docbase みたいなライブプレビューがある方が良い。
  • どのファイルが最近編集されたのか、というようなストリームが欲しいが、ない。
  • 多くのボタンが英語で書かれている点。
    • rails 的に i18n でおけばイイってことではないように見える。
  • ディレクトリ一覧のファイルを見たいとき、URL を削ってディレクトリを指定するが、そのとき期待する動作は自分にとってはそのパス以下のファイル一覧であるが、見れない(ページ作成になる)。
    • Apache とかでディレクトリの中が見えてるあれを期待してる(伝われ)
  • あるファイルを見ている時、それ以下のファイルが木構造で見えていて欲しい、もしくは簡単に見えるようになってほしい
    • コンフル小ページの発想
  • Dropbox と連携とかするとウマイことできるかなぁと感じたけど、エクセルとかそういうのを web で見ようとしてダウンロードになっちゃって辛みみたいなのがかなりある
  • (自分はあまり必要としていないが)変更をメールで飛ばせる機能がない
    • そういう意味で コンフルも一度編集したら勝手に記憶していて、メール通知が飛んでくる機能があった。まぁ悪くない。
  • 日本語での検索でエラーがでる(これはたぶんいろいろ追ったら普通に修正可能だと思う)
  • チームで使うなら、TOP のロゴみたいなやつは欲しい。

ただ、これらのほぼすべてについて、自分たち用に修正することができるのは、とんでもないメリットだ。
ただ修正するには時間が必要であることは間違いない。

良いなと思っている点

  • シンプルで動作が早く、unix な人にはかなり便利に使える点
  • ディレクトリを スラッシュで切っていく点は本当に便利(アトラシアンのコンフルとかで/とかで区切っていた風潮)
  • markdown でかける
  • h1, h2 がリンクになる点。これは素晴らしい。
  • (重要)すべてがファイルになっているので、なにかいい仕組みが出てきた時に気軽に変更できる点

gollum 使用方法 memo

https://github.com/gollum/gollum を見て欲しい。
日本語対応はこの記事 を参考にした。
なんか、普通に保存したときエラーがでるのは、 ググッた結果 Gemfile に
gem 'gollum-rugged_adapter' を追加してなんかウマイことやったら回避できた。

1
2
# アップロード付き、 rugged はエラー回避で必要だった、 show-all でファイルが全部観れる
bundle exec gollum --allow-upload page --adapter rugged --show-all

所感

こと、営業職の多い組織だと、素での gollum 使用はしんどいに違いない。
backlog と比べて出来ないことが多すぎて、それ以上のメリットを享受できないからだ。
だから、大抵の場合はたぶん既存で使っているやつのほうがいいかもしれない。

エンジニアが多い職場で、本当に金がないなら、これは導入する価値はあると思う。
(ぶっちゃけ、markdown 系共有のサービスで有料なものが多すぎると思う。
エンジニアとしてビジネスする側で考えたら非常にいいなと思うけど、
おかね払って使う立場から考えたら markdown が共有できたくらいでお金を払いたくないっていうのが
僕の正直なキモチだ。)
(そして逆に言うと、このオープンソースを使って自分が欲しい機能を付け足すだけで
お金をとれるレベルのサービスを創れる気もする。fork して月額100円くらいで売り出したい。
(まぁそんな時間ないんだけども。) ) でも、今考えると gollum と、 qiita や docbase とかって微妙に立ち位置が違う気もしてきた。

https://support-project.org/knowledge_info/index っていうオープンソースを作っている人がいて、これもかなり有用で、いい感じな気はしているんだけど、
個人的に、Java で書かれているのがネックで、JVM を起動したり、Java でメンテするってのを考えると
ちょっと敷居が高かったりするのがホンネだ。

そういう意味で、何もなかったら gollum に contribute したいんだけど、
ぶっちゃけそれ以上にやらなきゃならんことがたくさんあるのでちょっとしんどい。
それでも少しずつは貢献できたらいいなと思う(したいに価値はないが)。

この週末というか今日はかなりコレの評価に費やしたので記事にしておく。
だれかにとってこの記事がためになれば幸いです。

Rails_admin の日付のピッカーで日本語が使われて Argument Out of Range エラーが出るときの解決法

概要

rails_admin の日付のピッカーで日本語が使われて argument out of range エラーが出る。
原因は 参考のQiita 参照。

自分の場合はうまくいかなかったので、ソースおったらここ直せば良さそうだったので
ここを上書きする感じにした。

config/initializers/rails_admin.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Fix for bug when specified japanese datetime string
# http://qiita.com/kuboon/items/1d009e2f89729fe5db78
module RailsAdmin
  module Config
    module Fields
      module Types
        class Datetime < RailsAdmin::Config::Fields::Base
          ## こいつを入れないと変更ない時にダメだった
          def form_value
            I18n.l(self.value, format:localized_date_format)
          end
          def localized_date_format
            "%Y-%m-%d"
          end
        end
      end
    end
  end
end

以上。

Alamofire_SwiftyJSON でビルドエラーが出るとき

こんなエラーが出ていた

The operation couldn’t be completed. No such file or directory.

pods の dependencies に alamofire と swiftyjson をたしてあげよう

たぶんそれで行けるはず。

他のマシーンでなぜか動かない場合

この stack overflow の Dependencies を 削除する、でうまく行った。
Clean で全部消えないとか、どんだけ罠なんだよ。

ヒメダイをマルで買ってきて捌いて食べてみた

TL;DR

  • ヒメダイはすごく美味しい白身魚だった
  • ムニエルだと引くレベルでウマイ

チャート

  • 捌く難易度
    • 割りとシンプルなタイ。鱗を取るのがめっちゃダルい。
    • すこぶる美味
  • 料理
    • 刺し身はかなり美味
    • ムニエルはすこぶる美味

写真あるけど

めんどいから省略