ラベル Sudoku の投稿を表示しています。 すべての投稿を表示
ラベル Sudoku の投稿を表示しています。 すべての投稿を表示

☆LucidのGnome-Sudokuにパッチをあてる

Lucid(Ubuntu 10.04)のGnome数独(Gnome-sudoku 2.30)はKarmicで悪化した経過時間の表示が修正されています。
Karmicの時はセルの上側にメモ用の数字を入力すると経過時間がやたら増えたのですが、これも直っているようです。
(完全ではないようで、多少修正されています。)
しかし、残念ながら特定の場合にコンフリクトした値が赤くならないバグと終了判定が正しくないバグが残っています。
(すでにGnomeの新しいリビジョンでは修正されているので次のリリースでは修正されているはずです。)
これを修正するパッチを用意しました。

gnome-sudoku.2.30.0-0ubuntu6.patchをダウンロードして下記の要領でパッチしてください。
ファイルは ~/Download ディレクトリにダウンロードした前提で記述しています。

$ cd /usr/lib/python2.6/dist-packages/gnome_sudoku
$ sudo patch -p1 < ~/Download/gnome-sudoku.2.30.0-0ubuntu6.patch

注意点はgnome-games-commonとgnome-sudokuパッケージの両方にダブってsduoku.py,timer.pyが含まれていることです。
実際に使われているのはgnome-games-commonの方のsduoku.py,timer.pyですのでパッチを当てるファイルを間違わないように気をつけてください。

suoku.pyに対するパッチの内容はGnomeで実際に適用されたものではなく、私が書いたものです。
gitの使い方を多少学んだのですが、2.30からいくつかコミットが行われていてどれが該当するのかわからなかったのでorz.
(Gnomeで実際に適用されたパッチの方が良かった気がするのですが)
timer.pyの方の修正はGnomeで行われた修正を取り込みました。
こちらは変更が少ないのでgitで変更したコミットが簡単に特定でしました。

gnome-games$ find ./ -name 'timer.py'
../gnome-sudoku/src/lib/timer.py
gnome-games$ git blame -L '/^        if currently_timing:/,+1' -- ./gnome-sudoku/src/lib/timer.py
f235e03e (Jim Ross 2010-03-31 03:53:55 -0400 142)         if currently_timing:
gnome-games$ git log f235e03e^..f235e03e
commit f235e03e98e960a69627f5b4afacb9f14d599bad
Author: Jim Ross <jimbo@dimensia.com>
Date:   Wed Mar 31 03:53:55 2010 -0400

    sudoku: Fixed mark timing
    
    The problem is, when the main window is not active(timer paused) and
    the auto-save kicks in - the timer always gets restarted in mark_timing().
    
    This patch fixes it by storing the current value of self.is_timing at the st
    of mark_timing() and then checking it before calling resume_timing().
    
    Fixes bug #562782
gnome-games$ git show f235e03e
commit f235e03e98e960a69627f5b4afacb9f14d599bad
Author: Jim Ross 
Date:   Wed Mar 31 03:53:55 2010 -0400

    sudoku: Fixed mark timing
    
    The problem is, when the main window is not active(timer paused) and
    the auto-save kicks in - the timer always gets restarted in mark_timing().
    
    This patch fixes it by storing the current value of self.is_timing at the st
    of mark_timing() and then checking it before calling resume_timing().
    
    Fixes bug #562782

diff --git a/gnome-sudoku/src/lib/timer.py b/gnome-sudoku/src/lib/timer.py
index bd5e2de..c37511a 100644
--- a/gnome-sudoku/src/lib/timer.py
+++ b/gnome-sudoku/src/lib/timer.py
@@ -132,13 +132,15 @@ class ActiveTimer (gobject.GObject):
         self.resume_timing()
 
     def mark_timing(self):
+        currently_timing = self.is_timing
         self.pause_timing()
         if self.active_time < 1:
             self.active_time = 1
         # dirty hack: never let total time be less than active time
         if self.active_time > self.total_time:
             self.total_time = self.active_time
-        self.resume_timing()
+        if currently_timing:
+            self.resume_timing()
 
     def finish_timing (self):
         self.mark_timing()

☆gnome-sudokuの不具合修正

去年の11月にtwitterでつぶやいていたgnome-sudokuの不具合について、修正パッチを公開してみます。対象はubuntu jauntyに入っているバージョン2.26.1です。(karmicの場合は下の方に補足を書いています。)
すべてのソースを理解しているわけではありませんし、すべての機能をテストしているわけではありませんが、1ヶ月以上プレイしていておかしな点は出てません。(トラッカなどは使い方がわからないので.....)

gnome本家に報告したり、ppaを作ったりするのがより正しいユーザの在り方なのかもしれませんが、なにぶんわからないことが多いので......。
パッチが危険な動作をするようなことはありませんが、適用に当たってはすべて自己責任でおこなってください。

●不具合の概要

同一の行または列に番号のコンフリクトがある場合、その後から入力した方と同じボックス(3X3の領域)の別セルに同じ数値を入力しても赤くならない。
具体例は下図。反転しているセル(中心のひとつ上)は同一ボックスに同じ数字"1"があるのに赤くなっていない。

●修正方法

patchファイルを
https://sites.google.com/site/midspeclowload/files/sudoku.py.2_26_1.patch.txt?attredirects=0&d=1
に置きました。

対象のsudoku.pyは下記にあります。pythonのスクリプト(テキストファイル)です。
/usr/share/python-support/gnome-games-data/gnome_sudoku/sudoku.py

パッチを当ててから

sudo update-python-modules gnome-games-data
としてやれば使えるようになります。

既にgnome-sudokuを起動したことがあるとエラーが出るかもしれません。
その場合はホームディレクトリにあるsudoku関連のファイルを消してやると
起動するはずです。

find ~/ -name '*sudoku*'
で出てきたディレクトリをガリッと消して問題ないはずです。(必要なディレクトリは次に起動したときにまた作られます。)自分で作ったディレクトリやファイルを削除しないように気をつけてください。

●karmicについて

karmicに入っているgnome-sudokuは2.28です。2.26と同様の不具合があります。
加えてなぜか終了時に表示される経過時間がおかしかったりします。
さらに解けているはずなのに終了のダイアログが出なかったりします。
(2.26と同じ要領で修正する経過時間の件以外は直ります。)

経過時間のほうは直せそうにないので私は手作業で2.26を入れてます。これをやるとアップデートがあった場合に適用されません。しかしjauntyを使っている間、gnomeのゲーム関連でアップデートはみたことがないので多分問題ないでしょう。

(識者の方に怒られそうです。下記の説明はかなりはしょってますが、これでわからない方はやめておいた方がいいと思います。)

要領

1.synapticのゲームのカテゴリに入っているものをアンインストール。

2.jaunty用のdebを落としてきて、arで解凍、さらにdata.tgzをtarで解凍

control.tgzのなかのpostinstallを実行。ファイルは下記から
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-cards-data_2.26.1-0ubuntu2_all.deb
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-games-data_2.26.1-0ubuntu2_all.deb
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-games_2.26.1-0ubuntu2_i386.deb

3.パッチを当てる。

です。ちなみにdpkgでインストールするとupdate-managerを起動したときに
アップグレードが不完全だと怒られます。しかもディストリビューションのアップデートをしないと通常のアップデートの適用ができません。

●修正内容の説明

入力した値がコンフリクトしているとclass SudokuGridに保持しているデータ(コンフリクトチェック用のset3つと盤面対応のlistのlist)には入力値を保持せずに例外を投げます(オリジナルの107行目から始まるaddメソッド参照)。GUI上は数値が入っているので問題の現象が起ります。

そこで、コンフリクトチェック用のsetはlistに変更(当然追加はaddでなくappend)、ただし終了判定などで要素の数をチェックしていたりするので基本的に参照時はset()でset型に直して使用。コンフリクトした場合でも要素の追加を行います。(これはあちこち直します。)

コンフリクトした場合でもチェック用のリストに要素の追加を行っているので、コンフリクトチェックのメソッドで自分自身をコンフリクト判定から除外するように修正します。(オリジナルの179行目から始まるfind_conflictsメソッド)