dubbo-admin编译时报错无法得到war包【整理】

dubbo-admin编译时报错无法得到war包【整理】

整理笔记本时发现一些以前做过的笔记,整理一下,在博客里留个记录,省的以后忘记。
问题是这样的:dubbo在部署时需要用到dubbo-admin,但dubbo-admin需要自己编译,网上各种下载的war包可能并不适合自己的开发环境、有极大概率是没法用的。
编译dubbo-admin很简单,在编译环境中准备好jdk、maven(jdk maven配置过程就没必要说了,网上n多教程),从github上下载dubbo源代码,准备工作就这些。
我的编译环境如下:

  • MacOSX High Sierra
  • Oracle JDK 1.8
  • apache maven 3.5.2

编译步骤:
在shell里进入dubbo-admin文件夹,然后输入如下命令

mvn package -Dmaven.skip.test=true

看到这个结果说明编译成功。

[INFO] Building war: /Users/xxx/yourpath/dubbo/dubbo-admin/target/dubbo-admin-2.5.8.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 04:17 min
[INFO] Finished at: 2017-10-09T20:47:05+08:00
[INFO] Final Memory: 16M/150M
[INFO] ————————————————————————

然而,如果编译过程中报错,可以根据maven输出的错误信息一步步调试。我当时遇到的问题比较奇怪,完整错误信息如下:

[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects…
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.alibaba:dubbo-admin:war:2.5.8
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-compiler-plugin is missing. @ com.alibaba:dubbo-parent:2.5.8, /Users/xxx/Documents/PrayerData/GitRepo/dubbo/pom.xml, line 465, column 21
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-surefire-plugin is missing. @ com.alibaba:dubbo-parent:2.5.8, /Users/xxx/Documents/PrayerData/GitRepo/dubbo/pom.xml, line 388, column 21
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-jar-plugin is missing. @ com.alibaba:dubbo-parent:2.5.8, /Users/xxx/Documents/PrayerData/GitRepo/dubbo/pom.xml, line 374, column 21
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-source-plugin is missing. @ com.alibaba:dubbo-parent:2.5.8, /Users/xxx/Documents/PrayerData/GitRepo/dubbo/pom.xml, line 475, column 21
[WARNING] ‘build.plugins.plugin.version’ for org.apache.maven.plugins:maven-deploy-plugin is missing. @ com.alibaba:dubbo-parent:2.5.8, /Users/xxx/Documents/PrayerData/GitRepo/dubbo/pom.xml, line 458, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ————————————————————————
[INFO] Building dubbo-admin 2.5.8
[INFO] ————————————————————————
[WARNING] The POM for io.netty:netty:jar:3.10.5.Final is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO]
[INFO] — maven-resources-plugin:2.6:resources (default-resources) @ dubbo-admin —
[INFO] Using ‘UTF-8’ encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] — maven-compiler-plugin:3.1:compile (default-compile) @ dubbo-admin —
[INFO] Changes detected – recompiling the module!
[INFO] Compiling 130 source files to /Users/xxx/Documents/PrayerData/GitRepo/dubbo/dubbo-admin/target/classes
[INFO] ————————————————————————
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 1.799 s
[INFO] Finished at: 2017-06-09T19:24:06+08:00
[INFO] Final Memory: 12M/155M
[INFO] ————————————————————————
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project dubbo-admin: Compilation failure -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project dubbo-admin: Compilation failure
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:955)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:194)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:862)
at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:955)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:194)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

网上搜确实有相关的报错,有如下修改方案:
1、说JDK 1.8编译不好使,换1.7就OK
2、缺少maven插件,在dubbo-admin的pom.xml中添加如下配置项


org.apache.maven.plugins
maven-surefire-plugin
2.19.1

true

或是


org.apache.maven.plugins
maven-compiler-plugin
3.5.2

1.8
1.8

或是properties中添加

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

3、调用mvn clean install -DskipTests 命令,跳过单元测试
但这些对我都不管用。最后还是在stackoverflow上偶然看到一个回答(https://stackoverflow.com/questions/29700576/failed-to-execute-goal-org-apache-maven-pluginsmaven-compiler-plugin-default-c/29700727),说**清空一下$HOME/.m2里的所有内容**,这才编译成功。所以原因就在于,可能在maven下载包时一些包冲突了(it looks some of apache plugin artifacts corrupted in your local repository)。
所以啊,童鞋们:

用maven编译包时,如果什么时候实在找不到原因,可以试试清空maven本地repository试试。

顺手整理一下其他网友编译dubbo时遇到的坑以及解决办法:
dubbo源码编译 https://www.jianshu.com/p/0dde591f21d0\
dubbo源代码编译打包错误解决 https://www.cnblogs.com/bruceChan0018/p/5786044.html\
【DUBBO】实践之dubbo-admin编译不能出war包问题 http://blog.csdn.net/lsttoy/article/details/53219989

python安装faker包后引用时报错ImportError The “fake-factory“ package is now called “Faker“

python安装faker包后引用时报错ImportError The “fake-factory“ package is now called “Faker“

Faker是一个可以让你生成伪造数据的Python包。当你需要初始化数据库,创建美观的XML文档,不断产生数据来进行压力测试或者想从生产服务器上拉取匿名数据的时候,Faker将是你最棒的选择。
Faker的安装过程可以参考Faker:Python的伪造数据生成器 这篇文章,其实就是用pip一条命令:

1
pip install fake-factory

安装后记得验证,在python命令行下输入:

1
from faker import Factory

如果安装正常,按下Enter键后不会出现任何异常信息。我在ubuntu server 16.04上安装后,验证时报如下错误:

1
2
3
4
5
6
7
8
 import factory
File "/venv/lib64/python3.5/site-packages/factory/__init__.py", line 46, in &amp;amp;lt;module&amp;amp;gt;
from .faker import Faker
File "/venv/lib64/python3.5/site-packages/factory/faker.py", line 41, in &amp;amp;lt;module&amp;amp;gt;
import faker
File "/venv/lib64/python3.5/site-packages/faker/__init__.py", line 7, in &amp;amp;lt;module&amp;amp;gt;
raise ImportError(error)
ImportError: The ``fake-factory`` package is now called ``Faker``.

搜索后发现这个问题很多人都遇到过,参见 https://github.com/FactoryBoy/factory_boy/issues/334 。问题原因与解决方案在这帖子里都有。简单来说,就是fake-factory所依赖的一个包factory_boy在安装特定版本时会下载的内容有问题。我使用帖子里说的一个办法解决了这个ImportError问题,即使用requirements.txt来指定所要装的python包版本。
有关python中requirements.txt的使用可参考此文章:python笔记—需求文件requirements.txt的创建及使用
在python 虚拟环境中,先使用

1
pip freeze >requirements.txt

获取现有环境中的python包,然后在requirements.txt中追加如下内容:

1
2
fake-factory==0.7.4
factory-boy==2.7.0

然后调用下面这条命令,等待安装完成即可。

1
pip install -r requirements.txt

顺便提一句,需要创建这个虚拟环境的完全副本时,可以创建一个新的虚拟环境,并在其上运行上面这条命令即可。

离线环境下安装配置android studio

离线环境下安装配置android studio

公司项目迁移到android studio上已经有一段时间,之前光是配置android studio就花了一些时间——因为公司内网环境不能访问外网(内心吐槽过无数次了……工作本不能上外网给我们做开发的带来很多问题,唉……)……
本文主要想总结一下android studio在离线环境下如何配置。
jdk/android sdk的下载、配置再次不再赘述。
其实,android studio(以下简称as)在离线环境下的安装,关键在于配置gradle。as采用了gradle进行编译,安装jdk/android sdk后,如果下载as后直接启动as,则as检测是否已经安装了gradle,如果没有则as自行去官网下载对应的gradle。离线环境下,并不是我们自己去随便下个gradle、装上就可以了,首先gradle的版本要与as版本对应。这里就要先说明,as中包含有一个android gradle plugin,用于调用gradle进行编译,上面说的“gradle的版本要与as版本对应”其实就是指android gradle plugin的版本要和gradle的版本对应。android官网上给出了对应关系如下:
注:表格来自https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle

Plugin version Required Gradle version
1.0.0 – 1.1.3 2.2.1 – 2.3
1.2.0 – 1.3.1 2.2.1 – 2.9
1.5.0 2.2.1 – 2.13
2.0.0 – 2.1.2 2.10 – 2.13
2.1.3 – 2.2.3 2.14.1+
2.3.0+ 3.3+

我下载了as 2.3.3稳定版,as 2.3.3在自行下载gradle时默认就是下载gradle 3.3,并且会在操作系统如下路径保存、解压gradle:
Windows系统:C:\Users\XXX.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9
因此,在离线环境下,配置好jdk/android sdk,下载as(以最新的2.3.3为例)、下载对应版本的gradle(下载gradle-3.3-all.zip)之后,然后,依次进行如下操作:
1、修改android-studio/bin/idea.properties,在文件底部添加

#———————————————————————–\

启动不检查更新\

#———————————————————————–
disable.android.first.run=true

2、启动as,此时会报错,因为没有配置gradle、也没法下载
3、关闭as,此时操作系统中应该已经有生成有如下路径:
Windows系统下:C:\Users\XXX.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9
4、将gradle-3.3-all.zip放到上述路径中,不用解压
印象里还需要自行创建两个文件:gradle-3.3-all.zip.lck、gradle-3.3-all.zip.ok,直接创建文件、改下名字就行,不需要添加任何内容。这个大家可以去自己的操作系统中看看。55gk2rcmfc6p2dg9u9ohc3hw9这个是跟gradle版本有关,不同gradle文件夹名不一样。大家第一次启动as后看看as对应哪个版本gradle,下对应版本就行了。
注意,不用事先在环境变量中配置gradle,直接把gradle放到默认文件夹就行——我就是因为这个小细节,折腾了好久……心累……
5、重新启动gradle,此时应该就能正常启动as、进行编译。
 
 \

dubbo管理端+zookeeper注册中心的搭建【整理】

dubbo管理端+zookeeper注册中心的搭建【整理】

类似的文章网上很多,不打算重复写人家写过的东西,大家参考这两篇文章应该就够了,今天写这文章纯粹为了整理一下留个记录——
http://blog.csdn.net/evankaka/article/details/47858707 Dubbo-Admin管理平台和Zookeeper注册中心的搭建
http://www.cnblogs.com/zihanxing/p/7359727.html ZooKeeper 集群的安装、配置—Dubbo 注册中心
需要注意的是:
1、zookeeper集群大家时需要我们自己写myid文件。
2、dubbo-admin配置文件里,如果要连zookeeper集群,编写格式如下:

zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181
并不是以逗号分隔,大家注意一下就好。

安装部署开源看板工具wekan(libreboard)以及踩过的坑

安装部署开源看板工具wekan(libreboard)以及踩过的坑

一直很想使用看板工具来管理工作任务,市面上trello/teambition等有很多有用的工具,方便更新工作状态。然而,由于公司内网没法连外网,只能自己部署一套了。幸好目前这类实现比较多,我选用了wekan,之前叫做libreboard,http://github.com/wekan/wekan  。东西不错,跟trello很类似,但github上的wiki安装说明很滞后,有些地方说的也不是很清楚,我自己部署过程中也踩了几个坑,记录一下。
首先是安装方式,wekan的wiki写的还是很多的,有各种安装方式,我发帖咨询后感觉目前作者一直主要在维护的是docker版本,其他的版本可能滞后一些,所以建议大家直接使用docker安装吧。

docker安装方式

最简单的方法就是直接下载、运行wekan给出的docker脚本,参见https://github.com/wekan/wekan-mongodb

snap安装方式

ubuntu上用这种会比较简单,直接几条命令搞定,参考:https://github.com/wekan/wekan-snap/wiki/Install
注意,用这种方式安装时,如果之前从未使用过snap,会先下载一个ubuntu-core的包,然后才会去下载wekan的包。
我个人是选用这种方式,个人经验是,安装完ubuntu-core之后,如果立即安装wekan包容易出问题。所以建议先使用

snap install hello-world

安装hello w0rld应用,然后调用

/snap/hello-world/current/bin/echo

验证snap可用(显示hello-world字符串),然后再去使用如下命令安装wekan

snap install wekan

这样不容易出问题。

其他安装方式

大家自行按照wekan的github wiki说明来做吧。

配置

安装其实还好,但配置方面wekan的wiki有几个地方没明确说,简单汇总一下我遇到的坑:

  • 安装后,如果不做任何配置,虽然能登录、注册、创建card,但点击card时报错
    • wekan站点默认监听的是8080端口,但点击一个card时默认是80端口,因此必须配置wekan的port以及root_url配置项。具体修改github wiki。
  • ubuntu虚拟机中用snap安装了wekan,配置root-url=”localhost:xxx”,我访问宿主机ip,没问题,但点击card后,域名由宿主机ip/…变成了localhost/…..
    • root_url没配置好,我是将虚拟机部署在宿主机上,用virtualbox做了端口映射,但一开始root_url还是配置成localhost:xxx 实践证明wekan是将这个参数作为点击card时的根域名。因此我重新配置root_url为宿主机ip:xxx,然后就好使了

maven package install deploy区别【转载+整理】

maven package install deploy区别【转载+整理】

稍微留下个笔记,省的以后再搜了。本文内容来自以下两篇文章:
maven package install deploy区别
添加jar包到本地Maven仓库
首先,说下package install deploy区别
**1、maven package:**打包到本项目,一般是在项目target目录下。
如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目。
**2、maven install:**打包会安装到本地的maven仓库中,如果没有设置过maven本地仓库,一般在用户/.m2目录下。
如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件,
可以看install b的日志:
[INFO] — maven-install-plugin:2.5.2:install (default-install) @ b —
[INFO]Installing D:\Java\workspace\b\target\b-2.7.4.RELEASE.jar to
C:\mavenRepository\com**\b\2.7.4.RELEASE\b-2.7.4.RELEASE.jar [INFO]
Installing D:\java\workspace\b\pom.xml to
C:\mavenRepository\com**\b\2.7.4.RELEASE\b-2.7.4.RELEASE.pom
说明b项目已安装到本地仓库了,并且是jar和pom同时安装的. 这时候去compile a项目,编译通过.
总结:
A、maven package:打包(jar等)到本项目的target下。
B、maven install:把target下打的包(jar等)安装到本地仓库,可以供其他项目使用。
3、maven deploy:将打包的文件发布到远程参考,提供其他人员进行下载依赖。
然后呢,对于
mvn install
命令,格式如下:

安装指定文件到本地仓库命令:
mvn install:install-file
-DgroupId= : 设置项目代码的包名(一般用组织名)
-DartifactId= : 设置项目名或模块名
-Dversion=1.0.0 : 版本号
-Dpackaging=jar : 什么类型的文件(jar包)
-Dfile=<myfile.jar> : 指定jar文件路径与文件名(同目录只需文件名)

举个栗子:

1
mvn install:install-file -Dfile=apollo-core-0.10.0-SNAPSHOT.jar -DgroupId=com.ctrip.framework.apollo -DartifactId=apollo-core -Dversion=0.10.0-SNAPSHOT -Dpackaging=jar

注意version中并不一定只能是0.10.0这种数字,也可以是0.10.0-SNAPSHOT这种。我在编译携程apollo-client时,apollo-client依赖的就是apollo-core 0.10.0-SNAPSHOT。\

java List的中 方法参数是父类对象的list。传入子类对象时的处理【转载】

java List的中 方法参数是父类对象的list。传入子类对象时的处理【转载】

java List的中 方法参数是父类对象的list。传入子类对象时的处理

本文转载自:
https://blog.csdn.net/u014463137/article/details/75570656

父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FatherA {

private String a;


public String getA() {
return a;
}

public void setA(String a) {
this.a = a;
}

}

子类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Children extends FatherA {

private String b;

public String getB() {
return b;
}

public void setB(String b) {
this.b = b;
}

}

实现

ArrayList和ArrayList是两个不同的泛型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String[] args) {
Children cl = new Children();
cl.setB("1");
cl.setA("2");
List<Children> list = new ArrayList<Children>();
list.add(cl);
getA(list);
System.out.println(cl.getA());
}

private static <T extends FatherA> void getA(List<T> list) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setA("3");
}
}
}

解决android部分机型调用系统拍照功能后返回照片有旋转的问题

解决android部分机型调用系统拍照功能后返回照片有旋转的问题

如题,这个问题说起来略囧 o(╯□╰)o,调用系统拍照功能直接一个Intent搞定,谁曾想测试阶段发现部分机型拍照完成后自己加了一个旋转图片的操作,本来自己写的一个拍照截图控件用着好好的,有了这个旋转操作后显示效果自然不是我想要的。
原因找到了,解决问题其实挺简单,由于系统在拍照完成、生产图片的过程中会将一些参数写入到图片、形成EXIF信息,如果android系统对图片进行了旋转操作,那一般在EXIF中会保存着旋转角度这样的信息。那么,我们拿到图片后,可以读取这个EXIF,再旋转一次,将图片转过来即可。因此有了如下代码:
参考:
解决android有的手机拍照后上传图片被旋转的问题
部分Android手机拍照后照片被旋转的解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 读取图片的旋转的角度
*
* @param path
* 图片绝对路径
* @return 图片的旋转角度
*/
private int getBitmapDegree(String path) {
int degree = 0;
try {
// 从指定路径下读取图片,并获取其EXIF信息
ExifInterface exifInterface = new ExifInterface(path);
// 获取图片的旋转信息
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 将图片按照某个角度进行旋转
*
* @param bm
* 需要旋转的图片
* @param degree
* 旋转角度
* @return 旋转后的图片
*/
public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(degree);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}

《沃顿商学院最受欢迎的谈判课》读书笔记(05-06章)

《沃顿商学院最受欢迎的谈判课》读书笔记(05-06章)

承接:
《沃顿商学院最受欢迎的谈判课》读书笔记(01-02章)
《沃顿商学院最受欢迎的谈判课》读书笔记(03-04章)

05 不等价交换

首先,必须搞清楚对方脑海中的画面。然后,必须搞清楚你自己脑海中的画面。找出对一方价值不太大但对另一方很有价值的东西。之后,利用这些东西进行交易。
需求
关键是,你越了解对方,在谈判中就会越有说服力。
获取信息
在你所参加的每一次重要会议中,尽可能找出有关参会者们的各种信息,越多越好。这同样适用于求职面试、工作会议以及电话会议。会议开始之前要进行调查研究,要多向他人询问。
扩大整体利益
对待合作者,就将整体利益扩大;对待强硬分子,可以第三方看到如何将整体利益做大。
什么东西让你不花一分钱却可以满足我的需求,什么东西让我不花一分钱却可以满足你的需求?
联系
你要将那些未必有关的事物联系在一起:这些事物也许与交易有关,也许与交易无关。你可以通过议题、时间或其他参数将事物联系起来:如果你现在为我做这件事,稍后我就会为你做某件事。
我认识的经理们会对他们的竞争对手说:“当我们双方都有利可图的时候,为什么要彼此争斗不休呢?”
转变态度
要多考虑积极正面因素,而不是消极负面因素。转变态度与人们看待问题的方式有很大关系。
转变态度的思维过程如下:在生活中,某些问题会让你焦头烂额,你必须花时间处理这些问题。这时,你需要做的就是调整态度,既然非要解决这些问题,那么,能否利用这些问题创造出一些机会呢?人生岁月无多,为
什么不更有效地利用这些时间呢?
从问题当中找出各种隐藏的机会并不需要花很多时间。你只需寻找机会即可。不要把问题当成一个有待卸下的沉重负担,而要将其看做一个机会,正等着你去发现和开发。
询问了对方一些问题,了解了他们的需求和目标,找出了与他们有关的那些无形之物,将焦点放在积极向上的一面,而不是消极向下的一面。
了解对方是谁,了解他关心什么,有什么看法、有什么需求,以及各
种与他有关的无形之物。要利用价值不等之物进行交易。
只要确保建立起某种私人关系,任何一件产品或任何一项服务都不再只是一件“商品”,它是你的神经元、你的经历、你的时间、你的努力、对你必须与其进行交易的对方的兴趣。这会让你所提供的东西与众不同。这
些无形之物可以充实他人的生活,可以让交易更加成功,可以让每一个人都获得更多。

06 情感

情感补偿可以让对方平静下来,让对方去倾听,让对方愿意更多地思考自己的利益。情感补偿可以使对方从一开始的非理性状态,一点一点地,向一个更理想的(如果不是理性的)结果靠拢。
情感与谈判
同理心和协商都是一种感情付出。
容易引发对方情绪的谈判策略
通过调整表达方式,也就是将问题抛给对方的方式,你使对方的情绪得以缓和,得到了更令人满意的结果。你把这种情况变成了一个需要双方共同解决的问题,你给予对方更多尊重。
控制情绪
如果你是个容易情绪化的人,那么,在谈判中你对任何人都没有好处。如果你开始变得情绪化,那就快停下来!稍事休息,让自己镇定下来。如果你做不到,你也许就不适合参与谈判,至少此刻不适合。多休息一会儿,直到你能平静下来,或找别人来帮助你。如果你企图在心烦意乱、怒气冲冲或其他负面情绪的状态下进行谈判,那你就无法看到自己的目标和需求,而且还会使自己成为问题的焦点。
向对方发脾气会毁掉你的目标。
如何处理情绪问题以及如何对待情绪化的人:

  • 识别何时对方行事与他们的目标或需求相悖。
  • 设法了解对方的情绪状况和看法。
  • 找出对方情绪、需求和目标形成的原因。
  • 仔细思考你的谈判风格是否对形势有益。
  • 进行情感补偿:让步、道歉、同情。
  • 设法建立信任。
  • 避免极端言论——极端言论只会让对方更容易情绪化。
  • 利用第三方及对方委托人助你一臂之力。
  • 利用对方的准则。
  • 纠正错误的事实。

关键是,对方的行为是否与其利益、需求和目标相悖。你也许看到过有些人行事完全与自己的利益相悖。他们已经不再关注自己的目标和需求,他们正在感情用事,他们无法清楚地倾听。要说服他们,必须从提高他
们的倾听能力开始。这意味着你必须冷静下来,你必须成为他们情感上的知己。要设法了解他们的情绪,造成这种情绪的原因是什么?怎样才能让他们冷静下来?
必须搞清楚对方需要什么样的情感补偿。这是女性对男性经常提出的一个要求:“我不想让你来解决我的问题,我只是想让你听听她们的意见。”对许多女性而言,倾听她们说话就是对她们的情感补偿。你通过某种方式对她们的情感表示重视的任何行为都是一种情感补偿。这可以是一句赞美的话,可以是轻轻地碰触一下手臂,也可以只是倾听她们说话,这要因人而异。所以,首先,你必须设法了解对方脑海中的想法。
对方有可能将什么视为一种情感补偿呢?要想找出答案,必须密切注意对方脑海中的想法。他们的世界观是什么?他们的需求和看法是什么?什么样的表达方式会令他们愿意倾听?他们需要我们作出让步吗?如果需要,
是什么样的让步呢?是一个简单的道歉吗?是一个需要花心思的道歉吗?如果不道歉,送花行吗?换句话说,无论对人还是对形势,情感补偿一定要具体明确。
对付这种情绪暴力,首先可以尝试使用本书所介绍的方法:找出对方的需求、利用准则、争取建立某种关系、利用能对其施以影响的第三方、进行情感补偿、了解对方的观点等。对方也许没有意识到自己的行为,也许
愿意倾听你的意见。或者对方也许是不择手段,对自己的行为持无所谓的态度。
个人风格
公司可以根据小组成员的风格有效选择一个强有力的谈判小组。积极进取、目标明确的人是结束谈判的理想人选,他们会确保交易的达成。容易通融的人往往更善于倾听,他们适合开启谈判,在和对方建立关系方面大有帮助。容易妥协的人适合处理紧急情况:他们能迅速作出决定。具有合作精神的人是出色的服务者:他们会考虑所有各方的需求。当你在看下面的描述的时候,把你自己的风格和他人的风格分别当成低、中、高三个层次来加以思考。