Design

Design
asp.net mvc

2018年11月21日 星期三

NativeScript 心得

最近想寫練習android & ios手機原生 NativeScript 現在剛好有支援angular 跟 vue 我是選擇vue來做開發 angular 我也有看一下 也是大同小異  ,  我自己在環境上花了不少時間 遇到不少坑  整體開發還可以看的出來Nativescirpt 還有需要改進很多地方 , 因為手邊沒有mac所以先選擇android先做練習 ,
主要是要熟練native的布局例如gridlayout .stacklayout .等等  還有native的structure整體什麼東西做什麼事情,部分的地方還是要靠native去撰寫 ,最好的話看一下原生java是怎寫的,  其他就如寫vue javascirpt typescript css部分支援 比較不一樣的就是router 改用 manual routing 不過這也沒什麼問題  ,官方的document都寫得滿清楚的 也有Demo參考 ,我覺得如果原本就熟練vue的話 邊學邊開發是完全沒問題 ,我覺得最大的好處是  我寫一版就能支援android跟ios系統 ,   不過還是要注意部分語法還是要寫android跟ios差異判斷,還支援Hot Reload 整理開發速度會快非常多 目前已經快寫完 簡單的youtube播放器 支援編輯自己的音樂清單 跟背景播放功能
到時候可能會上google play. 也不一定會上, 算是在學得新技能方面 解鎖成就(1/1) 



2018年10月30日 星期二

在winform內鑲Selenium控制

最近研究出可以在winform內鑲瀏覽器用Selenium控制的方法,這樣就不用每次導出視窗 造成一些問題 也比較美觀,主要方法是透過CefSharp內核把chrome鑲入winform,ChromiumWebBrowser的RemoteDebuggingPort建立個本個遠端路徑,再透過 Selenium ChromeOptions的DebuggerAddress 去做畫面的顯示

程式碼如下
 public partial class Form1 : Form
    {
        private readonly ChromiumWebBrowser browser;
        private static readonly bool DebuggingSubProcess = Debugger.IsAttached;

        private ISelenium selenium;
        private StringBuilder verificationErrors;

        public Form1()
        {
            InitializeComponent();

            var settings = new CefSettings();
            settings.RemoteDebuggingPort = 8088;
            settings.IgnoreCertificateErrors = true;
            Cef.Initialize(settings);
            browser = new ChromiumWebBrowser(url)
            {
                Dock = DockStyle.Fill,
            };
            browser.CreateControl();
            this.Controls.Add(browser);
        }

        public static void GO()
        {
            var driverService = ChromeDriverService.CreateDefaultService();
            driverService.HideCommandPromptWindow = true;

            ChromeOptions options = new ChromeOptions();
            options.DebuggerAddress = "127.0.0.1:8088";
            options.AddArguments("--enable-logging");
            using (var driver = new ChromeDriver(driverService, options))
            {
               //doSomething
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GO();
        }
    }

2018年10月16日 星期二

Cassandra 自己winform寫了個GUI

待補充
內容 最近因為有工作上 有大量log紀錄的需求 原本是有使用mongodb,redis 這兩種nosql 就試看看新的Cassandra query語法不是那麼有善 , 網路上能用的GUI好像都要收費 因為語法相對簡單我這邊就自己用 winform寫了個GUI 方便查詢 有需要再聯繫我



2018年10月2日 星期二

簡易 HttpClient Post泛型請求

簡易 HttpClient Post泛型請求
我們使用httpclient get or post
常常會想要紀錄log或是回傳exceptional或是做一些事情
發現一直在寫重複的東西 如果我們寫個泛型的靜態方法是不是就乾淨多了




class Program
   {
       static void Main(string[] args)
       {
 
           string url = "http://jsonplaceholder.typicode.com/posts";
           var data = new PostModel();
           data.title = "foo";
           data.body = "bar";
           data.userId = 1;
           var c = HttpClient<PostModelResultModel>(url, data);           
           Console.WriteLine(JsonConvert.SerializeObject(c));
           Console.Read();
 
       }
 
       /// <summary>
       /// 如果沒有post參數的話
       /// </summary>
       /// <typeparam name="TResult"></typeparam>
       /// <param name="url"></param>
       /// <returns></returns>
       protected static TResult HttpClient<TResult>(string url) where TResult : class
       {
           return HttpClient<stringTResult>(url, string.Empty);
       }
 
 
       protected static TResult HttpClient<TPostTResult>(string url, TPost PostData) where TResult : class where TPost : class
       {
 
           var client = new HttpClient();
 
           var task = client.PostAsJsonAsync(url, PostData);
   
           //10秒timeout
           var hasimeOut = task.Wait(10000);
           if (!hasimeOut)
           {
               Console.WriteLine("timeout了");
               Console.Read();
           }
           var response = task.Result;
 
           var jsonString = response.Content.ReadAsStringAsync();
      
           var settings = new JsonSerializerSettings
           {
               NullValueHandling = NullValueHandling.Ignore,
             
           };
 
           //反序列
           var Result = JsonConvert.DeserializeObject<TResult>(jsonString.Result);
 
           return Result;
       }
 
 
 
 
       public class ResponseBase<TResult> {
 
           [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
           public int Code { getset; }
           [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
           public string message { getset; }
           [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
           public TResult data { getset; }
 
       } 
 
 
 
       public class PostModel
       {
           public string title { getset; }
           public string body { getset; }
           public int userId { getset; }
       }
 
 
       public class ResultModel
       {
           public string title { getset; }
           public string body { getset; }
           public int userId { getset; }
           [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
           public string test { getset; }
       }
 
   }

2018年9月19日 星期三

Selenium C# 簡單運用

Selenium 是為瀏覽器自動化(Browser Automation)需求所設計的一套工具集合,讓程式可以直接驅動瀏覽器進行各種網站操作。
應用的範圍滿廣泛的,除了自動化測試以外還可以當做爬蟲使用.
請NuGet 以下兩項
Selenium.Support
Selenium.WebDriver

底下簡單做個google搜訊範例 很直覺的啟動driver導頁到google 找search元件 輸入Submit 整體來說沒什麼難度 較進階的用法 會需要用到等待頁面加載完或是一些瀏覽器的問題跟操作 基本上大同小異

    using (var driver = new ChromeDriver())
            {
                driver.Navigate().GoToUrl("https://www.google.com.tw/");
                var search = driver.FindElementById("lst-ib");
                search.SendKeys("hi");
                search.Submit();
            }


我自己寫滿多的東西的,覺得目前來說各方面支援度都很夠用 推薦

2018年6月25日 星期一

懶得用DB 那就建個.json資料 來webapi CRUD吧

有時候懶得搞DB 這時候我們就可以本地建個JSON檔或是XML檔來當做資料庫
當然我不推崇這種方法 因為這會有很多問題 一方面效能 一方面資安 等等各種問題

那至於該怎做呢 方便我們前端呼叫做存取 這邊用webapi 當作範例
這邊依照飲料做為範例 先定義我們的Model格式吧





public class Type
    {
        public string Size { get; set; }
        public int Price { get; set; }
    }

    public class Drink
    {
        public int Drinkid { get; set; }
        public string DrinkName { get; set; }
        public List type { get; set; }
        public string Remarks { get; set; }
    }

    public class Blend
    {
        public string blendName { get; set; }
        public int Price { get; set; }
    }

    public class StoreModel
    {
        public int id { get; set; }
        public string StoreName { get; set; }
        public string Url { get; set; }
        public List Drink { get; set; }
        public List blend { get; set; }
        public string StoreRemarks { get; set; }
    }

再來就是簡單的CRUD 這邊自行看看吧 這邊都是邏輯都很簡單都是一照我們ID去找我們的資料再來重新復寫我們的資料

 public class StoreController : ApiController
    {

        [AllowAnonymous]
        [HttpPost]
        public List GetStore()
        {
            var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");

            return JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath));

        }

        [AllowAnonymous]
        [HttpPost]
        public StoreModel GetStorebyID(int id)
        {
            var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
            using (StreamReader r = new StreamReader(mappedPath))
            {
                string json = r.ReadToEnd();
                return JsonConvert.DeserializeObject>(json).Find(x => x.id == id);
            }
        }


        [AllowAnonymous]
        [HttpPost]
        public bool DeleteById(int id)
        {
            try
            {
                var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
                var json = JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath)).Find(x => x.id != id);
                var list = new List();
                list.Add(json);
                File.WriteAllText(mappedPath, JsonConvert.SerializeObject(list));
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        [AllowAnonymous]
        [HttpPost]
        public bool Add(StoreModel StoreModel)
        {
            try
            {
                var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
                var json = JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath));
                json.Add(StoreModel);
                File.WriteAllText(mappedPath, JsonConvert.SerializeObject(json));
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

    }

這邊就簡單做個紀錄

2018年6月23日 星期六

vscode 起手vue cli

最近剛有新筆電 開始想寫些side project 經過一陣子的磨練發現自己寫工具的能力大大提升
心想那何不增加自己的github stat,剛好把這些過程稍微紀錄一下生篇文章給需要的人
vscode 算現在最潮的editor, vue 也從library漸漸發展成framework 那就開始吧

首先先安裝vscode吧
https://code.visualstudio.com/

再來安裝我們的nodejs
https://nodejs.org/en/
左邊LTS算是穩定版  右邊算是現在的版本
我們就選擇穩定版吧  這個看個人需求


再來就可以開始安裝我們的vue cli了
vue cli 可以幫助我們在開發vue上快速建立起我們的環境及基本的設定
相關文件可以參考
https://cli.vuejs.org/guide/


首先開啟我們的vscode 在我們的終端機開輸入我們以下語法
 
npm install -g @vue/cli



安裝完後我們就可以透過vue cli的建立起我們的專案

vue init webpack my-project



然後就會要你輸入一些東西 專案名阿 什麼的

幫方便的是他連webpack都自動幫你封裝好了
至於webapck有時間再來詳細說明
我們精美的範例就出來的



接下來我們把專案run起來吧
cd到我們的專案 然後輸入 npm run dev  就可以看到我們8080 port就有我們的vue基本畫面接下來就可以開心開發我們的vue 網頁了
 cd my-project
npm run dev


這是vue cli 最基本中的基本用法  , 未來在來分享些架構上的東西
有任何問題可以在底下留言