Skip to Content
撰文於銘 飄散隨風 心行無語 仰首蒼穹

使用 TortoiseGit 刪除 GitHub 上的標籤

這二天有需要刪除 GitHub 上的標籤,但試了半天試不出來,原本以為很簡單,如下圖,只要按下滑鼠右鍵,選擇 "刪除 ref/tags/標籤名",就可以刪除該標籤了。

image

 

不過後來才發現,上面只是刪除了本地的標籤,無法刪除遠端的。只要重新拉取資料,被刪除的標籤又出現了。

在 GitHub 上東找西找,網頁上好像也沒有讓人刪除標籤的方法。

在 Win10 用 VMware Workstation Player 12 安裝 Mac OS X 10.12 Sierra 和開發 c++ 程式

在 2015 年 10 月左右,我在 Win7 上試著用 VMware 安裝了 Mac OS X 10.10 Yosemite。(詳見此頁)

在 2016 年 11 月左右,我用 Embarcadero C++ Builder Berlin Update 2 試用版試著撰寫 Mac 版的程式,Mac 的環境就是上面提到的 10.10 Yosemite。(詳見此頁)

如今作業系統已換成 Win10 專業版,單位也買了正式版的 Embarcadero C++ Builder Berlin Update 2,所以打算重頭安裝最新版的 Mac OS X 10.12 Sierra,以期能用最新的環境來測試程式。

以下是工作環境:

作業系統:Microsoft Windows 10 專業版
開發程式:Embarcadero C++ Builder Berlin Update 2 專業版
虛擬程式:VMware Workstation Player 12.5 ( 此處可下載 )
VMware 支援 Mac 程式 : unlock208 ( 此處可找到相關資料 )
Mac OS X 虛擬檔案:Mac OS X 10.12 Sierra ( 別人準備好的版本 )
Mac 下的開發程式:Xcode v8.2.1 ( Mac App Store 可以安裝 )

請注意,我們不知道這個由別人安裝好的系統裡面究竟有沒有藏什麼病毒、後門等東西,所以千萬不要拿來做重要的事情,只能拿來做些測試。如果要做重要的事,請找正確的管道來安裝 Mac OS。

Perl 新遇到的錯誤訊息 : Experimental push on scalar is now forbidden

今天在執行 Perl 一段程式時,發現沒看過的錯誤訊息。

Experimental push on scalar is now forbidden ......

用 Google 查了一些資料,據說是 Perl 5.24 才有的。因為我之前換成 Win10,同時也把 Perl 更新至 5.24,想不到就遇上這個問題了。

錯誤的地方在這二行

push($self->{"tags"} , \%hash);
.....
my $hash = pop($self->{"tags"});
根據查到的例子,我改成如下就可以順利運作了。
push(@{$self->{"tags"}} , \%hash);
.....
my $hash = pop(@{$self->{"tags"}});

一切法無我

這是今天看到一位可能是蕭平實信眾的奇怪觀點,在數次討論之後,忍不住把心得整理出來。
 
====================
 
【我見】真的是很難破除的邪見,先不要說親證無我這樣困難的目標,就算是理解上的無我,依然有許多人不願意接受,想盡辦法要證明一定有一個我。經文上說的明白的內容不去理解,千方百計就是想要在弦外之音找到自我的立足點。這種學習,肯定是事倍功半.甚至離正道愈來愈遠。
 
打個比喻,就像告知古人沒有雷神,打雷是自然現象。有些人可能就是不接受,還會問那會不會有雷神他爸?如果說沒有雷神他爸,對方可能又會問,那有沒有雷神的老闆?如果不想接受答案,問題永遠沒完沒了。
 
如果說世界上沒有神雷,他還會問那【世界下】有沒有神雷?【世界外】會不會有神雷?
 
不接受無我的人也是如此。如果世間有【真我】,佛陀就會直接說明,何必說【無我】,讓人去猜弦外之音呢?
 
佛陀說五蘊無我,他們就猜會不會在五蘊外有個六蘊我?說十八界無我,那會不會在十九界找到真我?這些都是戲論,沒有邊際。
 
這件事由經文可以找到完整的解釋,希望這些【夢裡尋我】千百度的人,可以放下妄心,不要再亂想了。
 
首先,經典的無我不只是五蘊無我,最大的範圍是【一切法無我】。經證如下:
《雜阿含經》卷10:「一切行無常,一切法無我,涅槃寂滅。」(CBETA, T02, no. 99, p. 66, b13-14)

阿毗達摩

這頁是用來放和阿毗達摩相關的資料,目前只有一項。

 

說明:

本網頁可依據指定的條件列出符合的心。
目前是選中的條件就會列出,例如在「作用」的條件中同時選取「推度、彼所緣」,則只要符合任一條件的心就會列出。

待改進:(有時間的話 ^^!)

1. 加上「剛好符合」、「包含全部選取條件」等不同的設定。
2. 提供文字輸入界面及網址直接連結方式。
3. 界面會再調整美觀及順手好用一點。(歡迎提供建議)

近日 Drupal 6 的一些雞毛蒜皮大小事

最近管理的 Drupal 6 網站遇到了一些奇怪的狀況,處理的過程中也學到一些東西,簡單記錄一下。

首先是在回應時,某些回應內容會產生奇怪的錯誤。但那些內容若是放在貼文中,就沒有問題。或是先貼個簡單的回應,然後進入編輯,改成先前會有問題的回應內容,此時也沒有問題了。總之,這情況只發生在新張貼「回應」,而且只有某些情況才會有錯誤。

JavaScript 物件中成員函式呼叫成員函式

先前寫的那一篇,我已經移到底下了,實際上問題多多,後來經過幾個高手朋友的指教,再次測試之後,才知道造成錯誤的真正原因是和 jQuery 混在一起了吧。

不過我當初在測試時,是有先避開 jQuery 哩?反正我已經無法重現當初的錯誤,只好把問題怪罪給它了。

總之,目前用底下二個方法來處理物件及測試成員函式的呼叫,都沒有問題。

第一種如下。原本紅色那行應該會有問題,但現在測試一切OK。

    function obj(){
        this.x = 1;
        this.func1 = function(){
            this.x++;
            console.log("func1 : x = " + this.x);
        };
        this.func2 = function(){
            this.x++;
            console.log("func2 : x = " + this.x);
            this.func1();
        };
    }
    var myobj = new obj();
    myobj.func1();
    myobj.func2();

第二種方式是直接宣告物件。底下也是OK的。如果把全部的 this 都換成 myobj,也都沒問題。我在網路上查到有人說用 this 會出錯,換成 myobj 才可以。也許這是之前的問題,現在都解決了吧。

    var myobj = {
        x : 1,
        func1 : function(){
            this.x++;
            console.log("func1 : x = " + this.x);
        },
        func2 : function(){
            this.x++;
            console.log("func2 : x = " + this.x);
            this.func1();
        }
    }
    myobj.func1();
    myobj.func2();

不過,如果搭配 jQuery 使用,在 jQuery 的函式中,就不能直接使用,因為此時的 this 是 jQuery 找到的物件。

底下這樣用會有問題

$("xxx").each(function(){  
    this.func1();  // 這樣會有問題
});

要改成這樣才行

var self = this;  // 先把 this 存起來
$("xxx").each(function(){  
    self.func1();  // 這樣OK
});

另外學到一件事,用 var 宣告的變數會擴展到整個 function,例如:

var i=3;
for(var i=1; i<10; i++)
{
    ...
}
console.log(i);

最後的 i 可不是 3 ,而是 10,這件事真的很詭異。

Yap 告知可以用 let 來宣告變數,就可以限制在區塊中,可參考這篇「深入浅出ES6(十四):let和const」。

  -- 2017/01/19 

底下是昨天寫的,內容有問題,參考就好,留著當紀念。


聽說 JavaScript 的地雷很多,今天終於踩到,幸好爬文半天,終於找到解答。

簡單來說,就是在一個簡單的物件中,某個成員函式呼叫另一個成員函式,想不到那麼簡單直覺的動作,也會出問題。(這些術語或許不適合 JavaScript,看在很少用 JavaScript 的份上,就別計較太多了。)

我的程式原本像這樣:

function obj ()
{
  this.func1 = function(){
    ....
  };
  this.func2 = function(){
    this.func1();    // 錯誤在這裡,
  };
}

後來看到有人提出一種解答,就是把 this 換成物件的名稱,如下:

var obj = {
  func1 : function(){
    ....
  },
  func2 : function(){
    obj.func1();  // 這樣就 OK 了
  }
}

不過我把我的程式中的 this 換成 obj 也不行。

大概是因為我的 obj 是類似定義成一個類別(函式),之後還會用 var x = new obj(); 的方式去宣告。

而那個解答則是一開始就宣告物件 var obj = xxx,所以才能用 obj.func1() 來執行。

 後來又爬文找到另一個解法,就是另外用 prototype 來宣告,如下:

function obj ()
{
  this.func1 = function(){
    ....
  };
}
obj.prototype.func2 = function(){
  this.func1();    // 這樣就可以了
};

不過事情其實沒那麼簡單,因為我又用了 jQuery,所以還是有問題。

obj.prototype.func2 = function(){
  $("xxx").each(function(){  
      this.func1();    // 還是有問題
  });
};

最後才想到,應該是那個 this 已經不是 obj 物件的 this,而是 jQuery 所選到的物件了。所以又改成如下才真正沒問題了。

obj.prototype.func2 = function(){
  tmp = this;  // 先把 this 存在 tmp 中
  $("xxx").each(function(){  
      tmp.func1();    // OK了
  });
};

perl 在函數中宣告 my $_

以前在學 Perl 時,知道在函數中宣告變數可以用 local 或 my ,local 表示在它的宣告的區塊中,可以在該區塊調用的子函數中繼續使用。而 my 宣告的變數就不行了。
 
不過當時有一個特殊的限制,就是針對這個特殊的變數 $_,只能宣告為 local。不過在後來的新版本中,有看到可以宣告為 my,對此我也沒特別注意,今天寫程式時,就試用了一下,結果程式有不在預期中的結果,還 debug 半天,才發現就是 my $_ 造成的。剛剛寫了個小程式測試,才大概看出它的特性。
 
程式:
$_ = "123";
test1($_);
print "$_\n\n";     # $_ = 123
 
$_ = "123";
test2($_);
print "$_\n\n";     # $_ = 123
 
$_ = "123";
test3($_);
print "$_\n\n";     # $_ = abc , 在函數中被取代了
 
sub test1
{
    local $_ = shift;       # 使用 local
    s/123/abc/;             # 預設是處理 $_
    print "in  : $_\n";     # $_ = abc , 被取代了
    print "out : $::_\n";   # $::_ = abc , $::_ 暫時被取代了
}
 
sub test2
{
    my $_ = shift;          # 使用 my
    $_ =~ s/123/abc/;       # 取代的對像是內部的 $_
    print "in  : $_\n";     # $_ = abc , 被取代了
    print "out : $::_\n";   # $::_ = 123 , $::_ 完全沒有參與
}
 
sub test3
{
    my $_ = shift;          # 使用 my
    s/123/abc/;             # 【重點】預設取代的對像是 $::_ , 也就是 $main::_
    print "in  : $_\n";     # $_ = 123 , 區域變數完全沒有被取代
    print "out : $::_\n";   # $::_ = abc , 所以 $::_ 反而被取代了
}
 
結果如下:
in  : abc
out : abc
123
 
in  : abc
out : 123
123
 
in  : 123
out : abc
abc
 
總之,重點就是這二行要特別小心
my $_ = shift;
s/123/abc;
在副程式中宣告 my $_ 之後,就不能用 s/123/abc/; 這種方式來處理,因為它預設是處理全域變數的 $_,而不是副程式中宣告的 $_,若不注意,就會有非預期的結果。
 
如果要處理,就不可以偷懶,要寫清楚變數名稱
 
my $_ = shift;
$_ =~ s/123/abc;
這樣才是針對內部宣告的 $_ 來進行取代處理。
 

Python for Visual Studio 2015 顛簸安裝之路

先說明,這篇學不到太多東西,主要是我走過很多冤枉路的記錄。

另一篇我有提到,曾經測試  Python Debug for VS Code 失敗,Python for VS 2015 也失敗。昨天前者終於成功了,於是接著測試後者。

後者的安裝真的是多災多難,底下一一道來。

一開始我不小心用到簡體版的安裝程式,花了很久才安裝好,應該有超過一小時,也許更久,久到我都忘了正在安裝中。

安裝到最後,看到有些錯誤,但它寫可以事後修改,一時沒注意就關了畫面,也忘了在哪裡可以改了。

第一次啟動程式,看到竟然是簡體,就先楞了一下,原來我下載到簡體的安裝程式了。後來在設定找到正體中文,竟然又要下載好幾 G,又花了不少時間才裝好。

完成後打開一看,完全找不到 Python 的相關東西,我明明有安裝 Python Tools,找了半天都找不到哪裡可以啟動 Python 相關的東西。

其實不只沒有 Python,也沒看到任何 Console 程式(主控台程式,也就是 DOS 畫面的傳統純文字程式,沒有視窗界面)的專案,雖然有 Windows 程式,但試寫了一下,也無法執行,根本是安裝了一套完全沒用的 Visual Studio 2015。

說真的,玩電腦那麼久,再怎麼複雜的程式,就算不會完全使用,最基本的功能總該隨便試一下就出來,這是第一次花了不少時間,安裝一套完全沒辦法使用的東西,連最簡單的 Hello World 程式都寫不出來。

試了很久,最後是有寫出一個 Windows 視窗程式,底下會提到。

以上還是前幾天測試的結果,所以今天繼續努力。

安裝 Python Debug for VS Code

去年(其實就是前幾天)在安裝 Perl Debug for VS Code 之後,也順便安裝 Python Debug for VS Code,但當時失敗了。因為我是安裝 Python 3.6 版,但執行 Python Debug 需要安裝 pylint 模組,安裝時它會自動安裝其他模組,不過在安裝時,因為自動載入的 lazy-object-proxy 模組大概是只有支援到 3.5 版,所以失敗了。當時雖然考慮到降回 3.5 版,不過有點懶,而且也同時在測試 Visual Studio 2015 的 Python,所以就放棄了,最後是二者都失敗了。crying

今天剛好和振洲提到此事,他建議降回 3.5 再試試,我就又提起興緻,移除 3.6 重裝 3.5,模組也都安裝成功。結果意外中在另一個網站找到有支援 3.6 版的 lazy-object-proxy 模組,於是忍不住又重裝 3.6,打算再拼一次。

Python 3.6 一切就緒,就開始安裝 pylint 模組。

訂閱文章


by Dr. Radut