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

mikel阅读(890)

来源: 在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阅读(842)

注: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阅读(787)

来源: 如何通过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阅读(857)

来源: 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阅读(822)

来源: 在线生成网址二维码的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阅读(887)

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

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

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

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

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

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

mikel阅读(1048)

来源: 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']}
复制代码

C#读取PDF文档文字内容 - tzdk - 博客园

mikel阅读(1199)

来源: C#读取PDF文档文字内容 – tzdk – 博客园

C#读取PDF文档文字内容

通过iTextSharp读取PDF文件内容,下载地址,下载后解压itextsharp-dll-core.zip。

只能读取英文和数字,文档中包含的汉字无法正常读取:

复制代码
private string ReadPdfContent(string filepath)  
{  
    try  
    {  
        string pdffilename = filepath;  
        PdfReader pdfReader = new PdfReader(pdffilename);  
        int numberOfPages = pdfReader.NumberOfPages;  
        string text = string.Empty;  
  
        for (int i = 1; i <= numberOfPages; ++i)  
        {  
            byte[] bufferOfPageContent = pdfReader.GetPageContent(i);  
            text += System.Text.Encoding.UTF8.GetString(bufferOfPageContent);  
        }  
        pdfReader.Close();  
  
        return text;  
    }  
    catch (Exception ex)  
    {  
        StreamWriter log = File.AppendText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase+"\\log.log");  
        log.WriteLine("出错文件:" + e.FullPath + "原因:" + ex.ToString());  
        log.Flush();  
        log.Close();return null;  
    } 
}
复制代码

 

可以读取中英文

复制代码
private string OnCreated(string filepath)  
{  
    try  
    {  
        string pdffilename = filepath;  
        PdfReader pdfReader = new PdfReader(pdffilename);  
        int numberOfPages = pdfReader.NumberOfPages;  
        string text = string.Empty;  
  
        for (int i = 1; i <= numberOfPages; ++i)  
        {  
            iTextSharp.text.pdf.parser.ITextExtractionStrategy strategy = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
            text += iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
        }  
        pdfReader.Close();  
  
        return text;  
    }  
    catch (Exception ex)  
    {  
        StreamWriter wlog = File.AppendText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase+"\\mylog.log");  
        wlog.WriteLine("出错文件:" + e.FullPath + "原因:" + ex.ToString());  
        wlog.Flush();  
        wlog.Close();return null;  
    }  
  
}
复制代码

 

经典企业管理软件商业模式 - 阿朱=行业趋势+开发管理+架构 - CSDN博客

mikel阅读(1834)

来源: 经典企业管理软件商业模式 – 阿朱=行业趋势+开发管理+架构 – CSDN博客

经典企业管理软件商业模式

咱们假设年销售额目标50亿-100亿。

一、渠道
1、全国除去香港/澳门/台湾(生意先不发展那里)、西藏/新疆/宁夏/青海(大城市太少)不说,直辖市北上广、天津重庆,还有华北(河北/山西/内蒙古)、东北(辽宁/吉林/黑龙江)、华东(山东/江苏/安徽/浙江/福建)、华中(湖北/湖南/河南/江西)、华南(广东/广西/海南)、西南(四川/云南/贵州)、西北(陕西/甘肃),一共5个直辖市、23个省。

2、全国一共600多个市(有准确的国家行政统计数据/县级市也算市),咱们把直辖北上、广深、天津重庆除外,其他城市按规模和经济实力咱们分三档:第一档100个城市,第二档200个城市,第三档300个城市。

咱们就算每个城市发展一个代理商,那就需要100-200个代理商(第三档都是弱小县级市了不支撑大销售,咱们80/20看事),平均到每个省需要找5-10个代理商。每个代理商需要负担:
A、100个代理商,50亿,每个代理商年目标5000万
B、100个代理商,100亿,每个代理商年目标1亿
C、200个代理商,50亿,每个代理商年目标2500万
D、200个代理商,100亿,每个代理商年目标5000万

二、客户
1、中国赚钱的行业大约40多个(可统计中国企业500强/中国民营企业500强),而且最老最成熟的SAP在全球也就拥有20多个行业解决方案(做不大的行业都没有专门的解决方案)。

2、按照80/20,塔尖客户还是每个行业的500强,中间一级是500强外-1万名的企业,其他1万开外的企业都是塔基企业。

咱们算大数,40个行业x500强=20000个客户。再简单粗暴说23个省,那每个省就分布大约100个中国500强客户(当然很多强客户的总部在直辖市和一级城市)。

但其实不可能每个行业都能扎的这样深把每个行业500强都覆盖到,所以主力覆盖的行业也就是20来个,这样就10000个客户,这样每个省平均分布50个500强客户。再说每个省需要找5-10个代理商,那么每个代理商需要Care 5-10个500强客户,差不多能Care过来。

看客户平均产值:
A、100个代理商,50亿,每个代理商年目标5000万,每个代理商Care 10个500强客户,每个客户需要每年产出大约500万。
B、100个代理商,100亿,每个代理商年目标1亿,每个代理商Care 10个500强客户,每个客户需要每年产出大约1000万。
C、200个代理商,50亿,每个代理商年目标2500万,每个代理商Care 5个500强客户,每个客户需要每年产出大约500万。
D、200个代理商,100亿,每个代理商年目标5000万,每个代理商Care 10个500强客户,每个客户需要每年产出大约500万。

三、产品与服务

1、每个软件公司不能研发太多产品,否则整个产业链(营销/销售/实施/项目管理/培训/定制开发/服务/运维)成本和复杂性都很高,代理商能力不匹配质量不达标。所以核心产品5个,次核心产品5个就OK。

产品不宜上中下都提供,不能一套产品提供豪华版/标准版/基本版,看似裁裁剪剪就OK,其实不可以。每层次客户的要求都不一样,对产品/营销/销售/实施/服务/定制是一整套匹配的不一样,每个代理商也做不到上能做塔尖客户下能做塔基客户的弹性能力。

2、软件价格和软件复杂度也有一定关系,软件复杂度也和客户层次有一定关系(塔尖客户/中间客户/塔基客户对软件复杂度和价格承受力均不同)。软件复杂度和价格也影响代理商能力要求和销售难度。依中国目前渠道商数量和能力,每个产品价格应该在10万-50万,这样一整套套件产品就是100万-500万。这也是普遍客户承受能力,上能覆盖每行业500强,下能覆盖中与中上行业客户。塔基客户只能放弃。

3、服务产品分为:
实施(高级流程梳理服务产品/实施安装配置服务产品/项目管理服务产品)、

服务(培训认证服务产品/试点应用服务产品/推广应用服务产品/客服问答服务产品/配置变更服务产品)、

运维(安全性能运维监控检查优化服务产品/数据检查修正清洗处理服务产品/升级迁移扩容技术服务产品/疑难技术支持服务产品)、

定制开发(新功能、新查询/新报表、系统整合/门户集成、原有UI修改、原有功能业务逻辑修改、BUG修改)

4、收入结构配比:
软件收入+License收入30%,实施收入20%,服务收入20%,运维收入20%,定制开发收入10%。

定制开发成本高利润低/知识人员管理难,所以不鼓励大规模团队定制。可以外包、可以化整为零来控制成本。为了做到能够外包、能够化整为零,需要功能代码自我封闭性/可阅读性/异常截获性强、平台API/定制开发平台/开发模板强、升级工具强,还要跟随开发文档、培训教育认证、定制开发支持。所以目标明确后就得配套所有端到端相关。

5、客户收入配比:

一套套件软件产品为5-10个子产品,每个子产品10-50万,一套套件软件产品为100-500万。这样来思考分配到一个客户一个子产品的综合产出与售价。

A、100个代理商,50亿,每个代理商年目标5000万,每个代理商Care 10个500强客户,每个客户需要每年产出大约500万。500万分为150万软件收入、100万实施收入、100万服务收入、100万运维收入、50万定制开发收入。

B、100个代理商,100亿,每个代理商年目标1亿,每个代理商Care 10个500强客户,每个客户需要每年产出大约1000万。1000万分为300万软件收入、200万实施收入、200万服务收入、200万运维收入、100万定制开发收入。

C、200个代理商,50亿,每个代理商年目标2500万,每个代理商Care 5个500强客户,每个客户需要每年产出大约500万。500万分为150万软件收入、100万实施收入、100万服务收入、100万运维收入、50万定制开发收入。

D、200个代理商,100亿,每个代理商年目标5000万,每个代理商Care 10个500强客户,每个客户需要每年产出大约500万。500万分为150万软件收入、100万实施收入、100万服务收入、100万运维收入、50万定制开发收入。

四、能力跟随

1、总部:需要在平台、模板、流程、自动化工具、全国管理平台上发力,投入精英高科技人才。

还需要做好品牌塑造、营销/销售/实施/服务/运维/开发标准制定、标准培训认证/督导/支持,管理好合同风险/回款风险

2、成立企业大学/和大学合办课程,做好人才吸引/培养/输送,做好渠道商营销/销售能力培训、实施/服务能力培训、技术运维/技术开发能力培训

五、实例分析

咱们分析,战略是:
1、产品:大力做强产品(财务、SCM、CRM、HR、OA)、大力做强服务标准产品、大力做强定制开发平台产品和配套

2、标准:大力做强品牌,大力做强各业务线标准制定/培训认证/督导/支持

3、大力做能力提升:渠道商营销/销售能力培训、实施/服务能力培训、技术运维/技术开发能力培训

4、大力扩张渠道战略:力求扩张到200个大渠道代理商

假设现在年收入10亿,要在10年内要达到年销售额50亿-100亿,按年复合增长率25%速度增长(考虑速度管控风险/能力成长/人工成本增长/营销销售费用增长/办公租金增长/税金增长/客户持续购买能力),来倒推需要多少年来实现。这个年限也决定了在这些有限时间内每年要明确做到哪些大事。

就算需要10年完成,那上述4类大事,每类都最少需要2.5年必要时间,这很紧。不过做事我们从来都不是线性的,而是配比同步增长的,所以会持续同比夯实与扩张,这就是健康的。

额外,再想想另外一家做各种主流行业解决方案的软件集团企业,号称年销售额60亿,主要收入却来自欧美日外包,把美元换算成人民币统计来提高年收入,本身国内各主流行业解决方案从开发到实施到服务到客服做了N多也收入才20亿(差不多一个行业平均下来2亿),其他收入来自电子硬件销售。所以回头想想就做国内市场,纯做解决方案(不卖硬件),要做到50亿-100亿,要有多难、利润要有多低,如果不压榨成本,就是优化最精确的战略规划/最精确的计划执行PDCA管理和预算管理,这运营能力得要求多强。
———————
作者:david_lv
来源:CSDN
原文:https://blog.csdn.net/david_lv/article/details/17733183
版权声明:本文为博主原创文章,转载请附上博文链接!

企业应用软件商怎么渡劫 - 阿朱=行业趋势+开发管理+架构 - CSDN博客

mikel阅读(1255)

来源: 企业应用软件商怎么渡劫 – 阿朱=行业趋势+开发管理+架构 – CSDN博客

企业应用软件商怎么渡劫

云这个概念从2006年由Google提出,Google的信息爬取爬虫、内容存储、内容索引、搜索运算,无时不刻的让我们感觉到云计算和云存储的强大性。传闻Google已经拥有一百万台服务器,这么密集的服务器,需要的电力/通风/散热、高集成安装放置、数据传输/服务器分布式协同运算、监控运行/硬件损坏/替换,这得多高的技术要求。所以听说Google自己研发服务器主板为了更高密集放置,自己设计机房为了全自动化运维/机器人替换损件,用海水循环制冷散热/用潮汐来产生电力,自己研发新的数据传输协议/自己研发铺建新的数据传输缆线介质,自己研发操作系统研发数据库研发开发语言研发中间件并且开源,而且还把这些从基础硬件/网络/存储/软件都开放出来供大家分享使用,这就是云的起源。

后来Amazon为了搞开放商家平台,为了商家的数据/图片的存储,为了销售数字化的电子书/音乐/数字电影的存储和传输,所以Amazon也发展了云计算/云存储业务。

但2013年才应该是中国云计算元年,这已经距离2006年过去了7年了。2013年,国际巨头Oracle整个公司全方向转云/大力收购大力研发云/并且加大对云的销售业绩要求和提成激励,IBM云进入中国、微软云进入中国、Amazon云进入中国,SAP大力推广私有云HANA高性能软硬一体化的数据仓库/商业智能。中国各大巨头如华为、联想等也加入国际开源OpenStack云组织,中国互联网巨头BAT/360都进入云市场,并且去年掀起一股消费云大战那就是网盘/相册,从免费赠送100G竞争到了免费赠送10个T。在企业应用云,金蝶的主打中端产品K3也演变成K3 Cloud,是全新研发的一代产品,完全基于云来设计而非过去K3的改造。用友也研发了云应用管理平台Cloud Service Platform。东软也在2014年初宣布以后在主力行业推进云,东软扎的行业可都是政府、事业性等对安全对私有敏感的组织(如国土资源、电信、电力、公安、税务、审计、社保等等)。2013年最让人震惊的还是Amazon与美国中情局签订云服务的提供,这可是安全保密极高的美国安全军方,对于对云有安全担忧的人们无疑是一剂强心剂。

云虽然在IaaS 网络虚拟化/存储虚拟化方面还有许多技术深化、在关系型数据存取领域还缺乏重磅分布式产品、在开发语言领域Golang还不成熟、在应用引擎研发方面还不丰富不稳定不强大、在运维服务管理方面还响应不足/解决问题不足、解决方案在开源界还尚不成熟,但,这是IT行业,3年一小变,5年一大变。所以从2013年算起,2017年将是中国云计算爆发的一年。

科技的进步是相对比较快的,但应用落地普及往往受客户进步的影响,客户走不动你就很难动。但纵观中国企业信息化20年,很多重大阶段的升级往往不是受客户驱动,而是受巨头推动。Oracle已经决定云优先,也就是销售组织侧重云、销售业绩份额偏重云、销售提成激励偏重云,所以Oracle的销售先给客户推荐云讲解云营销云。

巨头的推动力量是巨大的,就如同中国金融业一直很封闭的自己玩,现在BAT年底一轮利率热、理财基金热,短期聚集了万亿资金。这让保守金融业从未有过的震惊。怎么世界变成这样的玩法了?老百姓难道疯了?纷纷举办内部研讨会、给媒体吹风给老百姓吹风宣传风险担忧漏洞,但却仍然势不可挡。就如同中国电信业,过去三大巨头,现在虚拟运营商纷纷获得牌照应用花样眼花缭乱。就如同中国出租车业,几十年没什么变动,去年第四季度打车软件补贴大战互联网巨头砸10亿真金白银,顿时出租车业天翻地覆。再比如中国如家之于中国宾馆业,携程之于中国民航机票销售业一样。这就是巨头的资本力量+媒体传播营销力量+消费者流量入口力量+地推力量+信息数据收集/应用研发力量。这就是巨头的砝码。

中国企业客户应用科技是一向保守的,但这几年京东、阿里攻城略地,让线下制造商、分销商、零售商纷纷压力巨大,有的关店,有的多渠道销售,有的转型主力线上。这都是生死痛苦蜕变。谁能料到线上发展这么快,而且革命了线下,让线下无路可走。现在这些互联网巨头又在准备革命服务业,先从餐饮团购、电影院/KTV/美容院/度假村/游乐园开始。传统巨头惊了,什么叫互联网思维,怎么转?联想、万科、华为、海尔纷纷在探讨、领队参观学习。

而云计算也是如此。不仅互联网巨头们业务应用一体化变革整个行业的商业模式与业务流程,而且人家利用云存储获得了整个闭环业务链条的全社会的业务数据,这对重组、优化、配置社会资源,让社会资源更加高效率高价值非常有利。

我们做传统应用软件的目的不就是为了企业资源配置、组合更加高效率高价值么?我们局限在某个企业内部信息收集、某个企业内部资源的整合优化。而人家互联网一上手就是整个社会资源,我们的某个具体客户就是人家社会资源中的一份子。我们是小圈,人家是大圈。

企业经营讲究的是根据市场动态来决定自己的战略战术决策,所以最关键的信息反而是企业外/社会内的信息,而非企业内部的信息收集利用。所以我们做传统企业应用软件一开始就低了一维。

有句夸张的话就是未来每个企业都是电子商务企业,每个企业都会成为一个软件企业要充分利用软件信息技术来为自己经营而引领并支撑。虽说这个未来可能还不确定有多远,可能一些企业如媒体、出版、金融、旅游、机票/火车票、宾馆、打车、餐饮、休闲娱乐、购物、数码、家电、教育、医疗、农业养殖种植都被充分颠覆了,更多的行业也正在被逐步颠覆重新想象。但中国仍然太大,中国企业太多,中国三教九流的水平层次太杂。这么多的颠覆,仍然是大量企业在权钱寻租交易、跑马圈地、暴力营销、逐水草而居。所以中国传统企业软件也很多层次很多路仍然可行。

但云这个坎怎么迈?

我过去反思过传统企业软件的核心竞争力,有人讲应该是渠道销售与服务能力,有人讲应该是产品研发品质,有人讲应该是整个业务价值链的整合管理,有人讲是品牌溢价议价能力、有人讲是软件内嵌灵魂思想模型引领指导能力、有人讲是客户需求快速探知与满足。

我觉得这都对。但就是没人讲中国传统企业应用软件的核心在于技术。

你看看云。你要满足海量用户的运行和数据存储,这比给一家家企业安装部署软硬件要高门槛的多。大量传统企业应用软件商,只要客户的数据大点人多点,IT系统就不稳定/性能慢。虽说中国传统企业应用软件都研发自己的所谓企业应用平台,但结果就这现状。

那在云时代怎么应对?所以必然要把自己所谓的企业应用平台经过裁剪,放置到现在专业的云提供商那里。

企业应用平台其实内在分很多层,最底层应该是技术平台。过去搭建企业应用平台,如在微软技术体系内,微软提供了报表服务引擎、工作流服务引擎、消息队列引擎、服务接口管理引擎、数据ORM存取引擎、事务引擎、日志记录、异常跟踪监控等等。再往上是真正的企业应用基础,如单点登录门户、组织权限管理、主数据管理、基础业务参数开关维护。再往上走是新模块可视化设计工具/典型功能代码框架、定制开发工具/补丁打包发布工具/补丁升级工具、实施安装部署工具/数据初始化工具、运维检查监控优化工具/技术支持工具。

所以说,专业的云提供商会替代了企业应用平台中的技术平台部分。你看云提供商提供的文档存取数据库、图片存储数据库、视频存储、KV数据存储、语音识别引擎、图片识别引擎、消息队列引擎、地图引擎,这些高难度技术都是中国传统企业应用软件商干不了的。所以只能干脆利用人家的引擎。

未来,能做企业应用平台的寥寥无几,全被高技术门槛打死了,不像现在各种OA、BPM、快速开发平台等等各种李逵李鬼都纷纷宣称自己是平台。

彻彻底底扯下技术遮羞布的中国传统企业应用软件商,放到云上面大大自动化简化实施/运维/支持,在这种未来现状下,什么是中国传统企业应用软件商的核心竞争力呢?在这种局面下我们不妨再问自己一下这个问题。客户需求快速探知与满足能力?软件内嵌灵魂思想模型引领指导能力?品牌溢价议价?产品研发品质?渠道销售服务?业务价值链的整合管理能力?

到底哪个能力是第一呢?有人说当然是客户需求快速探知与满足能力?这是生意的本质根源啊。但你做了什么能够做到这一点呢?有人说是业务价值链整合管理能力?那你又做了什么能够做到这一点呢?我们不妨多问问我们自己。
———————
作者:david_lv
来源:CSDN
原文:https://blog.csdn.net/david_lv/article/details/20222193
版权声明:本文为博主原创文章,转载请附上博文链接!