JavaScript reduce 用法

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。

语法

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

参数

参数 描述
total 必需。初始值, 或者计算结束后的返回值。
currentValue 必需。当前元素
currentIndex 可选。当前元素的索引
arr 可选。当前元素所属的数组对象。

initialValue可选。传递给函数的初始值

Flex布局语法介绍

指定使用Flex布局

.box{
  display: flex;
}

行内元素使用Flex布局

.box{
  display: inline-flex;
}

注意,设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。

Flex的六个属性

    • flex-direction
    • flex-wrap
    • flex-flow
    • justify-content
    • align-items
    • align-content

flex-direction属性
flex-direction 设置项目的排列方向。

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}

row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿

See the Pen flex-direction: row by 06peng (@abswolf) on CodePen.

See the Pen flex-direction: row | row-reverse by 06peng (@abswolf) on CodePen.

See the Pen flex-direction: column by 06peng (@abswolf) on CodePen.

See the Pen flex-direction: column-reverse by 06peng (@abswolf) on CodePen.

flex-wrap属性
flex-wrap属性定义,如果一条轴线排不下,如何换行?它有三个值:
nowrap(默认):不换行。

See the Pen flex-wrap:nowrap by 06peng (@abswolf) on CodePen.


wrap:换行,第一行在上方。

See the Pen flex-wrap:wrap by 06peng (@abswolf) on CodePen.


wrap-reverse:换行,第一行在下方。

See the Pen flex-wrap:wrap-reverse by 06peng (@abswolf) on CodePen.

flex-flow属性
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row和nowrap。

 
 .box { 
    flex-flow: <flex-direction> || <flex-wrap>; 
 }

justify-content属性
justify-content属性定义了项目水平对齐方式。

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

See the Pen justify-content:flex-start by 06peng (@abswolf) on CodePen.

See the Pen justify-content:flex-end by 06peng (@abswolf) on CodePen.

See the Pen justify-content:center by 06peng (@abswolf) on CodePen.

See the Pen justify-content:space-between by 06peng (@abswolf) on CodePen.

See the Pen justify-content:space-around by 06peng (@abswolf) on CodePen.

align-items属性
align-items属性定义了项目垂直对齐方式。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}

flex-start:垂直起点对齐。
flex-end:垂直终点对齐。
center:垂直中间点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

See the Pen align-items:flex-start by 06peng (@abswolf) on CodePen.

See the Pen align-items:flex-end by 06peng (@abswolf) on CodePen.

See the Pen align-items:center by 06peng (@abswolf) on CodePen.

See the Pen align-items:baseline by 06peng (@abswolf) on CodePen.

See the Pen align-items:stretch by 06peng (@abswolf) on CodePen.

align-content属性
align-content属性定义了不同方向的对齐方式(相当于换行,有横有竖)。如果项目只有单个方向,该属性不起作用。

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

flex-start:与起点对齐。
flex-end:与终点对齐。
center:与中中间点对齐。
space-between:与两端对齐,两端之间的间隔平均分布。
space-around:两侧的间隔都相等。间隔比轴线与边框的间隔大一倍。
stretch(默认值):占满整个空间。

See the Pen align-content:flex-start by 06peng (@abswolf) on CodePen.

See the Pen align-content:flex-end by 06peng (@abswolf) on CodePen.

See the Pen align-content:center by 06peng (@abswolf) on CodePen.

See the Pen align-content:space-between by 06peng (@abswolf) on CodePen.

See the Pen align-content:space-around by 06peng (@abswolf) on CodePen.

项目(item)的6个属性

    • order
    • flex-growp
    • flex-shrink
    • flex-basis
    • flex
    • align-self

order属性
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0

See the Pen flex-order by 06peng (@abswolf) on CodePen.


flex-grow属性
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

See the Pen flex-grow by 06peng (@abswolf) on CodePen.


flex-shrink属性
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。

See the Pen flex-shrink by 06peng (@abswolf) on CodePen.


flex-basis属性
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
flex属性
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
align-self属性
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

See the Pen align-self by 06peng (@abswolf) on CodePen.

SpringBoot应用安全停止

SpringBoot的启动我们可以在打包后用如下命令启动:

nohup java -jar springapplication.jar --spring.profiles.active=prod &

更多关于启动的参数请自行查阅。

SpringBoot的停止有两种方式,一种是通过http发送shutdown信号,另一种是通过service stop的方式来停止服务。

方式一:通过http发送shutdown信号
该方式主要依赖SpringBoot Actuator的endpoint特性,具体步骤如下:
添加依赖:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-actuator</artifactId> 
</dependency>

application.properties中添加:

#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false

执行关闭命令:

curl -X POST host:port/shutdown
例如:$ curl -X POST http://localhost:8080/shutdown

如果需要配置路径,则需要在application.properties中添加

management.context-path=/manage

则关闭命令变为

curl -X POST host:port/manage/shutdown

接下来说一下安全设置相关,远程执行命令的时候需要借助spring-boot-starter-security进行身份认证。
首先,添加security依赖:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-security</artifactId> 
</dependency>

接着在application.properties中添加安全属性:

#开启shutdown的安全验证 
endpoints.shutdown.sensitive=true 
#验证用户名 
security.user.name=abswolf
#验证密码 
security.user.password=123456
#角色 
management.security.role=SUPERUSER

指定IP和端口

#指定管理端口和IP 
management.port=8080
management.address=127.0.0.1

执行命令

curl -u abswolf:123456 -X POST http://127.0.0.1:8081/shutdown

方式二:部署为Unix/Linux Service
该方式主要借助官方的spring-boot-maven-plugin创建”Fully executable” jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:
引入插件:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
        <executable>true</executable> 
    </configuration> 
</plugin>

设置为系统服务:
将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:

sudo ln -s /var/app/app.jar /etc/init.d/app

赋予可执行权限:

chmod u+x app.jar

以系统服务的方式管理:

service foo start|stop|restart
默认PID文件路径:/var/run/appname/appname.pid
默认日志文件路径:/var/log/appname.log

自定义参数:
在这种方式下,我们还可以使用自定义的.conf文件来变更默认配置,方法如下:
1、在jar包相同路径下创建一个.conf文件,名称应该与.jar的名称相同,如appname.conf
2、在其中配置相关变量,如:

JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log

安全设置:
作为应用服务,安全性是一个不能忽略的问题,如下一些操作可以作为部分基础设置参考:
为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
1、赋予最小范围权限:

chmod 500 app.jar

2、阻止修改:

sudo chattr +i app.jar

3、对.conf文件做类似的工作:

chmod 400 app.conf,sudo chown root:root app.conf

参考:正确、安全地停止SpringBoot应用服务

RxJava生命周期管理

当Activity或者fragment销毁的时候需要取消订阅,否则会消耗内存,导致OOM。这里推荐两种办法:
第一种:

 
CompositeDisposable mDisposables = new CompositeDisposable();
DisposableObserver mObserver = getObservable()//被观察者
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(mObserver);
mDisposables.add(mObserver);
当fragment或者activity销毁的时候,清空mDisposables.clear();

第二种使用rxlifecycle-components第三方框架

Activity需要继承RxAppcompatActivity,新建的Fragment则继承RxFragment。
myObservable
    .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
    .subscribe();
具体可以查看官方GitHub

Git基本使用

一、先在第三方git平台上创建一个空的项目。

二、本地初始化项目

1、执行以下命令设置git的提交信息

git config --global user.name "your name"
git config --global user.email "your email"

2、在你的需要初始化版本库的文件夹中执行初始化命令

git init 
git remote add origin <你的项目地址>

3、执行以下命令提交本地代码

git pull origin master
git add .
git commit -m "first commit"
git push origin master

Mac Android Studio离线配置gradle

Android Studio每次大更新,基本Gradle也需要大更新。每次通过studio都下载半天,甚至下载不了。所以通过在Gradle官网下载并手动配置,几分钟就可以搞定。

Gradle官网下载

1、首先要知道你需要下载的Gradle版本号。

在项目目录下,找到该文件:

2、下载gradle-4.1-all.zip之后,Copy 到Gradle所在的目录。

这里推荐用命令行直接打开:

#open .gradle

把gradle-4.1-all.zip直接放到gradle-4.1-all目录下的那一长串目录下。然后重启Android Studio就可以了。

JedisCluster应用详解

Redis集群的搭建参考Redis Cluster安装配置

本文主要介绍JedisCluster客户端结合spring注解的使用。

1、rediscluster.properties

#redis的服务器地址
redis.host=172.18.209.168
#redis的服务端口
redis.port=6379
#密码
redis.password=×××××××
#最大空闲数
redis.maxIdle=100
#最大连接数
redis.maxActive=300
#最大建立连接等待时间
redis.maxWait=1000
#客户端超时时间单位是毫秒
redis.timeout=100000
redis.maxTotal=1000
redis.minIdle=8
#明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#连接耗尽时是否阻塞  false报异常,ture阻塞直到超时
redis.blockWhenExhausted=false
#当设置为true,且服务开启的jmx服务时,使用jconsole等工具将看到连接池的状态
redis.jmxEnabled=true
#向连接池归还链接时,是否检测链接对象的有效性
redis.testOnReturn=false
#对象空闲多久后逐出,当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出
redis.softMinEvictableIdleTimeMillis=10000

#jediscluster
cluster1.host.port=172.18.209.168:7001
cluster2.host.port=172.18.209.168:7002
cluster3.host.port=172.18.209.168:7003
cluster4.host.port=172.18.209.169:7004
cluster5.host.port=172.18.209.169:7005
cluster6.host.port=172.18.209.169:7006

#rediscluster
spring.redis.cluster.nodes=172.18.209.168:7001,172.18.209.168:7002,172.18.209.168:7003,172.18.209.169:7004,172.18.209.169:7005,172.18.209.169:7006
spring.redis.cluster.max-redirects=3  

2、spring-redis.xml

<bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:rediscluster.properties" />
</bean>

<!-- 基础参数配置 -->
<bean id="jedisClusterPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 连接池最大允许连接数 -->
    <property name="maxTotal" value="${redis.maxTotal}"/>
    <!-- 对象空闲多久后逐出,当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出 -->
    <property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}"/>
    <!-- 向连接池归还链接时,是否检测链接对象的有效性 -->
    <property name="testOnReturn" value="${redis.testOnReturn}"/>
    <!-- 当设置为true,且服务开启的jmx服务时,使用jconsole等工具将看到连接池的状态 -->
    <property name="jmxEnabled" value="${redis.jmxEnabled}"/>
    <!-- 连接耗尽时是否阻塞  false报异常,ture阻塞直到超时 -->
    <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}"/>
    <!--最大空闲数-->
    <property name="maxIdle" value="${redis.maxIdle}" />
    <!--最大建立连接等待时间-->
    <property name="maxWaitMillis" value="${redis.maxWait}" />
    <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>

<bean id="resourcePropertySource" class="org.springframework.core.io.support.ResourcePropertySource">
    <constructor-arg name="name" value="rediscluster.properties"/>
    <constructor-arg name="resource" value="classpath:rediscluster.properties"/>
</bean>

<bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
    <constructor-arg name="propertySource" ref="resourcePropertySource"/>
</bean>

<!-- JedisCluster -->
<bean id="jedisCluster" class="*.*.jedis.JedisClusterFactory">
    <property name="addressConfig" value="classpath:rediscluster.properties" />
    <property name="addressKeyPrefix" value="cluster" />
    <property name="timeout" value="300000" />
    <property name="maxRedirections" value="6" />
    <property name="genericObjectPoolConfig" ref="jedisClusterPoolConfig" />
</bean>

<!-- 配置redis connection -->
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <constructor-arg ref="redisClusterConfiguration"/>
    <constructor-arg ref="jedisClusterPoolConfig"/>
</bean>

<!-- 数据以字符串存储  -->
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

<!-- 数据以字节流存储 -->
<bean id="jdkRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>

<!--  redis String类型 访问模版本 -->
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="redisConnectionFactory"/>
</bean>

<!-- redis 访问模版 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="redisConnectionFactory"/>
    <!-- 在hash数据结构中,hash-key的序列化策略 -->
    <property name="hashKeySerializer" ref="stringRedisSerializer"/>
    <!-- 对于普通K-V操作时,key采取的序列化策略 -->
    <property name="keySerializer" ref="stringRedisSerializer"/>
    <!-- value采取的序列化策略 -->
    <property name="valueSerializer" ref="jdkRedisSerializer"/>
</bean>

3、JedisClusterFactory.java

public class JedisClusterFactory implements FactoryBean, InitializingBean {

    private Resource addressConfig;
    private String addressKeyPrefix;

    private JedisCluster jedisCluster;
    private Integer timeout;
    private Integer maxRedirections;
    private GenericObjectPoolConfig genericObjectPoolConfig;

    private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");

    @Override
    public JedisCluster getObject() throws Exception {
        return jedisCluster;
    }

    @Override
    public Class<? extends JedisCluster> getObjectType() {
        return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    private Set parseHostAndPort() throws Exception {
        try {
            Properties prop = new Properties();
            prop.load(this.addressConfig.getInputStream());
            Set haps = new HashSet<>();
            for (Object key : prop.keySet()) {
                if (!((String) key).startsWith(addressKeyPrefix)) {
                    continue;
                }
                String val = (String) prop.get(key);
                boolean isIpPort = p.matcher(val).matches();
                if (!isIpPort) {
                    throw new IllegalArgumentException("ip 或 port 不合法");
                }
                String[] ipAndPort = val.split(":");
                HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));
                haps.add(hap);
            }

            return haps;
        } catch (IllegalArgumentException ex) {
            throw ex;
        } catch (Exception ex) {
            throw new Exception("解析jedis配置文件失败", ex);
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Set haps = this.parseHostAndPort();
        jedisCluster = new JedisCluster(haps, timeout, maxRedirections, genericObjectPoolConfig);
    }

    public void setAddressConfig(Resource addressConfig) {
        this.addressConfig = addressConfig;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public void setMaxRedirections(int maxRedirections) {
        this.maxRedirections = maxRedirections;
    }

    public void setAddressKeyPrefix(String addressKeyPrefix) {
        this.addressKeyPrefix = addressKeyPrefix;
    }

    public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {
        this.genericObjectPoolConfig = genericObjectPoolConfig;
    }
}

Retrofit Call 获取数据

关于的说明和用法可以详细查看官网

Call<List<Repo>> call = service.listRepos("octocat");

如何得到List<Repo>,请看下面的代码:

call.enqueue(new Callback<List<Repo>>() {  
    @Override
    public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
        
    }

    @Override
    public void onFailure(Call<List<Repo>> call, Throwable t) {
        
    }
});

 

 

git 命令说明

1、用命令进行配置
$ git config –global user.name “Your Name” $ git config –global user.email “email@example.com”
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
2、用命令git clone克隆一个本地库
3、查看当前状态
$ git status
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
4、添加到仓库
用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
5、提交仓库
用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m “wrote a readme file”
git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
6、查看历史记录
历史记录,在Git中,我们用git log命令查看:
$ git log commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: 06peng <linlepeng@06peng.com> Date: Tue Aug 20 15:11:49 2013 +0800 append GPL commit ea34578d5496d7dd233c827ed32a8cd576c5ee85 Author: 06peng <linlepeng@06peng.com> Date: Tue Aug 20 14:53:12 2013 +0800 add distributed 或者 $ git log –pretty=oneline 3628164fb26d48395383f8f31179f24e0882e1e0 append GPL ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
7、回滚
回退到上一个版本
$ git reset –hard 3628164
8、恢复
恢复到新版本怎么办?找不到新版本的commit id
$ git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file
9、暂存代码
git stash 可用来暂存当前正在进行的工作
$ git stash save “work in progress for foo feature”
10、取出暂存区代码
$ git stash list 命令可以将当前的Git栈信息打印出来
git stash apply stash@{0} 就可以将你指定版本号为stash@{1}的工作取出来
当你将所有的栈都应用回来的时候,可以使用 git stash clear 来将栈清空。
11、分支管理
创建dev分支,然后切换到dev分支:
$ git checkout -b dev
用git branch命令查看当前分支:
$ git branch
换回master分支:
$ git checkout master
分支的工作成果合并到master分支上:
$ git merge dev
12、更新 & 提交
更新
git pull –rebase
如果有冲突,会提示你。冲突分为两种,一种是在不同地方的冲突,通常情况下,git是可以自己合并的。另外一种是因为可能是同一个文件的编辑,git没法自动合并,需要二选一,这时候打开冲突的文件,手动编辑文件到可用的版本。然后。。
git rebase –continue
git push
13、缓存密码
.gitconfig 文件中添加
[credential]
helper = store
或者
$ git config –global credential.helper store
14、.gitignore文件说明
*.iml
*.idea
*/.classpath
*/.launch
*/.project
*/.settings
/*.launch
/*.tmproj
*/ivy*
*/eclipse
!.gitignore
*/target
*/outputLocation_IS_UNDEFINED
15、客户端工具介绍
windows 的github软件
1.source tree
2.Git Extensions.
3.msysGit
4.Cmder
5.乌龟 tortoise git
6.twilight
16、
一、 提交时
假设修改ABC.java为Abc.java。
1.1 如果使用git命令进行仅涉及大小写的重命名
1.1.1 设置git库为大小写敏感(不建议)
$ git config core.ignorecase false
用这种方法进行重命名,用git status就可以识别出修改了,但是不推荐用这种方式,因为在更新这种修改的时候会有麻烦。
1.1.2 使用git mv命令(仅当core.ignorecase为true时可用)
$ git mv ABC.java Abc.java
$ git status
……
renamed: ABC.java -> Abc.java
此时的状态是renamed,git commit即可。
1.2 如果使用Eclipse进行仅涉及大小写的重命名
无论core.ignorecase设置为true还是false或者没有设置该项,修改之后均可正常提交,在进行Commit的时候,对话框中显示的修改文件列表有:
即删除ABC.java并增加Abc.java,直接commit然后push即可。
偶尔会出现在Eclipse端修改完之后右键commit为灰色的情况,这时候如果使用git status发现有renamed状态的修改的话,也可以直接在git bash上commit并push。
17、
比如我现在有两个分支,分别是master和develop
按照官方的说法,在.gitattributes文件中如下设置
database.xml merge=ours
两个分支中都有database.xml文件,但是内容不同,我不想在master合并develop分支的时候,把database.xml也合并了。
还需设置如下:
git config –global merge.ours.driver true
当我修改了develop分支中的database.xml,切换到master分支进行合并
git merge develop

React Native嵌入到原生Android问题记录

本文主要是记录ReactNative嵌入到原生Android中遇到的一些问题以及解决方法。关于配置方面在这里就不说了。可以参考FaceBook的官方文档,或者ReactNarive中文版

1、java.lang.IllegalAccessError: Method ‘void android.support.v4.net.ConnectivityManagerCompat.<init>()’ is inaccessible to class ‘com.facebook.react.modules.netinfo.NetInfoModule’ (declaration of ‘com.facebook.react.modules.netinfo.NetInfoModule’ appears in /data/app/package.name-2/base.apk

解决办法:把support相关包改成23.0.1

compile 'com.android.support:appcompat-v7:23.0.1'

2、ReferenceError: Can’t find variable: __fbBatchedBridge

解决办法:晃动手机或者点击Menu菜单就会打开相关的调试页面,前提是要在配置文件中配置RN的DevSettingsActivity,让RN项目支持调试。

<activity android:name=”com.facebook.react.devsupport.DevSettingsActivity” />

选择Dev Settings,然后选择Debug server host & port for device,输入你的ip和8081端口,例如:192.168.1.100:8081,然后重试。

3、启动RN服务器的时候报错:

Loading dependency graph… ERROR  Packager can’t listen on port 8081

解决办法:端口被占用,在命令行输入lsof -i :8081 查看占用该端口的进程,然后执行命令“kill -9 进程id” ,再重启服务器。

4、Unable to download JS bundle:

原因是在npm install的时候曾经出现过

react-native@0.43.4 requires a peer of react@16.0.0-alpha.6 but none was installed.

解决办法:

执行 npm i -S react@16.0.0-alpha.6

重启npm start。

5、出现Got JS Exception: TypeError: undefined is not a function (evaluating ‘(bridgeConfig.remoteModuleConfig || []).forEach’) 的错误,原因是被官方文档坑了,官方文档是这样描述的:

allprojects {
    repositories {
        ...
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
    ...
}

然而正确应该是:

allprojects {
    repositories {
        jcenter()

        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/node_modules/react-native/android"
        }
    }
}