Archiva安装笔记
Apache Archiva是个开源的Artifact Repository。 网上关于Archiva的文档并不太多,因此我在安装过程中遇到一些麻烦。在此记录下解决问题的过程。
Apache Archiva是个开源的Artifact Repository。 网上关于Archiva的文档并不太多,因此我在安装过程中遇到一些麻烦。在此记录下解决问题的过程。
做前端开发通常需要打开好几个终端,运行vim编辑器、gulp watch
或webpack,有时还要自己跑后台服务。
如果经常需要在修改代码之后切换到另一个窗口查看服务器端日志或者watch的编译情况,
就免不了多次使用tmux的绑定键(默认是Ctrl-B),麻烦且不说,时间长了小指也会很痛。
我找到了两个办法来解决这个问题。首先,利用tmuxinator按照给定的布局打开多个pane, 这样所需的信息能在同一个屏幕内看见,就不需要频繁切换窗口了。
安装tmuxinator之后执行tmuxinator new <project>
就可以新建一个配置文件。
我的配置文件如下:
name: helloworld
# 设置项目根目录
root: ~/projects/helloworld
# 打开新窗口或pane之后首先激活virtualenv
pre_window: source .env/bin/activate
windows:
- editor:
# 设置pane的布局
layout: 52dd,272x65,0,0[272x58,0,0,0,272x6,0,59{90x6,0,59,3,90x6,91,59,4,90x6,182,59,5}]
panes:
- vi
- backend:
- ./manage.py runserver 0.0.0.0:8000
- frontend:
- gulp watch
- test:
- npm test
- extra:
上面我在同一个窗口内打开了4个pane,最大的第一个pane运行vi
,其他三个小的pane分别运行前端和后端的命令。
另外还开了一个名为extra
的窗口备用。
至于layout
的值,可以先开启tmux打开所需数量的pane,然后用鼠标调整pane的大小至合适位置(需要在.tmux.conf
里设置set-option -g mouse-select-pane on
和 set-option -g mouse-resize-pane on
),
最后执行list-window
命令即可得到layout的参数。
另外要注意,如果.tmux.conf
里设置了set -g base-index 1
,那么同时也要设置set-window-option -g pane-base-index 1
,否则tmuxinator会出错。
第二个方法是把窗口切换绑定到Alt/Option键,并且不设置前缀,这样只需按Option-1, Option-2就能切换多个窗口了。
bind -n M-1 select-window -t :1
bind -n M-2 select-window -t :2
bind -n M-3 select-window -t :3
bind -n M-4 select-window -t :4
bind -n M-5 select-window -t :5
bind -n M-6 select-window -t :6
bind -n M-7 select-window -t :7
bind -n M-8 select-window -t :8
bind -n M-9 select-window -t :9
如在iTerm2下使用,需要进入Preferences > Profile > Default > Keys中,将”Left option key acts as:”设置为”+Esc”,上述绑定才能正常工作。
本文译自Presentational and Container Components。
我发现在写React应用时,有个设计模式非常有用。如果你有React的经验,估计你已经知道了——它就是容器组件。这篇文章讲得很清楚了,但我想再补充几点。
有个办法能让组件更易懂、更容易复用,那就是将组件分成两类。我称之为容器组件和展示组件,但也有人叫胖组件和瘦组件(Fat and Skinny)、智能组件和非智能组件(Smart and Dumb)、状态组件和纯组件(Stateful and Pure)、画面和组件(Screen and Component)等等。尽管它们并不完全相同,但基本的理念是一致的。
我所说的展示组件如下:
this.props.children
包含其他组件。props
明确地接收数据、发起回调。Page
,Sidebar
,Story
,UserInfo
,List
容器组件如下:
connect()
,Relay的createContainer()
,Flux Utils的Container.create()
等UserPage
,FollowersSidebar
,StoryContainer
,FollowedUserList
。为清晰期间,我会把它们放在不同的目录下。
本文译自Container Components。
React的许多设计模式都给我的代码带来了深远的影响,而容器组件模式就是其中之一。
在React.js大会上,Jason Bonta介绍了他们在Facebook是如何构建高性能组件的,其中包含了这段关于容器组件的精髓.
其思想很简单:
容器负责获取数据,然后渲染到相应的子组件上。完毕。
“相应”的意思是同名的组件,例如:
StockWidgetContainer => StockWidget
TagCloudContainer => TagCloud
PartyPooperListContainer => PartyPooperList
明白了吧。
本文译自Advanced routing and resolves(原文副标题:避免AngularJS控制器中的回调陷阱)。
URL路由是Web应用中不可或缺的一部分。AngularJS自带的标准路由是ngRoute
。在开发Angular应用的过程中你会首先熟悉ngRoute
,并且它会陪伴你很久,但最终你会发现它无法满足你的需求。
默认的路由有许多限制,使得它并不太适合复杂的应用。实际上,它只能用在最小规模的项目上。显然AngularJS团队也注意到了这个问题,已把ngRoute
移出了核心模块。从AngularJS 1.2开始,使用ngRoute
就必须单独加载了。
本文简介:通过AngularUI Router和嵌套的解决项(resolve)将数据加载操作移出控制器(controller),避免控制器之间的耦合和代码重复。
在vagrant上使用Ubuntu时经常会出现启动过慢的问题。我的环境是MacBook Pro Mid 2015, OS X 10.11,vagrant上是Ubuntu 14.04,
使用一段时间后发现执行vagrant up
时速度特别慢,查看控制台发现启动时经常出现这条消息:
cloud-init-nonet[14.57]: waiting 120 seconds for network device
搜了下发现原因是Ubuntu与Virtual Box带的Intel网卡驱动不兼容所致,改成AMD网卡驱动即可解决。
在Vagrantfile
中添加以下配置即可解决(来源):
config.vm.provider "virtualbox" do |vb|
### Change network card to PCnet-FAST III
# For NAT adapter
vb.customize ["modifyvm", :id, "--nictype1", "Am79C973"]
# For host-only adapter
vb.customize ["modifyvm", :id, "--nictype2", "Am79C973"]
end
打开Web界面,进入Administration -> Management,找到”JFFS2 Support”节。默认状态下”Internal Flash Storage”应该是”Disable”的。
首先将USB盘插入R7000背面的USB2.0口中。我用的是一个256MB的小优盘。
打开Web界面,进入”Service” -> “USB”。然后进行以下设置:
此时通过ssh进入命令行,输入mount
命令应该能看到优盘(通常为/dev/sda1
)被mount到了/tmp/mnt/sda1
。如果优盘不是ext2系统,可以通过fdisk
和mke2fs
命令重新分区并格式化。
最后回到Web界面,将/dev/sda1
的UUID(在Web界面上可以看到)填入”Mount this partition to /opt”中,以便路由器启动时能够自动挂载。
Kong的dd-wrt已经自带了opkg,只不过需要在启用USB之后安装一下。将USB挂载到/opt
之后,运行
bootstrap
简单回答几个问题即可完成opkg的安装。
安装结束之后,打开/opt/etc/opkg.conf
,填写以下内容:
src/gz base http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/base
src/gz kernel http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/kernel
src/gz luci http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/luci
src/gz management http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/management
src/gz packages http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/packages
src/gz routing http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/routing
src/gz targets http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/targets
src/gz telephony http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/telephony
dest root /opt
dest ram /tmp
lists_dir ext /opt/var/opkg-lists
option overlay_root /overlay
option check_signature 1
然后执行:
# opkg update
# opkg list
安装时opkg可能会报告找不到libc,只需要加上--force-depends
强制安装即可。
# opkg install vim --force-depends
我只装了两个:
# opkg install vim
# opkg install htop
htop在执行时会报告terminal错误,可以通过以下命令解决:
export TERMINFO=/opt/usr/share/terminfo
我建了个/tmp/root/.profile
文件如下:
alias vi='vim'
export TERMINFO=/opt/usr/share/terminfo
为避免重启路由器时内容丢失,可以将这个文件保存到/jffs/profile/.profile
,然后通过Web界面添加一条启动命令(”Administration” -> “Commands” -> “Save Startup”):
# copy profile for shell
cp /jffs/profile/.* /tmp/root
几年前买过一台Linksys E4200。E4200有两个版本:rev1和rev2。熟悉dd-wrt的人可能知道, E4200v1使用的是Broadcom芯片,支持dd-wrt,但到了rev2就换成了Marvell芯片,不再支持dd-wrt,因此没法刷固件了。 很可惜,我购买时rev1已经断货,只好买了无法刷固件的rev2。
今天偶然查到,OpenWRT已经提供了E4200v2的支持,于是决定尝试一下。
刷机很容易,去设备页面上给出的链接下载openwrt-kirkwood-linksys-viper-squashfs-factory.bin
,
然后连到路由器的固件升级页面升级即可。
刷机之后需要注意的几点(给熟悉dd-wrt的人):
192.168.1.1
。passwd
命令设置密码。连上Internet之后(我通过已有router使用DHCP连的,若需要PPPoE请参考OpenWRT官方文档),即可用以下命令安装web界面:
opkg update
opkg install luci # 安装Web界面
opkg install luci-ssl # 安装SSL
/etc/init.d/uhttpd start # 启动Web界面
/etc/init.d/uhttpd enable # 设置Web界面自动启动
/etc/config/wireless
,在相应的wifi-device
节中添加option hwmode '11n'
以强行设置网卡为802.11n。Here is a script that can change your MAC address automatically. Just save it as ~/bin/macchange
and add ~/bin
to your path. Tested on Mac OSX Yosemite.
Type macchnage
to change MAC address to a random one. Type macchange restore
to restore MAC address to origin.
if [[ $1 == 'restore' ]]
then
action='restored'
mac=$(cat ~/bin/mac.origin)
else
action='changed'
mac=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
fi
sudo ifconfig en0 ether $mac
echo $action MAC to $mac
ifconfig en0
要安装cx_Oracle
包,需要首先下载Oracle的客户端库文件和头文件。访问OTN,下载相应操作系统的Instant Client Basic Package和SDK Package。64位Linux对应的文件名分别为instantclient-basic-linux.x64-12.1.0.2.0.zip
和instantclient-sdk-linux.x64-12.1.0.2.0.zip
。