サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
takatoshiono.hatenablog.com
使っていた理由 とりあえずoh-my-zshを入れておけばzshがいい感じに動いてくれるし、面倒そうな設定もしなくて済むし便利、くらいの気持ちで使っていた。 不満 それほど大きな不満ではないけど、以下の2つが小さなストレスだった。 シェルの起動が遅い ブラックボックス感 シェルの起動が遅いのは一概にoh-my-zshだけのせいとは言えず、プラグインの影響もあると思うのだけど、体感的に遅いと感じるレベルだった。 ブラックボックス感というのは、zshに対してどういう設定がされているかわからん、ということ。最初は「とりあえず使う」「便利」とか言ってても、だんだんと自分が明示的に設定したものだけが動いてる状態にしたくなってしまう。 どうやってやめたか 一度.zshrcをまっさらにしてから必要な設定を順番に書いていっただけ。もともと多くを必要とはしていなかったので、それほど大変ではなかった。なーんだ
きっかけ そういえば少し前にチームで振り返りをしている時に以下のようなKPTが出たのを思い出した。 初期のDB設計に時間をかけすぎた (Problem) いや、でもDB設計に時間をかけるのはいいこと (Keep) 次の開発でもDB設計に時間をかける (Try) そして、それから少し経ったある日、プルリクエストにこんなコメントがあった。 「未来のストーリーを使ってモデルを揺さぶってみるといいかも」 それでこの本の存在を認識したのだった。そしてもっとモデリングをうまくやりたい気持ちしかない我々はこの本を読むしかないのだった... モデリング この本で紹介されていたモデルの定義は「ある人にとっての、ある状況、あるいはある状況についての概念の明示的な解釈」。これは「システム仕様の分析学」の著者であるブライアン・ウィルソン(Brian Wilson)という人の言葉らしい。で、この定義のかなめは「ある
はじめに 普段MySQLを使っている人間が初めてPostgreSQLを触ってみたので、調べたことを整理して書いておきます。インストールしてテーブルを作るという本当に基本のところから、開発運用しているとどうしても気になってくるALTER TABLE周りまで。 インストール Macを使っているのでhomebrewで入れました。 $ brew install postgresql バージョンは9.6.3でした。 $ postgres --version postgres (PostgreSQL) 9.6.3 データベースクラスタの作成 PostgreSQLにはデータベースクラスタというのがあって、その中にデータベースを作るという感じになっている。データベースクラスタを作るにはinitdbを使う。またはpg_ctlを使う。brew install postgresqlした時にすでに実行されていた。
Go 言語で Apache Bench (ab) を実装してみた。 https://github.com/takatoshiono/go-ab なぜか 以前、wc コマンドを実装した。その時に ab も候補に入っていたけど、ab は http 通信をするプログラムなので、より単純な wc を選択したのだった。その次に何やるか、ということで http クライアントのコードを書く練習になりそうな ab を実装してみることにした。 期間は2016年10月から1ヶ月くらいやったあと、2ヶ月くらいブランクがあって、2017年1月に再開して一ヶ月くらいやっていた。コツコツとよく続いたと思う。 Apache Bench (ab) とは Apache Bench (ab) は HTTP サーバーの性能を測定するためのプログラムでシングルスレッドで動作する。Apache HTTP サーバーのソースコードに含
Go 言語で wc を実装してみた GitHub - takatoshiono/go-wc: Go implementation of wc command for practice なぜか A Tour of Go をやり終えた時「全然うまく書けない」というのが感想だった。もっと Go 言語のコードを読み書きする必要がある。 そして読むだけだとやる気が続かないから何か書きたい。何を作ろうか? Go 言語なのでスタンドアローンで起動するバイナリ実行形式のファイルがよさそう。仕様が簡単で手頃なやつがいいな...と考えて wc にしたのだった。他にも以下が候補にあった。 ab smtp server beer コマンド(なんかうまそうなビールを表示する) wc コマンド find コマンド (コマンド系で攻めるなら GNU coreutils, findutils などを見るとよさそうか...
A Tour of Goが終わってうれしいので記録しておく。 きっかけ 直接のきっかけは gh-ost の登場で、もともと何か新しいプログラミング言語を学びたいけど、何にしようかなと考えていて gh-ost が引き金になった。 MySQL は好きで、オンラインマイグレーションの仕組みにも興味があったので gh-ost は見逃せなかった。実装を見てみたらGo言語で「あ、読み書きできないな」となったのだった。 自分の身近にGo言語製の便利ツールが増えてきているのを感じるし、今後も増えていきそうで、Go言語を使えるようになっておくとよさそうという判断をした。 それに普段使っているRubyとは異なる考え方をする必要がありそうなのもよかったし、機械語にコンパイルできるというのもスタンドアローンで実行するツールを作る言語としては最適だし、いいなと思っている。 何から始めたか 「golang」でググって
自分用メモ。 遭遇した問題 Rack::Attack で redis に保存したデータに有効期限が設定されない namespace を定義した時だけ問題が発生する 結論 Redis::Store が古かった。1.1.4 を使っていたが、有効期限系のメソッド(expire, setex, ttlなど)が namespace に対応したのは 1.1.5 からだった 調査方法 コードを読んだ。 Rails.cache Rack::Attack はデフォルトでは Rails.cache を使うことになってるのでここから始める。 Rails で config.cache_store = :redis_store すると Rails.cache として Redis::Store を使うことができる。コードは以下を見るとわかる。 Rails::Application::Bootstrap の initi
仕事で使ってる MacBoox Air の OS がまだ Mountain Lion だったので、ようやく Mavericks にアップグレードした(Yosemite が出てるのにいまさらですけど…)。そしたらいろいろ動かなくなったのでやったことを書いておく。 1. homebrew のシンボリックリンクが全部消えた とりあえずググったら会社の同僚のブログが見つかったので、それを読んで、以下のことを行った。 Mountain Lion から Mavericks にアップデートしたら Homebrew の諸々の Link が消えた - ravelllの日記 brew list | xargs brew unlink brew cleanup brew list | xargs brew link cleanup は古いバージョンのパッケージを削除するコマンド。複数バージョン入っていてうまくい
なぜ読んだか メタプログラミング Ruby を読んだ ので、この勢いで Ruby のことをもっと深く知りたかった。 どうだったか エキサイティングな体験だった。 この本には Ruby が Ruby コードをどうやって実行しているのか、ということが書いてある。字句解析してトークン列に変換して、構文解析してAST(抽象構文木)ノードに変換して、コンパイルして YARV 命令列に変換して、それを YARV(仮想マシン) が実行する....どうやって?ということが書いてある。 登場する Ruby のコードは単純なものばかりだが、その背後にあるしくみ、C のコードは複雑だ。にもかかわらず、この本を読んでいると自分がそれをいとも簡単に理解したかのような錯覚に陥るので爽快感がある。ワクワクする。それはきっとこの本の著者の説明が驚異的に上手なのと、豊富な図のおかげだろうと思う。 著者の Pat Shaug
なぜ読んだか いつかは Rails のプラグイン的なものも作ってみたい。興味のあるライブラリのコードを読んだりしているけど、同じようには書けそうにないし、もう少し基礎を身につける必要があると感じていた。 どうだったか Ruby のオブジェクトモデルについて理解が深まった。オブジェクトモデルとは、この本によると、オブジェクト、クラス、モジュール、インスタンス変数といった言語要素が共存しているシステムのことで、「このメソッドはどのクラスに所属するものなのか?」「このモジュールをインクルードしたら何が起きるのか?」といった質問の答えが見つかる場所ということであった。メタプログラミングというのは、こうした言語要素を操作するものなので、これらについて知っておかねばならないという。 普段コードを書いたり、読んだりしているときも、この場所の self はなんだろう?などと考えることが増えてよい影響を受け
問題 RSpec で配列の検証をするのに以下のようなコードを書いた。 describe '#payments' do let(:account) { create(:account) } let!(:payments) { [ create(:payment_foo, account: account), create(:payment_bar, account: account), create(:payment_baz, account: account) ] } it 'アカウントに設定された決済方法を返す' do expect(account.payments).to include(payments[0], payments[1], payments[2]) end end このテストコードは正しく動作するが、もっとよく書ける。 includeを使っていると「これらの要素を含んで
きっかけ Railsアプリケーションでは URL の末尾に .json などと書いてレスポンスのフォーマットを指定することができる。先日、このフォーマット部分の末尾に記号をつけてリクエストしても正しく動くということに気がついた。 /v1/users.json (これが正しいけど) /v1/users.json' (これでも動くし) /v1/users.json! (これでも動く) でも一部の記号はエラーになる。 /v1/users.json. (これはルーティングエラー) ここで疑問が湧いてくる。 URLとルーティング設定のマッチ処理ってどうなってるんだろう? たぶん正規表現でマッチングしてるんだろうけど、コードを追って調べてみましょう。 概要をつかむ Rails のコードにおいてルーティング処理がどこに書いてあるのかよく知らないので、まずは Ruby on Rails Hacking G
今年のペパボの新卒エンジニア研修ではキャリア・キーノートという試みを行っている。詳しくは ペパボ新卒エンジニア研修2015が始まっています | blog: takahiro okumura に書いてあるので、興味ある人は読んでみてください。とても充実しててうらやましくなること請け合いです。 今日はそこで自分のエンジニアとしてのキャリアを振り返って発表させてもらった。気がつくと、もう15年も(いちおうは)エンジニアとして仕事をしているのであった。 発表してよかったこと。 学生時代も含めて、自分がどういう流れで、いま、ここで仕事をしてるのかというのを整理できた それを踏まえてこれからの話をできた 新卒エンジニアのみんなをはじめ、会社の同僚に自分の歴史や考えを知ってもらえた 何人かに「よかった」といってもらえてうれしかった 資料は公開できないので1ページだけ。これが一番うけていたと思う。 沖縄行
MySQL(InnoDB)でロック待ちタイムアウトになるクエリはスロークエリログに記録されるのか? 気になったので調べていた。 ロック待ちタイムアウト あるトランザクションで UPDATE 中の行を他のトランザクションから UPDATE しようとするとロック待ちになる ロック待ちの時間が innodb_lock_wait_timeout に設定された秒数を超えると Lock wait timeout exceeded; try restarting transaction というエラーが発生する スロークエリログ (MySQl 5.0) さて、このときスロークエリログは? # Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0 SET timestamp=1423478293; update ... こういう記録が残っていた。
なぜか忘れたけど MySQL のストレージエンジンについて調べたので書いておく。 はじめに断っておくと MySQL 5.6 以降について書いています。 MySQL の「ストレージエンジン」とはなにか? ストレージエンジンとはInnoDBのことである。 MySQLはプラガブルな(置き換え可能な)ストレージエンジンの仕組み(アーキテクチャ)を備えている。何も考えなければそれはInnoDBであり、通常はそのままでよい。ストレージエンジンにはそれぞれ特徴があるので、特殊な使い方(ユースケース)を求めている場合、最適なストレージエンジンが他にあるかもしれないというのを頭の片隅に覚えておきたい。 自分が使っているMySQLがサポートしているストレージエンジンを知りたい場合、SHOW ENGINESコマンドを実行する。ちなみに手元にあるMySQL 5.6.13で実行したら以下のようになった。 mysql
これは何か? 波ダッシュのような文字を変換するための ruby 用ライブラリです。 takatoshiono/wavedash · GitHub 対象ユーザー アプリケーションの文字コードは utf-8 だが、MySQL の文字コードが ujis, eucjp-ms, cp932, sjis である アプリケーションの外部と通信するために、ujis, eucjp-ms, cp932, sjis など異なる文字コードへの変換を必要としている いるのかな…(もしいたら教えてください) 問題 たとえば文字コードが ujis の MySQL データベースを使用する Rails アプリケーションにおいて、〜 (U+301C WAVE DASH) をデータベースに保存しようとすると Mysql2::Error: Incorrect string value というエラーになる。 何が起きているか My
はじめに Rails のログファイルに CACHE (0.0ms) という行が出力されることがある。 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = '1321459' LIMIT 1 [["id", "1321459"]] ここから以下のことがわかる。 このリクエストでこのクエリが発行されるのは2回目またそれ以上である 結果をキャッシュから返したのでDBには問い合わせていない クエリキャッシュ この仕組みはクエリキャッシュというもので、Rails 2.0 で導入された(らしい。よく知らない)。 Rails ガイドだと Caching with Rails: An overview — Ruby on Rails Guides に記載されている。 1.5 SQL Caching Query caching i
MySQL で EXPLAIN を使って実行計画を調べていると Extra フィールドに「Select tables optimized away」というメッセージが表示された。これはなんだろうか? mysql> explain select max(id) from products ; +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+
一貫性のある非ロック読み取り InnoDB では MVCC (multiversion concurrency control) という仕組みによって 一貫性のある非ロック読み取り(Consistent Nonlocking Reads)を実現してる。 トランザクションの分離レベルが REPEATABLE READ (デフォルト) の場合、同じトランザクション内で読み取る値は常に最初に読み取ったときの値(スナップショット)になる。たとえ他のトランザクションによって値が変更されても元のバージョンのデータが undo log というところに保持されているので、ロックすることなく元の値を一貫して読めるようになっている。 一貫性のある読み取りではないケース このように同じトランザクション内では常に同じ値を取得できるのだが、例外が2つある。 同じトランザクション内でなにか変更したら、その値が読み取ら
どういう本か データベースのインデックスについて解説している本。Bツリーインデックスの内部構造、効率よくインデックスを使う方法、実行計画の見方などが書いてある。Oracleデータベースの用語を使って書かれているけど、「原理は他のデータベースにも同じように適用できます。」と書いてあった。 この本はWeb上で無料で読めますが、私は9.95ユーロでPDFを買って読みました。 いいところ インデックスの内部構造の説明が最初の章にある これを頭に入れてから、それでは実際のSQL文においてインデックスがどう使われるでしょうか?という以降の文章を読むとスッと入ってくる感じがした。 視野が広がった この本はOracleデータベースを基本として書かれている。自分はMySQLの知識しか持ってないので知らないことがいろいろ出てきて視野が広がった。例えば以下のようなことを初めて知った。 カラムに関数を適用
今更だけど MySQL 5.6 ではオンラインDDLの機能が追加されている。今日はこのオンラインDDLについて勉強したことを書いてみる。 MySQL のマニュアル MySQL :: MySQL 5.6 Reference Manual :: 14.11 InnoDB and Online DDL にいろいろ書いてある。いまから書くことはこのマニュアルから得た知識が元になっている。 DDL てなによ? データではなく、テーブル自身を操作するためのSQL文のこと。CREATE, ALTER, DROP, TRUNCATEなど。オンラインDDLではCREATE INDEX, DROP INDEX, ALTER TABLEに適用される。 http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_ddl 5.1 までの ALTER TABLE
ロック待ちでデッドロック InnoDB は同じロックを待つクライアントが 200 を超えるとデッドロック扱いになる、というやつがある。 このへんに詳しく書いてある。 Open database life: InnoDBのAUTO_INCREMENTが遅い問題は5.1でどう改善されたのか 同じロックを待つクライアント数が一定ライン(ソース上の定数LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK:200固定)を超えると、デッドロック扱いにして強制的にロールバックさせる、というInnoDBの実装に起因します。 MySQL :: MySQL 5.0 Reference Manual :: 14.2.7.1 InnoDB Lock Modes If the LATEST DETECTED DEADLOCK section of InnoDB Monitor output includ
1つ前のエントリ Query_time - Lock_time > long_query_time - takatoshiono's blog で以下のように書いた。 ソースコード MySQL 5.0.96 で Lock_time が 0 になるのが気になったのでソースをダウンロードしてきて追ってみた。Lock_time で grep すると以下のコードに辿り着くので変数名を頼りに少しさまよってみたのだが、力不足で追いきれなかった。無念。 Webエンジニアのための データベース技術[実践]入門 (Software Design plus) を読んで動的解析の方法を学習したので試してみる。 MySQL 5.0.96 をデバッグモードでインストール kamipo/mysql-build · GitHub を使って 5.0.96 を —with-debug でインストールした。 最初 sed で
rbenv といえば 複数バージョンの Ruby を切り替えて使うための環境を提供してくれる便利なツールとして欠かすことのできないものですが、機会があってそれがどうやって動いているか調べたので、ここに書いておきます。また ruby-build は ruby をインストールするためによく使われている(というか使ってない人いないのでは)rbenv のプラグインです。rbenv install というコマンドは ruby-build が提供しています。これについても一緒に書きます。 はじめに断っておきますが、間違ったことを書いているかもしれないのでその辺はご了承ください。また、将来 rbenv の変更によって変わってしまう部分もあるかもしれません。 また rbenv のドキュメントはとても充実しているので、それを読めばここに書いてあることはだいたいわかると思います。 もくじ rbenv のインス
これは Pepabo Advent Calendar 2014 - Qiita の4日目のエントリです。 昨日は morygonzalez さんでした。明日は id:kitak さんです。 今日感じたことを書く。 プログラミングって自分なりのルールを築いていく作業だなあ、と感じた。 プログラムには必ずしも決まった答えがない。いろいろな書き方ができるし、いろいろな振る舞いが考えられる。 例えば、 「メソッドはどう分けるか?」 「このメソッドはどこに置くか?」 「例外を出すべきか?戻り値で返すべきか?」 「こういう場合は HTTP ステータスコードは何が適切か?」 とか、いい例が出てこないけど。 コードを書きながらそういうことを考える。そのとき、過去に同じ問題に遭遇したことがあって自分の中にルールができていれば、それに従ってコードを書けばいい。でもルールがない場合は?初めて遭遇する問題のときは
はじめに 最近の JavaScript 関連の技術にはほとんど触ったことがなかったので、今回ひととおりセットアップしたことでいろいろとカルチャーショックを受けた。記念にブログに書いておこうと思う。 ちなみに、JavaScript 関連の技術が進化していくスピードはすさまじいので、このブログの記事もそのうち無意味なものになると思いますが、その辺は念頭に置いて読んでください。 今回やること AngularJS という JavaScript の Web アプリケーションフレームワークのひな形を作って、それをローカルの Web サーバ上で動かしてブラウザで表示するまでをやります。 用語の整理 ごちゃごちゃとやるまえに、それぞれの用語を整理しておいた方がいいと思うので、簡単に書いておきます。 node.js ブラウザなしで JavaScript を動かすための実行環境 nvm Node.js のバー
dotfiles って? dotfilesというのは先頭にドット(ピリオド、これ -> .)が付いたファイルのことで、Linux や Mac などでエディタやシェルの設定ファイルがこの形式になっている。dotfilesには自分が快適に作業するための設定がいろいろ書いてあるので、無くしたくないし、PC を移行したときに簡単に復元したいから、Github などで管理している人が多いと思う。このエントリはその管理方法の話。 これまで とりあえず Github で管理していた 自分のdotfilesがごちゃごちゃしている印象があってもやもやしていた これまでどこかで見聞きした設定を「とりあえず入れてみる」というのを繰り返してきた その結果、自分が今どういう設定をしているのかよくわかっていなかった しかも、あるツールの導入や設定を、なぜ、どうやったのか思い出せない さらにその結果として、新しいツール
注意 この記事は2014年7月5日時点の情報に基いて書かれています。Amazon Glacierの最新の料金体系についてはAmazonの公式ページをご参照ください。 料金 - Amazon Glacier | AWS よくある質問 - Amazon Glacier | AWS 昨日の出来事 Amazon Web Services から6月の請求が来た。 Total: $20.30 あれ、なんか高いぞ・・。 ちなみに先月は 0.18 ドルだった。 やっぱり高すぎる。 内訳を見たら以下のようになっていた。 たしかに先月 Glacier のデータをリストアしたけど、なんだこの 1,633.224 GB というばかでかい数字は・・。こんな大きいデータリストアしてないし、そもそも持ってない。 調べた Amazon Glacier のリストア料金は「ピーク復元レート」というのに基づいて計算される。ピー
読んだ理由 Ruby を使い始めて間もない頃に(3ヶ月ほど前)、隣の席にいた同じチームの同僚が「これいいよ」って教えてくれたのがきっかけで、以下のような思いを持って読むことになった。 オリジナルのリファクタリング―プログラムの体質改善テクニック (Object Technology Series)は10年前くらいに読んだことがあるけど、いま読み返したら何か学びがありそう Ruby の勉強にもなるかもしれない いまの仕事(iPhone アプリ / Android アプリのサーバーサイド API 開発)に有用そう ちなみに昨日、その同僚はブログでもっといろんな本を紹介していた。 Rails で "とりあえず動くコード" を書けるようになった人が次に遭遇する問題とそれを解決してくれる本まとめ - 彼女からは、おいちゃんと呼ばれています この本に書いてあること まだ肝心のリファクタリングのカタログ
次のページ
このページを最初にブックマークしてみませんか?
『takatoshiono.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く