タグ

ブックマーク / songmu.jp (24)

  • Redisアプリケーションパターン | おそらくはそれさえも平凡な日々

    この記事は、はてなエンジニアアドベントカレンダー2016の12日目の記事です。 先日こういうツイートをしました。 Redisはキャッシュ用途のミドルウェアだと思わない方が良いと思う — songmu (@songmu) 2016年12月10日 言いたかったのは、Redisはキャッシュのためだけのミドルウェアだと誤解されがちなのですが実際はそうではないということです。実際、公式サイト を見に行くと以下の様なことが書かれています。 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. つまり、Redisは多彩なデータ構造を保持できるインメモリーのデータストアで、様々な活用法があり、キャッシュとして「も」使える、とい

    Redisアプリケーションパターン | おそらくはそれさえも平凡な日々
    moznion
    moznion 2017/02/13
  • ルーク!MySQLではkamipo TRADITIONALを使え! | おそらくはそれさえも平凡な日々

    よくMySQLはゆるふわだから 値が勝手に切り詰められる エラーが起きずに変な値/日付が入る 不正なスキーマが入ってしまう など言われることがあります。ただそれは、そもそもの設定が悪いのです。(確かに昔デフォルトがゆるふわなのはいけなかったんですが) ということで、データベースには不正な値が入らないように設定はとにかく厳しくしておくのがオススメです。 じゃあどうするか。 MySQLSQL Modeによって、その辺りの制約をコントロールすることができます。以前、MySQLsql-modeで一番厳しいやつはTRADITIONAL、というのを書いたのですが、実はそれだけでは不十分で、TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BYとするのがより安心なようです。 これはkamipoさんに教えてもらいました。 @songmu TRADITI

    ルーク!MySQLではkamipo TRADITIONALを使え! | おそらくはそれさえも平凡な日々
    moznion
    moznion 2015/07/08
    kamipo traditionalだ!!!
  • ソースコード以外もとにかくテストする。もしくはカバレッジだけではダメだという話 | おそらくはそれさえも平凡な日々

    あなたはプロジェクトのソースコードに対して適切にCIを回しているかもしれません。定期的にコードカバレッジの測定も行い、90%以上もしくは100%の数字を出しているかもしれません。 しかし果たしてそれで十分でしょうか?もしくはコードカバレッジだけにとらわれすぎていないでしょうか? 監視とは(システムに対する)継続的なテストである、というのは筆者の尊敬する奥一穂氏の言葉ですが、その逆もしかりで 「テストとはプロジェクトに対する継続的な監視である」 ということも言えます。 その観点に立ってみると、プロジェクトのソースコード以外にもテストが必要なものがたくさんあることに気づくでしょう。以下に実際に筆者が自分のプロジェクトの中でソースコード以外にテストを書き、CIを回していたものを挙げてみます。 アプリケーション設定ファイルのテスト 開発中に番用の設定ファイルを使うことはないため、番用の設定ファ

    ソースコード以外もとにかくテストする。もしくはカバレッジだけではダメだという話 | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/12/25
    まとめのところの「大事なこと」が良い事書いてて良い
  • お手軽InnoDBウォームアップを実現するMySQL::Warmerの話をGotanda.pm #2でしてきました | おそらくはそれさえも平凡な日々

    発表資料 Gotanda.pm #2でMySQL::Warmerというモジュールの紹介をしたのですが、それをCPANizeしたのでエントリを書いています。 % cpanm MySQL::Warmer とすると、mysql-warmupというコマンドがインストールされ以下のようなコマンドを打つとウォームアップクエリがダラっと発行されます。--dry-runもあり、その場合、発行されるクエリが標準出力されます。 % mysql-warmup mydatabase -h db.example.com -u dbuser -p サービス投入前のDBのデータをメモリに乗っけてやるのに有用でしょう。 ウォームアップ戦略はkazuhoさんのMySQL のウォームアップ (InnoDB編)に基づいていますが一部適当です。突っ込みどころがあれば指摘いただければと思います。 ISUCONでも再起動かかった直後

    お手軽InnoDBウォームアップを実現するMySQL::Warmerの話をGotanda.pm #2でしてきました | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/09/22
    ワォ!!!
  • クソコードに対する怒りとコードレビューにおける人格攻撃について | おそらくはそれさえも平凡な日々

    デキるプログラマだけが知っているコードレビュー7つの秘訣 7つの秘訣の1〜5は当にそのとおりだと思います。 「怒り」って言葉を使っているところはなかなか画期的だと感じた。というのも僕は前から「人格攻撃に思われて」しまうような、コードで人を殴るようなことをしてしまう人が出てきてしまうのは何故かということを考えた時に、そこには「コードに対する怒り」があるからだろうなと思っていたからである。怒りがあるからこそ強く指摘しすぎてしまうことが起こりうる。 「怒り」というのはつまり「感情」である。であれば、「その『怒り』はコードに向けられたものであり、書いた人に対してのものではないので、その人に対しての攻撃ではない」というのは、理屈ではかろうじて通るかもしれないが、書いた人の「感情」的には通らないこともあることは理解したほうが良いと思う。 じゃあ怒らなければ良い、という話にはしたくなくて、どうしても怒

    クソコードに対する怒りとコードレビューにおける人格攻撃について | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/08/20
    クソ素晴らしい
  • Perlで一枚岩のスクリプトをテスタブルにする | おそらくはそれさえも平凡な日々

    Perlで単一ファイルのスクリプトを書くと、すぐに配置して動かせるので重宝しますが、テストを書きづらいのが難点です。 ちゃんとpmファイルに分割して云々とかやると単一ファイルで動かなくなるし、かと言ってfatpackするのもちょっとした用途だったらやり過ぎだしめんどくさい。 ということで以下のように書いてはどうか。 if ($0 eq __FILE__) { main(); } sub main { ... } $0に実行ファイル名が入っているので、それがスクリプトファイル名と一致していたらmainの処理を実行する。pythonのif __name__ == '__main__':みたいな感じ。 このスクリプトをテストしたいときは、普通にテストスクリプトを書いてrequire 'main.pl';とかやれば、plファイルの中で定義されている関数とかが個別に呼び出せるのでそれをテストしてやれ

    Perlで一枚岩のスクリプトをテスタブルにする | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/08/14
  • Perlベストプラクティスのベストプラクティスじゃないやつをまとめてみた | おそらくはそれさえも平凡な日々

    Perlベストプラクティス Perlベストプラクティス(略してPBP)という良いがあります。僕自身もPerlを学ぶ過程で非常にお世話になったなのですが、以下の様なことが度々指摘されています。 bestって書いてあるけど「著者の」bestプラクティスなので偏りがあることも 「決して」とか「必ず」とかが多いけどあんま真に受けてはいけない このを書くために書かれたであろうCPANモジュールとかがあって、しかも公開されてないものまである 致し方ないけど現在の状況にマッチしない古い情報もある なので、PBPの何がベストじゃないのかについてまとめてみることにした。前からやりたかったんだけど、思い立ってやった。 まとめてみたら、思っていたほどには項目が上がってこなかったので、やっぱPBPは良いだなと改めて思いました。なので、このエントリーがこれからPBPを読む人の助けになれば良いなと思います。

    moznion
    moznion 2014/07/24
    ここに出てるやつ実装しなくても良いかな
  • 俺がDHMOについて知ってること,またそれに対する所感 | おそらくはそれさえも平凡な日々

    参考: http://moznion.hatenablog.com/entry/2014/06/17/223342 「わかりました。あなたは世界を革命するしかないでしょう」 浄水器 C1 スタンダードタイプ 去年買ったものの中で一番よかったなーとか思ってるのがこれ。そんなに舌の鋭くない僕でも明らかに分かるくらいにDHMOの味が変わった。家でいれるコーヒーが格段に美味くなったのがかなりの収穫。 場所もそんな取らない。洗い物ラックの隣においてある。取り付けも簡単だった。ウォーターサーバーほど場所取らないし、注文とかする必要もない。年に一回くらいカートリッジを買い換える必要があるくらい。 世界が変わった。

    俺がDHMOについて知ってること,またそれに対する所感 | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/06/18
    世界は変えられる
  • MySQL::Partition has been released! | おそらくはそれさえも平凡な日々

    MySQL::Partitionをリリースしていたのでお知らせです。パーティションを切る用のSQLを生成してくれるクエリビルダーです。 Webサービスでは如何にデータを増やさないか、DBを分割しないで一系統に抑えるか、DBをメモリに如何に載せきるかってのがゆるふわサービス運用をしていく上で重要です。MySQLを使っている場合、そのために非常に有用なのがパーティションで、適切にパーティションを切り、古いデータを随時Dropしていける運用に落としこむのが非常に大切なわけです。 社内のプロジェクトでもPartitionを活用しているわけですが、いまいち仕組み化されておらず、古いプロジェクトからコピペを重ねて秘伝のタレ化しており、例えばデイリーでパーティションを切る場合、MySQL5.5からはRANGE COLUMNSパーティションが使えるにも関わらず、TO_DAYS()とかを未だにコピペして使い

    MySQL::Partition has been released! | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/04/07
    Cool
  • Carton考2014 | おそらくはそれさえも平凡な日々

    こうするのがいいかなーと思ってる。経緯は端折って大枠だけ。Webアプリケーションプロジェクトの場合です。 cpanfileちゃんと書いてコミット 今やどこでもやってますね。scan-prereqs-cpanfileも便利です。 開発者は各自carton installでモジュールをインストール。プロジェクトごとにPerlをビルドしたりしてる場合は、cpanm --installdeps .でも別に良い。 CI環境でcpanfile.snapshotを作る CI環境は必ず以下のとおりとする。 番環境と同じアーキテクチャ 番環境と同じバージョンのPerl まっさらな状態(Globalに何のモジュールも入っていない) CIにcarton installもさせて、必要なモジュールをlocal/に入れてテストさせる。毎回サラからcarton installしてたら時間かかるので、git pull

    Carton考2014 | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/02/20
    大変参考になった
  • 俺のオレオレgit-flow | おそらくはそれさえも平凡な日々

    背景 一昨年末くらいにgit-flowを採用していた 良いんだけど、結構めんどくさいなーと思うところがあった 去年頭の新規開発からはgithub-flowを採用(と言うかごく普通のGit運用) masterのテスト通ったらjenkinsさんが開発サーバー反映してくれて捗る ただ番をそれで運用するわけにもいかない リリースタイミングとかある masterはデザイナーやME(=gitに不慣れな人たち)がカジュアルに画像やテンプレをpushできる(それで構わない) git-flowgithub-flowの中間くらいのフローで運用することに git-flowの気に入ってる点とそうじゃない点 気に入っている点 並列ブランチを走らせるというのは良い(git-flowの場合、masterとdevelop) hotfixが便利 めんどくさい所 releaseブランチ毎回作る必要性をあまり感じない バー

    俺のオレオレgit-flow | おそらくはそれさえも平凡な日々
    moznion
    moznion 2014/02/12
    参考になる
  • GithubのHookについてのまとめとソリューション | おそらくはそれさえも平凡な日々

    Githubはpushだったり、pull-requestなりのイベントを通知してくれるHook機構がある。Travisとかもその一環。リポジトリのSettings -> Service Hooksで設定できる。 Hookのイベント設定 各Hookで受け取れるイベントの種類は増やしたり減らしたりすることができる。 例えば、IRC通知の場合だと受け取ることができるイベントは今のところ以下の6種類。 commit_comment issue_comment issues pull_request pull_request_review_comment push その中でデフォルトでONになっているのはpushとpull_requestの2種類。どのHookがどのイベントに対応しているかはhttps://api.github.com/hooksを見れば分かる。 どのようにイベントの追加設定をするか

    GithubのHookについてのまとめとソリューション | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/12/05
    https://github.com/moznion/Yancha-GitHub-Bot/blob/master/set_hook.pl ←こういう異常な努力をしなくてよくなる
  • List::Util#pairmap|pairkeys が便利 (Re: ハッシュっぽい配列からkeysだけ取り出したい) 追記有り | おそらくはそれさえも平凡な日々

    List::Util#pairmap|pairkeys が便利 (Re: ハッシュっぽい配列からkeysだけ取り出したい) 追記有り http://hisaichi5518.hatenablog.jp/entry/2013/03/25/151942 Github::Hooks::Manager作ってるときに、HTML::Shakanに手を入れたりしてて、その流れでHTML::Shakanのオーナーになったりしてたのですが、その際に知った List::Util#pairmapが便利だった。 PSGIのSPECでも使われていたりしていることも関連しているのか、最近key valueのペアが入った配列を見かける頻度が上がってきたように思います。 で、そういうのを上手く扱う方法が無いのかなーとかみんな思っていたかとおもうのですが、灯台下暗し、List::Utilにpairmap()ってのがありまし

    List::Util#pairmap|pairkeys が便利 (Re: ハッシュっぽい配列からkeysだけ取り出したい) 追記有り | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/11/23
    便利情報
  • CPANモジュールは依存モジュールのバージョンを固定しない方がいい | おそらくはそれさえも平凡な日々

    Perl界隈ではCarton周りのtoolchainが整ってきて「これからはsemantic versioningやー」みたいな意識が高まりそうですが、そういうルールに則ってバージョニングをするのは大いに結構だとは思うのですが、バージョン違いのモジュールを同一プロセスで共有するとかそういうことはPerlではできないのでどちらにせよ注意が必要です。 まあ、バージョン違いのモジュールを共有できたところで、バージョン違いのオブジェクトが変なところに渡って死ぬみたいな話もあったりなかったりするらしいので夢を見過ぎるのも良くないですね。 それとタイトルのとおりですが、CPANに上げるモジュールの場合はバージョンは固定したり最大バージョンを決めない方が良いでしょう。 例えば、 Super::ORM が Mouse 2.0に固定依存 Hyper::WAF が Mouse 3.0に固定依存 だったりすると

    CPANモジュールは依存モジュールのバージョンを固定しない方がいい | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/11/05
    ここ最近の苦しみに対する処方
  • OrePAN2サーバーの話 | おそらくはそれさえも平凡な日々

    最近はArkもCPANに上げたし社内OrePAN運用やってないんですが、OrePAN2サーバー的なのをどうすればいいんだ的なことをhirobanexさんが言ってたのでこんなんでいいんじゃないかという話。 こんな感じのpsgiを作ってplackupで立てて、 こんなふうにリクエストでも送ってやれば良い。 curl --data-urlencode 'module=git@github.com:Songmu/p5-App-RunCron.git' --data-urlencode 'author=SONGMU' http://example.com:5000/ 実際使うとするとコミットフックとかでタグ打たれた時にリクエスト飛ばすとかそういう使い方になるでしょうか。 orepan2-injectはgit URLを直で指定できるのがcoolですね。 追記:ちょっと手を入れてtarを直接受け取ること

    OrePAN2サーバーの話 | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/10/30
    めっちゃ欲しかった情報
  • App::RunCron has been released! | おそらくはそれさえも平凡な日々

    https://metacpan.org/module/App::RunCron tl;dr cronlogより可搬性は落ちてシンプルさには欠けるけど、もうちょっと機能拡張してプラガブルな設定ができるruncronてやつを作った。コマンドの成功/失敗に応じて通知方法を変更できるようになっている。 cronで困るのは、ログだったり通知であったりをどうするかというところです。 で基的にどうするか、というところは@fujiwara組長の、 「cron で > /dev/null して椅子を投げられないための3つの方法」 に書いてあります。まとめると以下になります。 全部メールで投げる(> /dev/null は論外) 標準出力、エラー出力をまとめて、何らかのloggerに投げる(syslogがお手軽) 場合によってはcronlogで選別して失敗した時のみ通知する 最近は以下のように、sy

    App::RunCron has been released! | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/10/20
    良い!
  • おそらくはそれさえも平凡な日々: 運用におけるcrontabのテストとParse::Crontab

    Vixie cron形式のcrontabをparseするモジュールをリリースしました。 Vixie cronと言えば、けんじおじさんに「カビ臭い」とかdisられそうな代物ですが、なんだかんだで利用している人は多いでしょうし、僕も使っています。 https://metacpan.org/release/Parse-Crontab 最近携わるプロジェクトではcrontabはリポジトリ管理しているのですが、それをあまりちゃんとテストをしてなかったので、それを解消すべく書きました。 以下の様に、crontabのテストを書くことが可能です。 use strict; use Test::More; use Parse::Crontab; my $crontab = Parse::Crontab->new(file => 'data/crontab.txt'); ok $crontab->is_vali

    moznion
    moznion 2013/10/16
  • Ukigumo::ServerがCPANに上がっていました | おそらくはそれさえも平凡な日々

    https://metacpan.org/module/Ukigumo::Server CPANに上がっていない他の人のモジュールをあげる業をしている今日このごろ皆様如何お過ごしでしょうか。 さて、この度Ukigumo::ServerをやっとCPANに上げましたのでご報告です。 ukigumo-server起動スクリプト MySQL対応 辺りが大きなフィーチャーです。 % cpanm Ukigumo::Server % ukigumo-server --config=config.pl とかやればデフォルト2828ポートでサーバーが立ち上がります。「ふわふわ」なので2828なのですが、どう見ても「ニヤニヤ」でした。 configファイルにはDBの設定等を記載します。configファイルの指定は任意ですが、指定しない場合はdevelopment.dbというSQLiteのファイルがカレントディ

    Ukigumo::ServerがCPANに上がっていました | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/10/06
    ますますUkigumoが身近になったようであります。GJ!
  • Plack::Request::WithEncodingがなぜ便利なのか | おそらくはそれさえも平凡な日々

    Plack::Request::WithEncoding というモジュールをリリースしました 上記の記事にも書いているのですが、Plack::Request::WithEncodigが便利なのは、単に車輪の再発明がされまくっているのが無駄感あるってのもあるんですけど、 個人的には$env->{'plack.request.withencoding.*'}に共通の格納位置を獲得したってのが大きいと思ってます。 例えば、リクエストの文字コード判別ってのは結構だるいのですが、アプリケーションの前段のPlack::Middlewareで、リクエストのエンコーディングの判別をして $env->{'plack.request.withencoding.encoding'}に格納しておくみたいなことをすることにより、よしなに文字列をdecodeしたりすることが出来るようになります。 まーそんなことを考え

    Plack::Request::WithEncodingがなぜ便利なのか | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/10/01
    とのことです!ありがとうございます。
  • SQL::Translator::Producer::Tengを書きました | おそらくはそれさえも平凡な日々

    https://metacpan.org/module/SQL::Translator::Producer::Teng TengのSchemaは手で書くのがタルいので、Teng::Schema::DumperなりTeng::Schema::Loaderなりを使ってごにょったりしていたのですが、無理やりだし、自動生成すればいいよねとは思っていたので、書きました。 Kyoto.pmでも先日のYAPC::Asiaでも「SQL::Translator::Producer::Tengみたいなのがあればいいかもしれないけど特に不便を感じてないからやってない」とか言っていたのですが、書いてみたら案外サクッとかけたので、CPANizeした次第。 以下の様なSQLファイルがあったとして、 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT

    SQL::Translator::Producer::Tengを書きました | おそらくはそれさえも平凡な日々
    moznion
    moznion 2013/10/01
    これめっちゃ良い