2021年8月12日 星期四

Ysense - 免技術輕鬆網上賺美金平台

今日要介紹的是輕鬆網上賺美金平台 - Ysense,這平台提供問卷調查及任務供註冊者使用,完成後可獲得美金報酬,而且回報合理,Blog主甚至認為是數一數二的,只需簡單英語,不論是香港或台灣人都可以參與,下圖就是本Blog主的回報,今年年頭註冊,至今約半年,只需週末如果有空時抽半個小時安在家中就可以獲得72元美金了,這文章會講解如何註冊並且取得利潤。
各位喜歡這文章的話,註冊時可用以下網址:https://www.ysense.com/?rb=96873353,不勝感激。

註冊流程
打開網頁https://www.ysense.com/?rb=96873353,在畫面填上Email及密碼,注意Email需要與你的PayPal/Amazon戶口Email一致,方可提取利潤,再剔剔方格及按下:"Join Now" 鍵。

然後在畫面填上名字及姓氏,注意名字及姓氏也需要與你的PayPal/Amazon戶口Email一致,方可提取利潤,再按"Next Step"鍵。
接著是用戶名稱,再按"Complete"鍵。

剔"Agree to all"以接受資料政策條款,最後按"Agree and Continue"鍵。
註冊過程完成一大半,來到Ysense主頁,提示Email有待確認。
去到Email的電子郵箱,收取Ysense的註冊確認電郵,按下"Confirm email address"鍵。
註冊完成了,以下就是Ysense個人主頁,現在一一講解。主頁常用的主要有4點:
1. Surveys 問卷調查
2. Offers 任務,包括QUIZ,安裝APP,玩遊戲等
3. Addon 瀏覽器Plugin
4. Cashout 最重要的一點,出金
1. 按下Surveys,會出現幾個問卷方格,方格內會顯示問卷完成後的利潤金額及問卷需時,如果覺得合適,按下即可進行問卷調查,如果順利完成後,可獲得相應的美金利潤。(Blog主提示:建議先選高金額的!)問卷調查有超過95%可以選中文及英文,約5%只可選英文。問卷數目多,幾天就有幾十個。
2. 按下Offers,可以進行任務,跟問卷一樣,如果覺得合適,就點下去開始。Ysense跟很多平台合作,所以你看到Offers內有幾間不同的公司,但是放心,利潤還是會發放的,需時大約是完成後的一星期內。做任務的機款大致分為三種:電腦,Android,IOS,選自己擁有的平台。(Blog主較喜愛OfferToro和AyeT Studios)
3. 按下AddOn,可以為瀏覽器安裝Plugin,安裝的好處就是如果你一天內完成問卷或任務2次或以上,而且當天網頁閑置一小時,可獲得的BONUS提高2%,由基本12%上升至14%。如果連續3天達成任務可再增加2%,至16%,這種利潤增幅就是Blog主認為Ysense的優勢之處。假如一天內完成兩個任務合共2美元,乘1.16,就是2.32美元,積少成多。

4. 重點來了,CashOut。Ysense出金的種類多,香港及台灣人主要都使用PayPal和Amazon為主,PayPal每次最低出金金額是10美元,Amazon為5美元。如果帳號Email跟名字都跟出金戶口一樣,就可以簡單出金。首次出金的話要輸入手提電話號碼,系統會給你SMS,確認身份,第二次開始就不用了。
下圖就是我在PayPal收到Ysense的款項,輕輕鬆鬆就有10美金,希望能幫到各位。^^
最後加送,有些人可能出金驗證手機時出現問題(如下圖),而開始慌亂能否正常出金,不用擔心,會有辦法解決。
在Ysense主頁底部,按下"Help"鍵。
按下"Submit A Request"鍵,並輸入問題,需要使用英文,如果不懂,請參考下圖,上傳問題截圖,最後按下"Submit"鍵,就能完成。
以下就是我與Ysense客服的對答,最後成功及開始輕鬆賺取美金之路。^^



2019年4月12日 星期五

IIS 8 HTTPS Self Signed Certificate 教學

前言: 利用IIS 8架設HTTPS ASP.NET網頁,如果使用Self-Signed Cert(免費)時會遇到的問題
就是進入網頁前要click入Continue to this website (not recommended) 
 
以下的教學方法教你如何跳過以上樣衰情況(也要User配合)
 Windows Server 2012 R2 + IIS 8

 1. 使用PowerShell (Run as administrator) 創建Self Signed Cert


 輸入:
New-SelfSignedCertificate -DnsName XX.XX.XX.XX -CertStoreLocation cert:\LocalMachine\My

DnsName可填Domain/IP

2. 使用mmc(簡單Search mmc可開啟),並加入File->Add Snap in內的Certificate

3. Copy 剛剛創建的Certificate
 
4. 在Trusted Root Certication Authorities Paste Certificate
 
5. 開啟IIS的Server Certificate後,你會看到Certificate

6. 之後在你的Site,Site Binding 套用HTTPS Certificate, Server Setting完成
User部份開始
7. User第一次仍要Click入Continue to this website

8. Click View Certificate 和Install Certificate


9. 選Current User及選Place all certificate in the following store 並選擇Trusted Root Certification Authorities

選Yes
10. 重新開啟Browser,順利完成,不再彈出Error Certificate畫面

2018年11月22日 星期四

C#利用IIS中的FTPS傳輸方法

最近同事煩惱如何使用IIS內置的FTPS(SSL)來傳送及接收檔案,我花了一些時間,作出了以下.NET專案




1. FTP.cs

using System;
using System.IO;
using System.Net;

namespace FTP_DLL
{
 public class FTP
 {
  private string _remoteHost, _remoteUser, _remotePass, _remotePort;

  public FTP(String remoteHost, String remotePort, String remoteUser, String remotePass)
  {
   _remoteHost = remoteHost;
   _remoteUser = remoteUser;
   _remotePass = remotePass;
   _remotePort = remotePort;
  }

  public void SSLUpload(String filename)
  {
   FileInfo fileInf = new FileInfo(filename);
   string uri = String.Format("ftp://{0}:{1}/{2}", _remoteHost, _remotePort, fileInf.Name);
   FtpWebRequest reqFTP;
   reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
   reqFTP.EnableSsl = true;
   reqFTP.Credentials = new NetworkCredential(_remoteUser, _remotePass);
   reqFTP.KeepAlive = false;
   reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
   reqFTP.UseBinary = true;

   //Method1:Bypass Cert
   ServicePointManager.ServerCertificateValidationCallback = (s, certificate, chain, sslPolicyErrors) => true;

   //Method2:Accept Cert
   //X509Certificate cert = new X509Certificate2("C:\\Path\\cert.pfx", "password");
   //string b = cert.GetCertHashString();
   //Console.WriteLine("hash string " + b);

   //ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
   //{
    //if (certificate.GetCertHashString().Equals(b))
    //{
     //Console.WriteLine("ServerCertificateValidation true");
     //return true;
    //}
    //else
    //{
     //Console.WriteLine("ServerCertificateValidation false");
     //return false;
    //}
   //};

   //reqFTP.ContentLength = fileInf.Length;
   //reqFTP.ContentLength = 10000;
   int buffLength = 2048;
   byte[] buff = new byte[buffLength];
   int contentLen;
   FileStream fs = fileInf.OpenRead();
   try
   {
    Stream strm = reqFTP.GetRequestStream();
    contentLen = fs.Read(buff, 0, buffLength);
    while (contentLen != 0)
    {
     strm.Write(buff, 0, contentLen);
     contentLen = fs.Read(buff, 0, buffLength);
    }
    strm.Close();
    fs.Close();
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message, "Upload err");
   }
  }

  public void SSLDownload(String filename)
  {
   FileInfo fileInf = new FileInfo(filename);
   string uri = String.Format("ftp://{0}:{1}/{2}", _remoteHost, _remotePort, fileInf.Name);
   FtpWebRequest reqFTP;
   reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
   reqFTP.EnableSsl = true;
   reqFTP.Credentials = new NetworkCredential(_remoteUser, _remotePass);
   reqFTP.KeepAlive = false;
   reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
   reqFTP.UseBinary = true;

   //Method1:Bypass Cert
   ServicePointManager.ServerCertificateValidationCallback = (s, certificate, chain, sslPolicyErrors) => true;

   //Method2:Accept Cert
   //X509Certificate cert = new X509Certificate2("C:\\Path\\cert.pfx", "password");
   //string b = cert.GetCertHashString();
   //Console.WriteLine("hash string " + b);

   //ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
   //{
    //if (certificate.GetCertHashString().Equals(b))
    //{
     //Console.WriteLine("ServerCertificateValidation true");
     //return true;
    //}
    //else
    //{
     //Console.WriteLine("ServerCertificateValidation false");
     //return false;
    //}
   //};

   using (Stream ftpStream = reqFTP.GetResponse().GetResponseStream())
   {
    using (Stream fileStream = File.Create(filename))
    {
     byte[] buffer = new byte[10240];
     int read;
     while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
     {
      fileStream.Write(buffer, 0, read);
      Console.WriteLine("Downloaded {0} bytes", fileStream.Position);
     }
    }
   }
  }
 }
}


2. App.Config

Add Setting And Value in XML format.

1. setting name="TargetFtpSource" serializeas="String" value>X.X.X.X
2. setting name="TargetFtpSourcePort" serializeas="String" value>XX
3. setting name="TargetFtpSecureUser" serializeas="String" value>XXXX
4. setting name="TargetFtpSecurePass" serializeas="String" value>XXXX


3. Program.cs

using System;
using FTP_DLL.Properties;

namespace FTP_DLL
{
 class Program
 {
  static void Main(string[] args)
  {
   try
   {
    FTP ftp = new FTP(Settings.Default.TargetFtpSource, Settings.Default.TargetFtpSourcePort, Settings.Default.TargetFtpSecureUser, Settings.Default.TargetFtpSecurePass);
    //Upload and Download Function (Type File Path e.g.:C:\XXX)
    ftp.SSLUpload("FILE_PATH");
    ftp.SSLDownload("FILE_PATH");
   }
   catch (Exception e)
   {
    Console.WriteLine("Caught Error :" + e.Message);
   }
  }
 }
}

2018年10月12日 星期五

兩條實用SQL Server Select statement

1. 找尋STORED PROCEDURE內含有的字元
SELECT name
FROM sys.procedures
WHERE Object_definition(object_id) LIKE '%ABC%'


2. 找尋最近修改的STORED PROCEDURE及TABLE
Select * from sys.objects
order by modify_date desc

以上兩條SQL都是我常用的,對Merge Code及Debug時非常有幫助,希望幫到大家

2016年3月29日 星期二

C#連接OPC Server (Intouch 2014 R2 using Suitelink)

最近煩惱如何C#連接Intouch 2014 R2,並且要將Tag value寫入Intouch當中,對於我這個Intouch的菜鳥,這是非常的困難,但經過經驗人仕指導一番後就成功了。以下是一個分享:
先下載opcdaauto.dll,作為Project的Reference,再寫入下面經過改良的Class,當中不難看出Class包含連接OPC Server、創建Client Group及寫入Tag Value。
using OPCAutomation;

public class OPC
{
OPCServer KepServer;
OPCGroups KepGroups;
OPCGroup KepGroup;
OPCItems KepItems;
OPCItem KepItem;
string strHostIP = "";
string strHostName = "";
int itmHandleClient = 0;

public bool GetLocalServer()
{
  IPHostEntry IPHost = Dns.GetHostEntry(Environment.MachineName);
  if (IPHost.AddressList.Length > 0)
  {
    strHostIP = IPHost.AddressList[0].ToString();
  }
  else
  {
    MessageBox.Show("GetLocalServer Error 1");
    return false;
  }
  IPHostEntry ipHostEntry = Dns.GetHostEntry(strHostIP);
  strHostName = ipHostEntry.HostName.ToString();
  try
  {
   KepServer = new OPCServer();
   object serverList = KepServer.GetOPCServers();
   KepServer.Connect(((Array)serverList).GetValue(1).ToString(),"localhost");
  }
  catch(Exception ex)
  {
   MessageBox.Show("GetLocalServer Error 2 " + ex.Message);
   return false;
  }
  return true;
}

public bool CreateGroup()
{
  try
  {
    KepGroups = KepServer.OPCGroups;
    KepGroup = KepGroups.Add("MaxsonProgram");
    SetGroupProperty();
    KepGroup.DataChange += new   DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
   KepGroup.AsyncWriteComplete += new   DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete);
   KepItems = KepGroup.OPCItems;
  }
  catch (Exception err)
  {
   MessageBox.Show(err.Message, "CreateGroup提示信息", MessageBoxButtons.OK,     MessageBoxIcon.Warning);
   return false;
  }
  return true;
}

public void SetGroupProperty()
{
  KepServer.OPCGroups.DefaultGroupIsActive = true;
  KepServer.OPCGroups.DefaultGroupDeadband = 0;
  KepGroup.UpdateRate = 1000;
  KepGroup.IsActive = true;
  KepGroup.IsSubscribed = true;
}

void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
{
  MessageBox.Show("Success Write");
}

void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
}

public void opcWrite(string tagname, string value)
{
  try
  {
   Array Errors;
   int cancelID;
   KepItem = KepItems.AddItem(tagname, itmHandleClient);
   int[] temp2 = new int[2] { 0, KepItem.ServerHandle };
   Array serverHandles = (Array)temp2;
   object[] valueTemp = new object[2] { "", value };
   Array values = (Array)valueTemp;
   KepGroup.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
   KepItems.Remove(KepItems.Count, ref serverHandles, out Errors);
   GC.Collect();
 }
 catch (Exception ex) { MessageBox.Show(ex.Message); }
 }
}

如果想調用OPC Class,可依下面作為參考。
OPC opc = new OPC();
if (opc.GetLocalServer())
{
 if (opc.CreateGroup())
 {
   opc.opcWrite("SuiteLink.Topic.Test02", "30");   
   opc.opcWrite("SuiteLink.Topic.Rainfall_Value", "10.33"); 
   opc.opcWrite("SuiteLink.Topic.Rainfall_X", "123.456");  
   opc.opcWrite("SuiteLink.Topic.Rainfall_Y", "654.321");  
   opc.opcWrite("SuiteLink.Topic.WinterMode", "1");  
   opc.opcWrite("SuiteLink.Topic.NormalMode", "0");  
   opc.opcWrite("SuiteLink.Topic.TriggerLevel", "1.6");  
   opc.opcWrite("SuiteLink.Topic.RainingState", "0");
  }

Intouch Setting如下:




Visual Studio Setting如下(.net 4.5 + 32 bit CPU):(必須,我試了很多次,這是必須,否則會連接不上,這可是的花了很多時間得出來的結論)


如果設定成功及運行C# Application,你會在Intouch Viewer中看到Tag Value會改變,亦即代表你成功了。

2016年3月2日 星期三

C# Backgroundworker進階教學(Thread.Sleep的正確使用)

System.Threading.Thread.Sleep相信各位Winform的程式員都知道是什麼,就是停止運作一定的時間,但作為一個已進化的菜鳥,不能夠在正常情況可使用,最好是在BackgroundWorker內用,就能夠神不知鬼不覺,因為當你不在BackgroundWorker內使用,該死的界面就會顯示(Not Responding)的字句,客戶就會走來找你,問是不是死機啊‧‧‧以下是一個簡單的例子。

1‧創建一個WINFORM界面,並新增4個Control─label1、button1、toolStripProgressBar1、backgroundworker1

*backgroundworker1不是User Interface*

2‧background新增Event Handler

WorkerReportsProgress一定要set成true,否則不能加入ProgressChanged Event。
this.backgroundWorker1.WorkerReportsProgress = true;
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);

3‧ProgressChanged Event

主要是紀錄進度,除了toolStripProgressBar,toolStripLabel也是能夠更改的。
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   // The progress percentage is a property of e
   toolStripProgressBar1.Value = e.ProgressPercentage;
}

4‧DoWork Event

DoWork這裡會轉換label1的文字,ProgressBar亦會紀錄進度,Thread.Sleep在這裡使用。
在function內接觸Control類的,需要加入Invoke(Action),才可運行,否則會彈出跨線程錯誤。
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   Args arg = (Args)e.Argument;
   string a = arg.a;
   string b = arg.b;
   backgroundWorker1.ReportProgress(0);
   label1.Invoke(new Action(() => { label1.Text = b; }));
   backgroundWorker1.ReportProgress(30);
   Thread.Sleep(1000);
   backgroundWorker1.ReportProgress(60);
   label1.Invoke(new Action(() => { label1.Text = a; }));
   backgroundWorker1.ReportProgress(100);
   Thread.Sleep(1000);
   backgroundWorker1.ReportProgress(0);
   button1.Invoke((Action)(() => button1.Enabled = true));
}

5‧Args Class

在DoWork拿取Control的數值、文字是比較困難的,最好的方法是由外面掉Parameter入DoWork Function,所以先創建一個Class。
簡簡單單,看得明白就好。
internal class Args
{
   internal string a { get; set; }
   internal string b { get; set; }
}

5‧Button1 Action

Button1用來啟動BackgroundWorker,而且將剛才的Class放入DoWork這個Function裡面。

private void button1_Click(object sender, EventArgs e)
{
   button1.Enabled = false;
   var args = new Args() { a = "YES", b = "NO" };
   backgroundWorker1.RunWorkerAsync(args);
}

6‧結果

運行時可以見到label1由"No"變成"Yes",而ProgressBar亦會上升,為時大約5秒,而且UI不會出現Not Responding字樣,所以成功了。



這個Backgroundworker、progressbar的進階教學也完結了,多謝各位。

Compressor.io 縮圖大小網頁

網頁3大元素:文字、圖片、影像,三者不可或缺,特別是圖片及影像佔用大量網頁流量傳輸的資源,如何去減少這類資源,以提供瀏覽網頁的用戶更好的體驗,也是一門學問。在此,想分享一下如何壓縮圖片的檔案大小,而畫質也不會很差。
坊間有很多縮圖網站,例如TinyPNG、Compressor.io等等,經過我的多次測試,發現Compressor.io壓縮能力最高(個人意見),所以我會分享Compressor.io的縮圖方法。

網址: https://compressor.io/

以下是需要縮減檔案大小的香港天文台黃雨標誌(139KB),如果網頁用戶用電話瀏覽網頁時使用流動數據,網頁用戶一定會鬧‧‧‧



以下是Compressor.io主頁界面,按一下"Try it"就可以開始了。



有2種縮圖模式,一種Lossy,一種Lossless,很熟悉,像是中學教過的,於是找找資料。

#(Lossless)無損壓縮也即壓縮前和解壓縮後的數據完全一致。多數的無損壓縮都採用RLE行程編碼算法。(Lossy)有損壓縮意味著解壓縮後的數據與壓縮前的數據不一致。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復。幾乎所有高壓縮的算法都採用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮後的效果一般越差。此外,某些有損壓縮算法採用多次重複壓縮的方式,這樣還會引起額外的數據丟失。#
通常,我會選取Lossless,壓縮完後的檔案會比較好,失真不會太過嚴重,當然Lossy都不會有大問題。之後按下"Select File"按鈕,選取想要被壓縮的圖片,我選擇了一個黃雨標誌。


結果出現了!!!

檔案大小由139KB,大幅縮減至29.03KB,足足減少了110KB,少了400%,而圖片也沒有失真,以後做圖之後都一定要來壓圖才行。按一下"Download your file"就可打包下載,也有Google Drive,Dropbox選項,非常方便。