タグ

ブックマーク / blog.tmtms.net (17)

  • Ruby 2.7 の変更点 - パターンマッチング - tmtms のメモ

    Ruby 2.7 アドベントカレンダーの2日目の記事です。(更新が遅いのは仕様です) qiita.com パターンマッチング パターンマッチングは Ruby 2.7 での目玉機能と言ってもいいでしょう。 ただし現時点では experimental で、使用すると次のメッセージが出力されます。 warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby! パターンマッチングは配列やHashなどの構造のパターンとオブジェクトをマッチングするためのものです。 パターンマッチングは case...in 構文を使用します。 case に指定したオブジェクトのパターンが、in で指定したパターンと一致していれば、パターンに指定した変数に対応する値が代入されて、in 部

    Ruby 2.7 の変更点 - パターンマッチング - tmtms のメモ
    a2ikm
    a2ikm 2019/12/05
  • Ruby 2.7 の変更点 - キーワード引数 - tmtms のメモ

    Ruby 2.7 アドベントカレンダーの3日目の記事です。 qiita.com キーワード引数 Ruby は 2.0 から次のような感じでキーワード引数を使用することができるようになりました。 def hoge(k: 123) p k end hoge() #=> 123 hoge(k: 456) #=> 456 hoge({k: 789}) #=> 789 2.7 では最後の形式で warning が出るようになりました。 a.rb:7: warning: The last argument is used as the keyword parameter a.rb:1: warning: for `hoge' defined here キーワード引数は、最後の引数が Hash の場合に特別な扱いをするという感じだったのですが、それだと省略可能な位置引数(デフォルト値を持つ引数)がある場

    Ruby 2.7 の変更点 - キーワード引数 - tmtms のメモ
    a2ikm
    a2ikm 2019/12/05
  • Ruby 2.6 の変更点 - IO - @tmtms のメモ

    Ruby2.6アドベントカレンダーの10日目の記事です。 qiita.com IO ファイルオープン時のモードに x 追加 IO ファイルオープン時のモードに x 追加 https://bugs.ruby-lang.org/issues/11258 ファイルを作成用にオープンするには w を指定しますが、これはファイルが既に存在していた場合に上書きして空にしてしまいます。 それを避けるために次のようなコードをたまに見ることがありますが、これは他の方法で排他制御していなければ危険です。 raise "File exists" if File.exist?("hoge.txt") # 他プロセスがこのタイミングでファイルを作ってるかもしれない File.open("hoge.txt", "w") 今までは次のようにしていました。 File.open("hoge.txt", File::CREA

    Ruby 2.6 の変更点 - IO - @tmtms のメモ
    a2ikm
    a2ikm 2018/12/10
  • Ruby 2.5 - tmtms のメモ

    この記事は Ruby 2.5.0 preview1 時点のものです。Ruby 2.5 リリース版については http://tmtms.hatenablog.com/entry/2017/12/30/ruby25 を見てください。 Rubyは毎年クリスマスにバージョンアップされます。 今年も問題なければ12/25にRuby 2.5が出ると思います。 https://docs.ruby-lang.org/en/trunk/NEWS.html を元に変更内容を調べてみました。 言語仕様 トップレベル定数参照 rescue/else/ensure 節 文字列内式のRefinement Unicode バージョン 10.0.0 組み込みライブラリ Array#append, #prepend 追加 Dir.children, Dir.each_child 追加 Dir.glob :base オプショ

    Ruby 2.5 - tmtms のメモ
    a2ikm
    a2ikm 2017/12/04
  • 実行中プログラムのイメージを得る - tmtms のメモ

    Twitter見てたらこんなこと言ってる人がいました。 Unix で実行中の実行ファイルのパスを確実に得る方法はない、というのは FAQ だと思うけど、実際にやりたいことは自分自身を別プロセスで新たに立ち上げたいということなので、メモリにロード済の自分自身から別プロセスを作る手段はないんだろうか— Yusuke Endoh (@mametter) 2017年10月25日 昔自分もそんなこと考えたなーと思いつつ、Linuxなら /proc/<pid>/exe が実行ファイルへのリンクになってるんで、 環境によるような気もするけど、自分の実行ファイルのパスは /proc/pid/exe から取れないですかね。— とみたまさひろ (@tmtms) 2017年10月25日 と言ってみたら、 Linuxならその手が使えますが、現在実行中の実行ファイルでも削除できちゃいますから、パス名を得る完璧な方法

    実行中プログラムのイメージを得る - tmtms のメモ
    a2ikm
    a2ikm 2017/10/27
    面白い
  • ZIP中のファイル名の文字化け - @tmtms のメモ

    こんな記事がありました。 gihyo.jp これはMacユーザー用の書籍の宣伝記事らしいのですが、「Windowsを使ってる人のためにMac側がひと手間かけてあげよう」なんて殊勝なことをマカーが言うとは時代も変わったもんです。([追記] はてブのコメントを見たらさすがマカーという意見が並んでて安心しました) まあ私はWindowsユーザーでもMacユーザーでもないのでどうでもいいのですが、文字化けなネタなのでいついてみます。 記事中に、「付物出稿.zip」というファイルを開いた時の画像が載ってます。 文字の並びからして、UTF-8文字列をシフトJIS(CP932)とみなして表示してしまった文字列でしょう(「繧ォ繝上y繝シ繝輔か繝ォ繧ソ繧・」の元の文字は「カバーフォルダ」で、「蟶ッ繝輔か繝ォ繧ソ繧・」は「帯フォルダ」)。 つまり、Macはファイル名をUTF-8ZIPに書き込み、Wi

    ZIP中のファイル名の文字化け - @tmtms のメモ
  • table_cache, max_connections, open_files_limit の関係 - tmtms のメモ

    昔はマニュアルに書いてあったような気がしたけど、最近のマニュアルには見当たらないのでメモ。 mysqld が同時に使用可能なファイル数は open_files_limit というパラメータで指定します。ただし、mysqld は最低でも table_cache*2+max_connections+10 --- (a) は必要だと考えるので、open_files_limit が (a) よりも小さければ、黙って (a) の値まで大きくします。table_cache を2倍しているのは、MyISAM が1テーブルにつき2ファイル使用するためでしょう。10 を足しているのは標準入出力エラー出力と、ログファイル等の分でしょうか。 また、max_connections*5 --- (b) の方が (a) よりも大きければ、open_files_limit は (b) になります。 (a), (b) よ

    table_cache, max_connections, open_files_limit の関係 - tmtms のメモ
  • Ruby の Timeout の仕組み - tmtms のメモ

    Ruby で長い時間掛かるかも知れない処理のタイムアウトを行うにはこんな感じにします。 require 'timeout' begin Timeout.timeout(3) do # 3秒でタイムアウト hoge # 何かの処理 end rescue Timeout::Error puts 'なげーよ' # タイムアウト発生時の処理 end Timeout.timeout はブロック開始時にスレッドを作成し、そのスレッドで指定された秒数だけ sleep して、sleep から復帰してもまだブロックが終わってなければ作成元のスレッドに対して Timeout::Error 例外を発生させます。 指定時間以内に処理が終わる場合: timeout(X) │ スレッド作成 ─┐ │ │ ブロック実行 sleep X │ │ スレッドkill→ 🕱 │ timeout復帰 指定時間以内に処理が終わら

    Ruby の Timeout の仕組み - tmtms のメモ
  • MIMEヘッダエンコーディングは複雑すぎてつらい - tmtms のメモ

    これは NSEG Advent Calender の7日目の記事です(内容は NSEG とも長野とも関係ありませんが…)。 www.adventar.org メールの送信者(From)や件名(Subject)は来ASCII(の一部の文字)しか書くことができないんですが、MIME(RFC2047)の登場によって日語等の非ASCII文字を記述することができるようになりました。 とは言ってもメールアプリから見て日語が表示できているだけで、内部的にはASCII文字にエンコードされています。MIMEヘッダエンコーディングと呼ばれています。 たとえば、「日語」という文字列は =?utf-8?b?5pel5pys6Kqe?= や =?iso-2022-jp?b?GyRCRnxLXDhsGyhC?= に変換されています。 この処理が実は非常に複雑で、正しくエンコードされてない場合がかなりあります。

    MIMEヘッダエンコーディングは複雑すぎてつらい - tmtms のメモ
  • MySQLユーザーがPostgreSQLを触ってみたメモ - tmtms のメモ

    最近なぜか MySQL を使う Ruby アプリを PostgreSQL に対応する羽目になっているのですが、今までほとんど MySQL 以外の RDBMS を触ってなかったので、色々ハマったりしたのでメモっときます。 なお PostgreSQL 歴が浅いので間違ってること書いてるかもしれません。 API プログラムから MySQL にアクセスするには Ruby/MySQL を使っていたのですが、PostgreSQL 用の API を新たに覚えるのは面倒だったので、Sequel を使って書き直しました。 mysql.query("select col1, col2 from table where col3='xxx'") ↓ db[:table].where(col3: 'xxx').select(:col1, :col2) …みたいな感じです。 今までプログラム中に突然 SQL が現れ

    MySQLユーザーがPostgreSQLを触ってみたメモ - tmtms のメモ
  • Rubyのシグナルハンドラ - tmtms のメモ

    toRuby & guRuby 出張版 でシグナルについてやってたので、関連して書いてみます。 どのような時にシグナルハンドラを定義するのか どのような時にシグナルハンドラを定義するのかという話がありました。 UNIXのデーモンプログラムは、何が由来なのかわかりませんが、SIGHUP で設定ファイルの再読み込みを行うのが慣習になっています。 SIGHUP はデフォルト動作ではプログラムを終了させてしまうだけなので、SIGHUP で特別な処理を行いたいプログラムはシグナルハンドラを定義しています。 来 SIGHUP は端末が終了した時に端末上で動いていたプログラムに対してOSが発行するためのものです。 たとえば、端末エミュレータを開いて、 % sleep 9999 と実行してる状態で端末エミュレータを閉じると sleep プロセスに SIGHUP が送られます。別の端末から strace

    Rubyのシグナルハンドラ - tmtms のメモ
  • Rubyのエンコーディングその2 - tmtms のメモ

    この前「Rubyのエンコーディング」という記事を書いたのですが、それをネタに 8/25 の NSEG で発表しました。 Rubyのエンコーディング from Masahiro Tomita この中で、エンコーディングが原因で予期しないところで落ちてしまうことが結構あるという話もしたんですが、今回はプログラムが落ちないようにするにはどうすればいいかを考えてみます。 エンコーディングが原因で落ちてしまうのは大体次のパターンのようです。 文字列や正規表現のエンコーディングが異なる 文字列中に不正な文字が含まれている 文字列や正規表現のエンコーディングが異なる 正規表現をリテラルで生成していれば、エンコーディングは敢えて指定しない限りは普通はスクリプトエンコーディングになってると思うので、問題は文字列の方です。 特にファイルから読み込んだ文字列のエンコーディングが何になっているかに注意しましょう。

    Rubyのエンコーディングその2 - tmtms のメモ
    a2ikm
    a2ikm 2013/05/15
    valid_encoding?知らなかった
  • mysqldump --single-transaction に --flush-logs をつけてはいけない - tmtms のメモ

    (いまだに時々ブクマされていたりしますが、これはバグで MySQL 5.5.21 以降では修正されています。) mysqldumpMySQL のデータのバックアップを取得するコマンドです。 mysqldump に --single-transaction を指定すると一貫性を保持したバックアップを取得することができます*1。 この時に mysqldump が発行しているクエリは次のような感じです。 [mysqldump --single-transaction DB名] SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION WITH CONSISTENT SNAPSHOT UNLOCK TABLES DB選択 テーブルからデータの読み込み「START TRANSACTION WITH CON

    mysqldump --single-transaction に --flush-logs をつけてはいけない - tmtms のメモ
  • OSS貢献者賞を頂いたので昔話をします - tmtms のメモ

    この記事は、おっさんの自分語りと昔話なので、あまり読む価値はないです。 もう1ヶ月くらい前になるのですが、OSS貢献者賞を頂きました。 最近はあまりOSSに貢献するようなことをしてる自覚はなかったので、なぜ自分が候補にあがったのか謎でした。OSS貢献者賞のページによると、 影響力のある開発プロジェクトを創造、運営した開発者やグローバルプロジェクトにおいて活躍する卓越した開発者及び普及に貢献した方を表彰するもの ということらしいです。創造や運営してないし、たぶん卓越した開発者でもないので、「普及に貢献した」だろうと思い、じゃあ最近のことじゃなくて過去の実績が評価されってことならいいかと、受賞させていただくことにしました。 ちゃんとした受賞理由は発表のページに載るまで知らされてなかったのですが、予想通り MySQL 関係でした。 MySQLの初期の日語化パッチを作成し、国内での普及に大きく貢

    OSS貢献者賞を頂いたので昔話をします - tmtms のメモ
  • Rubyのエンコーディング - tmtms のメモ

    Ruby 1.9 から文字列や正規表現オブジェクトはそれぞれエンコーディング(いわゆる文字コード)を保持するようになりました。 たとえば 0xB1 0xB2 という2バイトは EUC-JP エンコーディングでは「渦」、SHIFT_JIS エンコーディングでは「アイ」という文字になります。つまり同じバイト列でもエンコーディングが異なれば異なる文字として解釈されます。 1.8 では文字列はただのバイト列でした。なので、それがどのような文字を表しているのか、つまりエンコーディングが何なのかはプログラムが知っている必要がありました。 1.9 では文字列オブジェクト自身が自分が何のエンコーディングかを知っています。同じ 0xB1 0xB2 というバイト列でも、それが EUC-JP の「渦」なのか SHIFT_JIS の「アイ」なのかは、文字列自身が知っています。 スクリプトエンコーディング スクリプ

    Rubyのエンコーディング - tmtms のメモ
  • #devsumi【18-B-1】プログラマが知るべきたったひとつの大事なことがら - tmtms のメモ

    デブサミ2011の id:t-wada の講演のメモです。嘘書いてあるかもしれません。 タイトルは釣り きのこ18. 学び続ける姿勢 読む/書く/話す サッカーファンが得意なことは二年単位でものを覚えること 1996/07/22 マイアミの奇跡 アメリカにいた 初めてコンピュータに出会った ホームステイ先の子供と仲良くなりたい ファミコンでマリオ3をやってみせた 当に没入したものは体が覚えている 無限1UP 「ニンテンドーの国からきた男は違う」 心をつかんだ 原体験 ひとを動かすためにはやってみせる 2000年 OO厨をこじらせる RDBの世界は汚いから俺が正す テスト大嫌い 俺が書いたコードにバグがあるわけがない でもバグや手戻りが多い 完璧主義の呪いにかかった ただしいモデルがわかるまでコードを書いてはいけない 2002/06/07 日韓ワールドカップでアルゼンチン対イングランド 技

    #devsumi【18-B-1】プログラマが知るべきたったひとつの大事なことがら - tmtms のメモ
    a2ikm
    a2ikm 2011/02/18
    「TDDは開発プロセスとは基本的には関係ない」「プログラマーが意思があればできるのがTDD」
  • レポジトリビューアで「見る」とダウンロードになる - tmtms のメモ

    Redmine のレポジトリビューアで、日語が含まれているテキストファイルを「見る」とダウンロードになってしまいます。 どうやら、非ASCII文字が30%以上あるとバイナリとみなしてしまうようです。 次のように修正したらちゃんと表示されました。 --- repositories_controller.rb.orig 2010-04-17 21:51:46.000000000 +0900 +++ repositories_controller.rb 2010-09-15 06:48:44.000000000 +0900 @@ -18,6 +18,7 @@ require 'SVG/Graph/Bar' require 'SVG/Graph/BarHorizontal' require 'digest/sha1' +require 'iconv' class ChangesetNotFoun

    レポジトリビューアで「見る」とダウンロードになる - tmtms のメモ
  • 1