Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/godcong/fate
Browse files Browse the repository at this point in the history
  • Loading branch information
godcong committed Oct 8, 2020
2 parents 6ec825b + 26067fa commit 51a3c9a
Show file tree
Hide file tree
Showing 8 changed files with 179 additions and 144 deletions.
99 changes: 14 additions & 85 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
Github第一个开源的中文取名项目(The first chinese name create tool in github)

## 简介 ##
本程序适用于单个姓或双个姓,起2个名的情况。(如:独孤**,李张**,张**,王**
一个好名字伴随人的一生,FATE让你取一个好名字。
TIPS: 本程序适用于单个姓或双个姓,起2个名的情况。(如:独孤**,李张**,张**,王**

## 关于版本:
除非稳定版本会单独出release,以后每次提交都会生成二进制文件的pre_release提供下载.
[最新自编译版本](https://github.com/godcong/fate/releases/tag/auto_build)
[Release版本:v3.1.1](https://github.com/godcong/fate/releases/tag/v3.1.1)
[最新数据库文件:20200331](https://github.com/godcong/fate/releases/download/v3.5.1/fate_db_200331.7z)
[最新自编译版本](https://github.com/godcong/fate/releases/tag/auto_build)
[最新数据库文件:20200331](https://github.com/godcong/fate/releases/download/v3.5.1/fate_db_200331.7z)
[v3.5.2下载](https://github.com/godcong/fate/releases/tag/v3.5.2)

## 关于起名算法 ##
FATE使用了以下算法,按照每种算法的准确度,使用程度也有高有低,不会一概而否,也不会偏向单独某种算法.
Expand Down Expand Up @@ -77,7 +77,7 @@
use fate;
//导入数据库文件
source /path/to/sql/file;
PS:建议使用Navicat等工具导入,导入速度较快
```

## 版本履历:
Expand Down Expand Up @@ -106,88 +106,17 @@
第七版(计划中):
通过AI,大数据匹配算法,取出更好更佳的名字.


### 其他(补充资料) ###
起名算法:
算法(进度) 备注
五格(95%) 暂用字库已补全
三才(95%) 暂用字库已补全
八字(100%) 喜用神完成, 补八字完成
卦象(100%) 算法完成,起卦完成,吉凶过滤完成。
生肖(30%) 生肖获取完成,字库筛选待完成
天运(TODO)

立春:
2019年02月04日 11:14:14
2020年02月04日 17:03:12
2021年02月03日 22:58:39
2022年02月04日 04:50:36
2023年02月04日 10:42:21
2024年02月04日 16:26:53
2025年02月03日 22:10:13
生肖按八字算从立春开始算起,不到时间则为上一年。

1、配合八字命理的喜忌,是起名字的核心所在。
八字是每个人出生的年、月、日、时,小孩取名的第一步即是分析八字,了解命理五行所缺并找出喜用神,并且据此起名,这是最关键的核心,所有姓名的吉凶预测与取名,都以此为准。
2、名字用字字义务必吉祥
中国文字的魅力在于,每个方块字不仅都有其本身的含义,而且还有其特殊的周易诱导含义,名字在很多时候它还会影响到人性格的形成,正所谓“名如其人”。
所以一个好的名字,务必用字字义吉祥。
宝宝起名字确实需要考虑很多因素,不仅要考虑读音、字形以及各种禁忌更重要的是要考虑宝宝的生辰八字,因此给孩子起名还是找专家比较好。
现在这方面比较知名的应该是温雅居士了,温雅居士在宝宝起名方面有着十几年的经验独创易学起名法:排八字、看五行、测五格、配三才、合属相、想寓意、听音律、写字形,在业界目前应该是比较权威的了。
取名是需要非常系统考虑的,不能只考虑读音一个方面,温雅居士采用的排八字、看五行、测五格、配三才、想寓意、听音律、写字形的综合起名法非常喜欢。
3、五格数理,特别是主格的数理要为吉数。
在姓名学中,数理产生许多福祸吉凶的灵动力,对人生影响很大。
这跟单个姓名用字的笔划好坏无关,准确的福祸吉凶是按照特殊方式计算数理的。
4、三才配置一定不可以相克。
三才配置在姓名学中,占有很大的分量。三才配置指的是天格、人格、地格之间的关系。中国传统文化中有顺应天时、地利、人和的行事哲理;
测名过程中,有很多姓名数理不错,但是三才配置不佳,大多表现为运气反复,遇事受阻碍,且感情及财运不好。
三才配置相生相克的关系定吉凶,同样也影响着一个人事业成功率的高低。
5、五格配置在姓名学中占有主要位置。
五格配置是指天格、地格、人格、外格、总格共五格之间的关系。
天格是由祖先流传而来,单独出现对人生没有多大影响;人格是姓名剖象数理的中心所在,对人生的影响最大;
人格与地格结合的数理则为基础运。地格主要是36岁前的人生,也叫前运力,外格代表人的外围,吉凶无谓。总格是36岁以后的人生,也是后运力。
6、小孩取名字时还要结合命主的出生方位、父母资料等因素,以达到事半功倍的效果。
其实任何事情道理都是一样的,只有适合自己的才是最好的。

周易卦象编码参考:

六十四卦
# ䷀ ䷁ ䷂ ䷃ ䷄ ䷅ ䷆ ䷇ ䷈ ䷉ ䷊ ䷋ ䷌ ䷍ ䷎ ䷏
# ䷐ ䷑ ䷒ ䷓ ䷔ ䷕ ䷖ ䷗ ䷘ ䷙ ䷚ ䷛ ䷜ ䷝ ䷞ ䷟
# ䷠ ䷡ ䷢ ䷣ ䷤ ䷥ ䷦ ䷧ ䷨ ䷩ ䷪ ䷫ ䷬ ䷭ ䷮ ䷯
# ䷰ ䷱ ䷲ ䷳ ䷴ ䷵ ䷶ ䷷ ䷸ ䷹ ䷺ ䷻ ䷼ ䷽ ䷾ ䷿

八卦
# ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷

四象
# ⚌ ⚍ ⚎ ⚏

两仪
# ⚋⚊

为什么要集六大派与一体?
看下下面这个统计,每一派的取名法其实都有其不足之处.
Fate涵盖以下六大派作为起名的基准:
• 笔划派: 认为笔划全吉,人生就大吉。其实准确度仅12.5 %
• 三才派: 完全不管笔划吉凶,只认为天地人三才五行相生,人生就大吉。其实准确度仅56.6 %。
• 补八字: 完全不管笔划吉凶,只认为名字补到先天八字命盘欠缺,人生就大吉。其实准确度非常低。
• 卦象派: 完全不管笔划吉凶,只认为名字求出卦象漂亮,人生就大吉。其实准确度仅40.26 %。
• 天运派: 完全不管笔划吉凶,只认为名字不要被出生年天运五行所剋,人生就大吉。其实准确度仅25.32 %。
• 生肖派: 完全不管笔划吉凶,只认为生肖用对字形,人生就大吉。其实准确度仅27.55 %。

PS:最近看到有人别出心裁说三才不准,并举了一些名人的例子.
然后他倒过来算,发现很符合,很正确.
那我也就呵呵了,按准确度来算,非正即反.
你倒过来算,不准的变准了.那原来准的那些不就不准了.
在我看来事分阴阳,而这接近一半的准确度则恰到其好处.

所以,遵照传统为自己的宝宝起一个中正平和的名字才是最好的.
从概率论的角度来讲,相交得到的最终结果.其准确度最高.
所以,单纯得拿一种或两种方法来取名是不可取的.
尽量符合多种的名字才是最佳,但并不一定需要全中.
Fate的本意是让起名变得简单,且能取到一个好的名字.
有人会花个十几,几十万取一个名字(周围的真人真事),
但是这个名字好不好你却未必知道.
算法开源就是为了让每个人知道,
这个名字取名过程的来龙去脉.

• 生肖派: 完全不管笔划吉凶,只认为生肖用对字形,人生就大吉。其实准确度仅27.55 %。

## PS ##
在过去的几年中虽然Fate经过了好几个版本的改进,但是任然有许多不足之处。
其中包括生成的名字太多不容易筛选,
还有些用户遇到了一些和Go相关的问题,
一些用户不知道如何导入数据库等。
这些问题都只能慢慢想办法去解决。
45 changes: 45 additions & 0 deletions cmd/console/check.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package main

import (
"errors"
"fmt"
"github.com/goextension/log"
"github.com/spf13/cobra"
"os"
"path/filepath"
"runtime"
)

func cmdCheck() *cobra.Command {
cmd := &cobra.Command{
Use: "check",
Short: "check the env does correct",
Run: func(cmd *cobra.Command, args []string) {
root := runtime.GOROOT()
log.Infow("check", "GOROOT", runtime.GOROOT())
if e := zoneCheck(root); e != nil {
log.Fatalw("zoneinfo check failed", "error", e)
}
fmt.Println("check all done!!!")
},
}
return cmd
}
func zoneCheck(root string) error {
path := filepath.Join(root, "lib", "time")
_, e := os.Stat(filepath.Join(path, "zoneinfo.zip"))
if e != nil && os.IsNotExist(e) {
_, e1 := os.Stat(filepath.Join(getCurrentPath(), "zoneinfo.zip"))
if e1 != nil && os.IsNotExist(e) {
return errors.New("zoneinfo file not found")
} else if e1 != nil {
return fmt.Errorf("found error in current path:%w", e1)
} else {
return nil
}
} else if e != nil {
return fmt.Errorf("found error in go path:%w", e)
} else {
return nil
}
}
52 changes: 1 addition & 51 deletions cmd/console/init.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package main

import (
"errors"
"fmt"
"io"
"os"
"path/filepath"
"runtime"

"github.com/godcong/fate/config"
"github.com/goextension/log"
"github.com/spf13/cobra"
"path/filepath"
)

func cmdInit() *cobra.Command {
Expand All @@ -31,53 +26,8 @@ func cmdInit() *cobra.Command {
log.Fatalw("config wrong", "error", e)
}

e = zoneCheck()
if e != nil {
log.Fatalw("zoneinfo fix failed", "error", e)
}
},
}
cmd.Flags().StringVarP(&path, "path", "p", "", "set the output path")
return cmd
}

func zoneCheck() error {
fmt.Println("GOROOT:", runtime.GOROOT())
path := runtime.GOROOT() + "/lib/time"
info, e := os.Stat(path)
if e != nil {
if os.IsNotExist(e) {
e = os.MkdirAll(path, 0755)
if e != nil {
return fmt.Errorf("could not make dir for copy zoneinfo:%w", e)
}
//fix:https://github.com/godcong/fate/issues/68
info, e = os.Stat(path)
if e != nil {
return fmt.Errorf("error after make dir:%v", e)
}
} else {
return fmt.Errorf("the target file is exist(%s):%w", path, e)
}
}
if !info.IsDir() {
return errors.New("destination file is not a directory")
}

filename := "zoneinfo.zip"

src, e := os.Open(filename)
if e != nil {
return e
}
target := filepath.Join(path, filename)
fmt.Println("copy zoneinfo to:", target)
dst, e := os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_SYNC|os.O_TRUNC, 0755)
if e != nil {
return e
}
if _, err := io.Copy(dst, src); err != nil {
return err
}
return nil
}
9 changes: 5 additions & 4 deletions cmd/console/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import "fmt"
import "github.com/spf13/cobra"

const programName = `fate`
const fateVersion = `0.0.2`

var rootCmd = &cobra.Command{
Use: "fate [command]",
Short: "call fate command",
Version: "v0.0.1",
Use: programName,
Short: "call fate command to make name",
Version: fateVersion,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("arguments [command] was not inputted")
},
Expand All @@ -17,7 +18,7 @@ var rootCmd = &cobra.Command{
}

func main() {
rootCmd.AddCommand(cmdInit(), cmdName())
rootCmd.AddCommand(cmdInit(), cmdName(), cmdCheck(), versionCMD())
e := rootCmd.Execute()
if e != nil {
panic(e)
Expand Down
17 changes: 13 additions & 4 deletions cmd/console/name.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,21 @@ func cmdName() *cobra.Command {
Use: "name",
Short: "output the name",
Run: func(cmd *cobra.Command, args []string) {
_, e := os.Stat("zoneinfo.zip")
_, e := os.Stat(filepath.Join(getCurrentPath(), "zoneinfo.zip"))
if e != nil {
log.Fatalw("zoneinfo file is not exist", "error", e)
return
}
os.Setenv("ZONEINFO", "zoneinfo.zip")
os.Setenv("ZONEINFO", filepath.Join(getCurrentPath(), "zoneinfo.zip"))
fmt.Println("start", time.Now().String())
config.DefaultJSONPath = path
cfg := config.LoadConfig()

if cfg == nil {
log.Info("use default config")
log.Warnw("config file not found,use default config")
cfg = config.DefaultConfig()
}
log.Infow("config loaded", "data", *cfg)
log.Infow("show config info", "data", *cfg)

if output != "" {
cfg.FileOutput.Path = filepath.Join(output, cfg.FileOutput.Path)
Expand All @@ -64,3 +65,11 @@ func cmdName() *cobra.Command {
cmd.Flags().BoolVarP(&sex, "sex", "s", false, "set sex of the baby")
return cmd
}

func getCurrentPath() string {
getwd, err := os.Getwd()
if err != nil {
panic(err)
}
return getwd
}
18 changes: 18 additions & 0 deletions cmd/console/version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package main

import (
"fmt"
"github.com/godcong/fate"
"github.com/spf13/cobra"
)

func versionCMD() *cobra.Command {
cmd := &cobra.Command{
Use: "version",
Short: "print current version to screen",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version:", fate.Version)
},
}
return cmd
}
Loading

0 comments on commit 51a3c9a

Please sign in to comment.