Quantcast
Channel: 看得透又看得远者prevail.ppt.cc/flUmLx ppt.cc/fqtgqx ppt.cc/fZsXUx ppt.cc/fhWnZx ppt.cc/fnrkVx ppt.cc/f2CBVx
Viewing all 20490 articles
Browse latest View live

cayley,一个基于go的开源的图数据库

$
0
0
这是一个NoSql数据库,适合处理复杂的,但是结构化低的数据,适用于社交网络,推荐系统等。
安装:
go get -u -v github.com/cayleygraph/cayley/cmd/cayley/是安装不成功的。

If your version of Go < 1.13, you need to run:
export GO111MODULE=on

git clone https://github.com/cayleygraph/cayley
cd cayley
# download dependencies
go mod download
go build ./cmd/cayley/
(在当前目录下,会生成可执行文件cayley)
./cayley -h

参考https://cayley.gitbook.io/cayley/contributing  

项目地址: https://github.com/cayleygraph/cayley

Mac知识整合

$
0
0

.DS_Store 文件是什么?

.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于 Windows 的 desktop.ini。
1,禁止.DS_store 生成:
打开 “终端” ,复制黏贴下面的命令,回车执行,重启Mac即可生效。
defaults write com.apple.desktopservices DSDontWriteNetworkStores -boolTRUE
2,恢复.DS_store生成:
defaults delete com.apple.desktopservices DSDontWriteNetworkStores

显示隐藏文件:

在终端执行命令,显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles -booltrue
恢复隐藏
defaults write com.apple.finder AppleShowAllFiles -boolfalse
执行命令后需要重新打开能看到效果。

切换Pyhton 环境:

我本地之前 Python 环境是 2.7.10 ,然后学习 Tensorflow 的时候,安装了 Python 3.5.2 ,把系统默认 Pyton 环境也设置成了 3.5.2 版本,今天运行以前写的 python 脚本发现运行不了了,因为python 2.7 和 3.5 的 语法有挺多改动,现在我需要把系统的 python 环境回退到 2.7。
可以直接修改 ~/.bash_profile文件。
  • 1、修改 vim ~/.bash_profile
修改方式有很多种,使用 vim  ,或者 cd ~/ 然后 open . 打开文件夹,找到 .bash_profile 文件,双击打开。
  • 2、在.bash_profile文件里添加下面参数
alias python="/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7"
  • 3、使用命令 source ~/.bash_profile或者重启 终端 就 OK 了 。
现在你再在终端输入 python就会发现,显示的信息为 2.7 了

Python 2.7.10 (default, Oct 232015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license"formore information.

生成SSHKey过程:

1.查看是否已经有了ssh密钥:`cd ~/.ssh`,如果没有密钥则不会有此文件夹,有则备份删除。    
2.生存密钥:ssh-keygen -t rsa -C“test@gmail.com”。 按3个回车,密码为空。

Your identification has been saved in /home/tekkub/.ssh/id_rsa.
Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
最后得到了两个文件:id_rsa和id_rsa.pub

使用版本控制器 SVN (versions) 添加.a库:

Xcode 自带的 svn 和 Versions 以及一些其它工具都不能上传”.a”文件
下面是在 Mac 上如何把 .a 添加到 SVN 里面的
1、打开终端,输入cd,空格,然后将需要上传的 .a 文件所在的文件夹(不是.a文件) 拖拽到终端(此办法无需输入繁琐的路径,快捷方便) 回车
2、之后再输入如下命令:svn add libGoogleAnalytics.a,回车
之后会出现:A (bin) libGoogleAnalytics.a
表示添加成功,打开 Versions 就可以看到,刚才添加的 .a 文件,此时就可以手动上传了。
另外,请注意路径的正确性。

這!不是新聞 港「大三罷」街頭對峙…警開槍,東山精密LED黑科技

沈大偉:美中關係進入無限期全面競爭状态(好消息。换句话说就是:中国势必成为第二个前苏联那样的竞争对手。共匪的好日子到头了,至少指日可待,而非遥遥无期)

$
0
0
中評社華盛頓11月9日電(記者 余東暉)美國的中國問題專家沈大偉(David Shambaugh)對中評社表示,不管誰當美國總統,美國對華政策不會有大的變化,因為對華強硬已經成為美國全國的、跨黨派的共識。他稱,美中關係已經進入"無限期的全面競爭"。

  喬治·華盛頓大學國際經濟政策研究所8日舉行"中國經濟發展與美中經濟關係"年會。該校國際關係學院教授沈大偉在會上回答中評社記者問"下屆美國總統,誰對中國來說更好打交道?"時作上述表示。

  沈大偉說,就對華政策來說,誰當下屆美國總統並不十分重要,因為美國對華政策轉強硬是機制化的、選民驅動的、跨黨派的、全國性的變化,不只是由總統一個人決定。即便下屆總統是民主黨人,對華政策也不會有太大變化。他承認,不同的總統施壓的重點有可能變化,比如民主黨總統可能在人權問題上加大施壓,但他認為不會看到美國對華政策因政府更迭而出現質的變化。

  在研討會上展望美中關係時,沈大偉斷言,美中兩國已經進入"無限期的全面競爭"之中,再也回不到以前曾有過或者說曾試過的"和諧接觸"狀態。這種全面的競爭體現在各個領域、各個地區,因為中國現在已是全球角色。

  儘管沈大偉堅稱競爭將是美中關係的主導趨勢,但他也指出,競爭並非完全排他性,美中之間還可以有一定範圍的合作,尤其是在全球治理和挑戰跨國全球性挑戰方面,雙邊也還有一些合作元素,比如商業、學術合作應當繼續。他強調,競爭不是對抗,也不是遏制,競爭就是競爭,競爭植根於人類基因之中。

  沈大偉表示,美中互為競爭者,長期全面競爭是"新常態",人們要習慣兩件事情:第一,美國對華政策更強硬、會繼續;第二,美中之間繼續會有摩擦。

  在回答聽眾關於美中意識形態競爭的提問時,沈大偉表示,從1949年以來,意識形態一直是美中競爭的元素之一。當然,現實主義者不將意識形態競爭作為非常重要的方面,他們通常會採取較務實的態度,但這個元素一直存在於表面之下,尤其是中方對美國的意識形態一直有很強戒心。但從最近蓬佩奧和彭斯講話看,意識形態在特朗普政府中確實在美中緊張關係中的重要性上升,而且與其它問題結合在一起。

  談到中俄關係,沈大偉表示,中俄建立"戰略協作夥伴"關係,"協作"為什麼?兩國沒有明說,但顯然是為了對付美國。他承認,戰略三角又回來了,這回是中俄攜手對付美國。

  在研討會上,沈大偉指稱中國知識界沒能理解美國對華政策為何急轉直下,宣稱中國精英階層也應當像上世紀50年代美國精英辯論"誰丟掉中國"一樣,來一場"誰丟掉美國"的大辯論。

  2015年3月,沈大偉在《華爾街日報》刊登標題為《即將到來的中國崩潰》的文章,引發爭議。人們更關注的是,沈大偉為何由之前人們普遍認為的對華"溫和派"變成"唱衰派"。沈大偉利用各種場合進行過多次澄清和解釋。近三四年,沈大偉在華府對華外交學界活躍度有所下降。

从“会党” 特征说到邓小平的改革旗帜

$
0
0


          会党是农业社会革命历史时期政治组织的基本特征,也只有这样,才能有效的把农民,特别是当中的"勇敢分子"组织起来。中共党内的国际派不懂这个道理,不懂中国社会,所以领导中国的共产革命就无法成功、败迹连连。而毛泽东深谙此江湖之道,所以才可能成功。周恩来在遵义会议之前明白了这一点,所以说服博古等人,让毛重回军事指挥一线,民主派张闻天主政。也正因为如此,革命才得以延续、逐渐发展壮大。
        但是这种拼杀办法,虽然在夺取政权的时候十分有效,但是在和平建设历史时期就不适用了。所谓"可以马上得天下,不可马上治天下"。但是毛泽东不明白这个道理,也不愿意接受这个道理,因为一旦接受,他的绝对权力地位就会被动摇。为此他想到了一个办法,把拼杀办法树立为革命传统,把中国社会内部一直涌动的,对和平时期社会正常的物质利益原则、运行规则的需求,一直标签为"资产阶级、资本主义复辟、修正主义"予以打压。这种反社会反人性,把社会拉向倒退的治国理政怎么能不失败!
        邓小平改革开放的实际立场是:坚持"打杀"的革命传统体制(四项基本原则),接受社会内部涌动出现的物质利益动员机制需求,即"两个接受"。所以一方面准许灵活的各种经济发展手段。但是发展经济的改革开放是以保证"打杀"体制为底线,这也是允许存在市场经济的运行躯壳,不准许市场经济的灵魂存在,因为市场经济的灵魂是要瓦解"打杀"体制的。另一方面,他的政治领域改革,只能把领袖独裁改革为党的专制体制。虽然他对"打杀体制"的未来并不乐观,但是邓绝不会主动、自觉去实现这一历史发展的进步趋势,他坚决拒绝这种历史角色。他的改革开放思想和立场通过社会实践已经非常明确:从理论务虚会到先后罢黜胡赵两任坚持改革的总书记,甚至不惧"开火";从抵制因"开火"而带来的经济改革倒退(南行讲话),到确定十四大的市场经济说法等。邓为了实现自己既定的改革思想和立场,甚至恢复使用领袖独裁的办法。由此可见,在这些老一辈"无产阶级革命家"的头脑里,"会党"的打杀观念多么牢固。对比胡耀邦、赵紫阳和当初无数因为追求光明进步而投身革命队伍的进步青年、知识分子,可以看出中国共产党本身的多重性。不过这一涉及如何全面深刻认识中国共产党的重要话题,只能留在另外的文章里讨论。
        由于邓的改革实践已经表达得十分充分,完全可以对他的思想和立场予以总结。
        首先邓没有整体的改革思想,在经济领域,他接受、批准推行来自民间的自发经济形式,甚至到了最后,接受了市场经济的形式(躯壳),但是坚决拒绝市场经济的灵魂。在政治领域,表面接受将领袖独裁改革为党权专制,但实际还是坚持了领袖独裁,并且坚决拒绝对党权体制实行社会改革。虽然他曾经就香港的一国两制说过"五十年后就不必变了",甚至说过共产党可以考虑改名为社会党这样的话,但那都没有成为实际的政治活动,所以不能纳入他的政治社会实践,作为归纳邓的改革思想和立场的依据。也正是基于上述论述,所以我不赞成"继续高举邓小平的改革旗帜"这种说法。

        吕  朴 
2019 11 12

戈尔巴乔夫的历史贡献,某些人理解不了

$
0
0


      苏俄的末代大帝戈尔巴乔夫,自从退出历史舞台起,乌托邦就以事实向世人表白了,即那些通过某些人躲在书斋内想象的理想是可笑的,是经不起实践的。对于乌托邦,在它还没有破碎之前,欧洲就有多位思想家予以论证,如哈耶克、波普尔、米塞斯等等。他们中的一些人,通过经济自由来分析问题,试图找到问题的根源来,以避免那可怕的奴役之路。
    对于乌托邦的实验,这本来是没有什么好争议的,但由于某些人的认知存在闭合圈,在没有接触到更广阔的思想下,他们习惯于用过去的那些理想去发挥想象,进而得出某些拯救的结论。生活在“洞喻世界”的人,所想出来的弥补或补救措施,其实终归是逃离不了“洞喻”观念及其思维,所谓的修复也只是一种假想。
   过去,有关戈尔巴乔夫的拯救一直不停,批评者指责他的失败,赞扬者肯定他的努力。在是与非之间,有一点却是很容易被忽视,那就是乌托邦实验真的可以闯出来吗?戈尔巴乔夫处理苏俄的方法有问题吗?
    显然,一些人沉醉在“乌托邦”之上,一些人则沉醉在“版图”之上,有些人则把视线放在了“改良”。换句话说,对于戈尔巴乔夫,不同的人其实有着不同的理解,所站在的角度也不尽然一致。但是,常识是非常简单的,就是认识问题的标准不同,所得到的结论就会不同。既然标准不同,那么不同维度的观点就根本没办法达成一致,试想要大家统一看法,那不过是专制思维而已。
    在历史上,乌托邦是没有办法拯救,不管是戈尔巴乔夫,还是谁,面对思想内在的冲突,那不是简单的方法就可以弥合起来的,因而戈尔巴乔夫的《新思维》同样无法实现目标。至于他的改良愿景,那是以良知为指导,以自由为目的,因而他的这个努力是值得肯定的,也是后来欧美世界予以赞扬的原因所在。
   乌托邦没能闯出来,那么戈尔巴乔夫是否可以努力维持住载体的苏俄呢?或者说,当下那些还在争论不休的人,是否切割分析了,又是否作了统合分析?一般地说,乌托邦的载体与乌托邦是存在一定的关系,但二者又不完全相同,乌托邦破碎了,载体未必就要结束,如东欧的某些地方。在俄国,试验乌托邦是一码事,而载体走向解体却是另外一码事。
    事实上,苏俄的解体不在戈尔巴乔夫挽救能力问题,而是俄国在沙皇时代持续扩张的问题,是苏俄的矫枉过正的某些民族政策问题。正是沙皇时代遗留下来的问题,导致了俄国在20世界出现二次解体,因为沙皇的持续征服是依靠强力,当这个强力不能在维持了,驾驭力出现式微或真空,被征服的那些边缘地区就很容易回归独立。在这个过程中,威尔逊主义的“自治”的确起到了很大的助推作用,而列宁对威尔逊主义的改造同样具有很大的刺激作用,因为它在某种程度上是对沙皇时代的政策进行一次矫枉过正。
     从这里来看,乌托邦的试验失败,以及苏俄帝国的解体,都是有自身的内在运行轨迹,也存在着它们各自的原因,因此,过去那些归罪于戈尔巴乔夫的观点显然是站不住脚的,是一种强烈的个人意志。事实恰好相反,面对客观存在的运行轨迹,戈尔巴乔夫选择的顺其自然,而不是逆潮流,这本身就是他对历史做出的贡献。试想,如果当时的戈尔巴乔夫执意要去逆形势,抗拒内在运行轨迹,那就势必要借用强力,这就很容易走向恶性,甚至上演暴力。明知不可为而为之,这是不智慧的表现,也是不负责任的做法,很容易产生“进一步身死,退一步心死”的尴尬局面。
    戈尔巴乔夫没有去做逆大形势的抵制,却是选择了顺应潮流,让其自然而然发展,这就避免了很多问题的出现,特别是避免了激进。当时的英美世界,正是保守主义持续发展的时期,所以避免激进暗合了这股保守主义思潮。戈尔巴乔夫的这些努力,是时人与后人难以理解的,也是很容易被忽视的。
     今日某些批评戈尔巴乔夫的人,无非是以“一统山河”的思维去看问题,是脱离苏俄大环境去考虑问题,普遍属于以己之心夺俄国之腹,纯粹用想当然去赋予美好的想象。或许,有的人在吃不饱饭的时候还想着俄国统一的事,还在努力赞扬俄国恢复旧版图如何好的事,这就是典型的梦想家。
    戈尔巴乔夫的选择,对俄国人来说是历史性贡献,它让俄国人快速获得了自由,让沙皇时代通过强力征服的人群回归到自己的传统生活上。所以,不能用普京的那些后退做法去评论戈尔巴乔夫,否则得出来的结论就会出现误解。是自己理解不了戈尔巴乔夫,而不是戈尔巴乔夫在当时的选择错了。
   2019.11.11.

年代向錢看 港11‘國殤’,武力鎮壓入校園 中俄聯合軍演 "封鎖奪島"圖曝光

香港到了真正紧迫的时刻,美国感觉到了,林郑月娥和习近平却未感觉到.


How to setup OpenShift Container Platform on your local machine in minutes

$
0
0
it's been awhile since I've talked about running OpenShift Container Platform on your local machine.

This mean a container platform at your finger tips, one you can experience the joys of cloud native development and automated rolling deployments. Since I started pulling together ways to easily experience this with OpenShift Container Platform, back with version 3.3 believe it or not, we've come a long ways.

For some time now I've been waiting for the local installation that stopped being supported with OpenShift Container Platform 3.9 to reappear in version 4.x. Well now it's finally here with the last release of OpenShift Container Platform 4.2, in the form of Code Ready Containers.

The idea was to make this as streamlined of an experience as possible by using the same OpenShift Container Platform Easy Local Install project. Let's take a look at what this looks like.


The first focus was to have this work for Unix based operating systems using a single installation script. The secondary wish is to provide a windows based installation script.

Linux or Mac installation

This installation requires the following (all freely available):

1. HyperKit for OSX, Hyper-V for Windows, or Libvirt for Linux
2. Code Ready Containers (OCP 4.2)
3. OpenShift Client (oc) v4.2.0

First you need to ensure your virtualization tooling is installed for your platform, just search online for how to do that or your specific platform. Second you need to download the Code Ready Containers. Finally, you need the OpenShift client. Normally you'd expect to have to track these last two down but we've made this all easy by just including checks during the installation. If you have something installed, it checks the version, if good then it moves on with next steps. If anything is missing or wrong version, the installation stops and notifies you where to find that component for your platform (including URL).

Let's get started by downloading the OpenShift Container Platform Easy Local Install Project and unzipping in some directory. This gives you a file called ocp-install-demo-master.zip,just unzip and run the init.sh as follows:

     $ ./init.sh

Follow the instructions as each of the dependencies is checked and you're provided with pointers to getting the versions you need for your platform.

Note: Each Code Ready Container download is tied to an embedded secret. This secret you need to download (link will be provided) as a file and you'll be asked to point to that secret to start your container platform. This pull-secret has a 30 day lifespan, so once it's expired you'll need to download both a new Code Ready Container AND a new pull-secret.

Once you've gotten all the dependencies sorted out, the install runs like this:


A little ASCII art and then it's checking for my platforms virtualization (Hyperkit), then looking for the OpenShift client version 4.2 (oc client), then running a setup (crc setup).


The next steps are providing the pull-secret-file, you can set this in the variables at the top of the installation script. Now the moment of truth, the Code Ready Containers cluster starts, which takes some time depending on your network (crc start). With a good networks it's about a five minute wait.


This is the logging you'll see as the OpenShift cluster starts on your local machine. The warning is normal, just some of the features have been trimmed to speed up deployment.


At the end we'll retrieve the admin password for logging in to the cluster's console, pick up the host URL, test the deployment by logging in with our client (oc login), and finally you're given all the details in a nice box. You have the option to stop, start it again, or delete the OpenShift Container Platform cluster as shown in the dialog.

Next open the web console using URL and login 'kubeadmin' with the corresponding password. In our case it's the URL: https://console-openshift-console.apps-crc.testing


Log in with user: kubeadmin
Password in our case: wyozw-5ywAy-5yoap-7rj8q

That opens the main dashboard:


This concludes the installation of an OpenShift Container Platform on our local machine using Code Ready Containers.

What about Windows?

If you are a sharp observer, you'll notice there is a file called init.bat for windows platforms to install with. The problem is I've not been able to test this yet on a windows machine, so I'd love to call out to the readers out there that might have some time to contribute to test this script and help us complete the installation. You'll notice a few TODO's marked in the scripts code, as they are untested areas in the installation.

You can raise new issues here and help us complete the windows based installation and get your name added to the contributors list. We'd be really thankful!

Stay tuned for more on cloud native development using other Red Hat technologies on your new OpenShift Container Platform installed locally on your own machine!

from  https://planet.jboss.org/post/how_to_setup_openshift_container_platform_on_your_local_machine_in_minutes

项目地址:https://gitlab.com/redhatdemocentral/ocp-install-demo

滕彪:柏林墙的倒塌与“信息柏林墙”的建立

$
0
0
柏林墙被拆除30年后,人类早已进入信息互联互通的数字时代,但在专制世界与自由世界之间,还有一座柏林墙需要被拆除,那就是中国的互联网防火长城,也称作国家防火墙(Great Firewall,GFW)。它是中国的互联网审查系统(包括相关行政审查系统)的统称,作用主要是监控国际网络上的通讯,对认为不符合中共官方要求的传输内容,进行干扰、阻断、屏蔽。此系统起步于1998年。

一般的墙,是防止外人随意进来;监狱的墙则是限制里边的人自由出去。而中国的防火墙,既阻止外界的信息自由进入中国,也限制里面的信息自由传出中国。它屏蔽了大量国际媒体、智库和国际人权组织的网站,屏蔽了几乎全部最流行的国际社交网站和大多数视频类网站。中国是极少数几个不能上Twitter、脸书、Google、YouTube、BBC、CNN、纽约时报的国家。墙内的人们既无法获取数以百万计的重要网站的信息,也无法通过这些自由的网络平台发布信息、发表看法。中国人就这样,被困在一个无形的、却严密的信息监狱里。

人们只能从层层过滤、重重审查的官方媒体、官方网络上,获取信息;人们被迫接受的是扭曲的历史、虚假的现实、意识形态宣传、心理操控、屏蔽真相、愚民奴化教育,共产党洗脑机器可以说成果显着。几代人生活在以血腥暴力为基础的信息监狱中,形成了顺服乃至热爱老大哥的认知和情感。不但如此,中国政府不但控制信息的自由流进流出,而且通过所谓的社交媒体 – 微博、微信、QQ、抖音等 – 收集和窃取公民信息、监控网民的一举一动。信息柏林墙虽然无形,但老大哥的眼睛无处不在。从毛氏群众运动极权到习氏高科技极权,独立思想被制裁、独立人格被摧毁、反抗行动被扼杀。这种环境培养出来的绝大多数人,只能是脑残、犬儒、投机分子或小粉红。

柏林墙挡不住人们对自由的向往。1962年8月17日,18岁的东德人彼得•费查试图翻越围墙,在攀至顶部后,两名东德边防军士兵罗夫•费特列治和艾力•薛伯发现了他,并向他开枪。彼得是第一个因试图攀越柏林墙而被射杀的人。除了直接翻墙外,人们采取了许多方式:高楼跳下、挖地道、潜水、大型热气球、走下水道、驾轻型飞机、开汽车高速冲过检查站等等。一位工程师设计了一个强力弹射装置,从东柏林市内的高楼起跳,“弹”了数百米到达西柏林,然后利用自造的降落伞缓缓落地。柏林墙建立后,共有5043人成功地逃入西柏林,3221人被逮捕,239人死亡,260人受伤。

为了翻越中国防火墙的网民们,也曾各显神通。自由门、火凤凰、tor、赛风、免费代理IP、VPN、蓝灯、SSR等,猫捉老鼠游戏玩了十多年。不过似乎道高一尺、魔高一丈,近年中共发威加强防火墙封杀VPN,翻墙越来越难,风险越来越高。因为帮人翻墙而被拘留、判刑的例子,开始多了起来。
广东东莞的邓杰威因出售“飞跃SS”、“影梭云”VPN翻墙软件账户,被判刑9个月;吴向洋因搭建VPN服务器,并出租、销售VPN软件和VPN路由器硬件,被判刑5年半。2019年3月,翻墙技术网站“逗比根据地”创始人孙东洋被判刑3年、缓刑4年,并被没收电脑及处罚20000万元罚金。甚至一些网民仅仅因为使用VPN翻墙,就被警告、传唤、罚款乃至拘留。因为网络言论而被判刑的中国网民、作家、记者更是成千上万,记者无国界、自由之家等国际人权机构,把中国列为少数几个“互联网黑洞”、“互联网敌人”。中国的互联网自由度排名仅仅排在三个国家之前:厄立特里亚、北朝鲜和土库曼斯坦。

“信息柏林墙”虽然无形,但专制政权对翻墙、推墙的惩罚却毫不手软。那些大胆行使言论自由、试图冲破言论禁忌的中国公民,因为翻越无形的高墙而被关入有形的高墙。
创始于1985年的“无国界记者”,在促进全球新闻自由方面卓有成效, 2005年被欧洲议会授予萨哈罗夫思想自由奖。2018年,在“无国界记者”的倡导下,成立了25人“全球信息与民主委员会”,委员包括经济学家阿玛蒂亚•森、斯蒂格勒茨、作家略萨、人权律师埃巴迪等四名诺贝尔奖得主,和弗兰西斯•福山、亚当•米奇尼克等学者、记者、作家、人权活动家和科学家。作为25名委员之一,我参与了《全球信息与民主宣言》的全部讨论和起草过程,向委员会解释中国的“信息柏林墙”。

2018年11月公布的《全球信息与民主宣言》,确立了全球信息空间是属于全人类的共同财产,它应服务于表达自由、人类尊严、宽容和增进理解;获取信息和知识,是一项基本人权;政府控制媒体、扭曲信息、压制新闻、用暴力对待记者,极大威胁和剥夺了人类获取信息和知识的权利。这个宣言重申和细化了《联合国人权宣言》与《公民权利与政治权利国际公约》中,关于“表达自由”的基本原则,并结合信息时代的特点,为全球信息空间、媒体、记者和国际信息平台确立了基本原则。《宣言》得到数十个国家、联合国教科文组织以及欧洲理事会的支持。

柏林墙倒塌至今30年了,越来越多的人们开始猛然醒悟到:互联网曾经被人们寄予厚望,可以引领中国走向开放与自由,但中共却用它来实施全面高效的数字极权主义。哈佛历史学家尼尔·弗格森(Niall Ferguson)在纪念柏林墙倒塌30周年的文章中说,“当我们痛快地庆祝共产主义在欧洲崩溃时,全然低估了共产政权在中国存活下来的深远意义。”

人们迟迟没有意识到:民主与专制的对抗没有停止,中共筑起的“信息柏林墙”不仅囚禁着中国人民,而且不断向自由世界渗透和扩张。孔子学院、中国学生学者联合会、各类同乡会、校友会和商会,威胁着西方的言论自由和学术自由;大量的海外媒体被中国政府渗透、收买,影响着海外华人和外国读者的思想观点;中共用拒绝签证来威胁国外研究者、记者,迫使他们进行自我审查;在中国进行采访报道的外国记者受到中国政府的限制、跟踪和骚扰;微信、抖音等中国社交媒体,越来越引起海外用户关于内容审查和隐私安全的忧虑;很多西方公司因为在西藏、维吾尔、香港、台湾等问题上的政治观点而受到中国政府的谴责和抵制,并且几乎都要道歉并且撤回或改正他们的说法;华为、ZTE等中国科技巨头,对所在国的国家安全构成威胁;中共利用黑客对西方政府、科技、大学、军事、情报等部门发起网络攻击、窃取秘密;中国政府的五毛水军或机器人制造和传播各种虚假信息,以达到不可告人的政治目的;出版人、书店店员和异议人士甚至在境外,被中共特务绑架回国……这些都可以看作是中共信息柏林墙的延伸。

尤其不可接受的是,西方的科技巨头们 – 思科、谷歌、脸书、苹果、雅虎等等,纷纷配合中国政府的互联网审查,甚至为中国的互联网防火长城(GFW)提供技术、设备和培训。西方人曾热情地帮助东德人翻墙和拆墙,但这些科技公司却为了巨额利益,帮助中国政府建立和加固高墙。
2017年4月28日在北京举行的国际手机互联网会议上的谷歌展台。(美联社)
1989年柏林墙被推倒后,逃到苏联的昂纳克被引渡回国受审,被控犯有叛国罪及杀害192名试图逃离共产党政权的德国人;“末代总书记”克伦兹,因杀害东德民众罪名被判刑6年半;开枪把18岁的彼得打死在柏林墙上的两名军人,分別被判刑20和21个月。在罗马尼亚,制造屠杀的独裁者、“中国人民的老朋友”齐奥塞斯库夫妇被枪决。再后来,“中国人民”的其他一些老朋友们,也得到了应有的下场。卡扎菲被打死,萨达姆被绞死,穆巴拉克被赶下台、关监狱,米洛舍维奇受审期间死亡,全斗焕被判死刑、后改为无期徒刑,本阿里逃亡、被缺席审判,皮诺切特入狱……颜色革命和民主革命席卷之下,大量的独裁政权纷纷瓦解。

但在中国,制造屠杀的刽子手们用人民的鲜血保住了政权,并且建起了高科技柏林墙。那些把翻墙者投入监狱的秘密警察、法官和共产党干部,仍在残害着中国人民。30年来,在西方政府的绥靖政策和国际科技巨头的助纣为虐下,中国在经济、军事和科技上畸形崛起的同时,却背离自由民主,而中共的魔爪已经伸向自由世界。就在此时,北京的枪声响在香港的街头。

1987年6月12日,里根总统在布兰登堡门向苏联共产党喊话:“戈尔巴乔夫先生,推倒这堵墙!” – 今天,深受信息柏林墙之苦的中国人,当然希望、也永远感佩国际社会推墙的努力;但如果不能帮忙推墙,请你们不要帮着加固这堵墙好吗?
——RFA

《57爆新聞》川普仿雷根「計中計」捉鱉, 大陸建「烯谷」超英趕美?

全局代理程序sshuttle简单又好用

$
0
0
今天重试了一下sshuttle。发现它其实易于安装,使用简便。只是看youtube,有点慢而已。
详见https://briteming.blogspot.com/2012/04/use-sshuttle-to-keep-safe-on-insecure.html的页首的括号里的内容。建议使用chrome浏览器,我这里用ff竟然打不开我这个网站。

我觉得 全局代理程序sshuttle真是很神奇世界真是奇妙。如果你有点悲伤,多看看世界的奇妙之处,enjoy the world,enjoy your life.

这样,mac上的全局代理程序又添加一员:
https://briteming.blogspot.com/2019/08/mac.html

使用 Docker 和 Nexus 搭建私有 Maven 仓库

$
0
0

使用 Docker 启动 Nexus

首先确保服务器已经安装了 Docker,然后执行以下命令启动 Nexus(可以考虑写成 docker-compose.yml):
# 创建存储数据的目录
mkdir data
# 修改目录权限,否则 nexus 启动时会报错没有权限
chown -R 200 data
# 启动
docker run -d -p 8081:8081 -v ./data:/nexus-data --name nexus sonatype/nexus3
测试是否成功:
curl -u admin:admin123 http://localhost:8081/service/metrics/ping
默认管理员账号为 admin,密码为 admin123,一定要记得修改此密码

配置 Nexus

创建仓库

Nexus 默认创建了四个 Maven 仓库,因此不需要手动去创建。
Administration>> Repository>> Repositories页面可以看到仓库列表:
仓库名称类型格式说明
maven-centralproxymaven2中央仓库
maven-releaseshostedmaven2正式版仓库
maven-snapshotshostedmaven2测试版仓库
maven-publicgroupmaven2仓库组,集合了其他三个仓库

关闭匿名访客权限

默认情况下匿名访客时可以看到仓库列表的,为了不泄露信息,需要关闭其访问权限。
Administration>> Security>> Anonymous页面,取消打勾 Allow anonymous users to access the server并保存。

新建角色和用户

系统默认的 admmin账户权限太大,一般建议新建一个普通账户,并授予有限的权限。首先在 Administration>> Security>> Roles页面新建一个角色,并授予以下的权限:
nx-repository-view-*-*-browse
nx-repository-view-maven2-*-*
接着新建一个用户,授予该角色权限。

配置 Maven 并发布

修改文件 ~/.m2/settings.xml,增加:
<servers>

<server>
<id>mynexus</id>
<username>user</username>
<password>password</password>
</server>
</servers>
修改 pom.xml文件:
<repositories>

<repository>
<id>mynexus</id>
<url>http://localhost:8081/repository/maven-public/</url>
</repository>
</repositories>

<distributionManagement>

<repository>
<id>mynexus</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>


<snapshotRepository>
<id>mynexus</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
然后执行 mvn deploy部署项目,如果控制台打印出 BUILD SUCCESS则表示发布成功,可以通过 http://localhost:8081/#browse/browse:maven-public确认仓库上是否有新发布的代码包。

参考资料

NPM 安装第三方模块常见问题

$
0
0

断网的机器,没法直接 npm install xxx 怎么办?

在部署 Node.js 写的应用时,我们都会在应用的根目录下执行 npm install来安装所有 的依赖模块,安装第三方模块也一样,你只要找到这个模块的源码,执行 npm install即可。
假如我们要安装一个叫 xss的模块,因为不能直接用 npm install xss来安装, 首先我们得想办法获取到这个这个模块的源码。
先在浏览器中打开模块的主页: https://npmjs.org/package/xss(如果不明白这个网址是怎么来的, 请阅读 《寻找第三方模块》
这时候我们可以知道 xss 这个模块的源码托管在 github 上,我们可以通过 git 命令 把源码拉下来: git clone git://github.com/leizongmin/js-xss.git
为了能让应用访问到这个模块,我们需要把源码放在应用的 node_modules目录里面, 比如这个模块叫 xss,那么它的源码就应该在 node_modules/xss目录里面。
然后进入 node_modules/xss目录,打开这个模块的 package.json文件,看看 dependencies这一项中是否有指定依赖模块,如果有的话,按照相同的方法把其依赖 模块也安装到这个模块的 node_modules目录里。
(如果不明白为什么要放到 node_modules目录, 请阅读 《Node.js API - Modules》

模块源码没有托管到 github

假如某个模块没有将源码托管到 github 这样的开源平台上,我们照样有办法获取到它的 源码:把 https://registry.npmjs.org/模块名/-/模块名-版本号.tgz这个压缩包下载 下来即可。
比如要下载 xss模块 0.0.6版本的源码,其对应的网址就是 https://registry.npmjs.org/xss/-/xss-0.0.6.tgz。把压缩包下载下来后,先解压, 其里面的 package目录即是这个模块的源码,这时候就可以按照上面说的那样安装了。

不需要 C++ 编译的模块还有更简便的安装方法

大多数的第三方模块都是纯 JavaScript 写的,不需要进行 C++ 编译,我们只要在一台 能使用 npm install xxx安装模块的机器上把模块安装好,直接复制到应用的 node_modules目录即可。

如何使用私有的模块

1、搭建私有 NPM 库

一般一些大的公司,有自己内部的 Node.js 模块库时,会尝试这种搭建私有的 NPM 库, 搭建好之后,直接使用 npm install xxxx来安装模块,但是操作难度较大,有兴趣的 可以参考 The couchdb setup for registry.npmjs.org and search.npmjs.org

2、通过一个 js 文件来链接

假如有一个私有模块 abc,其源码放在 /npm/abc目录,我们可以直接在当前应用的 node_modules目录下创建一个文件 abc.js,其内容如下:
module.exports = require('/npm/abc');
然后就可以直接通过 require('abc')来载入这个私有模块了。
当同时在开发几个模块,而这几个模块存在依赖关系时,使用这种方法也能方便调试。

npm install 时出错

域名解析出错

有时候网络不稳定会导致安装不成功,比如显示如下出错信息:
npm http GET http://registry.npmjs.org/supervisor
npm ERR! Error: getaddrinfo EADDRINFO
npm ERR! at errnoException (dns.js:37:11)
npm ERR! at Object.onanswer [as oncomplete] (dns.js:124:16)
npm ERR! If you need help, you may report this log at:
npm ERR! http://github.com/isaacs/npm/issues
npm ERR! or email it to:
npm ERR! npm-@googlegroups.com

npm ERR! System Linux 3.2.0-23-generic-pae
npm ERR! command "/usr/bin/node""/usr/bin/npm""install""-g""supervisor"
npm ERR! cwd /home/lwj
npm ERR! node -v v0.10.18
npm ERR! npm -v 1.3.8
npm ERR! syscall getaddrinfo
npm ERR! code EADDRINFO
npm ERR! errno EADDRINFO
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/lwj/npm-debug.log
npm ERR! not ok code 0
从中可以找到 syscall getaddrinfocode EADDRINFO这两行,EADDRINFO表示 在尝试解析域名的时候出错了,没法从 registry.npmjs.org上下载模块的源码, 这时候我们只需要重新执行一遍命令即可。如果问题还没有解决,应该检查一下本地机器 域名解析服务是否正常,某些地区 registry.npmjs.org这个域名会被屏蔽。如果实在 无法通过命令直接安装模块,可参考本文开头提到的方法来手动安装。

寻找nodejs的第三方模块

$
0
0

1、知道模块名,寻找模块的文档

在看别人的代码或者文章的时候,经常会遇到自己没用过的第三方模块,怎么办呢? 其实很简单,你只要在浏览器中输入网址 https://npmjs.org/package/模块名称,即可 进入这个模块的介绍页面。比如,别人的源码中出现一行 var xss = require('xss'), 说明这里使用到了 xss这个模块,在浏览器中打开 https://npmjs.org/package/xss,即可进入这个模块在 NPM 上的主页:

模块主页中显示这个模块的简介、作者、当前版本号、最后更新时间、模块源码链接、 报告 Bug 的链接和 README 页面。一般 README 页面都会简要地写出了模块的用途、用法 等等信息,大多数模块也都是托管在 Github 上的,直接点模块源码链接(Repository) 即可跳到其在 Github 上的主页,可以通过这里获得更多的帮助。

2、不知道模块名,根据关键字搜索需要的模块

我们可以通过 NPM 来寻找自己需要的模块。打开 NPM 的首页 https://npmjs.org/, 在 Logo 的右边,有一个搜索框,只要在上面输入关键字,即可搜索出相应的模块。比如 我们要搜索“模板”相关的模块,在搜索框输入 template并按回车:

页面中显示出了相应的模块名称、简介、作者和当前版本,直接点击模块名称即可进入这个 模块的主页。
但是, NPM 的搜索结果中,我们没法直接看到这个模块有多少人用,最后更新时间是什么 时候了(有些模块可能已经是几年前的了),怎么办?这就要用到我压箱底多年的工具了, 一般人我不告诉他的:
在浏览器中打开 http://eirikb.github.io/nipster/(由于要加载所模块的信息,可能 要等一阵才能完全显示出来):

在搜索栏中输入关键字,会自动筛选出相应的模块。模块信息包括了模块名称、简介、 作者、最后更新时间、Fork 数量和收藏数量。默认按照 Fork 数量降序排序,基本上 最前面的结果是最多人用的。
上面简单介绍了两种寻找 Node.js 模块的方法,学会了这两招之后,妈妈基本上再也不用 担心你找不到好模块了

ssh-agent 转发

$
0
0
  1. 你需要在多个服务器之间工作,通过 ssh key,你可以从本机登录这几个服务器。你登录到一个其中一个服务器 A,你想从 A 到另一个服务器 B,但服务器 B 上没有 A 的公钥,无法直接从 A 登录到 B。
  2. 你本机使用 ssh key 访问 GitHub 或者其他基于 ssh 认证的服务器,比如 Gitlab。你在本地提交代码,你可以登录服务器,你想在服务器上更新代码。
这样的场景,可以使用 ssh-agent。
  1. ssh 登录时,加入 -A选项,开启转发。你可以通过设置 alias ssh='ssh -A'来实现;
  2. 启动 ssh-agent,并通过 ssh-add 加入要转发的 key。通过 ssh-add -l查看有哪些 key 已经加入。
    key 的数量不能过多,ssh 会依次尝试使用这里的每一个 key,如果 key 数量过多,会达到最大尝试次数,认证失败。
你可直接使用将以下的脚本,加入到你的 ~/.bash_profile 中,在 add_ssh_keys这个函数中,加入你要转发的 key,重新载入 ~/.bash_profile 即可。
function add_ssh_keys(){
# Will load ~/.ssh/id_rsa
ssh-add
# You also can add the other keys here
# For example, add your GitHub key: ssh-add ~/.ssh/github
}

SSH_ENV="$HOME/.ssh/environment"
function _start_agent {
echo"Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/'> "${SSH_ENV}"
echo succeeded
chmod 600"${SSH_ENV}"
. "${SSH_ENV}"> /dev/null
add_ssh_keys
}

function start_ssh_agent(){
# Source SSH settings, if applicable
if[ -f "${SSH_ENV}"];then
. "${SSH_ENV}"> /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID}| grep ssh-agent$ > /dev/null ||{
_start_agent;
}
else
_start_agent;
fi
}

function set_alias(){
alias ll='ls -l'
alias ssh='ssh -A'
}

start_ssh_agent
set_alias
ssh-agent 有风险,使用使用谨慎。
https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
http://rabexc.org/posts/pitfalls-of-ssh-agents

用keep-running来守护进程

$
0
0


有一个 python 的小脚本 keep-running,是用来实现守护进程的,当进程退出之后,会重新启动进程。
这是一个工具脚本,发布到了Pypi: https://pypi.python.org/pypi/keep-running,安装时只要一个命令:
pip install keep-running
安装之后,这个脚本会拷贝到 /usr//bin。我们期待安装之后,可以通过命令行运行:
[huqiu@101 android-gems-middleware]$ keep-running
当然,为了可以直接运行,需要在脚本头部加上这样一段,这个是基础知识了:
#!/usr/bin/env python
实际上,运行之后:
[huqiu@101 android-gems-middleware]$ keep-running
: No such file or directory
但是可以通过 python 执行:
[huqiu@101 android-gems-middleware]$ python keep-running

原因

原因是:该脚本文件格式是 dos 格式 而非 unix 格式。
dos格式下,换行符是 CRLF 的问题,使得第一行变成了(CR 的 ascii 码是 015):
#!/usr/bin/env python\015
修改成 unix 格式就好了。刚发布了 1.0.0解决了这个问题。

修改方法

在 vim 中,查看文件格式,并设置,保存即可
查看
:set ff
设置
:set ff=unix

git branch的相关命令

$
0
0


create a branch, add some files, push to remote repository
git branch branchName
echo "Some information"> test.txt
git add test.txt
git commit -m 'add text.txt'
git push origin branchName
list all local branches
git branch -a
checkout remote branch
There is a branch named dev in remote repository, you want to trace that:
git branch -b dev origin/dev
delete remote branch
git push origin --delete 

git push origin :
delete local branch
// -d means --delete
git branch -d branchName

// force delete, even is not merged
git branch -D branchName

Merge & Rebase

Here is a repository has a branch named b1, it has some commits A, B. A -- B [b1]
  1. Local Case A:
    You check out b1, then do some work, your commit is C, after your commit, your local repository will be:
    A -- B -- C      [b1]
  2. Local Case B:
    You create branch b2 from b1, then commit.
    A -- B      [b1]
    \
    C [b2]
  3. Local Case C:
    You did nothing. A -- B [b1]
  4. Remote Case A:
    At the same time, someone commited a change, namely commit D, pushed the commit to repository server.
    A -- B -- D         [remote b1]
    \
    ----- C [local]
  5. Remote Case B:
    No commit has been pushed to remote before you push commit C to remote. The remote remains:
    A -- B   [b1]
$ git st
# On branch develop
# Your branch and 'origin/develop' have diverged,
# and have 1 and 2 different commit(s) each, respectively.
#
nothing to commit (working directory clean)
git fetch
After git fetch, your local repository will be one of the following status:
Case A: Local Case A + Remote Case B

A -- B [b1]
\
C [b1]

Case B: Local Case B + Remote Case B

A -- B [b1]
\
C [b2]

Case C: Local Case C + Remote Case A

C [b1 remote]
/
A -- B [b1,local]

Case D: Local Case A + Remote Case A

A -- B -- D [b1]
\
---- C [b1]

Case E: Local Case A + Remote Case B

A -- B -- D [b1]
\
--- C [b2]
what is fast-forward
If the branch has not diverged, and HEAD is behind, it can do fast-forward.
If git merge is called on a branch which can fast-forward, fast-forward will be applied automatically
git merge --ff-only origin/master will try to use fast-forward, abort if fast-forward is not possible.
git merge in one branch
$ git merge
After merged:
Case A: do nothing
Case B: do nothing
Case C: Fast-forward will be applied

A -- B -- C [b1,local/remote]


Case D: Merge, a new commit `E` will be created automatically.

A -- B -- D --- E [b1]
\ /
---- C [b1]
git merge two branches
$ git merge origin/b1
After Merged:
Case E:
A -- B ------ D [b1]
\ \
-- C -- E [b2]
git pull
git pull = git fetch + git merge
git rebase in one branch
# Case E
$ git rebase
A -- B ------- D [b1,remote]
\
------ D -- C1 [b1,local]
git rebase in diffrent branches
# Case F
$ git rebase origin/b1

A -- B ------- D [b1,remote]
\
------ D -- C1 [b2,local]
git push force
Why?
Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it.
Case F, may need force push. If b2 has some pushed commits before D and C
         pushed
A -- B -..... --- D [b1,remote]
\
-.... --- D -- C1 [b2,local]
$ git push origin b2 -f
$ git push origin b2 --force
$ git push origin +b2 
------------------
 

Git分支操作 

本文介绍日常中经常遇到的一些分支操作,并给出了详细解释。
  • 创建分支;
  • 删除分支;
  • 检出远程分支;
  • git merge;
  • git rebase;
  • git force push;
  • git fast-forward.

分支简单操作

最简单的用法
创建一个分支,添加文件,提交,推送。但是日常工作中往往比这个复杂得多。
git branch branchName
echo "Some information"> test.txt
git add test.txt
git commit -m 'add text.txt'
git push origin branchName
列出所有分支
git branch -a
检出一个远程分支
远程有一个 dev分支,你想 check out 这个分支到本地:
git branch -b dev origin/dev
开发告一段落,你把远程一些没用的分支删除:
git push origin --delete 

git push origin :
删除本地分支:
// -d 是 --delete 选项的短选项
git branch -d branchName

// 强制删除
git branch -D branchName

Merge & Rebase

git pull是非常笼统的一种操作,下面我们分析日常所有可能遇到的情况:
假设代码库有一个分支 b1, 当前有两次提交: A, B,如下: A -- B [b1]
  1. 本地可能发生的操作 A:
    你检出 b1,修改了代码,然后提交,生成一个提交:C
    A -- B -- C      [b1]
  2. 本地可能的情况 B:
    你从b1建了一个新的分支 b2, 提交代码,生成一个提交:C
    A -- B      [b1]
    \
    C [b2]
  3. 本地可能的情况 C:
    本地代码无任何变动。嗯,这也算情况之一。 A -- B [b1]
  4. 现在让我们看看远程的集中情况
    远程情况 A:
    在提交代码的期间,有人推送代码到了分支b1, 这个提交称为:D
    A -- B -- D         [remote b1]
    \
    ----- C [local]
  5. 远程情况 B:
    远程情况没任何变动。
    A -- B   [b1]

在上面,A, B, C, D指代可以是一次提交,也可以是一系列提交。

git fetch
现在你将远程变动取到本地,这时,本地代码库有可能以下几种情况:
Case A: 本地情况 A + 远程情况 B

A -- B [b1]
\
C [b1]

Case B: 本地情况 B + 远程情况 B

A -- B [b1]
\
C [b2]

Case C: 本地情况 C + 远程情况 A

C [b1 remote]
/
A -- B [b1,local]

Case D: 本地情况 A + 远程情况 A

A -- B -- D [b1]
\
---- C [b1]

Case E: 本地情况 A + 远程情况 B

A -- B -- D [b1]
\
--- C [b2]
以上5种情况,就是我们日常中经常遇到的情况。

什么是: fast-forward
git fetch之后,如果本地分支和远程分支没有分叉,并且本地分支指向较旧脚本,那么,这个分支称为可以 fast-forward;
fast-forward时,本地分支把指针指向最新的提交,并不会生成一个提交。
如果分支可以 fast-forward,执行 git merge时,实际执行的是fast-forward。如果不能,则合并,并自动产生一个提交。
很多情况下,我们并不希望有这样的自动合并产生,因为他产生了一个自动提交,会让版本变得交叉,不清晰。
我们希望,能 fast-forwardfast-forward, `,否则我们用rebase命令合并。可以这样:
git merge --ff-only origin/master
如果不能 fast-forward, merge 操作会终止。

git merge 合并一个分支
$ git merge
操作之后:
Case A: 没变化
Case B: 没变化
Case C: fast-forward

A -- B -- C [b1,local/remote]


Case D: 合并,并且自动生成一个提交E

A -- B -- D --- E [b1]
\ /
---- C [b1]
git merge 合并两个分支
当前在 b2上,合并远程 b1的改动,对应 Case E
$ git merge origin/b1
合并之后 :
Case E:
A -- B ------ D [b1]
\ \
-- C -- E [b2]

图1
git pull
git pull = git fetch + git merge
git rebase
只有当一个分支出现分叉,或者在不同的分之间,git rebase 才有意义。命令格式:
git rebase 目标分支
在git rebase时:
  1. 把本地未推送的所有提交,放到暂存区。
  2. 然后将本分支的指针指向目标分支最新提交,即改变本地分支的基础,简称变基, 这个翻译真是太糟糕了。
  3. 然后将暂存区的本地未推送的提交挨个应用回本分支。
同一个分支的 rebase
# Case E
$ git rebase
A -- B ------- D [b1,remote]
\
------ D -- C1 [b1,local]

图2
先将本地的提交 C暂存,然后指向 D, 应用 CCD之前,变成了 C1。注意这个和上面 egit merge(图1)的区别。
不同分支的 rebase
这其实和同一个分支类似,不过注意,不同分支 rebase 可能需要强制推送:
# Case F
$ git rebase origin/b1

A -- B ------- D [b1,remote]
\
------ D -- C1 [b2,local]
强制推送: git push --force
为什么需要强制推送,官方文档:
Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it.
Case F, 如果b2DC之前,有其他的提交已经推送到服务器了,则需要强制推送,因为他们是从 B开始分叉的。
         pushed
A -- B -..... --- D [b1,remote]
\
-.... --- D -- C1 [b2,local]
.
$ git push origin b2 -f
$ git push origin b2 --force
$ git push origin +b2 
--------------------
 

Some tips for git setup and git config

the ssh key

generate ssh key
cd ~/.ssh/
ssh-keygen -t rsa -C "changeme@xxx.com" -f filename
If the options f is not input, the file name of the public/pirvate rsa key pair files will be: id_rsa, id_rsa.pub.
add ssh key
ssh-add ~/.ssh/xxx
list all added ssh key
ssh-add -l
you may run into this error when try ssh-add:
Could not open a connection to your authentication agent.
eval `ssh-agent -s`
add ssh key permanently
Add the key path to ~/.ssh/config
$ vim ~/.ssh/config

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/xxx

git config

global config & repository config
The global setting is stored in ~/.gitconfig
The config of repository is stored in ./.git/config, in the repository directory.
git config --global will use global config, without --global options will use try to use the config file ./git/config in current directory.
config user name & user email for every repository
You may work with multiple repositories, so it is a good practice to config user information for every repository.
# for global setting
git config --global user.name xxx
git config --global user.email xxx@xxx.com

# for repository
git config user.name xxxx
git config user.email xxxx@xxx.com
git alias
Setup alias for convenience.
#git st => git status
git config --global alias.st 'status'

#git co => git checkout
git config --global alias.co 'checkout'

#git lg to view commit log like network graph
git config --global alias.lg "log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit"

#...
# whatever you like 
--------------------
 

git配置问题: 多个 sshkey, 多个用户身份, git alias 

ssh key

生成sshkey
cd ~/.ssh/
ssh-keygen -t rsa -C "changeme@xxx.com" -f filename
如果没有指定 f选项或者 f选项为空,生成的私钥和公钥为: id_rsa, id_rsa.pub.
添加 sshkey
ssh-add ~/.ssh/xxx
列出所有的 sshkey
ssh-add -l
执行 ssh-add可能会遇到的问题:
Could not open a connection to your authentication agent.
解决办法:
eval `ssh-agent -s`
机器重启又得重新添加 sshkey,如何永久添加 sshkey
把 sshkey 私钥的路径加入到 ~/.ssh/config, 如下:
$ vim ~/.ssh/config

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/xxx

git config

全局配置和项目配置
全局配置信息在: ~/.gitconfig
项目配置在项目目录下的: ./.git/config
git config --global操作全局配置, 不带 --global选项的话,会尝试相对于当前目录的: ./git/config, 找不到的话,报错。
为各个项目单独配置user.nameuser.email
你可能会在不同的几个项目中工作,各个项目的用户名可能不同,为了保证日志的准确性和提交时无误,最好对各个项目设置 user.nameuser.email
# for global setting
git config --global user.name xxx
git config --global user.email xxx@xxx.com

# for repository
git config user.name xxxx
git config user.email xxxx@xxx.com

git alias

使用快捷命令能带来很方便,输入命令更加快速,git lg这个短命令配置,将日志图形化方式展现:
#git st => git status
git config --global alias.st 'status'

#git co => git checkout
git config --global alias.co 'checkout'

#git lg to view commit log like network graph
git config --global alias.lg "log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit"

 

 

 

 

 

git的全局钩子

$
0
0

钩子文件在项目目录下

git 的钩子放在 git 项目下的 .git/hooks目录。
ls -l .git/hooks
如果我们所有项目都需要一个通用的钩子,那么我们需要在所有的项目中都放置钩子文件。挨个复制显然不是一个可行的方案。

模板目录

我们可用模板目录来解决这个问题。
git init或者 git clone时,如果指定有模板目录,会使用拷贝模板目录下的文件到 .git/目录下。
git init --template "path-to-template-dir"
git clone --template "path-to-template-dir"
好了,那么解决方案就是:把统一的钩子文件放到模板目录,然后在 git init / git clone时候指定模板目录?
不行,这样还是太麻烦了。

模板目录写入全局配置

模板目录固定在一个地方,我们可以把模板目录写入全局配置。
# 定义模板目录,模板目录下的钩子目录
template_dir=$HOME/.git-templates
tempalte_hooks_dir=$template_dir/hooks

# 拷贝全局钩子文件目录到模板目录下
mkdir -p $template_dir
cp -rf $root_dir/sample/git-template/hooks/ $template_dir/

# 修改模板目录下钩子目录权限
chmod -R a+x $tempalte_hooks_dir

# 设置全局模板目录
git config --global init.templatedir $template_dir
git init或者 git clone时,会自动拷贝钩子文件到项目的钩子目录。 已有项目,执行 git init重新初始化项目即可。

直接可用的脚本

上面那段脚本来自:https://github.com/liaohuqiu/work-anywhere/blob/master/tools/update-git-config.sh
将你需要的钩子文件放在 sample/git-template/hooks文件夹下即可。

苏晓康:西方领先逆转的信号

$
0
0
明朝朱升"广积粮、高筑墙、缓称王"建言于朱元璋之语,搬来形容今日之川普国策,可算一种"另类注释",它仍不失为一大谋略。美国霸权构筑于二战之后,其背景是大英帝国和欧洲的衰落,德日两个争霸者的崩解,美国填补空缺,不称霸都难。撇下五十年冷战不去说它,苏联衰落之后的世界,出现两个争霸者,或挑战者,伊斯兰和中国,美国国力不支,战线太长,内部消耗殆尽,其中福利和移民两大弊端沉疴已深,积重难返,以致美国也要玩一下"韬光养晦"了。华盛顿觉得欧陆老大哥只管花钱在本国搞平均主义,却把防务都扔给"世界领袖",保护北约其实就是一个冤大头事情,不想管它了。这么一吵,叫二战后建制起来的对抗苏俄和共产主义阵营的"大西洋精神"濒临崩溃,这便涉及了欧美整个民主制度、富裕社会、市场经济等得天独厚的"西方先进"体系和观念的瓦解。国际格局面临颠覆性巨变,这个很迫近的形势,只是浮面性的预兆,而资本主义以贸易喂养的"全球化"结构极为脆弱,无缘长久繁荣,无论先前的"亚洲四小龙"、中印,还是"金砖四国",都是浅层暴富,"欧洲工业革命"成绝响,无法复制,由此是否也预示了由"经济发达"而孵化民主制度,亦将不可复制?
美国意识形态左右大战,左倾福利、平均、平权等论述,失去物质基础而沦为空谈,只能迷惑东西两岸大城市青年;右翼则失去道德高度,趋向功利,没有什么现代论述可以支撑,反而广受中西部信教民众的接纳。左倾激进(如变性人等)不期然与伊斯兰合流,触及基督教的伦理底线,形成名副其实的"文明之争",又勾引基督教内藏的"白人至上"的价值冲动,宗教对抗也会漫溢至普世价值层面,迫使左右双方皆趋向各自的极端。右翼一端生出茶党,只抗高税和大政府,却又引出一个怪杰斯蒂芬•班农,坊间称他"白人至上主义者",竟"见人所未见,言人所未言",他说"儒家重商主义的权威模式已经赢了,犹太-基督教的西方,自由民主、自由市场已经输了",必须捍卫资本主义的纯洁和原则,不能任"资本主义中国",以其人口优势加劳动力的廉价优势,配之国家计划的指令性资本主义,对欧美的资本主义大占便宜。至少他的描述不错:东方另类资本主义打败西方正宗资本主义,是一个超经济的怪异现象,前所未有,而西方金融业和华盛顿建制派,与这个"东方不败"的媾和及腐败,终于引起眼下的国际性的民粹大潮,终结了二战以来的全部现成体制和论说,人类只剩下不确定的未来。
《燃情岁月》(Legends of the fall)这部电影,可以当作一次大战对美国心灵戕伤、宣扬孤立主义的片子来看,上校的无政府理念也许就是美国孤立主义的底子,摒弃欧洲及其正统文化,也可视为新大陆民间的无政府主义底子,所以孤立主义与独立大概是一体两面的事情。美国清教徒传统的沉沦消解,大约跟美国逐渐提升世界霸权欲念相辅相成,美国卷入欧洲霸主们的一次大战,是其步入国际的开端,当时她比英法德的帝王们要开明得多,然而美国的现实主义传统极为强大,不可能无视世界资源和势力范围,尤其后来的市场,所以难逃日后的越战戕伤。理查.霍夫士達特的《美國的反智傳統》指出:"美國本就是由對歐洲的壓迫不滿的人所建立,他們醉心於美洲的不是在此萌芽的社會,而是自然與野蠻。"但暗示Christine的人性在欧陆大战中被血腥迷蒙,其中暗伏的兽行再难压制下去,就非常自然主义,杀戮使他返祖(返回动物),以至无法接受Susan的爱情和婚姻,从总体上也许就是西欧文明的一种悲剧诠释。

Viewing all 20490 articles
Browse latest View live