post {
success {
emailext (
subject: "${env.JOB_NAME} [${env.BUILD_NUMBER}] 更新正常",
body: """
內容:
SUCCESSFUL: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]
狀態:${env.JOB_NAME} jenkins 更新執行正常
URL :${env.BUILD_URL}
項目 :${env.JOB_NAME}
項目更新进度:${env.BUILD_NUMBER}
""",
to: USER_MAIL,
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
failure {
emailext (
subject: "${env.JOB_NAME} [${env.BUILD_NUMBER}] 更新失敗",
body: """
內容:
FAILED: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]
狀態:${env.JOB_NAME} jenkins 執行失敗
URL :${env.BUILD_URL}
項目 :${env.JOB_NAME}
項目更新進度:${env.BUILD_NUMBER}
ERROR_CODE: ${ERROR_CODE}
""",
to: USER_MAIL,
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
}
SHOWcode
2021年1月6日 星期三
Jenkins-mail
2020年12月29日 星期二
Kubeadm
Install Kubernetes Cluster using kubeadm
*Verify the MAC address and product_uuid are unique for every node
3個ubuntu 環境都是分別裝起來 避免 kubeadm 不必要的衝突
環境:
Oracle VM VirtualBox 6.1
master-ubuntu-desktop 20.04 LTS版
node01-ubuntu-desktop 20.04 LTS版
node02-ubuntu-desktop 20.04 LTS版
Role | IP(根據分到的IP) | OS | RAM | CPU |
|---|---|---|---|---|
Master | 192.168.11.136 | Ubuntu 20.04 | 2G | 2 |
node01 | 192.168.11.138 | Ubuntu 20.04 | 2G | 2 |
node02 | 192.168.11.139 | Ubuntu 20.04 | 2G | 2 |
工具版本
docker-ce=5:19.03.10~3-0~ubuntu-focal //apt-cache madison docker-ce 會查到其他版本資訊
kubeadm=1.18.5-00
kubelet=1.18.5-00
kubectl=1.18.5-00Oracle VM VirtualBox 6.1 主要設定:
網路 介面卡
附加到: 橋接介面卡(模擬真實主機狀態)
*使用root 權限
$ sudo -i1.關掉防火牆(ufw disable)
$ ufw disable2.關閉虛擬記憶體(Disable swap)
$ swapoff -a
$ sed -i '/swap/d' /etc/fstab3.更新 Kubernetes network 系統設定
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system4.安裝 Docker engine (Install docker engine)
$ apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ apt update
$ apt install -y docker-ce=5:19.03.10~3-0~ubuntu-focal containerd.ioKubernetes Setup
5.Add Apt repository
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list6.Install Kubernetes components
$ apt update && apt install -y kubeadm=1.18.5-00 kubelet=1.18.5-00 kubectl=1.18.5-00
$ apt-mark hold kubelet kubeadm kubectl**以上是所有機器需要做的事情
On Master-(只有Master 主機需要安裝)
Initialize Kubernetes Cluster
1.Update the below command with the ip address of master
$ sudo kubeadm init --apiserver-advertise-address=192.168.11.136 --pod-network-cidr=192.168.0.0/16 --ignore-preflight-errors=allCNI Plugin: (主要基本功能提供 Pod x Pod 連線 )
Calico CNI (Container Network Interface):192.168.0.0/16 (本次使用)
Calico=>除了基本功能,還有提供其他功能
Flannel CNI:10.244.0.0/16
2.Deploy Calico network
$ sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf create -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml3.Cluster join command -如果忘記紀錄 Join master 指令 可以輸入這段找回
$ sudo kubeadm token create --print-join-command4. To be able to run kubectl commands as non-root user
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/configNODE-(其他節點加入Master)
將節點加入 Master
指令是 Master 產生 貼在ubuntu-NODE 執行
$ kubeadm join 192.168.11.136:6443 --token aujovi.2ewddfc9ypkqfbp0 --discovery-token-ca-cert-hash sha256:d70c148ac96428574fa146ccf90bf8a3fdb806fdba4bc3766509065f3645b57a如果沒記錄到在ubuntu-Master 輸入以下指令找回:
$ sudo kubeadm token create --print-join-command完成圖:
測試:
kubeadm 預設Master是不執行Pod工作,如果需要可以下指令一起分安工作
//所有主伺服器都安排 pod
$ kubectl taint nodes --all node-role.kubernetes.io/master-
//指定節點 master 伺服器都安排 pod
$ kubectl taint nodes <master-hostname> node-role.kubernetes.io/master-
ex:kubectl taint nodes master node-role.kubernetes.io/master-deployment-test:
kubectl create deployment nginx --image=nginx:1.7.9如圖:
Master-
node01-docker 會看到 deploument 的 nginx
其他設定:
將 node01 & node02 ROLES 標記 worker
$ kubectl label node <node_name> node-role.kubernetes.io/worker=worker
node/<node_name> labeled
EX:
$ kubectl label node node01 node-role.kubernetes.io/worker=worker
node/node01 labeled
$ kubectl label node node02 node-role.kubernetes.io/worker=worker
node/node02 labeled如果 worker節點加入 master 時配置有問題可以在 worker節點上使用 kubeadm reset 重置配置再使用 kubeadm join 命令重新加入即可。
$ kubeadm reset希望在 master 節點刪除 node ,可以使用 kubeadm delete nodes 刪除。
$ kubeadm delete nodes
2020年9月30日 星期三
Google cloud port 無法連線
2020年5月19日 星期二
C#.NET datatable distinct
在C# 將 DataTable 裡的資料進行 Distinct
DataTable Dt_data = NEW DataTable();
Dt_data = mySource.DefaultView.ToTable(true, new string[]{ "欄位" });
2020年4月1日 星期三
C# 檔案操作法
C# 檔案操作方法
Directory.Exists(FILENAME); //是否有檔案 Directory.Delete(FILENAME); //刪除檔案 Directory.CreateDirectory(FILENAME); //創建檔案 System.IO.File.Move(FILENAME, FILENAME); //移動檔案
文字檔.txt String.Split(';') 轉陣列
文字檔.txt String.Split(';') 轉陣列
string_str.txt = aaa;bbb;ccc;ddd
try{
System.IO.StreamReader sr = new System.IO.StreamReader("string_str.txt");
string[] connect_string = sr.ReadToEnd().Split(';');
string01 = connect_string[0].ToString();
string02= connect_string[1].ToString();
string03= connect_string[2].ToString();
string04= connect_string[3].ToString();
sr.Close();
}catch
{
MessageBox.Show("Error");
}
C# DataRow[] TO String
#region 輸入的VALUES
string str_values = "";
DataTable data_pigname = survive_data.DefaultView.ToTable(true, new string[] { "類別" });
for (int i = 0; i < data_pigname.Rows.Count; i++){
string str_mydata = "";
str_values += " { name: '" + data_pigname.Rows[i][0] + "', data: [";
for (int j = 1; j <= 12; j++){
string str_my = ddl_time.SelectedItem.Text.Trim() + "/" + j.ToString().PadLeft(2, '0');
//.PadLeft(補0)
DataRow[] data_pignow = survive_data.Select("年月 = '" + str_my + "'and 類別 = '" + data_pigname.Rows[i][0] + "'");
if (data_pignow.Length != 0){
str_mydata += data_pignow[0]["本月結存數"].ToString() + ",";
}else{
str_mydata += "0,";
}
}
str_values += str_mydata.Substring(0, str_mydata.Length - 1) + "] },";
}
survive_actual = str_values.Substring(0, str_values.Length - 1);
#endregion
MySQL獲取所有分類和每個分類的前N條記錄
原址:https://www.itread01.com/p/1133452.html
SELECT A1.*
FROM tb_sensor_values AS A1
INNER JOIN (
SELECT A.m_no,A.d_time
FROM tb_sensor_values AS A
LEFT JOIN tb_sensor_values AS B
ON A.m_no = B.m_no
AND A.d_time <= B.d_time
GROUP BY A.m_no,A.d_time
HAVING COUNT(B.d_time) <= 3
) AS B1
ON A1.m_no = B1.m_no
AND A1.d_time = B1.d_time
ORDER BY A1.m_no,A1.d_time DESC
2020年3月13日 星期五
2020年2月23日 星期日
DOT NET CORE_API_L1 DB連線?
來源參考:https://www.youtube.com/watch?v=_SprpIlxug8
~appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
//連線字串
"ConnectionStrings":{
"DefaultConnection":"Data Source=127.0.0.1;Initial Catalog=DBJosh;User ID=Josh;Password=123456"
},
"AllowedHosts": "*"
}
-----------------------------------------
~Startup.cs
using *;
//**************手動補上 命名空間
using Microsoft.Extensions.Configuration; //ConfigurationBuilder 會用到
using System.IO; //Directory 會用到
using System.Data.SqlClient; //SQL
using System.Text.Encodings.Web; //HtmlEcoder會用到(處理中文編碼)
//**************************END
namespace webapi
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
// await context.Response.WriteAsync("Hello World!");
//連線字串在appsetting.json 裡
var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
IConfiguration config = configurationBuilder.Build();
string connectionString = config["ConnectionStrings:DefaultConnection"];
var Conn = new SqlConnection(connectionString);
Conn.Open();
var Com = new SqlCommand("SELECT u_area FROM tb_User WHERE u_no = @u_no", Conn);
Com.Parameters.AddWithValue("u_no", 1);
using (SqlDataReader dr = Com.ExecuteReader()) {
while (dr.Read()) {
//1.中文亂解決--瀏覽器改UTF8
var title = dr["u_area"];
await context.Response.WriteAsync("<br />"+ title +"<hr />");
//2.中文亂碼解決 -- 不用修改瀏覽器--請加入 using System.Text.Encodings.Web;
var title2 = HtmlEncoder.Default.Encode(dr["u_area"].ToString());
await context.Response.WriteAsync("<br />" + title2+ "<hr />");
}
}
Conn.Close();
});
}
}
}
2020年2月11日 星期二
Trigger UPDATE,INSERT,DELETE
資料更改時同時寫入另一個表
USE [dbMES] GO /****** Object: Trigger [dbo].[tb_recordslog_Modify] Script Date: 2020/4/30 上午 09:00:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <KIRA> -- Create date: <20160727> -- Description: <Device setting> -- ============================================= ALTER TRIGGER [dbo].[tb_recordslog_Modify] on [dbo].[tb_recordslog] AFTER INSERT AS BEGIN --表格異動資料時會產生暫存的inserted和deleted兩個表格 --兩個表格格式資訊皆與原表格相同 --inserted紀錄insert資料、update後資料 --deleted紀錄delete資料、update前資料 --依據異動方式將異動資料新增到記錄檔 --inserted和deleted皆有資料表示為-UPDATE --inserted有資料deleted無資料表示為-INSERT IF EXISTS (select 1 from inserted) and Not EXISTS (select 1 from deleted) insert into tb_recordslog_1 select DID,DIP,SID,DVALUE,SYSTIME from inserted END
2020年2月3日 星期一
json 多table 分類 抓法
json 多table 分類 抓法
Jquery 抓Json 資料
<script src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var jqxhr = $.getJSON("./data_json/Filter_json/j97hq-92dsm_n.json", function () {
console.log("success");
})
//如果有這檔案會印出success
//$.getJSON("./data_json/Resonator_json/tl8oh-63gm2.json", function (json) {
// alert("JSON Data: " + json.name);
//});
//讀出json屬性的值,name是KEY,根據自己KEY定義改
//debugger;
var info = document.querySelector('.info');
var str = "";
$.getJSON("./data_json/Filter_json/j97hq-92dsm_n.json", function (json_data) {
// console.log(JSON.stringify(json));
// debugger;
var len = json_data.length; //資料比數
if (len != 0) {
for (var i = 0; i < len; i++) {
// var content = '<tr>' + '<td>名稱:' + datastr[i].name + ' </td>' + '<td>value_a:' + datastr[i].value_a + ' </td>' + '<td>value_b:' + datastr[i].value_b + ' </td>' + '<td>value_c:' + datastr[i].value_c + ' </td>' + '<td>value_d:' + datastr[i].value_d + ' </td>' + '<td>value_e:' + datastr[i].value_e + ' </td>' + '</tr>';
var content = "";
if (json_data[i].value_url != 'Null') {
content = '<tr>' + '<td> <a href="./pdf/Datasheet/' + json_data[i].value_url + '" target="_blank"> ' + json_data[i].name + '<img src="./img/pdf-download.png" width="51px" height="35px"></a></td>' + '<td>' + json_data[i].value_a + ' </td>' + '<td>' + json_data[i].value_b + ' </td>' + '<td>' + json_data[i].value_c + ' </td>' + '<td>' + json_data[i].value_d + ' </td>' + '<td> </td>' + '</tr>';
} else {
content = '<tr>' + '<td>' + json_data[i].name + ' </td>' + '<td>' + json_data[i].value_a + ' </td>' + '<td>' + json_data[i].value_b + ' </td>' + '<td>' + json_data[i].value_c + ' </td>' + '<td>' + json_data[i].value_d + ' </td>' + '<td> </td>' + '</tr>';
}
//console.log(content);
str += content;
};
} else {
var content = '<tr>' + '<td>Null</td>' + '<td>Null</td>' + '<td>Null</td>' + '<td>Null</td>' + '<td>Null</td>' + '<td>Null</td>' + '</tr>';
//console.log(content);
str += content;
}
info.innerHTML += str;
});
//將JSON印成字串
});
</script>
nginx服务无法停止(Windows)
nginx服务无法停止(Windows)
本文链接:https://blog.csdn.net/qq_36133698/article/details/88582539
本人一般停止nginx服务都是通过Windows自带的任务管理器来强制结束nginx进程实现的,如图
但是 这次我通过同样的方法来结束nginx服务,发现nginx的进程无法结束
首先我要确认了nginx服务还在运行,因为nginx是web服务器,正常启动的话,是可以访问它的网页的。例如:我们在浏览器中输入:127.0.0.1:8888(默认监听80端口,我这里修改了nginx.conf监听8888端口) 回车后,应该能看到一个欢迎页面(没有改默认网页的情况)。如果能够看到, 说明nginx启动正常。
然后我进入nginx根目录通过命令停止nginx服务,结果报错 如图
意思是nginx服务没有启动 所以nginx服务停止报错 这就很诡异啦 ngnix明明在偷偷运行 这里为啥会提示nginx没有运行呢。因为我的nginx监听的是8888端口 所以我就想 既然终端提示nginx服务停止了那8888端口就不会被监听,但是nginx的web页面可以访问 说明8888端口还在被监听 我只需要把监听8888端口的进程全部kill就可以停止nginx服务啦
cmd 输入命令 netstat -ano 如图 找到nginx监听端口的pid
通过cmd 命令tasklist|findstr "PID" 如图 找到监听8888端口的进程
确实发现有nginx服务在运行 通过cmd命令 taskkill /f /t /im nginx.exe 结束进程 结果如图
最后访问127.0.0.1:8888 失败 说明nginx服务被成功停止
2020年1月30日 星期四
C#.Net json to datatable
using System.Web.Script.Serialization;
using System.Collections;
using System.IO;
String line = "";
try
{ // Open the text file using a stream reader.
string filename = AppDomain.CurrentDomain.BaseDirectory;
using (StreamReader sr = new StreamReader(filename + @"\data_json\Antenna_DR_json\q9qwy-nvsns.json"))
{
// Read the stream to a string, and write the string to the console.
line = sr.ReadToEnd();
// Console.WriteLine(line);
}
}
catch (IOException ex)
{
}
DataTable json_data = JsonToDataTable(line);
#region json To datatable
public DataTable JsonToDataTable(string json)
{
DataTable dataTable = new DataTable(); //例項化
DataTable result;
try
{
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大數值
ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
if (arrayList.Count > 0)
{
foreach (Dictionary<string, object> dictionary in arrayList)
{
if (dictionary.Keys.Count<string>() == 0)
{
result = dataTable;
return result;
}
if (dataTable.Columns.Count == 0)
{
foreach (string current in dictionary.Keys)
{
dataTable.Columns.Add(current, dictionary[current].GetType());
}
}
DataRow dataRow = dataTable.NewRow();
foreach (string current in dictionary.Keys)
{
dataRow[current] = dictionary[current];
}
dataTable.Rows.Add(dataRow); //迴圈新增行到DataTable中
}
}
}
catch
{
}
result = dataTable;
return result;
}
#endregion
2020年1月19日 星期日
長時間裝載的ASP.NET頁面 在客戶端瀏覽器中顯示進度
对于加载时间比较长的ASP.NET页面,我们可以在客户端浏览器中显示进度条来显示页面正在装载。下面就是具体的实现过程:
新建项目,名字为WebPortal,在项目类型中选择Visual C#项目或者Visual Basic项目都可;
在模板类型中选择ASP.NET Web应用程序;
位置里输入:http://localhost/WebPortal;
添加新项:名字为ShowProgress的Web窗体。
在您的Web窗体ShowProgress.aspx上添加任何其他的Web服务器控件。
在ShowProgress.aspx上单击右键,点“查看代码”,在最上面输入:
Visual C# .NET代码
using System.Threading;
Visual Basic .NET代码
Imports System.Threading
在Page_Load事件里输入: Visual C# .NET代码
Response.Write("<div id='mydiv' >");
Response.Write("_");
Response.Write("</div>");
Response.Write("<script>mydiv.innerText = '';</script>");
Response.Write("<script language=javascript>;");
Response.Write("var dots = 0;var dotmax = 10;function ShowWait()");
Response.Write("{var output; output = '正在装载页面';dots++;if(dots>=dotmax)dots=1;");
Response.Write("for(var x = 0;x < dots;x++){output += '·';}mydiv.innerText = output;}");
Response.Write("function StartShowWait(){mydiv.style.visibility = 'visible'; ");
Response.Write("window.setInterval('ShowWait()',1000);}");
Response.Write("function HideWait(){mydiv.style.visibility = 'hidden';");
Response.Write("window.clearInterval();}");
Response.Write("StartShowWait();</script>");
Response.Flush();
Thread.Sleep(10000);
Visual Basic .NET代码
Response.Write("<div id='mydiv' >")
Response.Write("_")
Response.Write("</div>")
Response.Write("<script>mydiv.innerText = '';</script>")
Response.Write("<script language=javascript>;")
Response.Write("var dots = 0;var dotmax = 10;function ShowWait()")
Response.Write("{var output; output = '正在装载页面';dots++;if(dots>=dotmax)dots=1;")
Response.Write("for(var x = 0;x < dots;x++){output += '·';}mydiv.innerText = output;}")
Response.Write("function StartShowWait(){mydiv.style.visibility = 'visible'; ")
Response.Write("window.setInterval('ShowWait()',1000);}")
Response.Write("function HideWait(){mydiv.style.visibility='hidden';")
Response.Write("window.clearInterval();}")
Response.Write("StartShowWait();</script>")
Response.Flush()
Thread.Sleep(10000)
在ShowProgress.aspx窗体的html的中输入:
<script>
HideWait();
</script>
資料來源:https://blog.csdn.net/luyifeiniu/article/details/45230
2020年1月17日 星期五
Angular 8降级到Angular 7
npm --nodjs
ng --version
npm uninstall -g @angular/cli
npm cache clean --force
npm install -g @angular/cli@7.3.9
ng --version
-- 創建Angular
ng new ClientApp
2019年11月8日 星期五
2019年5月26日 星期日
pyQt5 button 事件(紀錄)
def setupUi(self, Form): Form.setObjectName("Form") Form.resize(489, 400) self.bt_file01 = QtWidgets.QPushButton(Form) self.bt_file01.setGeometry(QtCore.QRect(100, 140, 91, 51)) self.bt_file01.setObjectName("bt_file01") self.bt_file01.clicked.connect(self.hello)
def hello(self): self.lb_title.setText("hello 我被觸發了")
Jenkins-mail
參考:http://www.linuxea.com/1767.html 前置作業略過~有空再補 Mailer Plugin post { success { emailext ( subject: ...
-
ASP.NET刷新頁面的六種方法 第一: private void Button1_Click( object sender, System.EventArgs e ) { Response.Redirect( Request.Url.ToSt...
-
foreach (string fname in System.IO.Directory.GetFileSystemEntries(@"C:\Users\joshs")) { //if (fn...