API文件完成,程式也馬上產出的實驗比較- Gemini vs. Gork vs. Anthropic - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (2025)

API文件完成,程式也馬上產出的實驗比較- Gemini vs. Gork vs. Anthropic - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (1)

以往要開發程式,多少會寫一些工具來幫忙自己開發更快更準確,如偵測 DB table 欄位資訊再透過動態類別與微軟的System.Reflection 組件來幫忙自動產生程式,因為欄位可能多達數十個,手動與肉眼建立model很耗時。

現在似乎有更快更直接的方式,那就是利用目前釋出的大語言模型API。
身邊一直聽到有人或有老闆一個人把整個專案、ERP寫好,就覺得老闆下海寫程式是想不開嗎還是怎樣。
後來想想不對,老闆都是很聰明的每秒幾十萬上下,應該是有方法,了解後就是利用這些API。

於是就動手來測試看看,是不是可以幫忙coding更快一些。
(有先測過股票程式如一目均衡表等等,確實真的產出且正確且畫圖出來,跟自己寫的差不多。)

假設文件寫的清楚,要替文件寫程式,且透過套件存取資料庫,這邊先以呼叫store procedure來代替複雜的SQL邏輯。
目前是請模型先實行 PG 角色,如果有底層設計與其它架構則是由真人來擔任架構師或者 PA 以上的職務,額外對模型描述要求,此先不試這些部分。

也就是實際人類去請電腦寫程式,並且依照SA寫好的文件開發撰寫。
(之後的測試程式、測試報告甚至弱掃建議,是另外再建立描述)

開始實行,先找到公開的測試目標文件:
API文件完成,程式也馬上產出的實驗比較- Gemini vs. Gork vs. Anthropic - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (2)

其公開文件查看網址:
公開的API文件網址

開始實際呼叫API來測試。

1. Google Gemini

溝通的Python程式碼: (文件第2~5頁以圖檔方式讓模型讀取)

from google import genaifrom google.genai import typesimport PIL.Imageimport requestsimage1 = PIL.Image.open(r'C:\Users\XXX\Desktop\self Coding by AI\Step2-Spec1.jpg')image2 = PIL.Image.open(r'C:\Users\XXX\Desktop\self Coding by AI\Step3-Spec2.jpg')image3 = PIL.Image.open(r'C:\Users\XXX\Desktop\self Coding by AI\Step4-Spec3.jpg')image4 = PIL.Image.open(r'C:\Users\XXX\Desktop\self Coding by AI\Step5-Spec4.jpg')client = genai.Client(api_key="ABCDEF888KKKLLLGGG666XFFWFGGDFAEWFEWEFW")MODEL_ID = "gemini-2.0-flash"user_req = "產生C# Web MVC API 程式 "proj_name = "DigitalDevProj"data_service = f"使用 'dapper' 套件存取 'MS SQL SERVER' , SQL語法部分為執行名稱為 FetchData 的 'store procedure' \ 對應欄位跟規格提供的名稱一樣。 dapper用法可參考網址內容 'https://dappertutorial.net/' 。"system_prompt = f"成為一個專業的 'C# Web MVC API' 程式開發者, \ 我需要你的協助產生程式碼, 只需要依照使用者需求內容來產生程式碼。只給我程式碼與相關的註解就好。"prompt = f"需求為 {user_req} 。 \任務是依照提供的圖片內容為規格,開發C# Web MVC API,需要提供 controller、model與對應資料存取的 service 為 {data_service}。 \回覆應包含「C# Web MVC API controller 、 model and Data Service 」 代碼,並排除任何不相關的內容、註解與資訊文字。 \專案名稱為 {proj_name} 。"response = client.models.generate_content( model=MODEL_ID, contents=[prompt, image1, image2, image3, image4 ], config=types.GenerateContentConfig( system_instruction=system_prompt ))print(response.text)

產生的程式:

 // Model namespace DigitalDevProj.Models { public class SmsSendRequest { public string orderNo { get; set; } public string packageNo { get; set; } public int packageCnt { get; set; } public string timeUp { get; set; } public string responseUrl { get; set; } public string smsTitle { get; set; } public List<SmsBody> smsBody { get; set; } } public class SmsBody { public string uid { get; set; } public string mobile { get; set; } public string smsText { get; set; } } public class SmsSendResponse { public string msgId { get; set; } public string status { get; set; } public string statusMsg { get; set; } public string orderNo { get; set; } public string packageNo { get; set; } public int packageCnt { get; set; } public List<ErrorUid> errorUids { get; set; } } public class ErrorUid { public string uid { get; set; } public string uidStatus { get; set; } public string uidStatusMsg { get; set; } } } // Service namespace DigitalDevProj.Services { using Dapper; using Microsoft.Extensions.Configuration; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using DigitalDevProj.Models; public interface ISmsSendService { Task<SmsSendResponse> FetchData(SmsSendRequest request); } public class SmsSendService : ISmsSendService { private readonly string _connectionString; public SmsSendService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public async Task<SmsSendResponse> FetchData(SmsSendRequest request) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); var parameters = new DynamicParameters(); parameters.Add("@orderNo", request.orderNo); parameters.Add("@packageNo", request.packageNo); parameters.Add("@packageCnt", request.packageCnt); parameters.Add("@timeUp", request.timeUp); parameters.Add("@responseUrl", request.responseUrl); parameters.Add("@smsTitle", request.smsTitle); var smsBodyTable = new DataTable(); smsBodyTable.Columns.Add("uid", typeof(string)); smsBodyTable.Columns.Add("mobile", typeof(string)); smsBodyTable.Columns.Add("smsText", typeof(string)); foreach (var body in request.smsBody) { smsBodyTable.Rows.Add(body.uid, body.mobile, body.smsText); } parameters.Add("@smsBody", smsBodyTable.AsTableValuedParameter("dbo.SmsBodyType")); return await connection.QueryFirstOrDefaultAsync<SmsSendResponse>( "FetchData", parameters, commandType: CommandType.StoredProcedure); } } } } // Controller namespace DigitalDevProj.Controllers { using Microsoft.AspNetCore.Mvc; using DigitalDevProj.Models; using DigitalDevProj.Services; using Microsoft.AspNetCore.Authorization; [ApiController] [Route("api/[controller]")] public class SmsSendController : ControllerBase { private readonly ISmsSendService _smsSendService; public SmsSendController(ISmsSendService smsSendService) { _smsSendService = smsSendService; } [HttpPost("SmsSend")] [Authorize] public async Task<IActionResult> SmsSend([FromBody] SmsSendRequest request) { var response = await _smsSendService.FetchData(request); return Ok(response); } } }

2. Gork

這次把圖檔改成url連結,以減少token數目。

溝通的Python程式碼: (描述訊息有先mark掉一段,等等會說明差異)

from openai import OpenAIimport PIL.Imageimport requestsXAI_API_KEY = "xai-fsfjjre3l3jiojflks34t9sdfslk9fssfjjljlkjlkl" uri_doc1 = "https://pouch.jumpshare.com/preview/fgAKFdHoyMQIxK986_cCVJyV9i60pqYyXhDIyP-irR1Zch46a5IeuNUBiVCQD-ilzcIv_ajoO5ObdvvMdN6lLCXu4DUqlp4Owv51xUVLIKs"uri_doc2 = "https://pouch.jumpshare.com/preview/kdKEMmKTFCAao5u3YqHUEVD2mtm7GeApAGDqUEabc4357GlR3GB1DtWPxDMN2xbzAuLIvJA4UcmmPrm04w0iNvvEnRojmgCTkFmWDkZ8ETk"uri_doc3 = "https://pouch.jumpshare.com/preview/QBv3Yua9oyjrH7S_ly-VPJTo8TLH95P7JXSO5yQKE5uz-E_ief61HaSerhpfGqnbAuLIvJA4UcmmPrm04w0iNkQ80KIOjNuaj92cz6SaUto"uri_doc4 = "https://pouch.jumpshare.com/preview/H6RNFukmqhCAWqm1cRa4XXkVPGYgZZF1CjebFSR43hD7PEe1ybdJW8X04hZjDdLhAuLIvJA4UcmmPrm04w0iNvdVD6i__n8oqnkbPErdWro"MODEL_ID = "grok-2-vision-latest" #"grok-3-latest"user_req = "產生C# Web MVC API 程式 "proj_name = "DigitalDevProj"data_service = f"使用 'dapper' 套件存取 'MS SQL SERVER' , SQL語法部分為執行名稱為 FetchData 的 'store procedure' \ 對應欄位跟規格提供的名稱一樣。 dapper用法可參考網址內容 'https://dappertutorial.net/' 。"system_prompt = f"成為一個專業的 'C# Web MVC API' 程式開發者, \ 我需要你的協助產生程式碼, 只需要依照使用者需求內容來產生程式碼。只給我程式碼與相關的註解就好。"prompt = f"需求為 {user_req} 。 \任務是依照提供的網頁內容為規格,開發C# Web MVC API。提供的網頁內容試圖檔,請協助解析內容。然後回覆程式,為 controller、model與對應資料存取的 service 為 {data_service}。 \回覆應包含「C# Web MVC API controller 、 model and Data Service 」 代碼,並排除任何不相關的內容、註解與資訊文字。 \專案名稱為 {proj_name} 。 只需要提供SmsSend這部分即可。"#另外要注意的是,欄位 smsBody 是一個物件集合,集合的每個元素物件的成員描述在接下來的描述。"client = OpenAI( api_key=XAI_API_KEY, base_url="https://api.x.ai/v1",)completion = client.chat.completions.create( model= MODEL_ID , messages=[ { "role": "system", "content": system_prompt }, { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": uri_doc1 } }, { "type": "image_url", "image_url": { "url": uri_doc2 } }, { "type": "image_url", "image_url": { "url": uri_doc3 } }, { "type": "image_url", "image_url": { "url": uri_doc4 } }, { "type": "text", "text": prompt } ] }, ],)print(completion.choices[0].message.content)

產生的程式:

// Controller: SmsSendController.csusing Microsoft.AspNetCore.Mvc;using DigitalDevProj.Models;using DigitalDevProj.Services;namespace DigitalDevProj.Controllers{ [ApiController] [Route("api/[controller]")] public class SmsSendController : ControllerBase { private readonly ISmsSendService _smsSendService; public SmsSendController(ISmsSendService smsSendService) { _smsSendService = smsSendService; } [HttpPost] public async Task<IActionResult> SendSms(SmsSendRequest request) { var result = await _smsSendService.SendSms(request); return Ok(result); } }}// Model: SmsSendRequest.csusing System.ComponentModel.DataAnnotations;namespace DigitalDevProj.Models{ public class SmsSendRequest { [Required] [StringLength(36)] public string orderNo { get; set; } [Required] [StringLength(5)] public string packageNo { get; set; } [Required] [StringLength(4)] public string packageCut { get; set; } [Required] [StringLength(12)] public string timeUp { get; set; } [Required] [StringLength(256)] public string responseUrl { get; set; } [Required] [StringLength(30)] public string smsTitle { get; set; } [Required] [StringLength(20)] public string uid { get; set; } [Required] [StringLength(10)] public string mobile { get; set; } [Required] [StringLength(333)] public string smsText { get; set; } }}// Model: SmsSendResponse.csnamespace DigitalDevProj.Models{ public class SmsSendResponse { public string msgId { get; set; } public int status { get; set; } public string statusMsg { get; set; } public string orderNo { get; set; } public string packageNo { get; set; } public string packageCut { get; set; } public string errorIds { get; set; } public string uid { get; set; } }}// Service: ISmsSendService.csusing System.Threading.Tasks;using DigitalDevProj.Models;namespace DigitalDevProj.Services{ public interface ISmsSendService { Task<SmsSendResponse> SendSms(SmsSendRequest request); }}// Service: SmsSendService.csusing System.Threading.Tasks;using Dapper;using System.Data.SqlClient;using DigitalDevProj.Models;namespace DigitalDevProj.Services{ public class SmsSendService : ISmsSendService { private readonly string _connectionString; public SmsSendService(string connectionString) { _connectionString = connectionString; } public async Task<SmsSendResponse> SendSms(SmsSendRequest request) { using (var connection = new SqlConnection(_connectionString)) { var parameters = new DynamicParameters(); parameters.Add("@orderNo", request.orderNo); parameters.Add("@packageNo", request.packageNo); parameters.Add("@packageCut", request.packageCut); parameters.Add("@timeUp", request.timeUp); parameters.Add("@responseUrl", request.responseUrl); parameters.Add("@smsTitle", request.smsTitle); parameters.Add("@uid", request.uid); parameters.Add("@mobile", request.mobile); parameters.Add("@smsText", request.smsText); var result = await connection.QueryFirstOrDefaultAsync<SmsSendResponse>( "FetchData", parameters, commandType: System.Data.CommandType.StoredProcedure ); return result; } } }}

在 model 部分似乎有解析錯誤,物件欄位沒判斷到。
溝通程式碼將註解解除後再執行一次,也就是溝通得再詳細一點,就可以了。

再次產生的程式: (有好一點,但回傳部分仍有一點錯誤)

// Controller: SmsSendController.csusing Microsoft.AspNetCore.Mvc;using DigitalDevProj.Models;using DigitalDevProj.Services;namespace DigitalDevProj.Controllers{ [ApiController] [Route("api/[controller]")] public class SmsSendController : ControllerBase { private readonly ISmsSendService _smsSendService; public SmsSendController(ISmsSendService smsSendService) { _smsSendService = smsSendService; } [HttpPost] public async Task<IActionResult> SendSms(SmsSendRequest request) { var response = await _smsSendService.SendSmsAsync(request); return Ok(response); } }}// Model: SmsSendRequest.csnamespace DigitalDevProj.Models{ public class SmsSendRequest { public string orderNo { get; set; } public string packageNo { get; set; } public string packageCnt { get; set; } public string timeUp { get; set; } public string responseUrl { get; set; } public string smsTitle { get; set; } public List<SmsBody> smsBody { get; set; } } public class SmsBody { public string uid { get; set; } public string mobile { get; set; } public string smsText { get; set; } }}// Model: SmsSendResponse.csnamespace DigitalDevProj.Models{ public class SmsSendResponse { public string msgId { get; set; } public string status { get; set; } public string statusMsg { get; set; } public string orderNo { get; set; } public string packageNo { get; set; } public string packageCnt { get; set; } public List<SmsBodyResponse> smsBody { get; set; } } public class SmsBodyResponse { public string uid { get; set; } public string status { get; set; } public string statusMsg { get; set; } }}// Service: ISmsSendService.csusing DigitalDevProj.Models;using System.Threading.Tasks;namespace DigitalDevProj.Services{ public interface ISmsSendService { Task<SmsSendResponse> SendSmsAsync(SmsSendRequest request); }}// Service: SmsSendService.csusing Dapper;using Microsoft.Data.SqlClient;using System.Threading.Tasks;using DigitalDevProj.Models;namespace DigitalDevProj.Services{ public class SmsSendService : ISmsSendService { private readonly string _connectionString; public SmsSendService(string connectionString) { _connectionString = connectionString; } public async Task<SmsSendResponse> SendSmsAsync(SmsSendRequest request) { using (var connection = new SqlConnection(_connectionString)) { var parameters = new DynamicParameters(); parameters.Add("@orderNo", request.orderNo); parameters.Add("@packageNo", request.packageNo); parameters.Add("@packageCnt", request.packageCnt); parameters.Add("@timeUp", request.timeUp); parameters.Add("@responseUrl", request.responseUrl); parameters.Add("@smsTitle", request.smsTitle); parameters.Add("@smsBody", request.smsBody); var result = await connection.QueryFirstOrDefaultAsync<SmsSendResponse>("FetchData", parameters, commandType: System.Data.CommandType.StoredProcedure); return result; } } }}

3. Anthropic

溝通的Python程式碼::

import anthropicapi_key = "sk-ant-sdf332mlkrl39dfsfkslfjs8fsesefjlsfsk3dhdh5hj6rj67nhhk7" uri_doc1 = "https://pouch.jumpshare.com/preview/fgAKFdHoyMQIxK986_cCVJyV9i60pqYyXhDIyP-irR1Zch46a5IeuNUBiVCQD-ilzcIv_ajoO5ObdvvMdN6lLCXu4DUqlp4Owv51xUVLIKs"uri_doc2 = "https://pouch.jumpshare.com/preview/kdKEMmKTFCAao5u3YqHUEVD2mtm7GeApAGDqUEabc4357GlR3GB1DtWPxDMN2xbzAuLIvJA4UcmmPrm04w0iNvvEnRojmgCTkFmWDkZ8ETk"uri_doc3 = "https://pouch.jumpshare.com/preview/QBv3Yua9oyjrH7S_ly-VPJTo8TLH95P7JXSO5yQKE5uz-E_ief61HaSerhpfGqnbAuLIvJA4UcmmPrm04w0iNkQ80KIOjNuaj92cz6SaUto"uri_doc4 = "https://pouch.jumpshare.com/preview/H6RNFukmqhCAWqm1cRa4XXkVPGYgZZF1CjebFSR43hD7PEe1ybdJW8X04hZjDdLhAuLIvJA4UcmmPrm04w0iNvdVD6i__n8oqnkbPErdWro"MODEL_ID = "claude-opus-4-20250514"user_req = "產生C# Web MVC API 程式 "proj_name = "DigitalDevProj"data_service = f"使用 'dapper' 套件存取 'MS SQL SERVER' , SQL語法部分為執行名稱為 FetchData 的 'store procedure' \ 對應欄位跟規格提供的名稱一樣。 dapper用法可參考網址內容 'https://dappertutorial.net/' 。"system_prompt = f"成為一個專業的 'C# Web MVC API' 程式開發者, \ 我需要你的協助產生程式碼, 只需要依照使用者需求內容來產生程式碼。只給我程式碼與相關的註解就好。"prompt = f"需求為 {user_req} 。 \任務是依照提供的網頁內容為規格,開發C# Web MVC API。提供的網頁內容試圖檔,請協助解析內容。然後回覆程式,為 controller、model與對應資料存取的 service 為 {data_service}。 \回覆應包含「C# Web MVC API controller 、 model and Data Service 」 代碼,並排除任何不相關的內容、註解與資訊文字。 \專案名稱為 {proj_name} 。 只需要提供SmsSend這部分即可。 "#另外要注意的是,欄位 smsBody 是一個物件集合,集合的每個元素物件的成員描述在接下來的描述。"client = anthropic.Anthropic(api_key = api_key)message = client.messages.create( model= MODEL_ID, max_tokens=3000, temperature=1, system= system_prompt, messages=[ { "role": "user", "content": [ { "type": "image", "source": { "type": "url", "url": uri_doc1, }, }, { "type": "image", "source": { "type": "url", "url": uri_doc2, }, }, { "type": "image", "source": { "type": "url", "url": uri_doc3, }, }, { "type": "image", "source": { "type": "url", "url": uri_doc4, }, }, { "type": "text", "text": prompt, }, ] } ])print(message.content[0].text)

產生的程式: (未把註解解除,似乎就有正確把欄位結構對應好)

// Models/SmsSendRequest.csusing System.Collections.Generic;namespace DigitalDevProj.Models{ public class SmsSendRequest { public string orderNo { get; set; } public string packageNo { get; set; } public int packageCnt { get; set; } public string timeUp { get; set; } public string responseUrl { get; set; } public string smsTitle { get; set; } public List<SmsBodyItem> smsBody { get; set; } } public class SmsBodyItem { public string uid { get; set; } public string mobile { get; set; } public string smsText { get; set; } }}// Models/SmsSendResponse.csnamespace DigitalDevProj.Models{ public class SmsSendResponse { public string msgId { get; set; } public string status { get; set; } public string statusMsg { get; set; } public string orderNo { get; set; } public string packageNo { get; set; } public int? packageCnt { get; set; } public List<ErrorUid> errorUids { get; set; } } public class ErrorUid { public string uid { get; set; } public string uidStatus { get; set; } public string uidStatusMsg { get; set; } }}// Services/SmsSendService.csusing System.Data;using System.Threading.Tasks;using Microsoft.Data.SqlClient;using Dapper;using DigitalDevProj.Models;using Microsoft.Extensions.Configuration;namespace DigitalDevProj.Services{ public interface ISmsSendService { Task<SmsSendResponse> SendSmsAsync(SmsSendRequest request); } public class SmsSendService : ISmsSendService { private readonly string _connectionString; public SmsSendService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public async Task<SmsSendResponse> SendSmsAsync(SmsSendRequest request) { using (var connection = new SqlConnection(_connectionString)) { var parameters = new DynamicParameters(); parameters.Add("@orderNo", request.orderNo); parameters.Add("@packageNo", request.packageNo); parameters.Add("@packageCnt", request.packageCnt); parameters.Add("@timeUp", request.timeUp); parameters.Add("@responseUrl", request.responseUrl); parameters.Add("@smsTitle", request.smsTitle); parameters.Add("@smsBody", Newtonsoft.Json.JsonConvert.SerializeObject(request.smsBody)); var result = await connection.QueryFirstOrDefaultAsync<SmsSendResponse>( "FetchData", parameters, commandType: CommandType.StoredProcedure ); return result; } } }}// Controllers/SmsSendController.csusing System;using System.Text;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using DigitalDevProj.Models;using DigitalDevProj.Services;namespace DigitalDevProj.Controllers{ [ApiController] [Route("api/[controller]")] public class SmsSendController : ControllerBase { private readonly ISmsSendService _smsSendService; public SmsSendController(ISmsSendService smsSendService) { _smsSendService = smsSendService; } [HttpPost] public async Task<IActionResult> SmsSend([FromBody] SmsSendRequest request) { if (!IsAuthorized()) { return Unauthorized(); } if (!ModelState.IsValid) { return BadRequest(ModelState); } try { var response = await _smsSendService.SendSmsAsync(request); return Ok(response); } catch (Exception ex) { return StatusCode(500, new { error = ex.Message }); } } private bool IsAuthorized() { string authHeader = Request.Headers["Authorization"]; if (authHeader != null && authHeader.StartsWith("Basic")) { string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim(); Encoding encoding = Encoding.GetEncoding("UTF-8"); string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword)); int seperatorIndex = usernamePassword.IndexOf(':'); var username = usernamePassword.Substring(0, seperatorIndex); var password = usernamePassword.Substring(seperatorIndex + 1); return true; } return false; } }}// Startup.cs (Add to ConfigureServices)public void ConfigureServices(IServiceCollection services){ services.AddScoped<ISmsSendService, SmsSendService>();}

結論:

個人覺得以現在這個時間點,效果排名: Anthropic >= Gemini >> Gork

一樣的文件,Anthropic 似乎可以一次就看懂文件並完成程式(要付費)。Gemini也不錯(免費)。
但 Gork , 卻要再描述更詳細一點,才會比較正確(他要付費...),不過可能原因是url為參數方式目前只能用
"grok-2-vision-latest", 而 "grok-3-latest" 此時間點還未支援url為參數方式讀圖。

至於直接讀文件檔案方式,試過效果有一些出入,就先略過這部分的比較。不過讀檔可以直接請模型只寫某段API程式,這是大部分模型可以實現的。

大致上測試這三款,為何不測試 Open Api (chatGPT) 出的 model? 因為太熱門且要付費,應該可參考其它國內外的分享即可。
那 DeepSeek 則是有空再當作業測試看看。


API文件完成,程式也馬上產出的實驗比較- Gemini  vs.  Gork  vs.  Anthropic - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (2025)
Top Articles
Latest Posts
Recommended Articles
Article information

Author: Rueben Jacobs

Last Updated:

Views: 5923

Rating: 4.7 / 5 (57 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Rueben Jacobs

Birthday: 1999-03-14

Address: 951 Caterina Walk, Schambergerside, CA 67667-0896

Phone: +6881806848632

Job: Internal Education Planner

Hobby: Candle making, Cabaret, Poi, Gambling, Rock climbing, Wood carving, Computer programming

Introduction: My name is Rueben Jacobs, I am a cooperative, beautiful, kind, comfortable, glamorous, open, magnificent person who loves writing and wants to share my knowledge and understanding with you.