聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

七月 19, 2010
» [Scala 教學範例] 中醫學(TCM)-經絡 API

夫言人之陰陽,則外為陽,內為陰。言人身之陰陽,則背為陽,腹為陰。言人身之藏府中陰陽。則藏者為陰,府者為陽。肝心脾肺腎五藏皆為陰,膽胃大腸小腸膀胱三焦六府皆為陽。 - 黃帝內經-素問-金匱真言論篇第四

繼前篇 [Java 教學範例] Google Guava 與中醫學(TCM)-經絡 API 後, 老魚再試著用 Scala 2.8 來完成這個與中醫學(TCM)的經絡查詢器的核心 API, Scala 有著眾多的特性, 這使得除了可以擁有完整的 Java 特性與 JVM 效能外, 在撰寫程序上更有著許多先進的思維.


以 Java 為陽, 內以 Scala 為陰 ...


以這個範例來說, 為了達到該物件能成為 單例(Singleton)模式, 我們不再需要像 Java 使用靜態(Static)宣告與靜態空間的資源, Scala 能較 Java 達到真正單例模式的保證, 在前一篇中我們為了使其集合容器(Container)物件能達到 不可變性(Immutable) 以加快處理性能與 RAM, 我籍助了 Google Guava 中的不變性集合 APIs, 而在 Scala 則本身早已將這部份納為核心實作, 故不依賴任何的外部實作參考, 在本例中也使用了 函數式程式語言 的基本特性, Scala 創造了在相較同是 JVM 的 Java 所未有的眾多新特性與簡潔內容, 非常值得推篤給您學習, 或者混搭在 Java專案開發中~


深度加入老魚的 Scala 學習分享團隊與筆記本,


1
 2
 3
 4
5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.wisdomfish.tcm.scala

/**
* 中醫藥學-TCMES-經絡
* The meridian (simplified Chinese: 經絡;
* traditional Chinese: 經絡; pinyin: jīngluò)
* @author WisdomFish.ORG - 郭朝益(ChaoYi, Kuo), http:://www.wisdomfish.org
* @version 0.1 dev (SCALA 2.8)
* @since 2010-07-19
*/

object Meritan {

private val NOT_POINTS = 1
private val IS_KEY_CNAME = 0
private val handlefunc = (s: String) => s.split("\\s").toList
private val Meridians = Map.newBuilder[String, List[String]] += (
"LU" -> handlefunc("手太陰肺經 中府 雲門 天府 俠白 尺澤 孔最 列缺 經渠 太淵 魚際 少商"),
"LI" -> handlefunc("手陽明大腸經 商陽 二間 三間 合谷 陽溪 偏歷 溫溜 下廉 上廉 手三里 曲池 肘髎 手五里 臂臑 肩髃 巨骨 天鼎 扶突 口禾髎 迎香")
) result

def getMeridianIds: List[String] =
Meridians.keys.toList
def getMeridianCName(keyID: String) =
Meridians(keyID) view(IS_KEY_CNAME)
def getAcupuncturePointsSize(keyID: String) =
Meridians(keyID).size - NOT_POINTS
def getAcupuncturePoints(keyID: String) =
Meridians(keyID) slice(NOT_POINTS, getAcupuncturePointsSize(keyID))
def getAcupuncturePointName(keyID: String, numID: Int) =
Meridians(keyID) view(numID)
}



老魚相關文章:

  1. [Java 教學範例] Google Guava 與中醫學(TCM)-經絡 API

七月 17, 2010
» [Java 教學範例] Google Guava 與中醫學(TCM)-經絡 API

肝藏血,血捨魂, 肝氣虛則恐,實則怒。脾藏營,營舍意,脾氣虛則四肢不用,五藏不安;實則腹脹,經按不利。 心藏脈,脈捨神,心氣虛則悲;實則笑不休。肺藏氣,氣捨魄,肺氣虛則鼻塞不利少氣;實則喘喝, 胸盈仰息。腎藏精,精舍志,腎氣虛則厥;實則脹,五藏不安。必審五藏之病形,以知其氣之虛實, 謹而調之也。 - 黃帝內經-靈樞-本神論第八

近來老魚持續自習著中醫學, 為了讓自己在背近400多個"經絡"穴道有一個好工具, 逐著手開始撰寫了這個 API 以便在不久能與其它表現層技術相結合, 讓老魚在背頌同時有更好的"快快樂樂學經絡"的學習輔助工具~

這個範例完全使用 Google Guava API 來完成, 若您想了解它, 可以另外參考老魚的另一本學習筆記相關主題頁:
http://sites.google.com/site/javaenterpriseeditiongroup/se-in-depth/google-guava

程序執行結果圖:



範例的更新與完整說明連結:
http://iching.wisdomfish.org/tcm/tcmis/meridian

JAVA CODE   :中醫藥學-TCMES-經絡-Meridian
  1
  2
  3
  4
  5
  6
  7
  8
  9
10
 11
 12
 13
 14
15
 16
 17
 18
 19
20
 21
 22
 23
 24
25
 26
 27
 28
 29
30
 31
 32
 33
 34
35
 36
 37
 38
 39
40
 41
 42
 43
 44
45
 46
 47
 48
 49
50
 51
 52
 53
 54
55
 56
 57
 58
 59
60
 61
 62
 63
 64
65
 66
 67
 68
 69
70
 71
 72
 73
 74
75
 76
 77
 78
 79
80
 81
 82
 83
 84
85
 86
 87
 88
 89
90
 91
 92
 93
 94
95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
package org.wisdomfish.tcm;

import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;

// Java EE 6, JSF 2.0
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;


/**
* 中醫藥學-TCMES-經絡
* The meridian (simplified Chinese: 經絡;
* traditional Chinese: 經絡; pinyin: jīngluò)
* @author WisdomFish.ORG - 郭朝益(ChaoYi, Kuo), http:://www.wisdomfish.org
* @version 0.1 dev
* @since 2010-07-16
*
*/
@ManagedBean
@ApplicationScoped
public class Meridian {

    private final static ImmutableMap<String, ImmutableList<String>> Meridians;
    private final static int NOT_POINTS = 1;
    private final static int IS_KEY_CNAME = 0;
    private Meridian(){};
   
    static {
        Builder<String, ImmutableList<String>> init = ImmutableMap.builder();
        Meridians = init.
                put("LU", ImmutableList.copyOf(
                "手太陰肺經 中府 雲門 天府 俠白 尺澤 孔最 列缺 經渠 太淵 魚際 少商".
                split("\\s"))).
                put("LI", ImmutableList.copyOf(
                "手陽明大腸經 商陽 二間 三間 合谷 陽溪 偏歷 溫溜 下廉 上廉 手三里 曲池 肘髎 手五里 臂臑 肩髃 巨骨 天鼎 扶突 口禾髎 迎香".
                split("\\s"))).
                put("PC", ImmutableList.copyOf(
                "手厥陰心包經 天池 天泉 曲澤 隙門 間使 內關 大陵 勞宮 中沖".
                split("\\s"))).
                build();
    }
   
    /**
     * 取得經絡代碼清單
     * @return 經絡代碼清單
     */
    public static ImmutableSet<String> getMeridianIds() {
        return Meridians.keySet();
    }
   
    /**
     * 查詢指定經絡代碼之中文名稱.
     * @param keyID 經絡代碼
     * @return 經絡代碼中文名稱
     */
    public static String getMeridianName(String keyID) {
        return Meridians.get(keyID).get(IS_KEY_CNAME);
    }
  
    /**
     * 查詢指定經絡的腧穴總數值
     * @param keyID 經絡代碼
     * @return 腧穴總數數值
     */
    public static int getAcupuncturePointsSize(String keyID) {
        return Meridians.get(keyID).size() - NOT_POINTS;
    }
   
    /**
     * 取得指定經絡腧的腧穴中文名稱清單
     * @param keyID 經絡代碼
     * @return 腧穴中文名稱清單
     */
    public static ImmutableList<String> getAcupuncturePoints(String keyID) {  
        return Meridians.get(keyID).subList(NOT_POINTS, Meridians.get(keyID).size());
    }
   
    /**
     * 查詢指定經絡中特定編號的腧穴中文名稱
     * @param keyID 經絡代碼
     * @param numID 腧穴代碼
     * @return 腧穴中文名稱
     */
    public static String getAcupuncturePointName(String keyID, int numID) {
        return Meridians.get(keyID).get(numID);
    }
   
   
   
    public static void main(String[] args) {
        final String KEY_ID = "PC";
        final int NUM_ID = 5;
        long startTime = System.nanoTime()/1000000L;
//        System.out.println("經絡總清單:" + Meridians.entrySet());
        System.out.println("經絡代碼清單:" + Meridian.getMeridianIds());
        System.out.println("代碼名稱-" + KEY_ID + " = " + Meridian.getMeridianName(KEY_ID));
        System.out.println(Meridian.getMeridianName(KEY_ID) + " 腧穴總數:" +
                Meridian.getAcupuncturePointsSize(KEY_ID) + " 穴");
        System.out.println(Meridian.getMeridianName(KEY_ID) + " 腧穴清單:" +
                Meridian.getAcupuncturePoints(KEY_ID));       
        System.out.println(Meridian.getMeridianName(KEY_ID) + " 腧穴編號-" + KEY_ID + NUM_ID +
                " = " + Meridian.getAcupuncturePointName(KEY_ID, NUM_ID) + "穴");
        long endTime = System.nanoTime()/1000000L;
        long time = endTime - startTime;
        System.out.println("處理耗時:" + time + "ms");
    }
   
}





七月 6, 2010
» [製圖分享] 中醫學之十二正經絡 / 論醫德《大醫精誠》

凡大醫治病,必當安神定志,無欲無求,先發大慈惻隱之心,誓願普救含靈之苦。若有疾厄來求救者,不得問其貴賤貧富,長幼妍媸,怨親善友,華夷愚智,普同一等,皆如至親之想。亦不得瞻前顧後,自慮吉凶,護惜身命,見彼苦惱,若己有之,深心淒愴,勿避險,晝夜寒暑,飢渴疲勞,一心赴救,無作功夫形跡之心。如此可為蒼生大醫。反此則是含靈巨賊。自古名賢治病,多用生命以濟危急,雖曰賤畜貴人,至於愛命,人畜一也。損彼益己,物情同患,況於人乎?夫殺生求生,去生更遠,吾今此方,所以不用生命為藥者,良由此也。
-- 千金要方 大醫精誠篇第二 唐 孫思邈

《大醫精誠》一文出自中國唐朝 孫思邈所著之《備急千金要方》第一卷,是中醫學典籍中,論述醫德的一篇極重要文獻,為習醫者所必讀。《大醫精誠》論述了有關醫德的兩個問題:

  1. 第一是 精,亦即要求醫者要有精湛的醫術,認為醫道是「至精至微之事」,習醫之人必須「博極醫源,精勤不倦」。
  2. 第二是 誠,亦即要求醫者要有高尚的品德修養,以「見彼苦惱,若己有之」感同身受的心,策發「大慈惻隱之心」,進而發願立誓「普救含靈之苦」,且不得「自逞俊快,邀射名譽」、「恃己所長,經略財物」。
如果您對該篇全文有意學習, 請見 維基文庫-備急千金要方-大醫精誠篇第二

可能是老魚讀起了中醫學典籍, 也開始背起了許多名詞和要句選, 下面這張是老魚在邊讀典籍邊整理好的圖表, 我用它來理解中醫學談的經絡關係外, 最重要的是這張內容是老魚在本週對自已嚴格要求在記憶與背誦用的範圍, 分享給同是中醫學自習者的您:
(能理解中醫之理很重要, 但若能熟記更易用於技, 熟能生巧之道.)

(點圖放大後再收藏)


A Feedjack powered Planet
A Django site.