Ⅰ 通達信神奇九轉指標源碼
通達信的神奇九轉指標源碼選擇公式直接打開指標公式編輯器就可以看到公式源碼,該公式沒有加密直接就可以看。{買入結構}
B:=CDRAWNUMBER(N=6 AND REFXV(COUNT(B,6),5)=6 AND REF(B,1)=0,L,1),COLORRED;
DRAWNUMBER(N=7 AND REFXV(COUNT(B,7),6)=7 AND REF(B,1)=0,L,1),COLORRED;
DRAWNUMBER(N=8 AND REFXV(COUNT(B,8),7)=8 AND REF(B,1)=0,L,1),COLORRED;
DRAWNUMBER(N>=9 AND REFXV(COUNT(B,9),8)=9 AND REF(B,1)=0,L,1),COLORRED;
DRAWNUMBER(N=1 AND COUNT(B,6)=6 AND REF(B,6)=0,L,6),COLORRED;
DRAWNUMBER(N=2 AND REFXV(COUNT(B,2),1)=2 AND COUNT(B,6)=6 AND REF(B,6)=0,L,6),COLORRED;
DRAWNUMBER(N=3 AND REFXV(COUNT(B,3),2)=3 AND COUNT(B,6)=6 AND REF(B,6)=0,L,6),COLORRED;
DRAWNUMBER(N>=4 AND REFXV(COUNT(B,4),3)=4 AND COUNT(B,6)=6 AND REF(B,6)=0,L,6),COLORRED;
DRAWNUMBER(N=1 AND COUNT(B,7)=7 AND REF(B,7)=0,L,7),COLORRED;
DRAWNUMBER(N=2 AND REFXV(COUNT(B,3),1)=3 AND COUNT(B,7)=7 AND REF(B,7)=0,L,7),COLORRED;
DRAWNUMBER(N>=3 AND REFXV(COUNT(B,3),2)=3 AND COUNT(B,7)=7 AND REF(B,7)=0,L,7),COLORRED;
DRAWNUMBER(N=2 AND COUNT(B,8)=8 AND REF(B,8)=0,L,8),COLORRED;
DRAWNUMBER(N>=2 AND REFXV(COUNT(B,2),1)=2 AND COUNT(B,8)=8 AND REF(B,8)=0,L,8),COLORRED;
DRAWNUMBER(N>=1 AND COUNT(B,9)=9 AND REF(B,9)=0,L,9),COLORGREEN;
{賣出結構}
S:=C>REF(C,4);
DRAWNUMBER(N=6 AND REFXV(COUNT(S,6),5)=6 AND REF(S,1)=0,H*1.01,1),COLORMAGENTA;
DRAWNUMBER(N=7 AND REFXV(COUNT(S,7),6)=7 AND REF(S,1)=0,H*1.01,1),COLORMAGENTA;
DRAWNUMBER(N=8 AND REFXV(COUNT(S,8),7)=8 AND REF(S,1)=0,H*1.01,1),COLORMAGENTA;
DRAWNUMBER(N>=9 AND REFXV(COUNT(S,9),8)=9 AND REF(S,1)=0,H*1.01,1),COLORMAGENTA;
DRAWNUMBER(N=5 AND REFXV(COUNT(S,5),4)=5 AND COUNT(S,2)=2 AND REF(S,1)=0,H*1.01,2),COLORMAGENTA;
DRAWNUMBER(N=6 AND REFXV(COUNT(S,6),5)=6 AND COUNT(S,2)=2 AND REF(S,1)=0,H*1.01,2),COLORMAGENTA;
DRAWNUMBER(N=7 AND REFXV(COUNT(S,7),6)=7 AND COUNT(S,2)=2 AND REF(S,1)=0,H*1.01,2),COLORMAGENTA;
DRAWNUMBER(N>=8 AND REFXV(COUNT(S,8),7)=8 AND COUNT(S,2)=2 AND REF(S,2)=0,H*1.01,2),COLORMAGENTA;
DRAWNUMBER(N=4 AND REFXV(COUNT(S,4),3)=4 AND COUNT(S,3)=3 AND REF(S,3)=0,H*1.01,3),COLORMAGENTA;
DRAWNUMBER(N=5 AND REFXV(COUNT(S,5),4)=5 AND COUNT(S,3)=3 AND REF(S,3)=0,H*1.01,3),COLORMAGENTA;
DRAWNUMBER(N=6 AND REFXV(COUNT(S,6),5)=6 AND COUNT(S,3)=3 AND REF(S,3)=0,H*1.01,3),COLORMAGENTA;
DRAWNUMBER(N>=7 AND REFXV(COUNT(S,7),6)=7 AND COUNT(S,3)=3 AND REF(S,3)=0,H*1.01,3),COLORMAGENTA;
DRAWNUMBER(N=3 AND REFXV(COUNT(S,3),2)=3 AND COUNT(S,4)=4 AND REF(S,4)=0,H*1.01,4),COLORMAGENTA;
DRAWNUMBER(N=4 AND REFXV(COUNT(S,4),3)=4 AND COUNT(S,4)=4 AND REF(S,4)=0,H*1.01,4),COLORMAGENTA;
DRAWNUMBER(N=5 AND REFXV(COUNT(S,5),4)=5 AND COUNT(S,4)=4 AND REF(S,4)=0,H*1.01,4),COLORMAGENTA;
DRAWNUMBER(N>=6 AND REFXV(COUNT(S,6),5)=6 AND COUNT(S,4)=4 AND REF(S,4)=0,H*1.01,4),COLORMAGENTA;
DRAWNUMBER(N=2 AND REFXV(COUNT(S,2),1)=2 AND COUNT(S,5)=5 AND REF(S,5)=0,H*1.01,5),COLORMAGENTA;
DRAWNUMBER(N=3 AND REFXV(COUNT(S,3),2)=3 AND COUNT(S,5)=5 AND REF(S,5)=0,H*1.01,5),COLORMAGENTA;
DRAWNUMBER(N=4 AND REFXV(COUNT(S,4),3)=4 AND COUNT(S,5)=5 AND REF(S,5)=0,H*1.01,5),COLORMAGENTA;
DRAWNUMBER(N>=5 AND REFXV(COUNT(S,5),4)=5 AND COUNT(S,5)=5 AND REF(S,5)=0,H*1.01,5),COLORMAGENTA;
DRAWNUMBER(N=1 AND COUNT(S,6)=6 AND REF(S,6)=0,H*1.01,6),COLORMAGENTA;
DRAWNUMBER(N=2 AND REFXV(COUNT(S,2),1)=2 AND COUNT(S,6)=6 AND REF(S,6)=0,H*1.01,6),COLORMAGENTA;
DRAWNUMBER(N=3 AND REFXV(COUNT(S,3),2)=3 AND COUNT(S,6)=6 AND REF(S,6)=0,H*1.01,6),COLORMAGENTA;
DRAWNUMBER(N>=4 AND REFXV(COUNT(S,4),3)=4 AND COUNT(S,6)=6 AND REF(S,6)=0,H*1.01,6),COLORMAGENTA;
DRAWNUMBER(N=1 AND COUNT(S,7)=7 AND REF(S,7)=0,H*1.01,7),COLORMAGENTA;
DRAWNUMBER(N=2 AND REFXV(COUNT(S,3),1)=3 AND COUNT(S,7)=7 AND REF(S,7)=0,H*1.01,7),COLORMAGENTA;
Ⅱ 求一個c++小程序源代碼,要求200行以上,給100分,能用再加100
//=================================[說明]=======================================*/
//學生成績管理
//文件名:main.cpp
//------!!!!!!---------BOF-[程序代碼開始]-------------------
#include<iostream>
#include<string>
using namespace std;
//=============<開始定義結構體>===================================================
struct combox
{
int num;
int mark;
string name;
combox *next;
};
//=============<結束定義結構體>===================================================
//=============<開始定義Commonbox類>==============================================
//-----類體開始------------------------
class Commonbox
{
private:
combox *head;
void Swap(combox *,combox *); //交換兩個combox變數的數據域
void Print(combox *); //輸出一combox指定的記錄
combox *Find(int); //查找條例條件的記錄,並返回該記錄的指針
public:
Commonbox()
{
head=NULL;
}
int ListCount(); //統計當前鏈表的記錄總數,返回一個整數
void AddItem(int num, string name, int mark); //添加一條記錄到表尾
void RemoveItem(int); //刪除一條指定的記錄
void List(); //列出當前鏈表中的所有記錄
void Sort(); //對當前鏈表進行排序
void Search(int); //在當前鏈表查找指定記錄並輸出
float Average(); //計算平均成績
};
//-----類體結束------------------------
//-----類成員函數開始----------------------------------
int Commonbox::ListCount() //統計當前鏈表的記錄總數,返回一個整數
{
if (! head)return 0;
combox *p=head;
int n=0;
while (p)
{
n++;
p=p->next;
}
return n;
}
void Commonbox::AddItem(int num, string name, int mark) //添加一條記錄到表尾
{
if (! head)
{
head=new combox;
head->mark=mark;
head->num=num;
head->name=name;
head->next=NULL;
return;
}
combox *t=head;
while (t && t->num!=num)
t=t->next;
if (t)
{
cout<<"操作失敗:學號為"<<num<<"的記錄已經存在!"<<endl;
return;
}
combox *p=head;
while (p->next)p=p->next;
combox *p1=new combox;
p1->num=num;
p1->mark=mark;
p1->name=name;
p1->next=NULL;
p->next=p1;
return;
}
void Commonbox::RemoveItem(int num) //刪除一條指定的記錄
{
combox *t=Find(num);
if (! t)return;
combox *p=head;
//如果要刪除的記錄位於表頭
if (head==t)
{
head=head->next;
delete p;
cout <<"成功刪除學號為 "<<num<<" 的記錄!"<<endl<<endl;
return;
}
while (p->next!=t)p=p->next;
combox *p1=p->next;
p->next=p1->next;
delete p1;
cout <<"成功刪除學號為 "<<num<<" 的記錄!"<<endl<<endl;
return;
}
void Commonbox::Print(combox *p) //輸出一combox指定的記錄
{
cout<<p->num<<"\t\t";
cout<<p->name<<"\t\t";
cout<<p->mark<<endl;
return;
}
void Commonbox::List() //列出當前鏈表中的所有記錄
{
if (ListCount()==0)
{
cout <<"錯誤:當前的列表為空!"<<endl;
return;
}
combox *p=head;
cout<<"共有記錄:"<<ListCount()<<endl;
cout<<"學號\t\t姓名\t\t分數"<<endl;
while (p)
{
Print(p);
p=p->next;
}
cout <<endl;
return;
}
void Commonbox::Search(int num) //在當前鏈表查找指定記錄並輸出
{
cout <<"Searching...."<<endl;
combox *p=Find(num);
if (p)
{
cout<<"學號\t\t姓名\t\t分數"<<endl;
Print(p);
}
cout <<endl;
}
combox *Commonbox::Find(int num)
{
if (ListCount()==0)
{
cout <<"錯誤:當前的列表為空!"<<endl;
return NULL;
}
combox *p=head;
while (p)
{
if (p->num==num)break;
p=p->next;
}
if (! p)
{
cout <<"錯誤:找不到該記錄!\n";
return NULL;
}
return p;
}
void Commonbox::Swap(combox *p1, combox *p2) //交換兩個combox變數的數據域
{
combox *temp=new combox;
temp->num=p1->num;
temp->mark=p1->mark;
temp->name=p1->name;
p1->num=p2->num;
p1->mark=p2->mark;
p1->name=p2->name;
p2->num=temp->num;
p2->mark=temp->mark;
p2->name=temp->name;
}
void Commonbox::Sort() //對當前鏈表進行排序
{
cout <<"Sorting..."<<endl;
if (ListCount()<2) return;
combox *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=ListCount(),i,j;
p=head;
for (i=1;i<n;i++)
{
k=p;
p1=p->next;
for (j=0;j<n-i;j++)
{
if (k->num > p1->num)
{
k=p1;
}
p1=p1->next;
}
if (p!=k)Swap(k,p);
p=p->next;
}
cout <<"Complete successfully!"<<endl<<endl;
return;
}
float Commonbox::Average() //計算平均成績
{
if (ListCount()==0)
{
cout <<"錯誤:當前的列表為空!"<<endl;
return -1;
}
int sum=0,n=0;
combox *p=head;
while (p)
{
sum += p->mark;
p=p->next;
n++;
}
return float(sum)/n;
}
//-----類成員函數結束----------------------------------
//=============<結束定義Commonbox類>==============================================
Commonbox student; //定義全局變數
int Menu()
{
cout <<"===========[主選單:]==========="<<endl;
int n=1,select=-1;
cout <<n++<<".輸入學生成績;"<<endl<<endl;
cout <<n++<<".按學號排序;"<<endl<<endl;
cout <<n++<<".按學號查找記錄;"<<endl<<endl;
cout <<n++<<".刪除由學號指定的記錄;"<<endl<<endl;
cout <<n++<<".列出所有記錄;"<<endl<<endl;
cout <<n++<<".計算平均成績;"<<endl<<endl;
cout <<"0.退出;"<<endl<<endl;
cout <<"[請選擇(輸入相應數字)]:";
cin >>select;
return select;
}
char Exit() //返回一個字元患,用於確認退出
{
char s;
cout<<"確定要退出程序嗎?[Y/N]:";
cin >>s;
return s;
}
void Input(int *num, string *name, int *mark) //輸入學生信息
{
cout <<"請輸入 學號 姓名 分數:";
cin >>*num;
if (*num==-1)return;
cin >>*name>>*mark;
return;
}
void AddNew() //增加記錄
{
int num=0,mark=0;
string name="";
cout<<endl<<"當輸入的學號為-1時表示結束輸入."<<endl;
Input(&num, &name, &mark);
while (num!=-1)
{
student.AddItem(num,name,mark);
Input(&num, &name, &mark);
}
return;
}
void DoFind() //按學號查找
{
int num;
cout<<endl<<"當輸入的學號為-1時表示結束輸入."<<endl;
do
{
cout <<"請輸入要查找的學生的學號: ";
cin>>num;
if (num==-1)continue;
student.Search(num);
}
while (num!=-1);
return;
}
void DoDelete() //刪除記錄
{
cout<<endl<<"當輸入的學號為-1時表示結束輸入."<<endl;
int num;
do
{
cout <<"請輸入要刪除的學生的學號:";
cin>>num;
if (num==-1)continue;
student.RemoveItem(num);
}
while (num!=-1);
return;
}
void ShowAverage() //輸出平均數
{
float avr=student.Average();
if (avr>0)
{
cout<<"共有記錄:\t"<<student.ListCount()<<endl<<endl;
cout<<"平均成績:\t"<<avr<<endl<<endl;
}
return;
}
//-------******<主函數開始>******-------
int main()
{
cout<<"Welcome!\n學生成績管理系統\nVer 1.01\nBy FondBoy\n\n";
int select;
char s;
while (1)
{
select=Menu();
switch (select)
{
case 0: //退出程序
s=Exit();
if (s=='y' || s=='Y')return 0;
break;
case 1: //輸入學生成績
AddNew();
break;
case 2: //按學號排序
student.Sort();
break;
case 3: //按學號查找記錄
DoFind();
break;
case 4: //刪除由學號指定的記錄
DoDelete();
break;
case 5: //列出所有記錄
student.List();
break;
case 6: //輸出平均成績
ShowAverage();
break;
default:
cout<<"無效輸入!"<<endl;
}
}
return 0;
}
//-------******<主函數結束>******-------
//------!!!!!!---------EOF-[程序代碼結束]-------------------
Ⅲ 9塊9包郵源碼用英語怎麼說
9塊9包郵源碼_
譯
9 piece 9 parcel post source code
Ⅳ 為什麼有的URL長,有的短
一、前言
前幾天整理面試題的時候,有一道試題是《如何將一個很長的URL轉換為一個短的URL,並實現他們之間的相互轉換?》,現在想起來這是一個絕對不簡單的問題,需要考慮很多方面,今天和大家一起學習研究一下!
短網址:顧名思義,就是將長網址縮短到一個很短的網址,用戶訪問這個短網址可以重定向到原本的長網址(也就是還原的過程)。這樣可以達到易於記憶、轉換的目的,常用於有字數限制的微博、二維碼等等場景。
關於短URL的使用場景,舉個簡單的例子來說明一下,看一下業務中使用短URL的重要性!
二、短地址使用場景
1、新浪微博
我們在新浪微博上發布網址的時候,微博會自動判別網址,並將其轉換,例如:https://t.cn/RuPKzRW。為什麼要這樣做的?
這是因為微博限制字數為140字一條,那麼如果我們需要發一些鏈接上去,但是這個鏈接非常的長,以至於將近要佔用跡簡我們內容的一半篇幅,這肯定是不能被允許的或者說用戶體驗很差的,所以短網址應運而生了,短網址這種服務可以說是在微博出現之後才流行開來的!往下看:
(1)首先,我先發一條微博帶有一個URL地址:
(2)然後,看他轉換之後顯示的效果是什麼樣子的哪?
(3)查看對應頁面元素的HTML源碼如下:
(4)可以看出:https://blog.csdn.net/xlgen157387/article/details/79863301 被轉換為:http://t.cn/RuPKzRW,此時你訪問http://t.cn/RuPKzRW是可以定位到https://blog.csdn.net/xlgen157387/article/details/79863301,也就是實現了轉換。
2、短網址二維碼
網址在轉換成短網址時,也可以生成相應的短網址二維碼,短網址二維碼的應用,二維碼核心解決的是跨平台、跨現實的數據傳輸問題;而且二維碼跟應用場景結合之後,所能解決的問題會越來越多。
(1)短網址二維碼相比短鏈接更方便,能少輸入,盡量少輸入,哪怕只是少點一下鍵盤,都是有意義的。
(2)二維碼只是掃描一個簡單的鏈接,打開的卻是一個世界。想像一下,用手機購買售貨機里商品,二維碼掃描是略快於從用手機找到該售貨機並找到該商品的,而且這種操作相對於搜索/查找而言不是更優雅嗎?
(3)所有商超裡面的商品,都是使用條碼來確定商品的唯一性的,去買單的時候都是掃描條碼。試想,如果裡面加入了更多產品的生產日期、廠家、流轉途徑、原材料等等信息,是不是厲害了呢?特別是針對食品信息的可追溯上,二維碼應用場景更廣泛。
三、短地址的好處
除了上述場景中,我們將長地址轉換為短地址的使用場景的優點(壓縮URL長度)之外,短地址還具有很多實際場景中的優點,例如:
(1)節省網址長度,便於社交化傳播,一個是讓URL更短小,傳播更方便,尤其是URL中有中文和特殊字元,短網址解決很長的URL難以記憶不利於傳播的問題;
(2)短網址在我們項目里啟岩可以很好的對開放以及對URL進行管理。有一部分網址可以會涵蓋性、暴力、廣告等信息,這樣我們可以通過用戶的舉報,完全管理這個連接將不出現在我們的應用中,對同樣的URL通過加密演算法之後,得到的地址是一樣的;
(3)悄州御方便後台跟蹤點擊量、地域分布等用戶統計。我們可以對一系列的網址進行流量,點擊等統計,挖掘出大多數用戶的關注點,這樣有利於我們對項目的後續工作更好的作出決策;
(4)規避關鍵詞、域名屏蔽手段、隱藏真實地址,適合做付費推廣鏈接;
(5)當你看到一個淘寶的寶貝連接後面是200個「e7x8bv7c8bisdj」這樣的字元的時候,你還會覺得舒服嗎。更何況微博字數只有140字,微博或簡訊里,字數不夠,你用條短網址就能幫你騰出很多空間來;
四、短網址服務提供平台
目前,國內網又很多提供短地址服務的平台,例如:
新浪:http://sina.lt/
網路:http://dwz.cn/
0x3:http://0x3.me/
MRW:http://mrw.so/
等等還有很多,這個可以搜索一下就會有很多!但是一個注意的是,如果使用某一個平台的短地址服務,一定要保證長期可靠的服務,不然一段時間失效了,我們以前已經轉換的URL就完了!
這里以網路例,將我們上述博客的地址轉換為短地址如下所示:
當然,對於我們的業務來說,如果自己可以提供自己的短URL服務那才是更好的,不需要受制於人!(中國晶元需要崛起!!!)
五、關於如何生成短地址URL的討論
關於短地址URL如何生成方式的,網上有很多方式,有基於映射的,有基於Hash的,有基於簽名的,但是總的來說並不能滿足絕大部分場景的使用,或者說是一種錯誤的設計方式。這里不再重復造輪子!以下是知乎用戶iammutex關於該問題的探討,截圖過來和大家一起學習一下:
作者:iammutex
鏈接:https://www.hu.com/question/29270034/answer/46446911
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
六、生成短地址URL需要注意的
看到上述知乎用戶iammutex關於如何正確生成短地址URL的探討,我們知道了,可以通過發號器的方式正確的生成短地址,生成演算法設計要點如下:
(1)利用放號器,初始值為0,對於每一個短鏈接生成請求,都遞增放號器的值,再將此值轉換為62進制(a-zA-Z0-9),比如第一次請求時放號器的值為0,對應62進制為a,第二次請求時放號器的值為1,對應62進制為b,第10001次請求時放號器的值為10000,對應62進制為sBc。
(2)將短鏈接伺服器域名與放號器的62進制值進行字元串連接,即為短鏈接的URL,比如:http://t.cn/sBc。
(3)重定向過程:生成短鏈接之後,需要存儲短鏈接到長鏈接的映射關系,即sBc -> URL,瀏覽器訪問短鏈接伺服器時,根據URL Path取到原始的鏈接,然後進行302重定向。映射關系可使用K-V存儲,比如Redis或Memcache。
七、生成短地址之後如何跳轉哪?
對於該部分的討論,我們可以認為他是整個交互的流程,具體的流程細節如下:
(1)用戶訪問短鏈接:http://t.cn/RuPKzRW;
(2)短鏈接伺服器http://t.cn收到請求,根據URL路徑RuPKzRW獲取到原始的長鏈接(KV緩存資料庫中去查找):https://blog.csdn.net/xlgen157387/article/details/79863301;
(3)伺服器返回302狀態碼,將響應頭中的Location設置為:https://blog.csdn.net/xlgen157387/article/details/79863301;
(4)瀏覽器重新向https://blog.csdn.net/xlgen157387/article/details/79863301發送請求;
(5)返回響應;
八、短地址發號器優化方案
1、演算法優化
採用以上演算法,如果不加判斷,那麼即使對於同一個原始URL,每次生成的短鏈接也是不同的,這樣就會浪費存儲空間(因為需要存儲多個短鏈接到同一個URL的映射),如果能將相同的URL映射成同一個短鏈接,這樣就可以節省存儲空間了。主要的思路有如下兩個:
方案1:查表
每次生成短鏈接時,先在映射表中查找是否已有原始URL的映射關系,如果有,則直接返回結果。很明顯,這種方式效率很低。
方案2:使用LRU本地緩存,空間換時間
使用固定大小的LRU緩存,存儲最近N次的映射結果,這樣,如果某一個鏈接生成的非常頻繁,則可以在LRU緩存中找到結果直接返回,這是存儲空間和性能方面的折中。
2、可伸縮和高可用
如果將短鏈接生成服務單機部署,缺點一是性能不足,不足以承受海量的並發訪問,二是成為系統單點,如果這台機器宕機則整套服務不可 用,為了解決這個問題,可以將系統集群化,進行「分片」。
在以上描述的系統架構中,如果發號器用Redis實現,則Redis是系統的瓶頸與單點,因此,利用資料庫分片的設計思想,可部署多個發號器實例,每個實例負責特定號段的發號,比如部署10台Redis,每台分別負責號段尾號為0-9的發號,注意此時發號器的步長則應該設置為10(實例個數)。
另外,也可將長鏈接與短鏈接映射關系的存儲進行分片,由於沒有一個中心化的存儲位置,因此需要開發額外的服務,用於查找短鏈接對應的原始鏈接的存儲節點,這樣才能去正確的節點上找到映射關系。
九、如何用代碼實現短地址
1、使用隨機序列生成短地址
說到這里終於說到重點了,很多小夥伴已經按捺不住了,不好意思讓大家失望了,這只是一片簡單的文章,並不能把這么繁雜的一個系統演示清楚!秉著不要重復造輪子的原則,這里給出一個為數不多還算可以的實現短地址的開源項目:urlshorter
注意:urlshorter本身還是基於隨機的方式生成短地址的,並不算是一個短地址發號器,因此會有性能問題和沖突的出現,和知乎用戶iammutex 描述的實現方式還是有區別的!而關於短地址發號器的方式目前還沒有找到更好的開源項目可供參考!
項目地址:https://gitee.com/tinyframework/urlshorter
2、使用SnowFlake發號器生成短地址
實現參考: https://github.com/beyondfengyu/SnowFlake http://www.wolfbe.com/detail/201611/381.html
Twitter的雪花演算法SnowFlake,使用Java語言實現。
SnowFlake演算法用來生成64位的ID,剛好可以用long整型存儲,能夠用於分布式系統中生產唯一的ID, 並且生成的ID有大致的順序。 在這次實現中,生成的64位ID可以分成5個部分:
0 - 41位時間戳 - 5位數據中心標識 - 5位機器標識 - 12位序列號
5位數據中心標識、5位機器標識這樣的分配僅僅是當前實現中分配的,如果業務有其實的需要,可以按其它的分配比例分配,如10位機器標識,不需要數據中心標識。
Java代碼實現如下:
/**
* 進制轉換工具,最大支持十進制和62進制的轉換
* 1、將十進制的數字轉換為指定進制的字元串;
* 2、將其它進制的數字(字元串形式)轉換為十進制的數字
* @author xuliugen
* @date 2018/04/23
*/
public class NumericConvertUtils {
/**
* 在進製表示中的字元集合,0-Z分別用於表示最大為62進制的符號表示
*/
private static final char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
/**
* 將十進制的數字轉換為指定進制的字元串
* @param number 十進制的數字
* @param seed 指定的進制
* @return 指定進制的字元串
*/
public static String toOtherNumberSystem(long number, int seed) {
if (number < 0) {
number = ((long) 2 * 0x7fffffff) + number + 2;
}
char[] buf = new char[32];
int charPos = 32;
while ((number / seed) > 0) {
buf[--charPos] = digits[(int) (number % seed)];
number /= seed;
}
buf[--charPos] = digits[(int) (number % seed)];
return new String(buf, charPos, (32 - charPos));
}
/**
* 將其它進制的數字(字元串形式)轉換為十進制的數字
* @param number 其它進制的數字(字元串形式)
* @param seed 指定的進制,也就是參數str的原始進制
* @return 十進制的數字
*/
public static long toDecimalNumber(String number, int seed) {
char[] charBuf = number.toCharArray();
if (seed == 10) {
return Long.parseLong(number);
}
long result = 0, base = 1;
for (int i = charBuf.length - 1; i >= 0; i--) {
int index = 0;
for (int j = 0, length = digits.length; j < length; j++) {
//找到對應字元的下標,對應的下標才是具體的數值
if (digits[j] == charBuf[i]) {
index = j;
}
}
result += index * base;
base *= seed;
}
return result;
}
}
/**
* Twitter的SnowFlake演算法,使用SnowFlake演算法生成一個整數,然後轉化為62進制變成一個短地址URL
* @author beyond
* @author xuliugen
* @date 2018/04/23
*/
public class SnowFlakeShortUrl {
/**
* 起始的時間戳
*/
private final static long START_TIMESTAMP = 1480166465631L;
/**
* 每一部分佔用的位數
*/
private final static long SEQUENCE_BIT = 12; //序列號佔用的位數
private final static long MACHINE_BIT = 5; //機器標識佔用的位數
private final static long DATA_CENTER_BIT = 5; //數據中心佔用的位數
/**
* 每一部分的最大值
*/
private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
private final static long MAX_DATA_CENTER_NUM = -1L ^ (-1L << DATA_CENTER_BIT);
/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
private long dataCenterId; //數據中心
private long machineId; //機器標識
private long sequence = 0L; //序列號
private long lastTimeStamp = -1L; //上一次時間戳
/**
* 根據指定的數據中心ID和機器標志ID生成指定的序列號
* @param dataCenterId 數據中心ID
* @param machineId 機器標志ID
*/
public SnowFlake(long dataCenterId, long machineId) {
if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
throw new IllegalArgumentException("DtaCenterId can't be greater than MAX_DATA_CENTER_NUM or less than 0!");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("MachineId can't be greater than MAX_MACHINE_NUM or less than 0!");
}
this.dataCenterId = dataCenterId;
this.machineId = machineId;
}
/**
* 產生下一個ID
* @return
*/
public synchronized long nextId() {
long currTimeStamp = getNewTimeStamp();
if (currTimeStamp < lastTimeStamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}
if (currTimeStamp == lastTimeStamp) {
//相同毫秒內,序列號自增
sequence = (sequence + 1) & MAX_SEQUENCE;
//同一毫秒的序列數已經達到最大
if (sequence == 0L) {
currTimeStamp = getNextMill();
}
} else {
//不同毫秒內,序列號置為0
sequence = 0L;
}
lastTimeStamp = currTimeStamp;
return (currTimeStamp - START_TIMESTAMP) << TIMESTAMP_LEFT //時間戳部分
| dataCenterId << DATA_CENTER_LEFT //數據中心部分
| machineId << MACHINE_LEFT //機器標識部分
| sequence; //序列號部分
}
private long getNextMill() {
long mill = getNewTimeStamp();
while (mill <= lastTimeStamp) {
mill = getNewTimeStamp();
}
return mill;
}
private long getNewTimeStamp() {
return System.currentTimeMillis();
}
public static void main(String[] args) {
SnowFlake snowFlake = new SnowFlake(2, 3);
for (int i = 0; i < (1 << 4); i++) {
//10進制
Long id = snowFlake.nextId();
//62進制
String convertedNumStr = NumericConvertUtils.toOtherNumberSystem(id, 62);
//10進制轉化為62進制
System.out.println("10進制:" + id + " 62進制:" + convertedNumStr);
//TODO 執行具體的存儲操作,可以存放在Redis等中
//62進制轉化為10進制
System.out.println("62進制:" + convertedNumStr + " 10進制:" + NumericConvertUtils.toDecimalNumber(convertedNumStr, 62));
System.out.println();
}
}
}
//生成結果:
10進制:185784275776581632 62進制:dITqmhW2
Ⅳ Android的手機系統是開源的,開源到底是什麼意思
開源,全稱為開放源代碼。市場上開源軟體層出不窮,很多人可能認為開源軟體最明顯的特點是免費,但實際上並不是這樣的,開源軟體最大的特點應該是開放,也就是任何人都可以得到軟體的源代碼,加以修改學習,甚至重新發放,當然是在版許可權制范圍之內。
開源主要的目的就是允許任何一個人來修改和完善它,使用開源的軟體都不需要繳納費用,不想windows操作系統那樣一套要兩千塊。
(5)9塊9進群源碼擴展閱讀
開源主要表現為管理成本、設計程序議題以及組織可信賴性等。首先就管理成本而言,主要是因為一旦計劃發展到一定程度,其創新、修正的質量必然變大,參與人數眾多,當然也會造成一定的管理成本,另外,整合、決策架構都會增高管理的成本。
其次就設計程序議題來看,其不斷釋出新版本,將造成消費者需要不斷重新安裝的困擾,並且由於其設計上通常較不關心友善的界面,會增加使用者的接近使用的難度。
Ⅵ 通信達公式問題,超強組合指標公式,誰可以解釋一下。我看不明白,源代碼如下
{波段線}
VAR2:=(HIGH+LOW+CLOSE*2)/4;
VAR3:=EMA(VAR2,21);
VAR4:=STD(VAR2,21);
VAR5:=((VAR2-VAR3)/VAR4*100+200)/4;
VAR6:=(EMA(VAR5,5)-25)*1.56;
{AK: EMA(VAR6,2)*1.22;
AD1: EMA(AK,2);
AJ: 3*AK-2*AD1;
DRAWTEXT(CROSS(AK,AD1),AK,'*'),COLORRED;
DRAWTEXT(CROSS(AD1,AK),AK,'*'),COLORWHITE;}
{金手指}
RA:=LLV(LOW,35);
RB:=HHV(HIGH,30);
RC:=EMA((CLOSE-RA)/(RB-RA)*4,4)*19;
近日均價:=MA(CLOSE,5),COLORYELLOW,LINETHICK2;
DRAWICON(RC<6 AND 100*(HHV(HIGH,19)-CLOSE)/(HHV(HIGH,19)-LLV(LOW,19))>97,100,11);
LC:=REF(CLOSE,1);
RSI1:=SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*100;
ZL:=EMA( (CLOSE-MA(CLOSE,7))/MA(CLOSE,7)*480,2)*5;
SH:=EMA( (CLOSE-MA(CLOSE,11))/MA(CLOSE,11)*480,7)*5;
BT1:=CROSS(RSI1,25);
BT2:=CROSS(ZL,SH) AND ZL<-10;
BT:=FILTER(COUNT(BT1 OR BT2,3)>=2,3);
BIAS:=(CLOSE-MA(CLOSE,24))/MA(CLOSE,24)*100;
VARC:=LOW;
VARD:=REF(LOW,1);
VARE:=SMA(ABS(VARC-VARD),3,1)/SMA(MAX(VARC-VARD,0),3,1)*100;
VARF:=MA(VARE/10,3);
VAR10:=LLV(LOW,30);
VAR11:=HHV(VARF,30);
MA(IF(LOW<=VAR10,(VARF+VAR11*2)/5,0),3);
VAR1B:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);
VAR2B:=SMA(ABS(LOW-VAR1B),13,1)/SMA(MAX(LOW-VAR1B,0),10,1);
VAR3B:=EMA(VAR2B,10);
VAR4B:=LLV(LOW,33);
VAR5B:=EMA(IF(LOW<=VAR4B,VAR3B,0),3);
{主力進場:IF(VAR5B>REF(VAR5B,1),VAR5B,0),COLORRED;}
STICKLINE(VAR5B>REF(VAR5B,1),0,VAR5B*2,2,0 ),COLORYELLOW;
洗盤:IF(VAR5B<REF(VAR5B,1),VAR5B,0),COLORLIGREEN;
VARR1:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);
VARR2:=SMA(ABS(LOW-VARR1),13,1)/SMA(MAX(LOW-VARR1,0),10,1);
VARR3:=EMA(VARR2,10);
VARR4:=LLV(LOW,33);
VARR5:=EMA(IF(LOW<=VARR4,VARR3,0),3);
STICKLINE(VARR5>REF(VARR5,1),0,VARR5,2,0 ),COLORGREEN;
STICKLINE(VARR5<REF(VARR5,1),0,VARR5*2,2,0),COLORRED;
找主力吸籌提款:VARR5>REF(VARR5,4) {AND C>REF(C,1)},COLORMAGENTA;
VAR2C:=(HIGH+LOW+CLOSE*2)/4;
VAR3C:=EMA(VAR2C,7);
VAR4C:=STD(VAR2C,7);
VAR5C:=(VAR2C-VAR3C)*100/VAR4;
VAR6C:=EMA(VAR5C,3);
{WW:(EMA(VAR6C,5)+100)/2-3,COLORFF00FF;
MM:HHV(WW,3),COLORFF3333;}
AAA:=AMOUNT/VOL/100;
主力進場:IF(VAR5B>REF(VAR5B,1),VAR5B*1.5,0),COLORRED,LINETHICK2;
{吸籌}
VAR2Q:=REF(LOW,1);
VAR3Q:=SMA(ABS(LOW-VAR2Q),3,1)/SMA(MAX(LOW-VAR2Q,0),3,1)*100;
VAR4Q:=EMA(IF(CLOSE*1.3,VAR3Q*10,VAR3Q/10),3);
VAR5Q:=LLV(LOW,30);
VAR6Q:=HHV(VAR4Q,30);
VAR7Q:=IF(MA(CLOSE,58),1,0);
VAR8Q:=EMA(IF(LOW<=VAR5Q,(VAR4Q+VAR6Q*2)/2,0),3)/618*VAR7Q;
VAR9Q:=IF(VAR8Q>100,100,VAR8Q);
吸籌:STICKLINE(VAR9Q>-120,0,VAR9Q,6,1),COLORRED;
VARY2:=REF(LOW,1);
VARY3:=SMA(ABS(LOW-VARY2),3,1)/SMA(MAX(LOW-VARY2,0),3,1)*100;
VARY4:=EMA(IF(CLOSE*1.3,VARY3*10,VARY3/10),3);
VARY5:=LLV(LOW,30);
VARY6:=HHV(VARY4,30);
VARY7:=IF(MA(CLOSE,58),1,0);
VARY8:=EMA(IF(LOW<=VARY5,(VARY4+VARY6*2)/2,0),3)/618*VARY7;
VARY9:=IF(VARY8>100,100,VARY8);
吸籌2:STICKLINE(VARY9>-120,0,VARY9/3,2,1),COLORMAGENTA;
LCC:=REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LCC,0),4.1,1)/SMA(ABS(CLOSE-LCC),4.1,1)*100,COLORYELLOW,LINETHICK1;
黃買:FILTER((REF(CLOSE,2)<CLOSE AND RSI<25),7),COLORYELLOW;
STICKLINE(黃買,0,-40,10,1),COLORYELLOW;
黃賣:=FILTER((REF(CLOSE,2)>CLOSE AND RSI>80),7);
STICKLINE(黃賣,100,82,10,0),COLORBLUE;
紅買:FILTER(CROSS(RSI,11),7),COLORRED;
STICKLINE(紅買,0,-30,6,0),COLORRED;
紅賣:=FILTER(CROSS(89,RSI),7);
STICKLINE(紅賣,100,88,8,0),COLORCYAN;
綠買:FILTER(CROSS(RSI,20),7),COLOR00FF00;
STICKLINE(綠買,0,-20,6,0),COLORMAGENTA;
綠賣:=FILTER(CROSS(80,RSI),7);
STICKLINE(綠賣,100,94,6,0),COLOR00FF00;
★遵守紀律★:100,COLORRED;
★交易之魂★:100,COLORRED;
ZLC:= EMA((WINNER(CLOSE) * 70),3);
SHC:= EMA(((WINNER((CLOSE * 1.1)) - WINNER((CLOSE * 0.9))) * 80),3);
主力控盤: ((ZLC / (ZLC+ SHC)) * 100),COLOR00FFFF,LINETHICK2;
上限: HHV(主力控盤,20),COLORGREEN,LINETHICK2;
下限: LLV(主力控盤,20),COLORRED,LINETHICK2;
中線:(上限 + 下限)/2,COLORYELLOW,POINTDOT,LINETHICK2;
{60,LINETHICK4,POINTDOT,COLORYELLOW;}
{10,LINETHICK4,POINTDOT,COLORFF00FF;}
VAR200:=(CLOSE-LLV(LOW,20))/(HHV(HIGH,20)-LLV(LOW,20))*100;
VAR300:=SMA(SMA(VAR200,3,1),3,1)/28.57;
VAR400:=EMA(VAR300,5);
操盤:=3*VAR300-2*VAR400;
A1:=CROSS(操盤,VAR300) AND VAR300<2.1 AND C>O;
STICKLINE(A1,30,0,4,0),COLOR770077;
STICKLINE(A1,30,0,3,0),COLOR990099;
STICKLINE(A1,30,0,2,0),COLORBB00BB;
STICKLINE(A1,30,0,1,0),COLORWHITE;
STICKLINE(A1,30,0,0.3,0),COLORFF00FF;
DRAWTEXT(A1,36,'滿倉'),COLORRED;
DRAWTEXT(A1,36,'滿倉'),COLORRED;
AK: EMA(VAR6,2)*1.22;
AD1: EMA(AK,2);
AJ: 3*AK-2*AD1;
DRAWTEXT(CROSS(AK,AD1),AK,'*'),COLORRED;
DRAWTEXT(CROSS(AD1,AK),AK,'*'),COLORWHITE;
WW:(EMA(VAR6C,5)+100)/2-3,COLORFF00FF;
MM:HHV(WW,3),COLORFF3333;
DRAWTEXT(BT1,0,'□'),COLORYELLOW;
DRAWTEXT(BT,0,'■'),COLORYELLOW;
DRAWICON(CROSS(85,RSI1),102,15);{飯跑跑}
DRAWICON(CROSS(RSI1,25),10,26);{金鑽}
DRAWICON(CROSS(ZL,SH) AND ZL<-10,20,24);{藍鑽}
DRAWICON(CROSS(BIAS,-12),-10,13);{BIAS買點};