在 Redmine 中整合 Git 版本库

Redmine 的官方 Wiki 里面有许多文档可能过时了,可能并非 Best Practice 。关于如何在 Redmine 中整合 Git 版本库,这篇文章 是最简单的。我把原文做了一些修改,使用中文提供在这里:

[TOC]

我的配置

  • 我的 redmine 用户名称为: redmine ;
  • 我的安装目录在 /srv/redemine ,我的仓库文件夹为 /srv/redmine/repos
  • git 的仓库的地址为 ssh://redmine@git.mysite.com:29418/a.gitssh://redmine@git.mysite.com:29418/b.git (是的,我使用 Gerrit)。

Redmine 使用的方法,就是从远程版本库中 Clone 一个版本库,然后把所有的提交信息写入 Redmine 的数据库中。

第一步: Clone 版本库

首先使用 MIRROR 模式来 Clone 我们的版本库。Mirror 模式的版本库将仅包含提交信息而不包含具体提交的文件。这会让我们 Clone 的内容比较小,速度足够快。

1
2
3
4
sudo -su redmine
cd /srv/redmine/repos/
git clone --mirror ssh://redmine@git.mysite.com:29418/a.git
git clone --mirror ssh://redmine@git.mysite.com:29418/b.git

接下来需要让 Redmine 中配置版本库的路径。

第二步: 配置 Redmine

进入 “administration > project -> repositories” 界面开启版本库支持。然后进入 “project -> settings -> repositories” 增加版本库配置:

  • Type: GIT
  • Main-repository: 是否是主版本库。主版本库只能有一个。
  • Name: 一般是使用和版本库相同的名称。
  • Path: 版本库在服务器上的绝对路径。/srv/redmine/repos/a.git

版本库可以增加多个,可以再加入一个版本库指向 b.git 。但是主版本库只能有一个,如果两个都设置成了主版本库,那么生效的是最新的那一个。

配置完成后,进入项目的版本库界面就能看到版本库的提交历史记录和版本树了。

如果你的版本库有成百上千次提交,那么第一次打开版本库界面可能会等上一段时间,因为 Redmine 在把版本库中的提交信息写入数据库。此时最好不要刷新界面。

为了避免上面的情况,可以做离线刷新: Attaching an existing repository to a project

第三步:定时刷新版本库

Redmine 并不会主动去刷新版本库。我们可以使用 GitHook 的方式来更新版本库,也可以直接用 Crontab 来实现。

下面的代码设定每隔 5 分钟去远程仓库同步一次。

1
2
3
4
5
6
7
sudo crontab -e -u redmine
# 如果当前处于 redmine 账户下,也可以使用
crontab -e

# 选择你喜欢的编辑器,在打开的编辑器中写入下面的内容
*/5 * * * * git -C /srv/redmine/repos/a fetch --all
*/5 * * * * git -C /srv/redmine/repos/b fetch --all

设置默认显示的版本库分支

Redmine 默认显示的提交信息是仓库的默认分值(一般为 master 分支)。如果你使用了 git flow 工作流 ,那么很可能你会希望默认分支是 develop

这就出现了新问题:在使用 --mirror 参数 clone 的仓库中,你不能使用 git checkout develop 来切换工作分值。

此时你可以使用下面的命令来切换默认分支:

1
git symbolic-ref HEAD refs/heads/develop

symbolic-ref 子命令的说明在此: git-symbolic-ref

当然,你也可以直接编辑 /srv/redmine/repos/a.git/HEAD 这个文件,能达到一样的效果。

在提交信息中更新问题

在管理员面板中将版本库的 Referencing keywords 设置为: issue;将 Fixing keywords 的值设置为: fix 。

在提交信息中使用下面的语法来引用问题1,2,同时把问题3置为 已解决 状态:

这个问题 issue #1, #2 和 fix #3
这个问题 issue:#1, #2 和 fix:#3
这个问题 issue: #1, #2 和 fix: #3

文章转自:https://blog.zengrong.net/post/2606.html

CentOS下MySQL忘记root密码解决方法

CentOS下mysql忘记root密码解决方法

1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。
因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的
状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对
外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全
状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。

2.修改MySQL的登录设置:
# vim /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi。

3.重新启动mysqld
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]

4.登录并修改MySQL的root密码
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.56
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> USE mysql ;
Database changed
mysql> UPDATE user SET Password = password ( ‘new-password’ ) WHERE User = ‘root’ ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)
mysql> quit

5.将MySQL的登录设置修改回来
# vim /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除
保存并且退出vim

6.重新启动mysqld
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]

专治无耻的tadb.exe,kadb.exe等各种XXXadb.exe

最近在试着搞android基于webview的开发,因为是小白,遇到了这个 tadb.exe 占用 adb.exe 端口的问题,这是搜刮来的解决办法。

这是一篇我个人在EOE发的blog《专治无耻的tadb.exe,kadb.exe等各种XXXadb.exe》,由于eoe的blog系统实在是无言以对,我就把eoe上面的帖子以及blog是都转到csdn上来,

用自己电脑想学点东西,但是adb进程总是被各种xxxadb.exe进程抢占,好烦,下面给出治他们的办法:

1、手机连上之后让tadb启动一次
2、然后去任务管理器中看tadb进程,右键->查看属性,看他的位置在哪,然后找到这个位置
;3、找到目录之后就可以看到tadb.exe文件,结束tadb.exe进程,然后将你找到的tadb.ext文件删除
4、然后新建一个文本之类的文件,修改文件名为tadb.exe(ps:你的文件夹选项要显示文件后缀)
如果,还不行的话,就操作完上面的步骤之后,将该文件夹里的文件全部删除,然后用管理员权限,将该文件夹设置为只读

PS:我的是win8系统,可能找位置的方法会不一样,大家自己试试,而且这种办法估计也不是永久的,先暂时用着吧,如果升级程序的时候,报文件不让写,直接点忽略就OK了

文章原址:https://blog.csdn.net/lsmfeixiang/article/details/42213441

Android ADB server didn’t ACK * failed to start daemon * 简单有效的解决方案

感谢给出这篇文章的博主,这是标准的授之于渔

转自:https://blog.csdn.net/xiaanming/article/details/9401981

ADB server didn’t ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程序,出现如下的信息

The connection to adb is down, and a severe error has occured.
You must restart adb and Eclipse.
Please ensure that adb is correctly located at ‘D:\android-2.2-windows\platform-tools\adb.exe’ and can be executed.

然后我就按照他的要求来做,重启Eclipse和adb,然后确认adb的路径是否正确,然后当我再次运行程序的时候,依旧不行,之后我就开始百度了,有朋友说先在DOS下运行adb kill-server(你必须在环境变量中配好你adb的路径或者进入到adb.exe的目录下),然后在adb start-server,当我运行adb start-server的时候,DOS出现如下信息

* daemon not running. starting it now *
ADB server didn‘t ACK
* failed to start daemon *

然后在运行程序还是不行,重复搞了很多次老不行,还有朋友说在任务管理器找到adb.exe,然后关闭,重启Eclipse,我打开任务管理器,发现根本没有找到adb.exe,这时候我流泪满面了,然后我冷静下来,知道有些朋友遇到这个错误是因为豌豆荚啥的软件占用了adb.exe的端口,我的电脑里面根本没有安装豌豆荚,然后我想看看是谁占用adb的端口,我从网上查到adb.exe使用的端口是5037,接下来我给大家介绍解决方法

  • 查看5037端口被谁占用了,开始–运行–CMD 到命令提示符,输入 netstat -aon|findstr “5037”,如下图                                                                          
  • 我们从上面根本就看不出5037端口被谁占用,我们需要根据后面的PID(2748)来查找占用该端口的应用程序,输入 tasklist|findstr “2748” ,如下图                                                                                                                                                                                                                                                                                                      注: 我这里5037端口是正确的被adb.exe占用,如果是你,就是其他的应用程序啦
  • 结束该进程,输入taskkill /f /t /im 你的进程名,例如adb.exe,如下图,在重新连接手机,这时候你会发现程序运行起来了                                    

这个问题虽然不是什么很大的问题,但是对于新手来说也是属于比较棘手的问题,所以我将自己解决此问题的方法在这里记录下,希望能给遇到此问题的人一点点帮助,如果我写得文章对你一点帮助请帮我顶一下文章,谢谢!

contos 搭建 shadowsocks 服务

搭建一个代理服务器

进入内部网络,访问公司内部服务器,除了采用 VPN 的方式,也可以采用代理服务器的方式。

代理服务器英文全称是(Proxy Server),其功能就是作为用户的中转站去获取网络信息。代理服务器就好象一个大的 Cache,这样就能显著提高浏览速度和效率。这次介绍一个代理服务器的软件 Shadowsocks。

Shadowsocks 以下简称 ss ,它和 VPN 是有区别的,这里先介绍一下,我们主要是学习安装配置客户端和服务器端的流程。

4.1 Shadowsocks 介绍

Shadowsocks 是将以前通过 SSH 创建的 Socks5 协议拆开成 Server 端和 client 端,PC 客户端(即你电脑客户端)发出基于 Socks5 协议请求与 SS-Local 端进行通讯,SS-Local 和 SS-Server 两端通过多种可选的加密方法进行通讯,SS-Server 将收到的加密数据进行解密,还原初始请求,再发送到用户需要访问的服务网站,获取响应原路再返回 ,返回的数据包内容依然使用了加密,而 IP 报文看起来依然是普通 TCP 包,可成功穿过防火墙。

 

因此,Shadowsocks 的优点在于它解决了防火墙通对 IP 报文中一些特定的目的地址的排除,从而干扰的问题。

4.2 安装配置 ss 服务器端,首先去搬瓦工上买一个国外的服务器。很便宜

  • 由于 ss 加入了 python 官方的源,所以打开终端,输入以下命令安装即可:
sudo pip install shadowsocks #保证 pip 已安装
  • 使用方法 :
mkdir /etc/shadowsocks.json
vi /etc/shadowsocks.json # 写入下方内容
{
  "server": "0.0.0.0",
  "server_port": 8388,
  "password": "uzon57jd0v869t7w",
  "method": "aes-256-cfb"
}
ssserver -c /etc/shadowsocks.json #将该内容写入shadowsocks.sh 脚本文件
./shadowsocks.sh > /dev/null 2>&1 &
#执行上面的命令,shadowsocks服务就启动起来了

linux 安装php swoole 扩展

方案一

swoole目前已经加入php的官方扩展库

即是说它已经是PHP的一枚扩展了

所以我们这里可以使用一种更便捷的安装方式

pecl install swoole

不过这种方式需要本机的phpize支持

这里我没有使用这种方式,具体的问题跟流程就不说了

总之它需要你前置phpize支持

这种方式安装结束后需要在php.ini文件中添加扩展

extension=swoole.so

方案二

首先我们需要下载swoole到我们本地

这里我偷懒直接下到本地在传到服务器上了

在linux下cd到目标目录里

 ./configure --with-php-config=/usr/bin/php-config
 //这里(/usr/bin/php-config)是你的php-config文件的路径
 

sudo make

sudo make install

这一步如果没有报错的话就安装成功了(仿佛说了句废话)

安装好后我们来测试一下是否安装成功

php -m

如果能看到swoole就表示安装成功了

—————————————分割线————————————

怎样让swoole在后台运行呢?采用xshell等工具远程连接服务器的小伙伴发现就算在命令后面加上“&”符号,退出远程连接终端后,依然就连不上了。

这个问题很好解决,只要加上“nohup” 命令就行了:
nohup /usr/local/php/bin/php  swoole.php >> log_dir.log 2>&1 &

好了就先到这吧- –

linux 下安装jdk

linux 下安装jdk

用yum安装JDK

-1.查看是否安装了jdk

[root@localhost java]# java -version

bash: java: command not found

 

1.查看yum库中都有哪些jdk版本(暂时只发现了openjdk)

[root@localhost ~]# yum search java|grep jdk
ldapjdk-javadoc.x86_64 : Javadoc for ldapjdk
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.8.0-openjdk-headless.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle
ldapjdk.x86_64 : The Mozilla LDAP Java SDK

2.选择版本,进行安装

//选择1.7版本进行安装
[root@localhost ~]# yum install java-1.7.0-openjdk
//安装完之后,默认的安装目录是在: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75.x86_64

3.设置环境变量

[root@localhost ~]# vi /etc/profile

在profile文件中添加如下内容

#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

让修改生效

[root@localhost java]# source /etc/profile

4.验证

[root@localhost java]# java -version

java version “1.7.0_181”
OpenJDK Runtime Environment (rhel-2.6.14.8.el6_9-x86_64 u181-b00)
OpenJDK 64-Bit Server VM (build 24.181-b00, mixed mode)

 

 

php.ini文件神秘失踪

win_10 系统下wampserver中的php.ini文件神秘失踪,没有发现文件失踪的原因,在此留个记录。

我的系统是win_10系统,安装的是wampserver_3.1.3 ,32位的版本,今天早上启动系统后,开启wampserver,然后运行本地的开发项目,发现报错。错误信息大致的意思是说没有发现:Phalcon\Config\Adapter\Php  这个类。

这个是phalcon框架用来载入配置文件的啊,怎么会找不到这个类呢,近两天没有更新相关的东西,找不到类肯定是phalcon载入出问题了。

phpinfo(),查看信息发现phalcon模块不在了,查看ext文件夹下,phalcon.dll扩展还在,再看信息中,显示php.ini文件不存在。进入wampserver目录中php.ini文件的目录,发现php.ini文件确实不见了。我很确认最近相关的东西都没动过,并且昨天直到下班,我的wampserver还是可以正常运行的。

将原始的php.ini文件拷贝一份到配置目录,重新写入extension=phalcon;后问题解决。

问题解决了,疑惑没有解决,考虑到系统自行删除php.ini文件的可能性应该没有,想到是不是杀毒软件隔离了,查看也不是。全盘杀毒也没有发现病毒,再说,有什么病毒会专门针对wampserver的php.ini文件?

最终没有发现php.ini文件消失的原因,在此留个记录。

php将长数字串变成短字符串

php将长数字串变成短字符串的方法,可用于id转化等

php将长数字串变成短字符串的方法,可用于id转化等。

$str="0abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
  * 将数字转为短字符串
  *
  * @param int $number 数字
  * @return string 短字符串
  */
public function generate_code($number) {
	$out  = "";
	$codes = $this->str;
	while ($number > 61) {
		$m = $number % 62;
		$out = $codes[$m].$out;
		$number = ($number - $m) / 62;
	}
	return $codes[$number].$out;
}
/**
 * 将短字符串转为数字
 *
 * @param string $string短字符串
 * @return int 数字
 */
public function get_num($string){
	$codes = $this->str;
	$num = 0;
	for($i=0;$i<strlen($string);$i++){
		$n = strlen($string) - $i -1;
		$pos = strpos($codes,$string[$i]);
		$num += $pos * pow(62, $n);
	}
	return $num;
}