1. シンボルの役割 a. シンボルは一意 Ruby で、シンボルを使うと、名前に一意性を持たせることができる。 たのしいRuby (p125) によると、 シンボルとは、Ruby が内部でメソッド名などの識別に使っている数値で、任意の文字列に対して異なった値が割り当てられます。 Emacs Lisp では、タンスの引き出しに例えられている。 cf. Symbols as Chest - Programming in Emacs Lisp b. シンボルの書き方 シンボルにはリテラルがあり、接頭辞 `:’ を名前の前につける。 プログラミング言語Ruby — ありえるえりあ のシンボル(3) には、ハッシュのキーをシンボルで書くことが勧められている。 # こうするより ht1 = { "key1" => "val1", "key2" => "val2" } # こう書く ht1 = { :
シリーズ・RubyのSymbol 。だいぶ空いてしまったけど、気が向いたので続きを書く。 前回 は文字列の同一性について復習したのであった。 意義 そう言うわけで、文字列においては同一性と同値性は異なる。特に、Rubyの場合は同じリテラルも評価する度に異なるオブジェクトを生成する。ところが、これは不便な場合があるわけだ。 まず、文字列の同値性比較はコストがかかる。長い文字列を比較にするには時間が掛かる。保持しておくにも長い文字列だったらメモリーを食う。更に、毎回リテラルからオブジェクトを生成するとしたら、無駄なケースが多々ある。Railsに良く出てくる疑似名前付き引数みたいなやつ。 some_method "a" => 1, "b" => 2, "c" => 3 おい、この箇所を通る度に一々文字列のメモリー確保してオブジェクト構築するのか? その背後ではパフォーマンス厨なら誰もが恐れる m
Sequel作者のブログで、不用意にrespond_to?,const_defined?などのメソッドを使っているとDoSされる可能性があると書かれてます。 RubyのSymbolはGCされない→外部から任意のSymbolを生成されればメモリがどんどん食われていく→respond_to?などのメソッドは内部的にSymbolを生成している→その手のメソッドにユーザー入力値渡してたらまずいんじゃね? という話で、具体的にはActiveRecordでattr_accessibleを使ってないときに該当するらしいです。 Sequelはrespond_to?('any_method')をpublic_methods.map{|x| x.to_s}.include?('any_method')のように書き換えることで対応したとのこと。Sequelはmap(&:to_s)した値をキャッシュで保持してるの
RubyのSymbolと文字列の違いを研究室の輪講用に書いたのですが,折角なので公開したいと思います. 元々学部生に対する輪講用に書いた物なので,若干上から目線ですがご了承ください. Symbolの意義は何か文字列とSymbolはよく似ています.プログラマから見ればどちらも文字列です.違いを一言で説明すると『プログラムが扱う』文字列か,『プログラマが見る』文字列かの違いです.例えば変数名は『文字列』ですが,rubyのオブジェクトである『文字列』ではないですよね? 例えば,今あなたがC言語でお絵描きライブラリを作っているとしましょう.その中に,色で塗りつぶすfillという関数があり,色を青・赤・緑の3色から選べ,fillの引数でそれを指定できるとしましょう. fillの引数の設定方法として一番単純なのが,0を青,1を赤,2を緑として,0〜2で選択させる方法でしょう.しかし,それでは,どの数値
平素よりQA@ITをご利用いただき、誠にありがとうございます。 QA@ITは「質問や回答を『共有』し『編集』していくことでベストなQAを蓄積できる、ITエンジニアのための問題解決コミュニティー」として約7年間運営をしてきました。これまでサービスを続けることができたのは、QA@ITのコンセプトに共感をいただき、適切な質問や回答をお寄せいただいた皆さまのご支援があったからこそと考えております。重ねて御礼申し上げます。 しかしながら、エンジニアの情報入手方法の多様化やQAサービス市場の状況、@ITの今後のメディア運営方針などを検討した結果、2020年2月28日(金)15:00をもちましてQA@ITのサービスを終了することにしました。 これまでご利用をいただきました皆さまには残念なお知らせとなり、誠に心苦しく思っております。何とぞ、ご理解をいただけますと幸いです。 QA@ITの7年間で皆さまの知識
# top top - 12:22:56 up 7 days, 16 min, 15 users, load average: 0.00, 0.02, 0.00 Tasks: 114 total, 3 running, 108 sleeping, 3 stopped, 0 zombie Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.0% id, 0.3% wa, 0.0% hi, 0.0% si Mem: 256628k total, 249408k used, 7220k free, 31068k buffers Swap: 521600k total, 16292k used, 505308k free, 47524k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 29339 ro
※本TIPSではWindows 2000/Windows XP/Windows Server 2003におけるタスク・マネージャの見方について解説しています。Windows 7など、ほかのWindows OSについては、次のTIPSをそれぞれ参照してください。 タスク・マネージャのパフォーマンス・タブの見方(Windows 7/Windows Server 2008 R2編) タスク・マネージャのパフォーマンス・タブの見方(Windows Vista/Windows Server 2008編) Windows 2000やWindows XPなどの仮想記憶システムを採用したOSでは、システムに物理的に装着されているメモリ量を超えるような、大きなプログラムや多数のプログラムを同時に実行することができる。物理メモリが足りない場合は、メモリに入りきらない部分をディスクへ書き出しておき、必要に応じて
サ−バ等に使っているPC のメモリが十分かどうか気になる事は多いと思う. 調べ出すと フリーメモリーの不足や SWAP にメモリーがはみだしている様子など 心配な事がいろいろでて来る. PC の動作が遅くなる原因は様々な要因が絡み合っているので, 表面に現れた症状だけでは効果的な対策が分からない事もある. 以下では, メモリ−関連にしぼって解説する. メモリの状況を調べる メモリ−は十分なはずなのに 余裕が無い? どのプロセスがメモリを消費しているのか? メモリーのリークを検出する方法? 防止する方法? メモリ−は十分なはずなのに SWAP を使ってる? じゃ, 本当のメモリ−不足はどうしたら分かるの? メモリーと SWAP 領域はどのくらい確保すると良いのか メモリの状況を調べる メモリの利用状況を調べる方法は, free, top, ps, vmstat, /proc/meminfo
PHP Advent Calendar 2013 - 7日目 昨日は@hidenorigotoさんのBeyond MVCでした。 今日は PHPあるある的な問題に対する対策について少しばかり書きたいと思います。 ※ 歯ブラシを持たせてみた *1 メモリ不足でよくやる対応 PHPで大量のデータを扱ったりすると、設定された利用可能な最大メモリ使用量を超えて PHP Fatal error: Allowed memory size of 524288330 bytes exhausted (tried to allocate 351 bytes) in ....というエラーが発生して対応に追われたことの経験がある人はかなり多いと思います。 そもそも環境のメモリに余裕があるならmemory_limitを調整してメモリの使用量を増やしたり あまり余裕がない場合は暫定的対応として、該当処理部分だけ <
いつも思いだすのに時間がかかるというか、ググるのでメモ。 例えば、ベンチマークとかをとっていて、残ったキャッシュを奇麗さっぱりに消したい時とかに使う。 Linuxのメモリで保持しているキャッシュをクリアするには、以下を実行する。 # sync # echo 3 > /proc/sys/vm/drop_caches 値の意味としては、、、 1: ページキャッシュを解放 2: dentry、inode を解放 3: ページキャッシュ、dentry、inode を解放 以下を参考に。 /proc/sys/vm/drop_caches (Linux 2.6.16 以降) このファイルに書き込みを行うことで、クリーンなキャッシュ、dentry、 inode をメモリ上から外し、そのメモリを解放する。 ページキャッシュを解放するには、 echo 1 > /proc/sys/vm/drop_caches
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く