BLOGTIMES
» ArchiveList (Tag for "ruby" )
«Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
2020/12/28

Ruby 3.0.0 がリリースされてた

ruby 

しばらくウォッチしていないうちに Ruby 3.0.0 がリリースされていました。
Ruby 2.7 からの変更がいろいろとある*1ので、時間をとって確認する必要がありそうです。

Ruby 3.0.0 リリース

Ruby 3.0系初のリリースである、Ruby 3.0.0 が公開されました。


at 19:36 |
2019/11/06

mysql2 をスレッドセーフに

ruby 

gem mysql2 をマルチスレッドで使っていたら、以下のようなエラーがでて困ってしまいました。

This connection is in use by: #<Thread:0x000000020e0c70 sleep> (Mysql2::Error)

どうやら mysql2 はスレッドセーフではないことが原因の模様。

いろいろと調べてみたら、MutexLockedQuerying*1というモジュールを書いている人を見つけたので、ちょっと改造して取り込んでみました。元の実装だとクラス変数を使っているのでロックがインスタンス単位ではなく、グローバルにかかってしまうので、インスタンス変数に変更してあります。ロックの粒度的にはこちらの方が望ましいはずです。

require 'mysql2' module MutexLockedQuerying def initialize(*) @semaphore = Mutex.new super end def query(*) @semaphore.synchronize { super } end end Mysql2::Client.send(:prepend, MutexLockedQuerying)

at 19:11 |
2019/10/29

gem mysql から mysql2 に移行してみる

ruby  mysql 

昔書いた Ruby のプログラムを CentOS 7 上で動かそうとしたのですが、MariaDB が 10.4 と比較的新しいバージョンだったので gem で mysql がインストールできないので困ってしまいました。

mysqlを見ると、最終アップデート日が 2013 年になっていて、最近はメンテナンスされていないようです。このまま粘っても解決の見込みも立たないので、mysql2 に移行してしまうことにしました。

ソースの書き換えは大きく3箇所

基本的には以下の3箇所を変更してやれば、基本的な動作はするようです。
Date などの部分を自動的に cast する機能がついたようですが、これは :cast => false でオフにしてあります。

# モジュールの読み込み require 'mysql' require 'mysql2' # 接続 @db = Mysql::connect('localhost', 'user_name', 'pass', 'db_name') @db = Mysql2::Client.new(:host => 'localhost', :username => 'user_name', :password=> 'pass', :database => 'db_name', :cast => false) # 結果の取得 rows.each_hash rows.each
[gem mysql から mysql2 に移行してみる の続きを読む]

    at 22:24 |
    2019/09/09

    CentOS 7 + MariaDB の組み合わせで gem mysql2 がエラーになるときは

    ruby  centos7  mysql 

    CentOS 7 に MariaDB をインストールして、Ruby の gem mysql2 実行したらエラーになってしまって困ってしまいました。

    エラーメッセージを読む限りリンカのエラーのようなので、もう一度良く MariaDB のインストールを確認したら MariaDB-shared が入っていないのが原因だったようで、以下のコマンド1行で解決でした。MariaDB-devel だけでいけると思っていたのが、勘違いでしたね。

    yum install -y MariaDB-shared

    CentOS 7 への MariaDB のインストール

    ハマらないように次回からは以下のような感じでインストールすることにしようと思います。

    curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash yum install -y MariaDB-server MariaDB-client MariaDB-devel MariaDB-shared systemctl start mariadb systemctl enable mariadb mysql_secure_installation

      at 16:28 |
      2019/01/10

      IPアドレスのリストからCIDR表現を作る(Ruby編)

      ruby  networking 

      大量の IP アドレスの始点と終点の組(例えば 192.168.0.0~192.168.0.255 のようなもの)組を上手に纏めて CIDR 表現を作る必要があったので、Ruby でスクリプトを書いてみました。

      IP アドレスの範囲を扱うのに altmetric/ip_ranger 、IP アドレスの集約に ipaddress-gem/ipaddress を使っているので、あらかじめ gem install ip_ranger ipaddress でインストールをしておきます。

      コード的にはこんな感じでしょうか。

      ip_summarize.rb

      #!/bin/env ruby require 'ip_ranger' require 'ipaddress' ranges = [] STDIN.each_line do |line| (s, e) = line.chomp.split(',') range = IPRanger::IPRange.new(s, e) ranges += range.cidrs end ranges = ranges.map{|net| IPAddress(net.to_cidr)} summarized = IPAddress::IPv4::summarize(*ranges).map{|i| i.to_string} summarized.each { |r| puts r }

      実際の実行してみると、こんな感じになります。
      IP の範囲は標準入力から1行毎にカンマ区切りで開始,終了のような感じで与えています。

      echo "192.168.0.0,192.168.0.1 192.168.0.2,192.168.0.5 192.168.0.6,192.168.0.11 192.168.0.12,192.168.0.17 192.168.0.18,192.168.0.18" | ruby ip_summarize.rb 192.168.0.0/28 192.168.0.16/31 192.168.0.18/32

        at 23:23 |
        2018/06/03

        Ruby 2.6 から JIT コンパイルが可能に

        ruby 

        JIT コンパイラが搭載された Ruby 2.6.0 の Preview 版が公開されました。

        Java やその他の言語と違って、C 言語のソースコードを生成してコンパイルする方法を取るようです。
        ちょっとどんな感じで動作するのか気になりますね。

        [ruby-dev:50555] Ruby 2.6.0-preview2 Released

        Ruby 2.6ではJIT (Just-in-time) コンパイラが導入されました。 JITコンパイラはあらゆるRubyプログラムの実行を高速化することを目的としています。 他言語の一般的なJITコンパイラと異なり、RubyのJITコンパイラはC言語のソースコードをファイルとしてディスクに書き、通常のCコンパイラを用いてネイティブコードに変換することでJITコンパイルを行うという手法を用いています。(参考: https://github.com/vnmakarov/ruby/tree/rtl_mjit_branch#mjit-organization)


          at 23:21 |
          2018/02/10

          ActiveRecord で ROW_FORMAT=DYNAMIC を自動でつけるようにするには

          ruby  mysql 

          ActiveRecord でテーブルが CREATE TABLE されるときに、ROW_FORMAT=DYNAMIC を自動的に追加する方法を見つけたのでメモ。
          とりあえず RAILS_ROOT で以下のシェルスクリプトを流せば OK です。

          cat << 'EOS' > config/initializers/ar_innodb_row_format.rb # https://qiita.com/kamipo/items/101aaf8159cf1470d823#comment-6a9c50b52e94b8d2cc08 module InnodbRowFormat def create_table(table_name, options = {}) table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC') super(table_name, table_options) do |td| yield td if block_given? end end end ActiveSupport.on_load :active_record do module ActiveRecord::ConnectionAdapters class AbstractMysqlAdapter prepend InnodbRowFormat end end end EOS

          参考


            at 19:33 |
            2017/01/21

            milter-manager を使って特定の IP からの接続時に milters を適用しないようにする

            ruby  postfix  milter 

            Postfix + milter-manager 環境にメールサーバーを移行したのですが、特定の IP のサーバをホワイトリストに入れて milter を適用しないようにしたかったのでいろいろ調べてみたら「how to bypass milters, whitelist hosts」という掲示板のスレッドを見つけたので、これを参考にちょっと Ruby でコーディングしてみました。

            netaddr をインストール

            ホワイトリストは単一の IP ではなく CIDR を使った指定がしたかったので、IP アドレスのレンジを自動的に計算してくれる netaddr を使うことにしました。モジュールは以下のように gem を使って一撃で導入することができます。

            gem install netaddr

            設定は milter-manager.local.conf で

            まず、ホワイトリストを用意します。CIDR で1行に1つずつ記述しておいてください。
            ファイルの場所は以下の Ruby 内のホワイトリストのパスと合せてください。

            /etc/milter-manager/whitelist

            192.168.1.0/24 192.168.100.100 10.0.0.0/8

            あとは以下の内容を milter-manager.local.conf に追加(ファイルがない場合は作成してください)して、milter-manager を restart すれば OK。
            ホワイトリストの IP からアクセスすると [stop] というログが残るのが確認できると思います。

            /etc/milter-manager/milter-manager.local.conf

            # IP-based Whitelist # Based on http://postfix.1071664.n5.nabble.com/how-to-bypass-milters-whitelist-hosts-td35207.html require 'netaddr' whitelist = NetAddr::Tree.new() File.read("/etc/milter-manager/whitelist").each_line do |line| next if /^#/ =~ line whitelist.add!(line.strip) end # Check host ip with whitelist. define_applicable_condition("Whitelist") do |condition| condition.description = "Whitelist" condition.define_connect_stopper do |context, host, address| return false unless address.to_ip_address whitelist.longest_match(address.address).to_i != 0 end end # Apply whitelist to all defined milters. defined_milters.each do |name| define_milter(name) do |milter| milter.add_applicable_condition("Whitelist") end end

            意外と milter-manager の拡張は簡単にできることが分かったのでいろいろと工夫のし甲斐がありそうです。


              at 22:01 |
              2016/06/03

              BibTeX ファイルを Ruby で解析する

              LaTeX  ruby 

              BibTeX で書かれた参考文献の一覧をコンバートする方法がないかと思っていろいろ調べてみたら、Ruby で書かれた BibTeX-Rubyが使えそうだったのでメモ。
              単に Parse するだけでなく、簡単なクエリも書けるようになっているのでなかなか便利そうです。


                at 21:03 |
                2016/04/21

                プログラミングで美少女を集めるゲーム「コードガールこれくしょん」公開

                programming  php  ruby  python 
                コードガールこれくしょん - プログラミングで美少女を集めるゲーム「コードガールこれくしょん」公開

                かんこれに始まって、「○○これくしょん」というゲームがあちこちで登場していますが、「コードガールこれくしょん」というプログラミングで美少女を集めるという一風変わったゲームが登場しています。

                プログラミング学習ゲーム「コードガールこれくしょん」公開! - GAME Watch

                プレーヤーは、最初は簡単な問題から、徐々にレベルが上がっていくクエスト形式でストーリーを進行させていく。プログラミング言語はPHP、Rubyに対応しており、6月にはPythonへの対応も予定されている。

                ソフトウェアを本職にしている身としては問題の難易度がどんな感じなのかちょっと気になりますね。。。。


                  at 19:33 |
                  «Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
                  » ArchiveList (Tag for "ruby" )