rails で transaction内でnextしたらtransactionブロックを抜けただけだった話
タイトルが結論なんですが、つんだ話。
Railsで、
[1,2,3].each do |i| Hoge.transaction do 何らかの処理 next if Hoge.huga end p i end
みたいなのを書いたとして、
例が適当すぎるけど、要はfor文の中に、transactionを書いて、
transaction内の処理の内容によっては、その後の処理をskipして次に行きたい場合ってのがあったんだけども、その場合にnextが効かないことに気づいた。
transactionはブロックなので、ここでかくnextはブロックを抜けてしまうっぽい。
nextで飛ばされるはずの、transactionブロック後のp i が実行されて、あれ?ってなって気づいた。
ブロックとクロージャーについて詳しく書いてある記事にお世話になった
Rubyの動かないコード (初級編) ブロックとクロージャの性質 - 主に言語とシステム開発に関して
has_manyのdependentパラメータの値がdestroyとdelete_allの時の違い[Rails]
Railsで、親のレコードと一緒に、関連する子のレコードも消したい時に、
has_manyのdependentパラメータにdestroyを選ぶべきか、delete_allを選ぶべきか迷った
(というか、何も考えずにdestroyをかいたら、delete_allでいいんじゃない?って言われて、違いをしらべた)
ので、メモ。
destroyの場合は、
class Parent < ActiveRecord::Base has_many :children, dependent: :destroy end
Childrenクラスのインスタンスを生成して、destroyを実行していている。
delete_allの場合は、
class Parent < ActiveRecord::Base has_many :children, dependent: :delete_all end
Childrenクラスのインスタンスを生成せずに、親のidを元にSQLを直接発行して削除している。
なので、
みたい。
※Rails3
【参考】
今年のTRYの進捗
もう3月になりました。あっという間ですね。
せっかくなので軽く振り返り記事。
★日常生活編
1. 体力をつける
→朝ヨガに行き始めた。が、体調崩したりして、まだ2回しかいってない。
TRY:今週からは行く。
2. 週2回以上は自炊する
→なんやかんやでできてる。頑張る。
3. 早起きをする
→できてない。ギリギリでおきてる。
TRY:朝ごはんを食べれる時間に起きるようにする。最低8時。
4. 一日一箇所何か片付ける
→全然できてなくて、部屋が荒れたので今日頑張って片付けた。
物が多いのが問題なので、いらないものは売るか捨てるかするようにしてものを減らす。
TRY:一年以上手をつけてないものは捨てる
★仕事編
1. 効率アップするアレコレを覚えたり時間やお金を投資したりする
→心がけ始めた。Dashにsnippetを追加したりして、ちょっと効率化した。
vimrcとかzshrcを整備しなおしたりした。
2. 人に聞くと決めたら早く聞く
→案外大丈夫になってきた気がする。この調子。
★その他
1. 本を読む
→あまりできてない。
TRY:デザインパターン関係の本(先輩に貸してもらった)2冊読む
あと、Effective RubyとパーフェクトRuby on Rails読む
2. ブログを書く
→全然できてない、リレーブログすっ飛ばした
TRY:最低でもリレーブログは書く
3. もうちょっと外にでる
→服を買いに行くとかしかしてない気がする…
歯医者に行く習慣はついたけど…。
TRY:一人で行く気が起きないなら誰かとの予定をいれる、土日どちらか一回以上。
-
- -
またこのTRYの進捗を書く。
今年のTRY
1 月も半ば過ぎ去りましたが。
年末年始をすぎると、今年という年に関する想像が現実になってくるので、
なんというか、ドリーミーじゃなくて現実的なTRYがでてきたなーとおもうので、
ブログにまとめて宣言(期限つき)しておこうとおもいます。
なんというか、できそうだけどできなかったこと、が多いんですが、
これをやるともうちょっといい感じの人間になれるとおもう(しろめ
上半期が終わったぐらいに、中間報告を書こうとおもいます。
★日常生活編
1. 体力をつける
学生の時は、自由に生きてたので、むしろ土日のほうが働いてたりしたのですが、
社会人になってからの傾向が、土日が非常に廃人と化して活用できてないなと。
全ては平日にすべての体力を使いきって抜け殻になってるのですが原因なのですが、
これはよろしくないので、軽い運動を始めて体力をつけたいなーと。最近ヨガがきになる。
【リミット:3月までにワンアクションはおこす】
2. 週2回以上は自炊する
飲み会があったり、起きれなかったり、疲れきっていたりで、どうしても外食になりがちな毎日。
自炊はお金もかからないし、塩とか油とか自分で入れる量調整できますし。
毎日自炊は無理だろうので、週2回の現実最低ライン。
【今から】
3. 早起きをする
4月とは7時には起きていたのに、最近は8時すぎぐらいに起きてるような…。
高校時代は5時半起きだったので、やればできるはず。朝ごはんを食べてから会社にいけるように。
7時半には起きよう…w
【明日から】
4. 一日一箇所何か片付ける
一週間経つと部屋がすごいことになって毎週土日に片付けるハメになるのをやめたい
【今日から】
★仕事編
1. 効率アップするアレコレを覚えたり時間やお金を投資したりする
そんなにキーボード打つのがめっちゃ遅いとかじゃないとは思うのですが、
覚える気があんまりなくていままで覚えてこなかったコマンドやショートカット類をちょこちょこ覚える。
あと、手動でやらないでもいいことは自動化スクリプトを書くなどする。
ぬくもりなくても良い部分は手作業から脱する
【今から】
2. 人に聞くと決めたら早く聞く
作業など一人でできることは比較的早め早めに手をつける習慣があるのですが、
普段あまり接しない人に聞きに行くとかっていうところが非常に遅い(精神的ハードルを作る傾向がある)
わかってるんですけど、自分にとって一番ハードルの高い部分。
えいやってやってみる習慣をつける。
【来年になって、そんなことなくなったなーって思えるようになる】
★その他
1. 本を読む
ビジネス書や技術書などを読む習慣をつける。
【今から】
2. ブログを書く
4週に一回はリレーブログが回ってくるけど、もうちょっと書いてもいいような気がする。
ゆるふわな内容でもいいので、アウトプットする場を作る。
【今週から】
3. もうちょっと外にでる
土日に最低一回、初めて行く所に行くようにする(いつも大体同じ行動をする傾向にあるので。)
【今週から】
TodoistとTodoistAPIで、毎朝のタスク報告をするヾ(‘ω’)ノ
この記事はVOYAGE GROUP エンジニアブログ : Advent Calendar 2014の11日目の記事になります。
こんにちは、@sinamon129です。
VOYAGE GROUPで、新卒一年目のエンジニアをしておりますヽ|・ω・|ゞ
突然ですが、みなさんはタスク管理ツールってつかっていますか?
学生時代はTODOが多い時だけメモに書き出してみたりしていたものですが、
会社に入ると、今日や今週に自分が自分がやる仕事を把握したり、報告する場面が増えました。また、仕事だけじゃなくて、プライベートのタスクもあったりして、時間を有効活用するために、やるべきことをきちんと把握したいようになりました。
そこで、Todoistを使い始めたので、どこが使いやすいかと、普段の報告を簡単にするプログラムを書いた話をしようと思います〜
Todoistとは?
いい感じのタスク管理ツールです。詳しくは、
To-Doリストとタスク管理。無料、簡単、オンラインとモバイル用: Todoist
日記3日坊主的正確の私なので、あまり管理系のツールを使い続けられたことがないのですが、一週間ぐらい続いています…w
個人的にいいなと思ってるポイントを3つ。
今日&一週間のやることが見やすい
全体的に無駄がなくて、テンションのあがるUIだとおもいますw
今日と次の7日間がフォルダ分けされているので、
今日やることをみながらTODOをこなすし、明日のものを前倒しにしてやっといたほうが平和そうとか、そういう調整を一週間の予定を見ながらできます。
また、期限が切れたタスクも今日のフォルダに入ったままになっていて、やばいやばい感を持ちながら消化することもできます…w
やたら褒められる
当日のタスクを全て終了すると、お疲れ様でした的な文章がでたり、あなたの生産性という項目があって、タスクをこなすとカルマが加算されていったり、日や週煮立てた目標を達成すると、ボーナスポイントがもらえたりするので、楽しいですw
一人で使うのに適している
プロジェクトを共有して複数人でつかうこともできるのですが、一人で使う時に気軽に使えるのがすごくよいです。
日々のタスクを自動で報告してみる
会社で、毎朝Slackの所属チームのチャンネルに、昨日やったことと今日やることを投下して、メンバーに共有をしています。
せっかくTodoistをつかっているので、昨日終わらせたものと今日やることにはいってるものをそのままslackに投げたいなーとおもいました。
でもいちいち探してコピーするのは面倒だし…
ということで、Todoist APIとSlack APIをつかって、
Todoistで管理している仕事の昨日やったこと・今日やることをSlackに投げることにしました。
今回は、http://todoist.com/API/Todoist Standard APIの、
を使って、昨日やったことと今日やることを取得することに。
どちらも、この日のという指定をして取ることができなかったので、
全部とってきて、プログラム側で処理をしています。
(コード適当でごめんなさい)
#todoist.rb require 'open-uri' require 'json' class Todoist API_URL = 'https://todoist.com/API/' TOKEN = 'とーくん。設定から取ってこれる' def getAllCompletedItems(project_id) request_url = create_url('getAllCompletedItems', {:token => TOKEN, :project_id => project_id}) api_request(request_url) end def getUncompletedItems(project_id) request_url = create_url('getUncompletedItems', {:token => TOKEN, :project_id => project_id}) api_request(request_url) end def api_request(request_url) res = open(request_url) code, message = res.status if code == '200' return JSON.parse(res.read) end end def create_url(action, params) API_URL + action + '?' + URI.encode_www_form(params) end end
#slack.rb require 'uri' require 'net/http' class Slack TOKEN = 'slackのとーくん'; def post_message(text) `curl -F "token=#{TOKEN}" -F "channel=#{'チャンネル名'}" -F "username=#{'投稿名'}" -F "text=#{text}" -F "icon_emoji=>#{'アイコン代わりの絵文字'}" https://slack.com/api/chat.postMessage` end end
# daily_standup.rb require 'date' require './todoist.rb' require './slack.rb' project_id = 'とってきたいプロジェクトのID' todoist = Todoist.new all_complete_items = todoist.getAllCompletedItems(project_id) uncomplete_items = todoist.getUncompletedItems(project_id) yesterday_complete_tasks = '' all_complete_items['items'].each do |task| if Date.today - 1 === Date.parse(task['completed_date']) then yesterday_complete_tasks << "・#{task["content"]} \n" end end today_tasks = '' uncomplete_items.each do |task| unless task['due_date'].nil? then if Date.today === Date.parse(task['due_date']) then today_tasks << "・#{task["content"]} \n" end end end daily_standup = <<"EOS" :panerun: しなもん :panerun: # 昨日やったこと #{yesterday_complete_tasks} # 今日やること #{today_tasks} EOS print daily_standup slack = Slack.new slack.post_message(daily_standup);
あとで綺麗にして、githubにあげます(TODO)
そうすると、
こういう感じで投稿できるようになります!
あとは、cronで毎日9時半(定時)にセットすれば手を離してても報告できますね!(´・艸・`)
明日は、同期で音ゲーをこよなく愛する@gomachan46です!
【Tech Women Advent Calendar 2014】今思えば笑える&背筋が凍る 私が犯したwebアプリケーション開発〜リリースまでの黒歴史(ゆるふわに10個)
※これはTech Women Advent Calendar 2014の1日目として書かれています。
こんにちは、@sinamon129といいますヾ[・ω・`●]
皆様からはしなもそとよばれています。
本題に入るまえに、この記事は、
Tech Women Advent Calendar 2014の一日目&私がカレンダー登録したということで、
少し前置きを。
http://qiita.com/advent-calendar/2014/tech_women
Tech Women Advent Calendar 2014 - Qiita
こちらのアドベント・カレンダーは、
TechなWomenのためのAdvent Calendarで、興味のあるプログラミングなどの話題(分野問わず)や、最近流行りの○○女子部(ex. Linux女子部,Android女子部, Pyladies等)での活動の様子などの発信をして、盛り上がっていく!ことが目的のカレンダーです!
techなwomen人口は少ないと感じているのですが、女子部系の活動も盛り上がってきていることですし、更に盛り上がっていければと思っております!
そんなところで、本題に。。
今思えば笑える&背筋が凍る 私が犯したwebアプリケーション開発〜リリースまでの黒歴史
今私は社会人一年目なのですが、大学生の時の昔話をしようとおもいます。
あれは大学三年生の冬でした。
当時関わっていた、当時学生のメンツだけで作っていたwebサービスがありました(今もあります)。
その頃、私のwebアプリケーション開発経験は今より本当に乏しかった時期に、
たまたま、関わっていたサービスがありがたいことに、テレビやSNSのシェアでアクセスが沢山来た時に、
色々奮闘した際にやった、今思えば笑える&背筋が凍る話。
(時系列が案外バラバラになってしまった)
1.バージョン管理などされていない!?開発機で上書きされまくり
第一バージョンを作っている時は、gitの使い方もあやしい時期だったので、複数人で同じサーバのデータを編集していました。
cssをなおして、よっしゃ!っておもってリロードすると、まさかの元にもどってる!?コードも元に戻ってる…うああああ。
その後バージョン管理をはじめました(学び)
2.本番DBを直接GUIツールで編集しまくり
特に深夜帯でもなんでもない、アクセスが集中する時間帯に、データ更新のために、レコードを直接編集したり、カラムを間違えて消したりしていた。
うわーしくったとかいいながら、消す前にとっておいたダンプファイルになおしていた。
3.コントローラーが全て しかもメソッド一個
フレームワークはCakePHPだったのですが、複雑なロジックも全部コントローラーに書いてある。もちろんテストなんて一個もない。コワイ
ひさびさによんだらこれはひどいって感じだった。
4.間に合わないところは全部静的ページ状態
エンジニアの手をつかわなくても更新できるとか、ピックアップ的なものを用意していたりしたのですが、間に合わなくて全部ただのhtml
最後まで仕組み化できず
5.データは頑張って手動でどうにかする
データの更新をエクセルでもらう
エクセルからcsvで保存&文字コード改行コード変換(coteditorで)
&DB格納用に変換(一応自前スクリプト)
(絶対自動化できる)
6.最初にアクセスが沢山きて、サーバが重くなった時、攻撃されてると思っていた
さくらVPSの一番低いプランのサーバ一台構成(DBサーバはもちろん別ではない)だった時期に、
重すぎてみれないという報告をうけ、
とりあえず本番サーバに入って、インターンで覚えたてのtopコマンドを打つ。
そしたらロードアベレージが見たことない数値(記憶があやしいですが、桁が二桁ぐらい違う?)。
意味不明だ!これは攻撃されている!やばい!
と助けを求めましたが、アクセスがたくさん来ているだけでした。
mysqlのテーブルに一個もインデックス貼ってないわ、キャッシュもなにも設定してない状態でした。
いろんな人に助けを求めて何とかチューニングをして事無きを得ました。(入ってる状態で固まって為す術がなくなり再起動しました)
7.明日はテレビだから、とりあえずサーバーを増築?しましょう事件
翌日テレビに出ることになったけど、そもそもテレビに出たらどれだけアクセスが来るかはかりしれず(なにもわかってない)。
出るのは朝のニュース番組で、日付が変わって当日(0:30ぐらいだった)になってから、やっとサーバーの設定をスタート(ようは6時間半ぐらいしかない)。
時間がないので、とりあえず増築というか、スペックのいいサーバに交換することに(DNSの再設定が必要)これが後あと悲劇を呼ぶのだった。。。
7.1 サーバを変えるために、設定して、リポジトリをクローンしたけど、アプリケーションが動かない
apacheの設定、mysqlを入れて起動したのに、動かない。なんでだああああ。
となって、チームメンバーと確認してたら、phpが入ってなかった(cakePHPでつくったアプリケーションでした)
7.2 深夜帯の作業のため、遠隔でやりとりしていたチームメンバーの連絡が途絶える
やっとアプリケーションがうごくようになったし、データも前のサーバからとってきたし、お名前ドットコムで設定も切り替えたし大丈夫だ!
っておもって、メンバーにできた!って報告したら、反応がない。
みんな寝落ち…w(メンバーはみなリモートでやりとりして開発していました)
7.3 お名前.comページが見える
朝の情報番組で人が来ているのを無事analyticsで確認してチャットに書き込み、
とりあえずその日面接だし(就活生)仮眠をとって、電車に乗り込む。
そしたら、【お名前ドットコムのページがみえるんだけど…?】との連絡。
その日の夜、もう一本大きい番組の放送がまっていたのに、まさかのお名前トッドコムのページがみえる!?なんで?
実は、深夜作業の時に、DNSレコード設定で、まさかのリセットボタンを押していました…
その後、設定しなおしたのですが、まあリセットの設定が一度反映されてしまってるので…(察し)
7.4 IPアドレスをfacebookページに貼る
どうしようもなくなってしまったので、
テレビ番組に、アクセスが多くてつながらなかったら、facebookページをみてくださいと伝えてもらい、IPアドレスを書いた
8.mysqlとアプリケーションが同じサーバにあるのを2つ作ってロードバランサにつないだ
二箇所の別のマスターDBにデータが分散して格納される(しかもどうやって一緒にすればいいかわからない)みたいなひどいことが起きてた
9.バグったから、本番サーバを直接直す
テレビ放送何分か前に、git管理してた方のブランチがリリースできる状態じゃなくなり(masterしかなかったし、何処に戻ればいいのかすら謎だった)
しょうがないので、本番サーバのコードを直接直した。
iPhoneがない(´・ω・`)からの学び
こんにちは、@sinamon129です。
最近jquery mobileに苦しめられています。
さておき、
今日外で夕食を食べたあとに、
ブログのネタを考えて書くために喫茶店に向かっていました。
コーヒーを注文して、
席について、テザリングしようと思ってiPhoneをつけようとしたら、
iPhoneがない…orz
うあああああorz
でもご飯を食べた場所で、
席を立つときに忘れそうだと思って持ったはず。
そこから喫茶店まではどこかに立ち寄ったりはしませんでした。
ポケットやかばんにもはいっていなくて、
とりあえず、一緒にいた人にwifiを借りて、
iPhoneを探すをしました。
そしたら、iPhoneはオフライン。
おかしいなぁ、電池はあったから、電源は切れていないはず。
オフラインだと探せないので、とりあえず電源がはいったら警告がなるようにしました。
とりあえずその喫茶店で確認し、
元きた道をたどりつつ交番へ向かいました。
途中で、上着の袖のなかにiPhoneを入れてブンブン腕を振り回していたことを思い出し、
(その時はすごく夢中に話していた)
その時に落としたのかもしれない
(気づかなかったのかよって感じでした)
そして交番について、調べてもらったら、
別の交番にあるかも?とのことで、いってみたら、
ありました。拾ってくれた人ありがとう(´;ω;`)日本でよかった。
そこで、iPhoneを渡され、パスコード解除してください(目の前で)
(本人のものかどうかの確認ですね)
といわれて、渡されて、
あれ?電源切れてる?電池きれてるかも?といったら、
「電源きるようにしてるんですよ〜」
っていわれた。
そうか、iPhone交番に届いてたら、
電源切ってくれるからiPhoneを探すでオフラインになってる可能性あるのか。
という学びがありました。
きっと電源きれちゃうと、本人確認できなくなるからでしょうね。
なお、iOS8からは、最後の位置情報を送信する機能があるらしく、
【iOS8】紛失&盗難防止!「最後の位置情報を送信」は必ずオンに! | 楽しくiPhoneライフ!SBAPP
いまからOSアップデートして、それを入れようと思いました。
(あげてなかったんかよ、というツッコミはおいといてw)
<学び>
・iPhoneは袖に入れてぶんぶんしない
・常に所在を把握しながら移動する
・交番に運良く届くと、電源切られるからiPhoneを探すできない
・iOS8からは、最後の位置情報を送信することができる
iPhoneおとして疲れたので今日のブログはこれだけです←