Coder Social home page Coder Social logo

bittiger-cs504-faq's People

Contributors

hackjutsu avatar jygan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bittiger-cs504-faq's Issues

Problem in Homework1: cannot upload data

{
  "timestamp": 1492022648230,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
  "message": "Could not read document: Instantiation of [simple type, class demo.domain.RunningInformation] value failed: null (through reference chain: java.util.ArrayList[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class demo.domain.RunningInformation] value failed: null (through reference chain: java.util.ArrayList[0])",
  "path": "/bulk/runningInformation"
}

When uploading data, I keep getting 400 Bad Request. The exception is listed above. Has anyone met this problem before? Thanks!

vagrant up/reload等待时间太久,图形界面没有出来

问题

首次vagrant up/reload等待时间太久,卡在terminal界面。最后没有图形登录界面,只能用命令行登录。

分析

注:不熟悉vagrant的同学可以略过这部分。

vagrant在provision阶段,从archive.ubuntu.com下载配置(JDK、图形界面xubuntu等)。如果我们所在网络是IPv6,配置时会优先连接archive里支持IPv6的服务器。

由于archive目前支持IPv6的服务器数量有限,我们连接时常需等待较长时间。(如下)

[Connecting to archive.ubuntu.com (2001:67c:1360:8c01::1a)]

解决

解决方法是让vagrant优先从IPv4服务器下载配置。

步骤

vagrant up --no-provision

用命令行登录系统,然后修改/etc/gai.conf权限为可写。

sudo chmod a+w /etc/gai.conf
vi /etc/gai.conf

/etc/gai.confprecedence ::ffff:0:0/96 100前面的注释去掉(如下图,需要熟悉基本vi操作)。这一步会让系统优先使用IPv4的网络。

#
#    For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100

退出系统。这时,我们应该可以优先从Ubuntu archive里的IPv4服务器下载配置。

vagrant reload --provision

现在terminal应该能实时打出log(首次配置要花一定时间)。配置结束后,再运行reload。

vagrant reload

参考

Can we use Spring Boot for Search Ad system?

Is it possible to use Spring Boot, Spring Data for creating SearchAds system (Index builder, AdsEngine... etc.)? Spring also provide RPC support, so can we use all the microservices technologies we learned at the first month on SearchAds project? Is there any concern for using it?(like too many resources used with Spring?) How is this done in industry?

Some db design questions

  1. RunningInfo 和 UserId 显然是一对多的关系但是在这里我们都放在一张表里面。老师说实际工作有时候会为了节省join的消耗而不embedded,可以具体讲一下怎么分析应该拆分还是不拆分么?

  2. 如何自动生成userId?在这个project里面userId在上传的JSON里面是没有的,所以要自己生成。首先AutoGenerated似乎在embedded object里面不work,其次也不符合同一个user的userId应该是一样的要求。我能想到的实现方法就是根据name和addr做一次query然后没有的自动生成,有的用取出的。

[问题]修改Week4 的SpringBoot版本为 1.5.3.RELEASE 后,测试出现issue

好像1.5版本以后的Spring Boot Test不再支持@SpringApplicationConfiguration和@WebAppConfiguration
所以目前注解改成

@RunWith(SpringRunner.class)
@SpringBootTest
public class LocationRepositoryTest {
//....代码不变
}

运行Test后,报以下异常,在StackOverFlow上面我没看到有其他人遇到这个问题。
所以发上来问问。

12:50:22.001 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.showBanner(Z)Lorg/springframework/boot/builder/SpringApplicationBuilder;
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:110)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:75)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:55)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:119)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
12:50:22.003 [main] ERROR org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@5b0abc94] to prepare test instance [io.bittiger.cs504.capstone.LocationRepositoryTest@61322f9d]
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.showBanner(Z)Lorg/springframework/boot/builder/SpringApplicationBuilder;
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:110)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:75)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:55)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:119)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.showBanner(Z)Lorg/springframework/boot/builder/SpringApplicationBuilder;

	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:110)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:75)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:55)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:119)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

12:50:22.051 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - After test class: context [DefaultTestContext@5db45159 testClass = LocationRepositoryTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@6107227e testClass = LocationRepositoryTest, locations = '{}', classes = '{class io.bittiger.cs504.capstone.RunningLocationServiceApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.SpringBootTestContextCustomizer@33f88ab, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@1b68ddbd, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@467aecef], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]], class annotated with @DirtiesContext [false] with mode [null].

Process finished with exit code 255

如何用SpringData JPA去连接table with dynamic name?

当define table 的时候, table name 是define在@table的name里, 如下例:

======================================================
@entity
@DaTa
@table(name = "category", indexes = {@Index(name = "index_category_name", columnList = "categoryName", unique = true)})
public class Category {
@id
@GeneratedValue
private long id;

======================================================
但是如果table name 是每日更新的话,比如:
name = category_mm_dd_yyyy
ex:
category_01_01_2017: category generated at 01/01/2017
category_01_02_2017: category generated at 01/02/2017
category_01_03_2017: category generated at 01/03/2017

有没有办法设计 Category object 去dynamically更新table name?

Problem with JSOUP

我在使用JSOUP解析如下URL的时候,总是得不到数据,不知道要怎么修改URL才能爬到相应的数据。

String url = "https://www.amazon.com/s/ref=sr_hi_eb?rh=n%3A283155%2Cp_72%3A1250221011%2Cn%3A27&ie=UTF8&qid=1497845640";

HashMap<String, String> headers = new HashMap<>();
headers.put("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,***/*//*//**//*;q=0.8");
headers.put("Accept-Encoding", "*");
headers.put("Accept-Language", "en-US,en;q=0.8");

Document doc = Jsoup.connect(url).userAgent(USER_AGENT).timeout(10*1000).get();
if(doc != null) {
     System.out.println("Connection Success");    
}
String path = "#result_0 > div > div > div > div.a-fixed-left-grid-col.a-col-right > div.a-row.a-spacing-small > div:nth-child(1) > a";
Element ele1 = doc.select(path).first();
if(ele1 != null) {
    String product_url = ele1.attr("href");
    System.out.println("url = " + product_url);
} else {
    System.out.println("failed");
}

代码运行过后总是显示“Connection Success”以及“failed”,不知道为什么总是failed,麻烦大家帮我看一下。

Maven里添加dependency的问题

在maven的Pom.xml里加了


 <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.3</version>
        </dependency>

build成功
image

运行报错
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonGenerationException

image

请问为什么会报错呢?

上传jsondata,执行upload.sh报错

用docker-compose up -d启动mysql后,执行mvn clean install, 执行./target/Running-Information-Analysis-Service-1.0.0.BUILD-SNAPSHOT.jar,然后再执行./upload-running-informations.sh 就报错。

upload-running-informations.sh 文件内容是

#!/usr/bin/env bash
curl -H "Content-type: application/json" localhost:8080/bulkUpload  -d @runningInformations.json

执行报错
image
image

Cannot send message to UI through WebSocket on examlpe code

Try to run running-location-updater project from CS504-week3-4-for-students.zip (Downloaded from 第四周实战课):

Steps to reproduce:

Start Docker environment

docker-compose up

Start the server:

sh ./start-location-updater.sh

Enter UI site:
http://localhost:9007/

Click "Subscribe to Location Updates"
Then click "Send Test Message"

See "sendMessage triggered" displayed, but didn't see the test message displayed on UI.

On server side:
See the following error message, but can't figure out what's wrong w/ the code:

2017-05-24 02:08:16.876 ERROR 4747 --- [nboundChannel-3] .WebSocketAnnotationMethodMessageHandler : Unhandled exception

org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: [B@3ddd4450; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: [B@3ddd4450; line: 1, column: 1]
	at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:223) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.converter.AbstractMessageConverter.fromMessage(AbstractMessageConverter.java:175) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.converter.CompositeMessageConverter.fromMessage(CompositeMessageConverter.java:67) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:115) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:129) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:102) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:462) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:482) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:86) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:423) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:361) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135) [spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
 at [Source: [B@3ddd4450; line: 1, column: 1]
	at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:857) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2851) ~[jackson-databind-2.6.3.jar!/:2.6.3]
	at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:210) ~[spring-messaging-4.2.2.RELEASE.jar!/:4.2.2.RELEASE]
	... 15 common frames omitted

反爬虫策略

反爬虫策略

  • 君子协议:robot.txt
  • Header检验(userAgent、Referer、Cookie)
  • IP/Session访问频率
  • 严格规范用户注册流程(人工审批、内部推荐)
  • 校验码(CAPTCHA)
  • 经常变更网页结构
  • 请求URL复杂化(使用UUID)
  • 前端数据动态加载,并限制单次加载量 (影响SEO)
  • 机器学习爬虫/正常用户的repetitive pattern
  • 关键数据额外加密、认证、转换水印图片
  • 混入伪装数据
  • 蜜罐诱捕 (Honey Pot)

vagrant环境配置中常见的问题

环境配置中常见的问题

正常步骤

git clone https://github.com/bittiger-java/vagrant-workstation.git
cd vagrant-workstation
vagrant up

结束以后

vagrant reload

一切顺利的话,我们会看到下面的登录界面
vagrant_login

常见问题

报错姿势

不巧当的姿势

  • “跑不了”、“不能用”、“不行”、“还是不行”、“跑了很多遍还是不行”……
  • 模糊的电脑屏幕照片……

建议姿势

  • 操作系统:Windows还是macOS
  • 系统版本
  • Virtual Box 和 Vagrant 版本
  • 执行到哪一步?
    • expected behaviors
    • actual behaviors
    • logs (screenshots, not photos)

善用Google + StackOverflow + GitHub issue

从Virtual Box中打开虚拟机出错?

  • 不需要从Virtual Box界面里打开虚拟机

VM not created

  • 删除Virtual Box中已有的Image,或者重新安装Virtual Box

图形界面不出来

cannot access '/root/Development/'

  • vagrant reload

在哪里安装IntelliJ?

  • 虚拟机中

[Windows] requested address is not valid

[Windows] Which interface should the network bridge to?

  • 如果没有出现选项,安装最新版Virtual Box(v5.1)

jetty servlet中出现ClassNotFoundException

原本我的rabbitMQ的comsumer是在main()函数中运行的。但是想把这个功能写在pull server的servlet的init()里面。却出现Exception。我的代码都没有改,提示ClassNotFoundException: product.Product,找不到Product class。但是我的Product class就写在同一个目录下,都没有报错。
是不是这种rabbitMQ的callback function不能写在servlet里面?
还是我还是在main()里面运行consumer,重新创建一个web app来handle pull request比较方便。
出错代码:

Consumer consumer = new DefaultConsumer(channel){
	@Override
	public void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {
      Product product = (Product)SerializationUtils.deserialize(body);

Log:

[pool-1-thread-10] ERROR com.rabbitmq.client.impl.ForgivingExceptionHandler - Consumer MonitorServlet$1@2cff972f (amq.ctag-Wr9fChF9kVNa2vO_rB4KYg) method handleDelivery for channel AMQChannel(amqp://[email protected]:5672/,1) threw an exception for channel AMQChannel(amqp://[email protected]:5672/,1)
org.apache.commons.lang.SerializationException: java.lang.ClassNotFoundException: product.Product
	at org.apache.commons.lang.SerializationUtils.deserialize(SerializationUtils.java:166)
	at org.apache.commons.lang.SerializationUtils.deserialize(SerializationUtils.java:193)
	at MonitorServlet$1.handleDelivery(MonitorServlet.java:83)
	at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
	at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:100)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: product.Product
	at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:487)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:628)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
	at org.apache.commons.lang.SerializationUtils.deserialize(SerializationUtils.java:163)
	... 7 more

关于Track1中关于OAuth2.0认证

阮一峰的这篇《理解OAuth 2.0》我觉得写得挺通透的,分享一下。

理解OAuth 2.0
作者: 阮一峰
日期: 2014年5月12日
原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。
本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。

一、应用场景

为了理解OAuth的适用场合,让我举一个假设的例子。
有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。
云冲印
问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢?
传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。
(1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
(2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
(3)"云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
(4)用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
(5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。
OAuth就是为了解决上面这些问题而诞生的。

二、名词定义

在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。
(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。
(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。
(3)Resource Owner:资源所有者,本文中又称"用户"(user)。
(4)User Agent:用户代理,本文中就是指浏览器。
(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
知道了上面这些名词,就不难理解,OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动。

三、OAuth的思路

OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

四、运行流程

OAuth 2.0的运行流程如下图,摘自RFC 6749。
OAuth运行流程
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
不难看出来,上面六个步骤之中,B是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。
下面一一讲解客户端获取授权的四种模式。

五、客户端的授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)

六、授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
授权码模式
它的步骤如下:
(A)用户访问客户端,后者将前者导向认证服务器。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
下面是上面这些步骤所需要的参数。
A步骤中,客户端申请认证的URI,包含以下参数:
response_type:表示授权类型,必选项,此处的值固定为"code"
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
下面是一个例子。

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

C步骤中,服务器回应客户端的URI,包含以下参数:
code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
下面是一个例子。

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
code:表示上一步获得的授权码,必选项。
redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
client_id:表示客户端ID,必选项。
下面是一个例子。

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

E步骤中,认证服务器发送的HTTP回复,包含以下参数:
access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
下面是一个例子。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json)。此外,HTTP头信息中明确指定不得缓存。

七、简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
简化模式
它的步骤如下:
(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F)浏览器执行上一步获得的脚本,提取出令牌。
(G)浏览器将令牌发给客户端。
下面是上面这些步骤所需要的参数。
A步骤中,客户端发出的HTTP请求,包含以下参数:
response_type:表示授权类型,此处的值固定为"token",必选项。
client_id:表示客户端的ID,必选项。
redirect_uri:表示重定向的URI,可选项。
scope:表示权限范围,可选项。
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
下面是一个例子。

    GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

C步骤中,认证服务器回应客户端的URI,包含以下参数:
access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
下面是一个例子。

     HTTP/1.1 302 Found
     Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
               &state=xyz&token_type=example&expires_in=3600

在上面的例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。
根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。

八、密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
密码模式
它的步骤如下:
(A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C)认证服务器确认无误后,向客户端提供访问令牌。
B步骤中,客户端发出的HTTP请求,包含以下参数:
grant_type:表示授权类型,此处的值固定为"password",必选项。
username:表示用户名,必选项。
password:表示用户的密码,必选项。
scope:表示权限范围,可选项。
下面是一个例子。

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=password&username=johndoe&password=A3ddj3w

C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

上面代码中,各个参数的含义参见《授权码模式》一节。
整个过程中,客户端不得保存用户的密码。

九、客户端模式

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
客户端模式
它的步骤如下:
(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B)认证服务器确认无误后,向客户端提供访问令牌。
A步骤中,客户端发出的HTTP请求,包含以下参数:
granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。
scope:表示权限范围,可选项。

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。
B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "example_parameter":"example_value"
     }

上面代码中,各个参数的含义参见《授权码模式》一节。

十、更新令牌

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求,包含以下参数:
granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
refresh_token:表示早前收到的更新令牌,必选项。
scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。
下面是一个例子。

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

(完)

对存在one to many关系的两个类,应该如何设计上传的API

有两个类Menu和MenuItem,他们是one to many的结构
image
image

我要如何设计上传的API才能在上传的时候创建出关系?比较坑的是Hibernate自动做one to many关系的时候foreign key是被隐藏起来的,这样最简单的上传MenuItem -> 得到后台generate的key -> 将key list嵌入到menu的json里面上传的方法是行不通的

VM里没有配置Docker

Install docker on Ubuntu vm separately.

curl https://raw.githubusercontent.com/hackjutsu/workstation-configurations/master/docker_install.sh -o docker_install.sh
chmod a+x ./docker_install.sh
./docker_install.sh

Running Information Analysis Service (TA版)

Running Information Analysis Service (TA版)

项目链接:https://github.com/hackjutsu/RunningInformationAnalysisServiceTA

下载代码

git clone https://github.com/hackjutsu/RunningInformationAnalysisServiceTA.git
cd RunningInformationAnalysisServiceTA

启动数据库

启动 MySQL Docker

docker-compose up -d

登录数据库

登录数据库console

mysql --host=127.0.0.1 --port=3306 --user=root --password=root 

查看已有数据库。

show databases;

如果不存在running_information_analysis_db,就新建一个

create database running_information_analysis_db;

退出数据库console

\q

启动 Spring Application

mvn clean install

启动server

java -jar ./target/running-information-analysis-service-1.0.0.BUILD-SNAPSHOT.jar

如何用mysql client 连接docker container里的mysql server

1.使用 docker-compse up 启动了mysql docker,显示

mysql_1 | 2017-04-12T19:53:45.844243Z 0 [Note] Beginning of list of non-natively partitioned tables
mysql_1 | 2017-04-12T19:53:45.950429Z 0 [Note] End of list of non-natively partitioned tables
mysql_1 | 2017-04-12T19:53:45.950944Z 0 [Note] mysqld: ready for connections.
mysql_1 | Version: '5.7.17'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
mysql_1 | 2017-04-12T19:54:18.382591Z 3 [Note] Access denied for user 'root'@'172.17.0.1' (using password: YES)
mysql_1 | 2017-04-12T19:54:19.278377Z 4 [Note] Access denied for user 'root'@'172.17.0.1' (using password: YES)

如下图
image
2.然后使用另一个终端,用mysql client 去访问docker里的mysql服务器
报错:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

如下图
image

How to launch mysql docker? (Linux & Mac)

docker-compose.yml

runningInformationDatabase:
  image: mysql
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=root

run

docker-compose up -d

login from command line

mysql --host=127.0.0.1 --port=3306 --user=root --password=root

learn something about MySQL

IMAGE ALT TEXT

不能用python执行spark job

我可以用spark-submit来执行spark job。但是用python直接执行就会报错ModuleNotFoundError: No module named 'py4j'.
这是log:

NIC@Yan-Mac  ~/Documents/504_BankEnd/DemoCode/week7_codelab1  python demo0.py demo1.txt
Traceback (most recent call last):
  File "demo0.py", line 2, in <module>
    from pyspark import SparkContext
  File "/usr/local/spark/python/pyspark/__init__.py", line 44, in <module>
    from pyspark.context import SparkContext
  File "/usr/local/spark/python/pyspark/context.py", line 29, in <module>
    from py4j.protocol import Py4JError
ModuleNotFoundError: No module named 'py4j'

这是我的环境变量。

export PATH="/usr/local/git/bin:/sw/bin/:/usr/local/bin:/usr/local/:/usr/local/sbin:/usr/local/mysql/bin:$PATH"
export SPARK_HOME=/usr/local/spark/
export PATH="$SPARK_HOME/bin:$PATH"
export PYTHONPATH="$SPARK_HOME/python:$PYTHONPATH"
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.1-src.zip:$PYTHONPATH

export PYSPARK_DRIVER_PYTHON=ipython
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

# added by Anaconda3 4.3.1 installer
export PATH="/Users/NIC/anaconda/bin:$PATH"

cannot resolve symbol "SpringApplication"

image
我的intellij不知道为什么不会自动import,我已经确定选了enable auto-complete 最开始的时候。POM里面跟老师写的也一样,而且没有报错。

'requested address is not valid in its context'

问题

在Windows上执行vagrant up后,提示错误

requested address is not valid in its context. - connect(2) for '0.0.0.0' port 8080

分析

这是host ip的问题。参考另外一个Issue hashicorp/vagrant#8395
image

解决

在VagrantFile里添加上host_ip: "127.0.0.1", 把默认的0.0.0.0改成127.0.0.1

  config.vm.network :forwarded_port, guest: 8080, host: 8080, host_ip: "127.0.0.1"

Error when java -jar XXX.jar of RunningInformationAnalysis(TA)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
....................
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
................
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

代码点没有动,执行了docker-compose up -d, mvn clean install 都没有问题,但是最后启动就报错了
有人遇到相同的问题么?

爬虫 用doc.select("li[data-asin]") 来得到这一页内result_id的数量,为什么每次不一样

老师,我在写爬虫作业 增加paging时遇到点疑问:

老师的代码里是用doc.select("li[data-asin]") 来得到id的数量,然后拼出每个product的detail link. 比如

//detail url
String detail_path = "#result_" + Integer.toString(i) + " > div > div > div > div.a-fixed-left-grid-col.a-col-left > div > div > a";

我也利用了这个方法,为了看的清楚,省略了解析每页产品的那部分代码,代码是

Elements results = doc.select("li[data-asin]");
System.out.println("this url page has num of results = " + results.size());

代码:
image
我发现,编译后代码,每次执行的时候,results.size() 就是这个页面里面的li[data-asin] 的数量每次执行不一样,有时候18,有时候20.。这是为什么呢? 这种变化,会导致这一页的产品取出来不对。
但是我到Amazon里用inspect看的话,都是18个产品,应该是 page1 0-17 page1 16-33, page2 32-49
但是现在results.size()每次不同,导致我得到的产品序号也不对了。所以爬出来的也不对

请帮忙看看是什么问题,


具体请看下截屏

我去Amazon看第2页时是看就18个
image

编译后,执行一次:

image

马上执行第二次

image

奇怪啊,page=2的时候,有时是是18,有时候是20,其他页也是。

Push mode下实现每隔一段时间push

我现在的问题是在push mode下,我用rabbitMQ的handleDelivery这个callback function来监听我的reduced price queue.但是问题是,这个function一直在执行,它一直在监听queue,我要做用ScheduledExecutorService到每隔一段时间来执行一下,没法先让它停止.
我查了也没找到当MQ为空时,停止consumer的方法。既然没法停止,我就想还是让consumer一直监听,但是每隔一段时间push一下从queue里得到的东西,但是ScheduledExecutorService 重写run()方法,这个方法是没有参数的,没办法把从queue里得到的东西传进去。
大家有什么好方法吗?谢谢!

Jsoup Crawler

I have a question about using jsop api to select the target element.
Here is the HTML.
image
I want to get the href attribute value in <a>tag, which is under the <div class=bxc-grid__image bxc-grid__image--light>.
I tried use

Elements elements = doc.select("div[class=bxc-grid__image   bxc-grid__image--light]");

to locate the div. It works. I followed the API E > F an F direct child of E . So the select css will be li[class=sub-categories__list__item]>a. Howerver, there is exception.

Anyone knows how to locate the <a>tag?

Thanks in advance!
Jsoup select API
URL OF ORGINAL PAGE

Here is the exception log:

Exception in thread "main" java.lang.IllegalArgumentException: String must not be empty
	at org.jsoup.helper.Validate.notEmpty(Validate.java:92)
	at org.jsoup.nodes.Attribute.setKey(Attribute.java:51)
	at org.jsoup.parser.ParseSettings.normalizeAttributes(ParseSettings.java:54)
	at org.jsoup.parser.HtmlTreeBuilder.insert(HtmlTreeBuilder.java:185)
	at org.jsoup.parser.HtmlTreeBuilderState$7.process(HtmlTreeBuilderState.java:553)
	at org.jsoup.parser.HtmlTreeBuilder.process(HtmlTreeBuilder.java:113)
	at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:50)
	at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:43)
	at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:56)
	at org.jsoup.parser.Parser.parseInput(Parser.java:32)
	at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:135)
	at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:747)
	at org.jsoup.helper.HttpConnection.get(HttpConnection.java:250)
	at test.main(test.java:26)

运行爬虫时,出现exception

以前运行的时候都没有错误,错误是出现在 AmazonCrawler.javaDocument doc = Jsoup.connect(url).headers(headers).userAgent(USER_AGENT).timeout(100000).get();
下面是exception log和我的代码

Exception in thread "main" java.lang.IllegalArgumentException: String must not be empty
	at org.jsoup.helper.Validate.notEmpty(Validate.java:92)
	at org.jsoup.nodes.Attribute.setKey(Attribute.java:51)
	at org.jsoup.parser.ParseSettings.normalizeAttributes(ParseSettings.java:54)
	at org.jsoup.parser.HtmlTreeBuilder.insert(HtmlTreeBuilder.java:185)
	at org.jsoup.parser.HtmlTreeBuilderState$7.process(HtmlTreeBuilderState.java:553)
	at org.jsoup.parser.HtmlTreeBuilder.process(HtmlTreeBuilder.java:113)
	at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:50)
	at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:43)
	at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:56)
	at org.jsoup.parser.Parser.parseInput(Parser.java:32)
	at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:136)
	at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:666)
	at org.jsoup.helper.HttpConnection.get(HttpConnection.java:225)
	at io.bittiger.crawler.AmazonCrawler.GetAdBasicInfoByQuery(AmazonCrawler.java:167)
	at io.bittiger.crawler.CrawlerMain.main(CrawlerMain.java:54)

一些关于REST API Response的问题

在实现“返回结果按照healthWarningLevel从高到低进行排列,每页显示两个数据”这个要求时,我在postman中输入了相应的GET请求,得到了返回数据,但是返回的response中的内容非常冗长,有一些内容是作业中不需要显示的,如图所示
1

我想请教大家的是

  1. 如何能不显示(忽略)”latitude”和“longitude”信息;
  2. 为什么在每页显示完两组数据后,我会有这样一堆内容呢?

2

自己也尝试加了一些@JsonIgnore@JsonProperty之类的annotation,但是对这些不是很熟悉,所以一直研究不出来,感谢大家能帮忙看看这些问题,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.