2018年2月21日 星期三

[轉載]淺析Go語言Interface類型的語法行為及用法

原文
Go不是一種典型的OO語言,它在語法上不支持類和繼承的概念。 沒有繼承是否就無法擁有多態行為了呢?答案是否定的,Go語言引入了一種新類型—Interface,它在效果上實現了類似於C++的「多態」概念,雖然與C++的多態在語法上並非完全對等,但至少在最終實現的效果上,它有多態的影子。
那麼,Go的Interface類型到底是什麼呢?怎麼使用呢?這正是本篇筆記試圖說明的問題。

1. Method(s) in Go

在說明Interface類型前,不得不先用Go的method(s)概念來熱身,因為Go語言的interface與method(s)這兩個語法有非常緊密的聯繫。
雖然Go語言沒有類的概念,但它支持的數據類型可以定義對應的method(s)。本質上說,所謂的method(s)其實就是函數,只不過與普通函數相比,這類函數是作用在某個數據類型上的,所以在函數簽名中,會有個receiver來表明當前定義的函數會作用在該receiver上。
關於methods的精確語法規範,可以參考language specificationEffective Go中的說明,這裡略過。
注意:Go語言支持的除Interface類型外的任何其它數據類型都可以定義其method(而並非只有struct才支持method),只不過實際項目中,method(s)多定義在struct上而已。
在struct類型上定義method(s)的語法特性與C++中的struct支持的語法非常類似(c++中的struct定義了數據,此外也支持定義數據的操作方法),從這一點來看,我們可以把Go中的struct看作是不支持繼承行為的輕量級的「類」。

2. What is Interface type in Go ?

GoLang官網language specification文檔對interface type的概念說明如下:
An interface type specifies a method set called its interface. A variable of interface type can store a value of any type with a method set that is any superset of the interface. Such a type is said to implement the interface. The value of an uninitialized variable of interface type is nil.

說實話,這段說明對新手來說比較晦澀,這正是本篇筆記試圖解釋清楚的地方。

2018年1月8日 星期一

[轉載]使用Lua Function表示Lambda calculus

http://blog.csdn.net/yuanlin2008/article/details/8627081
很多程序語言所帶給你的“完美”的感覺都來自於數學抽象之美。
在Lua中,function被描述成“具有真正的詞法範圍的一類值”(first-class values​​ with proper lexical scoping)。
所謂的“一類值”,應該滿足以下條件:
  • 可以被保存到變量和數據結構中
  • 可以被當作子程序的參數和返回值
  • 可以在運行期創建
  • 具有內在標識,不依賴於任何給定的名稱
大多數語言的基本數據類型,比如int,就屬於“一類值”。很多語言中的函數實​​現,只能滿足其中一些條件。比如在C中可以將函數指針保存到變量中,可以將函數指針當作參數和返回值。這樣的函數實現一般不會被算作“一類值"。
在Lua中,所有的值都是“一類”值,包括function本身。函數可以被保存到任何的變量或者table中,可以被當作參數和返回值使用,所有的函數(更準確的說應該是closure)都是運行期被創建的,函數本身並沒有名字,名字只是對函數的引用而已。作為“一類值”的function更為抽象,可以用來表示很多的"Functional Programming"的概念。比如“高階函數”(Higher-order functions),“匿名函數”(Anonymous functions")。這些功能在很多語言中都是通過特殊的語法來支持的,而在lua中則不需要。

2017年11月2日 星期四

[轉載]Haskell與範疇論

2010-04-06 黃毅 原文
用haskell的概念解釋範疇論。翻譯自 wikibook : http://en.wikibooks.org/wiki/Haskell/Category_theory

Haskell與範疇論

本文對範疇論做一個簡單的介紹,最終目的是為了將它應用到Haskell語言。為了達到這個目的,我們一邊介紹數學上的定義,一邊給出對應的Haskell代碼。我們不追求這個對應有多精確,只期望讀者在讀完以後,能對範疇論的基本概念及其跟Haskell之間的聯繫有一個直觀的感受。

一個簡單的範疇,由三個對像 A, BC 組成,有三個單位態射 , ,還有另外兩個態射 。第三個組成元素(即如何對態射進行組合)沒有展示出來。
本質上講,範疇由三部分組成:
  1. 一組 對像
  2. 一組 態射 。每個態射捆綁兩個對像(一個源對象,一個目標對像)。(也有人把它們叫做箭頭,我們這裡不這麼叫它,因為這個詞語在Haskell裡面有其他含義。譯註:其他含義指的是 Control.Arrow 。)如果 f 是一個從源對像 A 到目標對像 B 的態射,我們把它記作
  3. 一個稱為 態射組合 的概念。如果 h 是態射 fg 的組合,我們記作:
許多事物都構成範疇。比如全部的集合就構成範疇 Set ,函數(譯註:這裡說的函數是指集合論中的函數)是它的態射,態射的組合就是函數的組合。全部的群也構成範疇 Grp ,保持群結構的函數就是它的態射(群同態),比如任意兩個群 GHG 的操作符為 H 的操作符是 ,那麼函數 只要滿足如下條件就是一個態射:
乍看之下似乎所有態射都是函數,實際上不一定,比如下面這個例子,任何偏序結構 (P, ) 都構成範疇, P 中的元素就是該範疇的對象,任意兩個元素 ab 只要滿足 ,那麼 就是一個態射。另外,在相同的源對像和目的對象之間可以存在多個態射。我們拿 Set 範疇為例, 都是從 的函數,但是他們是不同的態射。

2017年10月31日 星期二

C#語法糖

無無聊聊翻開了本c# in a nutshell看了一下 發現了一個和c++幾乎一模一樣的語法糖
using System;
public class Wine
{
  public decimal Price;
  public int Year;
  public Wine (decimal price) { Price = price; }
  public Wine (decimal price, int year) : this (price) { Year = year; }
}
和以下這段code是等價的
using System;
public class Wine
{
  public decimal Price;
  public int Year;
  public Wine (decimal price) { Price = price; }
  public Wine (decimal price, int year) { Wine(price); Year = year; }
}
一樣都會改Price的值 上網找了一下 發現原來還有很多方便的語法糖 以下節錄幾個常用的
經過兩次變異的委託寫法
真的易用多了一開始推出的時候真的完全看不懂
class MyClass
{
    public delegate void DoSomething(int a);
 
    //定義方法委託
    private void DoIt(int a) {
        Console.WriteLine(a);
    }
 
    private void HowtoDo(DoSomething doMethod,int a) {
        doMethod(a);
    }
 
    public static void Main(string[] args) {
        MyClass mc = new MyClass();
        //調用定義的方法委託
        mc.HowtoDo(new DoSomething(mc.DoIt), 10);
        int x = 10;
        //使用匿名委託
        mc.HowtoDo(delegate(int a){
            Console.WriteLine(a + x);
        },10);
 
        //使用lamda表達式
        mc.HowtoDo(a=>Console.WriteLine(a+x),10);
 
        Console.ReadLine();
    }
}

2017年10月26日 星期四

[轉載]Python yield 使用淺析

原文連結
Introduction 
初學 Python 的開發者經常會發現很多Python 函數中用到了yield 關鍵字,然而,帶有 yield 的函數執行流程卻和普通函數不一樣,yield 到底用來做什麼,為什麼要設計yield ?本文將由淺入深地講解 yield 的概念和用法,幫助讀者體會Python 裡yield 簡單而強大的功能。您可能聽說過,帶有yield 的函數在Python 中被稱之為generator(生成器),何謂 generator ?我們先拋開generator,以一個常見的編程題目來展示 yield 的概念。

如何生成斐波那契數列 
斐波那契(Fibonacci)數列是一個非常簡單的遞歸數列,除第一個和第二個數外,任意一個數都可由前兩個數相加得到。用計算機程序輸出斐波那契數列的前N 個數是一個非常簡單的問題,許多初學者都可以輕易寫出如下函數:
清單1. 簡單輸出斐波那契數列前 N 個數
def fab(N):   
    n, a, b = 0, 0, 1   
    while n < N:   
        print b   
        a, b = b, a + b   
        n = n + 1 
執行 fab(5),我們可以得到如下輸出:

windows下使用putty連接codeanywhere wordpress

怕忘記 留個筆記

首先 download Putty和RSA擷取工具
putty.exe puttygen.exe

到codeanywhere登入後右鍵你的wordpress按config複製網址 網址樣子應該是這樣:
hostX.codeanyhost.com:XXXXX

X是數字
然後右鍵wordpress按SSH terminal輸入以下指令取得private key

cat ../.ssh/id_rsa

或者public key(如有需要)
cat ../.ssh/id_rsa.pub

2017年10月25日 星期三

[轉載] [VirtualBox] Samba 下 Ubuntu與Win7共享資料夾設定,利用 host-only網路

原文連結
使用Samba設置Ubuntu有多種方式,像是Guest OS利用橋接方式與Host OS連結,搭配指定同網段IP的方式來做,但這樣的方式會讓所有區網內的使用者都可以連上Guest OS。只是想在Guest OS上寫寫code應該不用昭告天下吧!
所以為了達到讓Guest OS能夠上網,且同時只有Host OS可以用Samba分享透過內部網路存取Guest OS上的資料,要如何達成呢?

以下用VirtualBox下設置為例
Host OS : Win 7 64bit
Guest OS : Ubuntu 12.04.3 LTS
首先設置VirtualBox網路卡設定