asp.net C# 实现阿里大鱼和云片网短信接口类 - 叶长种 - 博客园

mikel阅读(867)

来源: asp.net C# 实现阿里大鱼和云片网短信接口类 – 叶长种 – 博客园

云片网短信通用类

复制代码
public class YunpianSMS
    {
        public YunpianSMS()
        { }

        /// <summary>
        /// 服务器HTTP地址
        /// </summary>
        private static string BASE_URI = "http://yunpian.com";

        /// <summary>
        /// 服务版本号
        /// </summary>      
        private static string VERSION = "v1";

        /// <summary>
        /// 查账户信息的http地址 
        /// </summary>           
        private static string URI_GET_USER_INFO = BASE_URI + "/" + VERSION + "/user/get.json";

        /// <summary>
        /// 通用接口发短信的http地址 
        /// </summary>
        private static string URI_SEND_SMS = BASE_URI + "/" + VERSION + "/sms/send.json";

        /// <summary>
        /// 模板接口短信接口的http地址 
        /// </summary>
        private static string URI_TPL_SEND_SMS = BASE_URI + "/" + VERSION + "/sms/tpl_send.json";

        /// <summary>
        /// 通用接口查回复的短信的http地址 
        /// </summary>
        private static string URI_GET_REPLY = BASE_URI + "/" + VERSION + "/sms/get_reply.json";

        /// <summary>
        /// APIKEY
        /// </summary>
        private static string APIKEY = "APIKEY";

        /// <summary>
        /// 获取用户信息
        /// </summary>
        /// <returns>Json格式</returns>
        public static string GetUserInfo()
        {
            System.Net.WebRequest req = System.Net.WebRequest.Create(URI_GET_USER_INFO + "?apikey=" + APIKEY);
            System.Net.WebResponse resp = req.GetResponse();
            System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
            return sr.ReadToEnd().Trim();
        }

        /// <summary>
        ///  发短信通用接口
        /// </summary>
        /// <param name="text">短信内容</param>
        /// <param name="mobile">接收的手机号码,有多个手机号则用逗号分隔,一次最多100个手机号码</param>
        /// <returns>Json格式</returns> 
        public static string SendSms(string text, string mobile)
        {
            //注意:参数必须进行Uri.EscapeDataString编码。以免&#%=等特殊符号无法正常提交
            string parameter = "apikey=" + APIKEY + "&mobile=" + mobile + "&text=" + text;
            return HttpPost(URI_SEND_SMS, parameter);
        }

        /// <summary>
        /// 模板接口发短信
        /// </summary>
        /// <param name="tpl_id">模板ID</param>
        /// <param name="mobile">接收的手机号码</param>
        /// <param name="tpl_value">模板变量值</param>
        /// <returns>Json格式</returns>
        public static string TplSendSms(long tpl_id, string mobile, string tpl_value)
        {
            string postDataStr = "apikey=" + APIKEY + "&mobile=" + mobile + "&tpl_id=" + tpl_id.ToString() + "&tpl_value=" + tpl_value;
            return HttpPost(URI_TPL_SEND_SMS, postDataStr);
        }

        /// <summary>
        /// 查回复的短信
        /// </summary>
        /// <param name="page_num">页码,从1开始</param>
        /// <param name="page_size">每页个数,最大100个</param>
        /// <param name="mobile">接收的手机号码</param>
        /// <returns>Json格式</returns>
        public static string GetReplySms(int page_num, int page_size, string mobile,string datastart,string dataend)
        {
            DateTime now = DateTime.Now;
            //string datastart = now.AddDays(-3).ToString("yyyy-MM-dd 00:00:00");
            //string datasend = now.AddDays(1).ToString("yyyy-MM-dd 00:00:00");
            string postDataStr = "apikey=" + APIKEY + "&start_time=" + datastart + "&end_time=" + dataend
                + "&page_num=" + page_num + "&page_size=" + page_size + "&mobile=" + mobile;

            return HttpPost(URI_GET_REPLY, postDataStr);
        }

        /// <summary>
        /// 通用接口请求
        /// </summary>
        /// <param name="Url"></param>
        /// <param name="postDataStr"></param>
        /// <returns></returns>
        public static string HttpPost(string Url, string postDataStr)
        {
            byte[] dataArray = Encoding.UTF8.GetBytes(postDataStr);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = dataArray.Length;
            //request.CookieContainer = cookie;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(dataArray, 0, dataArray.Length);
            dataStream.Close();
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                String res = reader.ReadToEnd();
                reader.Close();
                return res;
            }
            catch (Exception e)
            {
                return e.Message + e.ToString();
            }
        }
    }
复制代码

调用短信模版方式:

复制代码
string tpl_value = HttpUtility.UrlEncode(
                            HttpUtility.UrlEncode("#username#", Encoding.UTF8) + "=" +
                            HttpUtility.UrlEncode(phone, Encoding.UTF8) + "&" +
                            HttpUtility.UrlEncode("#passwd#", Encoding.UTF8) + "=" +
                            HttpUtility.UrlEncode(passwd, Encoding.UTF8), Encoding.UTF8);
                        //短信失败时,调用第二短信接口
                        YunpianSMS.TplSendSms(1508914, phone, tpl_value);
复制代码

阿里大鱼短信通用类

复制代码
public class AliDaYuSMS
    {
        /// <summary>
        /// <summary>
        /// Url
        /// </summary>
        private static string Url = "http://gw.api.taobao.com/router/rest";
        /// AppKey
        /// </summary>
        private static string AppKey = "AppKey";
        /// <summary>
        /// AppSecret
        /// </summary>
        private static string AppSecret = "AppSecret";

        /// <summary>
        ///  发短信通用接口
        /// </summary>
        /// <param name="extend">公共回传参数,
        /// 在“消息返回”中会透传回该参数;举例:用户可以传入自己下级的会员ID,在消息返回时,
        /// 该会员ID会包含在内,用户可以根据该会员ID识别是哪位会员使用了你的应用</param>
        /// <param name="smsFreeSignName">短信签名</param>
        /// <param name="code">短信模板ID</param>
        /// <param name="smsParam">短信模板变量“验证码${code},您正在进行${product}身份验证,打死不要告诉别人哦!”,
        /// 传参时需传入{"code":"1234","product":"alidayu"}</param>
        /// <param name="mobile">接收的手机号码,群发短信需传入多个号码,以英文逗号分隔,一次调用最多传入200个号码。</param>
        /// <returns>Json格式</returns> 
        public static string SendSms(string extend, string smsFreeSignName, string code, string smsParam, string mobile)
        {
            ITopClient client = new DefaultTopClient(Url, AppKey, AppSecret);
            AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
            req.Extend = extend;
            req.SmsType = "normal";
            req.SmsFreeSignName = smsFreeSignName;
            req.SmsParam = smsParam;
            req.RecNum = mobile;
            req.SmsTemplateCode = code;
            AlibabaAliqinFcSmsNumSendResponse rsp = client.Execute(req);
            return rsp.SubErrMsg;
        }
    }

调用方式

                    var smsresult = AliDaYuSMS.SendSms(phone, "潮运动", "SMS_13000621", "{\"username\":\"" + phone + "\",\"passwd\":\"" + passwd + "\"}", phone);
复制代码

 

git 使用简易指南

mikel阅读(1098)

来源: git 使用简易指南

git – 简易指南

助你开始使用 git 的简易指南,木有高深内容,;)。

作者:罗杰·杜德勒
感谢:@tfnico@fhd and Namics
其他语言 englishdeutschespañolfrançaisitalianonederlandsportuguêsрусскийtürkçe,
မြန်မာ日本語한국어
如有纰漏,请到 github 填报

创建新仓库

创建新文件夹,打开,然后执行
git init
以创建新的 git 仓库。

检出仓库

执行如下命令以创建一个本地仓库的克隆版本:
git clone /path/to/repository
如果是远端服务器上的仓库,你的命令会是这个样子:
git clone username@host:/path/to/repository

工作流

你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,指向你最近一次提交后的结果。

添加与提交

你可以计划改动(把它们添加到缓存区),使用如下命令:
git add <filename>
git add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
git commit -m "代码提交信息"
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

推送改动

你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:
git push origin master
可以把 master 换成你想要推送的任何分支。

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>
如此你就能够将你的改动推送到所添加的服务器上去了。

分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。

创建一个叫做“feature_x”的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的
git push origin <branch>

更新与合并

要更新你的本地仓库至最新改动,执行:
git pull
以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
两种情况下,git 都会尝试去自动合并改动。不幸的是,自动合并并非次次都能成功,并可能导致 冲突(conflicts)。 这时候就需要你修改这些文件来人肉合并这些 冲突(conflicts) 了。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
在合并改动之前,也可以使用如下命令查看:
git diff <source_branch> <target_branch>

标签

在软件发布时创建标签,是被推荐的。这是个旧有概念,在 SVN 中也有。可以执行如下命令以创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用如下命令获取提交 ID:
git log
你也可以用该提交 ID 的少一些的前几位,只要它是唯一的。

替换本地改动

假如你做错事(自然,这是不可能的),你可以使用如下命令替换掉本地改动:
git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。

假如你想要丢弃你所有的本地改动与提交,可以到服务器上获取最新的版本并将你本地主分支指向到它:
git fetch origin
git reset --hard origin/master

有用的贴士

内建的图形化 git:
gitk
彩色的 git 输出:
git config color.ui true
显示历史记录时,只显示一行注释信息:
git config format.pretty oneline
交互地添加文件至缓存区:
git add -i

解决Git建立远程分支关联时fatal the current branch master has no upstream branch 问题 - 拂晓的专栏 - CSDN博客

mikel阅读(3621)

来源: 解决Git建立远程分支关联时fatal the current branch master has no upstream branch 问题 – 拂晓的专栏 – CSDN博客

问题描述
今天在使用git时,在本地新建了一个分支,按照网上搜到的方式使用 git branch –set-upstream dev origin/dev (这里的dev为本地新建的分支)命令建立本地分支与远程分支的关联,但该命令执行后并不能成功push变更到远程分支。

问题解决
出现上述问题,说明远程并没有感知到本地新建的这个分支,经过多种尝试后,发现一旦执行 git branch –set-upstream 命令后本地与远程的关联要是仍旧没有建立成功,则再次执行 git push -u origin dev 即可成功建立本地与远程的关联。

git push -u origin dev

在GitHub上管理项目 - 圣骑士wind - 博客园

mikel阅读(916)

来源: 在GitHub上管理项目 – 圣骑士wind – 博客园

在GitHub上管理项目

 

新建repository

本地目录下,在命令行里新建一个代码仓库(repository)
里面只有一个README.md
命令如下:
touch README.md
git init
初始化repository

git add README.md
将README.md加入到缓存区

(可以用git add –a将所有改动提交到缓存(注意是两个杠))

 

git commit -m “first commit”
提交改变,并且附上提交信息”first commit”

 

Push

  git remote add origin https://github.com/XXX(username)/YYYY(projectname).git

加上一个remote的地址,名叫origin,地址是github上的地址(Create a new repo就会有)
因为Git是分布式的,所以可以有多个remote.

git push -u origin master
将本地内容push到github上的那个地址上去。

参数-u
用了参数-u之后,以后就可以直接用不带参数的git pull从之前push到的分支来pull。

 

此时如果origin的master分支上有一些本地没有的提交,push会失败.

所以解决的办法是, 首先设定本地master的上游分支:

git branch –set-upstream-to=origin/master

然后pull:
git pull –rebase

最后再push:

git push

 

分支

新建好的代码库有且仅有一个主分支(master),它是自动建立的。
可以新建分支用于开发:
git branch develop master
新建一个叫develop的分支,基于master分支

切换到这个分支:
git checkout develop
现在可以在这个develop分支上做一些改动,并且提交。
注意:切换分支的时候可以发现,在Windows中的repository文件夹中的文件内容也会实时相应改变,变成当前分支的内容。

 

push方法1:

现在如果想直接Push这个develop分支上的内容到github

  git push -u origin

如果是新建分支第一次push,会提示:
  fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use
git push –set-upstream origin develop
输入这行命令,然后输入用户名和密码,就push成功了。

以后的push就只需要输入git push origin

 

 

push方法2:

比如新建了一个叫dev的分支,而github网站上还没有,可以直接:

git push -u origin dev

这样一个新分支就创建好了。

 

push方法3:

提交到github的分支有多个,提交时可以用这样的格式:

git push -u origin local:remote
比如:git push -u origin master:master
表明将本地的master分支(冒号前)push到github的master分支(冒号后)。
如果左边不写为空,将会删除远程的右边分支。

 

创建分支的另一种方法

用命令git checkout -b develop2 develop
可以新建一个分支develop2,同时切换到这个分支

 

删除分支

git branch可以查看所有的分支
git branch -d develop2 将develop2分支删除

 

Clone

使用git clone+github地址的方法,项目默认只有master分支。git branch也只有master

要看所有的分支:git branch -a或者是git branch -r

这时候要新建一个分支,叫做dev,基于远程的dev分支:git checkout -b dev origin/dev

 

加Tag

git tag tagname develop
git tag中的两个参数,一个是标签名称,另一个是希望打标签的点develop分支的末梢。

 

合并分支

git checkout master

先转到主分支
git merge –no-ff develop

然后把develop分支merge过来

参数意义:
不用参数的默认情况下,是执行快进式合并。
使用参数–no-ff,会执行正常合并,在master分支上生成一个新节点。
merge的时候如果遇到冲突,就手动解决,然后重新add,commit即可。

 

相关链接:

GitHub网址:https://github.com/

Git 一些错误的解决方法-微硬程序员-51CTO博客

mikel阅读(861)

注:Git初学者的个人经验记录,仅供参考1. Pull is not possible because you have unmerged files.症状:pull的时候$ git pullPull is not possible because you have unmerged files.Please, fix them up in the work tree, and then use

来源: Git 一些错误的解决方法-微硬程序员-51CTO博客

注:Git初学者的个人经验记录,仅供参考

1. Pull is not possible because you have unmerged files.

症状:pull的时候

$ git pull

Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use ‘git add/rm <file>’
as appropriate to mark resolution, or use ‘git commit -a’

应该是因为local文件冲突了

解决方法:

引用——

1.pull会使用git merge导致冲突,需要将冲突的文件resolve掉 git add -u, git commit之后才能成功pull.

2.如果想放弃本地的文件修改,可以使用git reset –hard FETCH_HEAD,FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull.
注意:

git merge会形成MERGE-HEAD(FETCH-HEAD) 。git push会形成HEAD这样的引用。HEAD代表本地最近成功push后形成的引用。

就我的经验,有时候会莫名其妙地出现这种状况,而且Untracked files 还特别多(实际上自己可能只改了一两个文件),所以只好先保存好自己确定做出的local的修改,然后用git reset –hard FETCH_HEAD回到上次成功pull之后的点,然后再pull就没有问题了

2.You are not currently on a branch.

症状:有一次pull的时候又出现冲突,这回用“git reset –hard FETCH_HEAD”方法都不行了,出现:

$ git pull
You are not currently on a branch, so I cannot use any
'branch.<branchname>.merge' in your configuration file.
Please specify which remote branch you want to use on the command
line and try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

解决方法:

首先git checkout -b temp

其次git checkout master

即可恢复到master repository的状态,然后就可以pull了

参考:

http://skywhsq1987.iteye.com/blog/1814137

http://slacy.com/blog/2011/04/git-pull-says-you-are-not-currently-on-a-branch/

http://ddmytrenko.blogspot.com/2012/03/git-not-currently-on-any-branch.html

如何通过Git GUI将自己本地的项目上传至Github - 尼古拉斯.张飞的博客 - CSDN博客

mikel阅读(807)

来源: 如何通过Git GUI将自己本地的项目上传至Github – 尼古拉斯.张飞的博客 – CSDN博客

githud是一个程序员以后成长都会使用到的,先不说很多优秀的开源框架都在这上面发布,光是用来管理自己的demo都已经让人感到很方便,用得也很顺畅。而真正让我下定决心使用github的原因是因为两次误操作,将自己所有的学习demo全都删除,而且由于数据太大,是彻底删除的那种,使用数据恢复软件,但然并卵,恢复的数据杂乱无章,另一次是由于自己的固态损坏,所有的东西也全没了,终于痛下决心好好研究github的使用。
在上面的原因之下,花了一天的时间来研究github,一下是一天来的学习成果。
1.至于怎么注册和安装git客户端,可参照以下这篇博客:http://blog.csdn.net/vipzjyno1/article/details/22098621
通过命令行,以上的博客也说德很清楚,下面要说的是如何通过Git GUI将自己本地的文件上传至Github上。
2.将自己本地文件上传至Github
1)创建.git仓库
    在自己的本地文件(位置随意),点击右键==》选择Git GUI Here ,会弹出以下框,选择create new Repository,也就是箭头处,红色圈内是我自己已经创建的。
点击create new Repository以后会出现让你输入一个文件夹的弹窗,直接输入一个文件夹名称即可。点击创建,这时打开Git文件夹里面有一个.git文件夹,但有些人是看不到的,这是因为,默认情况下是隐藏的,自己将自己电脑里的文件显示即可,不会的自行百度。这时,这个Git文件夹就是你的项目仓库。只要将你需要上传的项目放在该文件夹即可。
完成点击创建以后,会弹出可视化窗:点击Remote–》Add…
弹出以下框以后输入你Github的用户名(shanerou是我的github名称)和你需要将你本地的项目放在Github的仓库的地址,如我在Github上创建了一个repository名称为Test的,然后添加如下,点击创建,弹出success的框代表创建成功
在Git文件夹下放入我的一个demo:SD_SQList2
按以下步骤操作:
点击第三步时,在Initial Commit Message 框里将会看到一行信息
点击第四步,也就是提交命令以后,左边已经缓存的文件被提交,缓存文件消失,这时点击第五步即可,点击第五步后出现以下框:
输入你Github的用户名 和密码:
点击上传:出现以下弹框则表示上传成功
这时到你的Github上去看,将会看到以下dome:

Git可视化极简易教程 — Git GUI使用方法 | 菜鸟教程

mikel阅读(879)

来源: Git可视化极简易教程 — Git GUI使用方法 | 菜鸟教程

前言

之前一直想一篇这样的东西,因为最初接触时,我也认真看了廖雪峰的教程,但是似乎我觉得讲得有点多,而且还是会给我带来很多多余且重复的操作负担,所以我希望能压缩一下它在我工作中的成本,但是搜索了一下并没有找到满意的教程,新的一年自己梳理一下自己的经验。

可能男生们大神比较多,觉得Git是如此简单,便已觉得命令行操作就是SO EASY,甚至或许有看不起可视化这样面对低端用户的心理,好的,那您就当我是水货可以右上角了。

我一直觉得类似GIT这样的东西,他对于我而言只是个不完全必须的工具,我并不想成为使用他的专家,类似的东西,今天有GIT,明天可能有GAT,或者GAY?所以快速地掌握它我需要的重要日常操作,最好是10分钟,那就好了,如果你有类似的想法,好吧,那不要废话了,咱们赶紧开始。

(全文限windows系统。)

何为GIT?

安装GIT,大致了解下GIT是做某子的

权限校验

首先,您的数据保存在远端服务器一份,服务器需要对您的身份识别。一段RSA加密字符串。

启动GUI,菜单-帮助,【Step1-创建密钥】Generate SSH KEY

271102462211960

【Step2-添加密钥】去你的代码托管服务器,你的账号设置中,添加它。

比如在Github中的地址,title随意,比如你可以用Home,company等作为标识来区别。

271104566587275

Gitlab中的演示

271108115808959

账号保存

如果不做设置的话,每次提交的时候,都会询问你填写密码。于是我们先来把这个设置好。

【Step3.1-添加环境变量

我的电脑 – 属性 – 高级系统设置 – 环境变量 – 新建变量

变量名HOME,变量值%USERPROFILE%

271117100641718

271117191748667

271117300493045

271117384245853

【Step3.2-创建账号文件】

开始 – 运行 中打开%Home%,即windows的管理员账号文件夹。

新建一个名为”_netrc”的文件,填写你要保存的服务器地址及账号密码,保存。

271123307214691

271123401437312

操作流程

如果你用过SVN的话就会大致了解操作流程,如果没有也没关系。

初始化(Git init)

顾名思义,就是新建一个项目,跟你用PS新建一张画布一样。在你新建好的文件夹中右键创建即可,若点击Git bash则以此目录作为当前目录进入命令行状态。

271234025648572

添加(Git add)

添加并不是提交代码到远程Git库,Git也并不会你修改了代码它自动帮你保存你修改的每一个过程。你修改了很多文件,但未必所有的修改,最终打算提交上去,那么哪些是你打算提交的,你可以添加进来待会提交,叫做缓存改动。很简单,比如本地电脑上我有整个项目完整的东东,甚至包含了账号密码的一些文件,但是我只是ADD除账号密码之外的文件,并不缓存账号密码文件的改动。不被ADD它就不会参与后续的操作。通常我都会直接全部缓存,它会自动寻找所有有改动的文件,而不需要提交的文件放在忽略的文件夹中。(关于忽略下面我们就会说到)

271238259396476

忽略(.gitignore)

但实际上大部分我们的文件都是一起提交的,并不会逐一去甄选,又或者类似PSD这样的大源文件以及并不作为产品最终展示的过渡文件,我们可以统一放在临时文件夹中,并忽略此文件夹。

271134259394618

提交(Git commit)

提交则代表此前被添加ADD的文件已确认被提交到Git库了。需要注意的是,如果你改变代码的缩进(尽管没有修改内容),默认状态下会被识别为整个代码全部变更。提交的时候是要求必须要写备注的

271240398302205

上传(Git push)

顾名思义,上传则是上至远端服务器了,小伙伴们可以看到咱们的渣渣代码了(好羞涩。

271241402522046

获取远程代码(Git remote/fetch)

比如你在公司做好的东东,今夜难眠十分亢奋,回家准备继续搬砖,那咱们就在家里的电脑上,同上进行好各种安装配置账号,先把公司做好的东东嫩下来(不过公司是内网不可以,但是假如是Github上是可以的)。又或者和小伙伴一起开发个啥,你也要先fetch他的下来。至于怎么操作,下面上图。现在你只要知道,大大们下齿全露刷牙表情对你口口念念的fetch是个啥子~

271145255335341 来,跟我念,fetch~~(我怕你们脑补不出来……)

先来设置与远程地址的关联,Git remote:

271242561118002

271244220336453

填写SSH地址与项目名。下面有3个选项:

第一个:立刻获取最新改动(所以如果是本地克隆远程一个项目,也可以这样操作)。

第二个:本地新建的项目,初始化远程仓库并发布过去。

第三个:什么也不做。

在项目的进行过程中,获取仓库的最新改动Git fetch

271259025495085

选择从远程仓库哪个分支中获取更新,如果没有则只有主支。

提示成功则改动的已经被存放到临时区了,你一会还需要进行合并操作,如果没有任何改动,则列表中是空的,比如:

271300329558531

合并(Git merge)

请注意啦,不管你本地有没有代码,fetch之后呢,是都要merge的,也就是说,fetch下来后,大大的代码还在一个小黑屋里,我们需要把它装到自己兜里。

选择合并 – 本地合并,然后选择本地的分支(如果你没有创建分支,则只有1个主支master)

271254126278757

冲突处理(Conflict)

合并的过程中可能会出现一些红色的文件与一堆叹号,这时候慌慌张张的点啥它都不管用,不用担心,不是程序坏了,只是有冲突的文件,例如A童鞋写了width:1180px,你写了width:auto。那到底用你们谁的呢。

在GUI界面正文区,正文区右键可以选择,Use local version(使用本地版本)或Use remote version(使用远程版本),到底用你的还是小伙伴的?或者你也可以自己再整合。

271257485644055

其他还有分支和一些高级功能,如果需要了解可以自己再摸索摸索,以上的操作已经可以满足简单的开发需求了。

总结

1.先进行安装,密钥添加,账号等一次性操作。

2.操作流程:

271314500648180

是不是觉得so easy了呢,赶紧have a try!

在线生成网址二维码的API接口 - 不抛弃、不放弃:Aaron莫言 - CSDN博客

mikel阅读(851)

来源: 在线生成网址二维码的API接口 – 不抛弃、不放弃:Aaron莫言 – CSDN博客

现在很多大网站都有这样的一个功能,使用手机扫描一下网页上的二维码便可快速在手机上访问网站。想要实现这样的功能其实很简单,下面麦布分享几个在线生成网址二维码的API接口。都是采用http协议接口,无需下载安装什么软件,可简单方便地引用,这才是最简单、最便捷的免费网址二维码生成工具。
在线生成网址二维码的API接口:

1.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.ifeng.com

2.http://b.bshare.cn/barCode?site=weixin&url=http://www.ifeng.com

3.http://s.jiathis.com/qrcode.php?url=http://www.ifeng.com

4.http://qr.liantu.com/api.php?text=http://www.ifeng.com

5.http://api.k780.com:88/?app=qr.get&data=http://www.ifeng.com&level=L&size=6

6.https://api.qrserver.com/v1/create-qr-code/?size=150×150&data=http://www.ifeng.com

使用说明:把url=后面的网址改成你要生成二维码的;用它们只需要填写好网址就能自动生成二维码,方便实用,以上几个,任选一种即可。
———————
作者:Aaron莫言
来源:CSDN
原文:https://blog.csdn.net/aoxiangzhe/article/details/80895802
版权声明:本文为博主原创文章,转载请附上博文链接!

【随记】解决:VS2010 调试器无法继续继续运行该进程,无法启动调试 - 钱恩基 - 博客园

mikel阅读(908)

今天在调试项目的时候突然出现错误: 按照网上的一些方法弄了后还是同样报错,把本地代码删除后从库上重现拉下来的项目依然报错,到这里就明白不是项目本身问题了,而是VS2010 的问题,经过网上查资料,问同事各种方法之后,终于找到了问题所在:原来是PowerDesigner 16 的插件导致的; 解决方法:在VS上的菜单栏【工具】–>【扩展管理器】中把PowerDesigner 16 的插件卸载,重启VS就解决了。

来源: 【随记】解决:VS2010 调试器无法继续继续运行该进程,无法启动调试 – 钱恩基 – 博客园

今天在调试项目的时候突然出现错误:

按照网上的一些方法弄了后还是同样报错,把本地代码删除后从库上重现拉下来的项目依然报错,到这里就明白不是项目本身问题了,而是VS2010 的问题,经过网上查资料,问同事各种方法之后,终于找到了问题所在:原来是PowerDesigner 16 的插件导致的;

解决方法:在VS上的菜单栏【工具】–>【扩展管理器】中把PowerDesigner 16 的插件卸载,重启VS就解决了。

nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件 - Boom__Clap - 博客园

mikel阅读(1064)

来源: nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件 – Boom__Clap – 博客园

目前公司Web服务端的开发是用Nodejs,所以开发功能的话首先使用Nodejs,这也是为什么不直接用python转换的原因。

由于node对文本的处理(提取所需信息)的能力不强,类似于npm上的包:‘linebyline’、’lineReader’,处理能力都不强,所以使用python来处理。

 

目的:提取PDF中带有‘检查’字样的文本(行)

思路:

1、Nodejs 找到PDF转换text的包,转换,将text文本信息发送到Python服务器。

2、创建一个简单的Python服务器,接收并处理text文本,得到所需要的文本信息,打包成Json并发送到Node服务端。

3、Node服务端接收到后,再发给前端页面将信息展示。

 

好,那首先我们要去npm官网上找到转换用的包,pdf-textstring是一个不错的包,测试之后,大部分PDF都可以成功转换成text文本,但是有个别文件转换不成功,所以还需要换一个,最后是使用了’pdf2json‘这个包,在npm 上找包,有一个要点,就是包名很短,功能很多,类似的处理功能会集中在某个包上,但是包名可能只是其中一种功能。

 

PDF文件样本:

 

转换代码:

复制代码
 var fs = require('fs'),
     PDFParser = require("pdf2json");

 var pdfParser = new PDFParser(this, 1);
pdfParser.loadPDF("tmp/testpdf.pdf");
pdfParser.on("pdfParser_dataError", errData => console.error(errData.parserError)); pdfParser.on("pdfParser_dataReady", pdfData => {
     data = pdfParser.getRawTextContent()
     console.log(‘文本信息:’+data)
 });
复制代码

 

转换后的文本信息:

复制代码
操作任务: 3号主变压器带10kVB、C母全部负荷,2号主变压器停电,2号主变压器、162-2隔 
 
 
 
离开关、170、802断路器由运行状态转换为检修状态,110kVB母由运行状态转换为检修状态 
 
 
 
顺序 操 作 项 目 √ 时间 
1 投入10kVB、C母分段820闭锁备自投压板   
2 退出10kVB、C母分段820备投跳803压板   
3 退出10kVB、C母分段820备投合820压板   
4 检查2、3号主变压器分头位置一致   
5 合上820断路器   
6 检查820断路器确带负荷   
7 检查2号、3号主变压器负荷分配正常   
8 拉开802断路器   
9 检查802断路器在分闸位置   
10 检查3号主变压器不过负荷   
11 合上12中0中性点接地刀闸   
12 检查12中0中性点接地刀闸在合闸位置   
13 检查802断路器在分闸位置   
14 将802-3手车由运行位置拉至试验位置   
15 检查802-3手车到位指示正确   
16 将802手车由运行位置拉至试验位置
复制代码

 

Node服务端将转换后的文本信息发送到Python服务端:

复制代码
//Node发送数据并接受返回的处理后的数据

PDFPARSER(data, function(err, result) {
var test = unescape(result.replace(/\\u/g, ‘%u’))//解python端传来的unicode
res.send(ERRCODE.MakeResult(ERRCODE.OK, JSON.parse(test)));//JSON.parse一次,将解后的字符串换转成Json,发给前端
return;

});

//发送数据的函数

var PDFPARSER = function (reqData, callback) {
    var buf = new BUFFER.Buffer(reqData);
    var op = {
        host: "127.0.0.1",
        port: 8087,
        method: 'POST',
        path: "/",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': buf.length
        }
    };

    var req = HTTP.request(op, function (res) {
        var recvData = "";

        res.on('data', function (chunk) {
            recvData += chunk.toString();
        });

        res.on('end', function () {

            if (callback) {
                callback(null, recvData);
            }

        });
    });

    req.on('error', function (e) {
        console.log(e);
    });

    req.write(reqData);

    req.end();
};
复制代码

 

Python服务端接受并处理、返还数据:

复制代码
import sys 
import codecs
import SimpleHTTPServer
import SocketServer
import json
import re
from urlparse import urlparse
from urlparse import parse_qs

PORT = 8087

class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        pass#print self.headers
        
    def do_POST(self):
        #print self.headers
        
        contentLength = int(self.headers["Content-Length"])

        textString = self.rfile.read(contentLength)
        s = textString.split("\n")

        test = []
        for fileLine in s:
            if u'检查' in fileLine:
                line_pattern =r'\s*\d+\s?(.*)'
        
                def func(text):
                    c = re.compile(line_pattern)
                    lists = []
                    lines = text.split('\n')
                    for line in lines:
                        r = c.findall(line)
                        if r:
                            lists.append(r[0])
        
                    return '\n'.join(lists)
        
                
                result = func(fileLine)
                test.append(result)
        print test
                
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        #print result.decode("utf-8")
        #print result
        test = {"CZBZ": test}
#这里test的格式是因为前端页面接收数据的格式需要
        self.wfile.write(json.dumps(test) )
                
        

        



if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding("utf-8")
    httpd = SocketServer.TCPServer(("", PORT), Handler)
    print "serving at port", PORT
    httpd.serve_forever()
复制代码

 

Python处理后的数据:

复制代码
{"CZBZ":['\xe6\xa3\x80\xe6\x9f\xa52\xe3\x80\x813\xe5\x8f\xb7\xe4\xb8\xbb\xe5\x8f\x98\xe5\x8e\x8b\xe5\x99\xa8\xe5\x88\x86\xe5\xa4\xb4\xe4\xbd\x8d\xe7\xbd\xae\xe4\xb8\x80\xe8\x87\xb4   \r', '\xe6\xa3\x80\xe6\x9f\xa5820\xe6\x96\xad\xe8\xb7\xaf\xe5\x99\xa8\xe7\xa1\xae\xe5\xb8\xa6\xe8\xb4\x9f\xe8\x8d\xb7   \r', '\xe6\xa3\x80\xe6\x9f\xa52\xe5\x8f\xb7\xe3\x80\x813\xe5\x8f\xb7\xe4\xb8\xbb\xe5\x8f\x98\xe5\x8e\x8b\xe5\x99\xa8\xe8\xb4\x9f\xe8\x8d\xb7\xe5\x88\x86\xe9\x85\x8d\xe6\xad\xa3\xe5\xb8\xb8   \r', '\xe6\xa3\x80\xe6\x9f\xa5802\xe6\x96\xad\xe8\xb7\xaf\xe5\x99\xa8\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa53\xe5\x8f\xb7\xe4\xb8\xbb\xe5\x8f\x98\xe5\x8e\x8b\xe5\x99\xa8\xe4\xb8\x8d\xe8\xbf\x87\xe8\xb4\x9f\xe8\x8d\xb7   \r', '\xe6\xa3\x80\xe6\x9f\xa512\xe4\xb8\xad0\xe4\xb8\xad\xe6\x80\xa7\xe7\x82\xb9\xe6\x8e\xa5\xe5\x9c\xb0\xe5\x88\x80\xe9\x97\xb8\xe5\x9c\xa8\xe5\x90\x88\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5802\xe6\x96\xad\xe8\xb7\xaf\xe5\x99\xa8\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5802-3\xe6\x89\x8b\xe8\xbd\xa6\xe5\x88\xb0\xe4\xbd\x8d\xe6\x8c\x87\xe7\xa4\xba\xe6\xad\xa3\xe7\xa1\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5802\xe6\x89\x8b\xe8\xbd\xa6\xe5\x88\xb0\xe4\xbd\x8d\xe6\x8c\x87\xe7\xa4\xba\xe6\xad\xa3\xe7\xa1\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170\xe6\x96\xad\xe8\xb7\xaf\xe5\x99\xa8\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-2\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-3\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5162-3\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5162-2\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-2\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-20\xe6\x8e\xa5\xe5\x9c\xb0\xe5\x88\x80\xe9\x97\xb8\xe5\x9c\xa8\xe5\x90\x88\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-3\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5170-30\xe6\x8e\xa5\xe5\x9c\xb0\xe5\x88\x80\xe9\x97\xb8\xe5\x9c\xa8\xe5\x90\x88\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa51B9\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa51B90\xe6\x8e\xa5\xe5\x9c\xb0\xe5\x88\x80\xe9\x97\xb8\xe5\x9c\xa8\xe5\x90\x88\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa5162-2\xe9\x9a\x94\xe7\xa6\xbb\xe5\xbc\x80\xe5\x85\xb3\xe5\x9c\xa8\xe5\x88\x86\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r', '\xe6\xa3\x80\xe6\x9f\xa51B10\xe6\x8e\xa5\xe5\x9c\xb0\xe5\x88\x80\xe9\x97\xb8\xe5\x9c\xa8\xe5\x90\x88\xe9\x97\xb8\xe4\xbd\x8d\xe7\xbd\xae   \r']}
复制代码