Python 股票研究

Python 股票研究

软件安装

Numpy
Matplotlib
Pandas
Pandas-datareader
BeautifulSoup4
scikit-learn / sklearn

安装pip

sudo yum install -y python-pip

升级pip

pip install --upgrade pip

Debian

apt-get install python-dev

Centos

yum install python-devel

matplotlib

python -m pip install matplotlib

Debian

apt-get install python-tk #标准Tk GUI工具包的接口

Centos

sudo yum install tkinter #标准Tk GUI工具包的接口

pandas

pip install pandas

pandas_datareader

pip  install pandas_datareader

nose

pip install nose

mock

pip install mock

BeautifulSoup4

pip install BeautifulSoup4

tushare

pip install tushare
pip install tushare --upgrade

lxml

pip install lxml

bokeh

pip install bokeh #图像在网页中显示

代码测试

#!/usr/bin/python
#coding:utf-8

import tushare as ts
df_his = ts.get_hist_data('600036') #招商银行 600036
print(df_his)

df_real = ts.get_realtime_quotes('600036')
print(df_real)

sh = ts.get_hist_data('sh')
print(sh)

sz = ts.get_hist_data('sz')
print(sz)

取到所有的股票代码

ts.get_today_all()

阴线

阳线

代码 – 数据图像存成网页

#!/usr/bin/python
#coding:utf-8

from __future__ import unicode_literals
from __future__ import print_function, division
from collections import OrderedDict

import pandas as pd
import tushare as ts
from bokeh.charts import Histogram, output_file, show

sh = ts.get_hist_data('sh')
sz = ts.get_hist_data('sz')
zxb = ts.get_hist_data('zxb')
cyb = ts.get_hist_data('cyb')

df = pd.concat([sh['close'], sz['close'], zxb['close'], cyb['close']],axis=1, keys=['sh', 'sz', 'zxb', 'cyb'])

fst_idx = -700
distributions = OrderedDict(sh=list(sh['close'][fst_idx:]), cyb=list(cyb['close'][fst_idx:]), sz=list(sz['close'][fst_idx:]), zxb=list(zxb['close'][fst_idx:]
))

df = pd.DataFrame(distributions)
col_mapping = {'sh': u'hz','zxb': u'zxb','cyb': u'zyb','sz': u'sz'}
df.rename(columns=col_mapping, inplace=True)

output_file("histograms.html")
hist = Histogram(df,bins=50,density=False,legend="top_right")
show(hist)

代码 – 获取某一只股票时间范围内的最高价与最低价

#!/usr/bin/python
#coding:utf-8

import datetime as dt
import tushare as ts
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web


start = dt.datetime(2015,1,1)
start_date = start.strftime('%Y-%m-%d')
end = dt.datetime(2016,12,31)
end_date = end.strftime('%Y-%m-%d')
df_his = ts.get_hist_data('600036',start_date,end_date) #招商银行 600036
df_his.to_csv('TSLA.csv')

df = pd.read_csv('TSLA.csv', parse_dates=True, index_col=0)
#df.plot()
#plt.show()

#df['Adj Close'].plot()
df[['high','low']].plot()
plt.show()

滚动窗口

import datetime as dt
import tushare as ts
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web


start = dt.datetime(2015,1,1)
start_date = start.strftime('%Y-%m-%d')
end = dt.datetime(2016,12,31)
end_date = end.strftime('%Y-%m-%d')
df_his = ts.get_hist_data('600036',start_date,end_date) #招商银行 600036
df_his.to_csv('TSLA.csv')

df = pd.read_csv('TSLA.csv', parse_dates=True, index_col=0)
#df.plot()
#plt.show()

df['100ma'] = df['close'].rolling(window=100, min_periods=0).mean()
print(df.head())

ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1, sharex=ax1)

ax1.plot(df.index, df['close'])
ax1.plot(df.index, df['100ma'])
ax2.bar(df.index, df['volume'])

plt.show()            

K线图 – candlestick graph

#!/usr/bin/python
#coding:utf-8

import datetime as dt
import tushare as ts
import matplotlib.pyplot as plt
from matplotlib import style
from matplotlib.finance import candlestick_ohlc
import matplotlib.dates as mdates

import pandas as pd
import pandas_datareader.data as web


start = dt.datetime(2015,1,1)
start_date = start.strftime('%Y-%m-%d')
end = dt.datetime(2016,12,31)
end_date = end.strftime('%Y-%m-%d')
df_his = ts.get_hist_data('600036',start_date,end_date) #招商银行 600036
df_his.to_csv('TSLA.csv')

df = pd.read_csv('TSLA.csv', parse_dates=True, index_col=0)
#df.plot()
#plt.show()

df_ohlc = df['close'].resample('10D').ohlc()
df_volume = df['volume'].resample('10D').sum()

df_ohlc.reset_index(inplace=True)
df_ohlc['date'] = df_ohlc['date'].map(mdates.date2num)

ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1, sharex=ax1)
ax1.xaxis_date()

candlestick_ohlc(ax1, df_ohlc.values, width=5, colorup='g')
ax2.fill_between(df_volume.index.map(mdates.date2num), df_volume.values, 0)
plt.show()

API解析

    rolling
    subplot2grid
    plot
    bar

HTML parsing library

python 获取股票幅度最大的

get_price_change_rate - 获取历史涨跌幅
get_price_change_rate(id_or_symbols, start_date='20130104', end_date='20140104')

stock analysis hadoop

https://github.com/HarshHarwani/Stock-Analysis-using-Map-Reduce-and-Hadoop

参考网址

https://pythonprogramming.net/getting-stock-prices-python-programming-for-finance/
https://github.com/waditu/tushare
Posted in 编程技术类 | Leave a comment

kafka集群安装文档

1. kafka下载与安装

su - root
wget http://www-us.apache.org/dist/kafka/0.10.1.0/kafka_2.11-0.10.1.0.tgz
tar zxvf kafka_2.11-0.10.1.0.tgz

sudo mv kafka_2.11-0.10.1.0 /usr/local/kafka
sudo chown -R root:root /usr/local/kafka

2.常用指令

#创建Topic
./bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --replication-factor 1 --partition 250 --topic wgame_log --create

#列出Topic
./bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --list

#删除wgame_log
./bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic wgame_log
    删除topics注意要将server.properties的delete.topic.enable=true选项启用并重启kafka

3.单机配置

Zookeeper配置

cp zookeeper.properties zookeeper.properties_bak
vim zookeeper.properties
dataDir=/var/zookeeper

Zookeeper启动

./bin/zookeeper-server-start.sh config/zookeeper.properties > /var/zookeeper.log &

Zookeeper停止

./zookeeper-server-stop.sh

Kafka配置

cp server.properties server.properties_bak
vim server.properties

broker.id=1

host.name=10.235.102.111
advertised.host.name=10.235.102.111
num.partitions=256

Kafka启动

cd /usr/local/kafka
./bin/kafka-server-start.sh -daemon  config/server.properties

Kafka停止

./bin/kafka-server-stop.sh

4.集群中一台机器的配置

4.1 Kafka配置

cd kafka_2.11-0.10.1.0/config
cp server.properties server1.properties

vim server1.properties

修改 broker.id=1
修改 num.partitions=256
修改 zookeeper.connect=10.235.102.111:2181,10.235.102.112:2181,10.235.102.113:2181,10.235.102.114:2181,10.235.102.115:2181
修改 port=9092
修改 host.name=10.235.102.111
修改 advertised.host.name=10.235.102.111

4.2 Zookeeper配置

cp zookeeper.properties zookeeper.properties_bak
修改 vim zookeeper.properties

粘贴

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# the directory where the snapshot is stored.
dataDir=/var/zookeeper
# the port at which the clients will connect
clientPort=2181
# clientPortAddress=10.235.102.111
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
tickTime=2000
initLimit=5
syncLimit=2
server.1=10.235.102.111:2888:3888
server.2=10.235.102.112:2888:3888
server.3=10.235.102.113:2888:3888
server.4=10.235.102.114:2888:3888
server.5=10.235.102.115:2888:3888

配置Zookeeper的唯一ID

mkdir -p /var/zookeeper
echo 1 > /var/zookeeper/myid  # 与echo "1" > /var/zookeeper/myid 是一样的

4.3 启动

4.3.1 Zookeeper启动

./bin/zookeeper-server-start.sh config/zookeeper.properties > /var/zookeeper.log &

4.3.2 Kafka启动

./bin/kafka-server-start.sh -daemon  config/server1.properties

4.3.3 测试指令

#创建topic

./bin/kafka-topics.sh --zookeeper 10.235.102.111:2181,10.235.102.112:2181,10.235.102.113:2181,10.235.102.114:2181,10.235.102.115:2181 --replication-factor 1 --partition 250 --topic wgame_log --create

#生产者
./bin/kafka-console-producer.sh --topic wgame_log --broker-list 10.235.102.111:9092,10.235.102.112:9092,10.235.102.113:9092,10.235.102.114:9092,10.235.102.115:9092

#消费者
./bin/kafka-console-consumer.sh --from-beginning --topic wgame_log --zookeeper 10.235.102.111:2181,10.235.102.112:2181,10.235.102.113:2181,10.235.102.114:2181,10.235.102.115:2181

#获取topics上的描述
./bin/kafka-topics.sh --describe --zookeeper 10.235.102.111:2181,10.235.102.112:2181,10.235.102.113:2181,10.235.102.114:2181,10.235.102.115:2181

#XGAME测试数据
6|0|40001000024|1496298517933099568|7|5|6|9017|||||1496298518||||0|0|0|0|0|0|0|0|1496298518|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1496298548|{"stage_id":100101}|C2S_ExecuteStage||||0|0|1496298518350134918

5. 报错及其处理

5.1 错误一

WARN Cannot open channel to 1 at election address /10.235.102.111:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
   at java.net.PlainSocketImpl.socketConnect(Native Method)
   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
   at java.net.Socket.connect(Socket.java:589)
   at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
   at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
   at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
    at java.lang.Thread.run(Thread.java:748)

警告

集群必须3个Zookeeper以上都启动了,Zookeeper的cli才能连接上

5.2 错误二

FATAL Fatal error during KafkaServerStartable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)
kafka.common.InconsistentBrokerIdException: Configured broker.id 1 doesn't match stored broker.id 0 in meta.properties. If you moved your data, make sure your
configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).
       at kafka.server.KafkaServer.getBrokerId(KafkaServer.scala:687)
       at kafka.server.KafkaServer.startup(KafkaServer.scala:213)
       at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:39)
       at kafka.Kafka$.main(Kafka.scala:67)
       at kafka.Kafka.main(Kafka.scala)
[2017-05-09 15:12:32,435] INFO shutting down (kafka.server.KafkaServer)

解决方法

错误的原因是log.dirs目录下的meta.properties中配置的broker.id和配置目录下的server.properties中的broker.id不一致了,解决问题的方法是将两者修改一致后再重启。
find / -name "meta.properties"
如:/tmp/kafka-logs

注意点

根据Paxos算法指引,当Leader挂掉时,为了选举出一个Leader,需要至少3个以上结点存活,才可以形成多数派,
从而可以选举出新的Leader。也就是说一个最小集群配置为4结点。

标准Zookeeper集群为5个,允许2台Zookeeper挂掉
最差的集群为3个,一台挂掉后整个集群都不能访问
Posted in 编程技术类 | Leave a comment

hbase集群安装文档

1. 一台机器上的配置文档

1.1 参考 hadoop集群文档完成hadoop的安装

hbase依赖于hadoop

1.2 hbase安装

cd /usr/local
wget https://archive.apache.org/dist/hbase/hbase-0.98.8/hbase-0.98.8-hadoop2-bin.tar.gz
sudo tar xzf hbase-0.98.8-hadoop2-bin.tar.gz
sudo mv hbase-0.98.8-hadoop2 hbase
sudo chown -R hduser:hadoop hbase

1.3 修改 hbase-env.sh 文件

cd /usr/local/hbase/conf

修改 vim hbase-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_131
export HBASE_MANAGES_ZK=true

1.4 修改 hbase-site.xml 文件

cd /usr/local/hbase/conf
修改 vim hbase-site.xml

<configuration>
    //Here you have to set the path where you want HBase to store its files.
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://master:9000/hbase</value>
        <description>The directory shared by region servers. Should be fully-qualified to include the filesystem to use. E.g: hdfs://NAMENODE_SERVER:PORT/HBASE_ROOTDIR</description>
    </property>
    <property>
        <name>hbase.master</name>
        <value>hdfs://master:60000</value>
        <description>The host and port that the HBase master runs at.</description>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
        <description>The mode the cluster will be in. Possible values are
        false: standalone and pseudo-distributed setups with managed Zookeeper
        true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)</description>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>10.235.102.111,10.235.102.112</value>   
    </property>
    <property>
        <name>zookeeper.session.timeout</name>
        <value>60000</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/zookeeper</value>
    </property>
</configuration>

1.5 修改 regionservers 文件

cd /usr/local/hbase/conf
vim regionservers

node1
node2

1.6 拷贝hbase目录到其他结点机器上

cd /usr/local/
scp -r hbase root@node1:/usr/local/
scp -r hbase root@node2:/usr/local/

1.7 启动

进入master所在机器在的终端

cd /usr/local/hbase/bin
./start-hbase.sh 

./hbase-daemon.sh start thrift2

1.8 关闭

进入master所在机器在的终端

cd /usr/local/hbase/bin

./hbase-daemon.sh stop thrift2
./stop-hbase.sh

thrift安装

wget https://archive.apache.org/dist/thrift/0.10.0/thrift-0.10.0.tar.gz
./configure
make
make install

常用命令

list
status
get 'wgame_log','1_0_16957632951834388726'
scan 'wgame_log',{'LIMIT' => 5}
describe 'wgame_log'


put '<table name>','row1','<colfamily:colname>','<value>'

put 'wgame_log','1_0_16950877128543906240','info','1|0|0|1495866945149514995|7|5|1|9017|||||1495866945||||0|0|0|0|0|0|0|0|1495866945|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1495867542|{"sid":1,"token":"eyJvc2RrX2dhbWVfaWQiOiIxOTYzNzcyMTUiLCJ1c2VyX2lkIjoib29sbGwiLCJhY2NvdW50X3N5c3RlbV9pZCI6IjEiLCJ0aW1lIjoxNDk1ODY2OTQ0LCJvc2RrX3VzZXJfaWQiOiJvb2xsbCIsImV4dGVuZCI6IjF8OTR8MjAxMyIsImNoYW5uZWxfaWQiOiIwIiwic2lnbiI6IjE4YzY2ZDlhYjk0OGQxOTBmYjkzMjc1NDliYTdkODhmIn0=","channel_id":"1","device_id":"develop","ip":"10.235.102.139:1462","gate_ip":3446074122,"port":9017}|GS2SS_Login||||0|0|1495866945165645375'


hbase(main):001:0> scan 'wgame_log',{'LIMIT' => 5}
ROW                  COLUMN+CELL                                               
 1_0_169508797417185 column=info:, timestamp=1495864305423, value=1|0|0|1495864
 21765               331649491672|7|5|1|9017|||||1495864331||||0|0|0|0|0|0|0|0|
                     1495864331|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1495864838|{"na
                     me":"208198","type":1,"gate_ip":3446074122,"port":9017}|GS
                     2SS_Create||||0|0|1495864331991029850  

错误解决

1、libboost_unit_test_framework.a: No such file or directory

    ln -s /usr/local/lib/libboost_unit_test_framework.a /usr/lib64/libboost_unit_test_framework.a

2、npm install

注意点

9000是hadoop系统master的NameNode监听端口
60000是hbase系统master的监听端口

测试

1、hbase shell 在 regionserver 中创建一个表,添加数据,在masterserver中查看是否存在
    测试结果在regionserver中创建的表,在masterserver上可以看到

    在regionserver中
        create 'wgame_log', 'info'

    在masterserver中
        list

参考网址

http://jayatiatblogs.blogspot.com/2013/01/hbase-installation-fully-distributed.html

疑问

1、

hbase普遍会开出两个进程

8819 ?        S      0:00 bash /usr/local/hbase/bin/hbase-daemon.sh --config /usr/local/hbase/bin/../conf internal_start regionserver
8833 ?        Sl     0:08 /usr/java/jdk1.8.0_131//bin/java -Dproc_regionserver -XX:OnOutOfMemoryError=kill -9 %p -Xmx1000m -XX:+UseConcMarkSweepGC -Dhbase.

网络连接的建立都是8833这个进程 
这样设计的意义 8833与8819如何通信的?

2、master server与region server监听的端口不一样

tcp6       0      0 10.235.102.111:60000    :::*                    LISTEN      25172/java          
tcp6       0      0 :::60010                :::*                    LISTEN      25172/java  

tcp6       0      0 10.235.102.112:60020    :::*                    LISTEN      8833/java           
tcp6       0      0 :::60030                :::*                    LISTEN      8833/java

错误

错误一

ERROR: Can't get master address from ZooKeeper; znode data == null

配置中加入
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/zookeeper</value>
</property>

权限配置
mkdir /zookeeper
chown -R hduser: /zookeeper

错误二

2017-05-27 15:06:52,854 INFO  [master:master:60000] catalog.CatalogTracker: Failed verification of hbase:meta,,1 at address=node1,60020,1495868490048, exception=org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,,1 is not online on node1,60020,1495868804997
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:2776)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegion(HRegionServer.java:4333)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionInfo(HRegionServer.java:3676)
    at org.apache.hadoop.hbase.protobuf.generated.AdminProtos$AdminService$2.callBlockingMethod(AdminProtos.java:20158)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2027)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:108)
    at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:110)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:90)
    at java.lang.Thread.run(Thread.java:748)

解决方法

./bin/zkCli.sh -server 10.235.102.111:2181
rmr /hbase

错误三

ipc.RpcClient: Retrying connect to server: node1/10.235.102.112:60020 after sleeping 100ms. Already tried 1 time(s)

解决方法

删除日志,重新启动

思考

regionserver上只保存一个region,它也可以与三个datanode交互,更何况,一台regionserver可以保存多个region
hbase的region的概念


Region 概念
Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:
Table       (HBase table)
    Region       (Regions for the table)
     Store          (Store per ColumnFamily for each Region for the table)
          MemStore        (MemStore for each Store for each Region for the table)
          StoreFile       (StoreFiles for each Store for each Region for the table)
                Block     (Blocks within a StoreFile within a Store for each Region for the table)


HBase中Table的不同区块(region)由不同的Regionserver来负责

思考

Hadoop与Hbase的diff

Hadoop基本上是两件事,一个FS(Hadoop分布式文件系统)和一个计算框架(MapReduce)
HDFS允许您将大量数据存储在分布式(提供更快的读/写访问)和冗余(提供更好的可用性)方式。
而MapReduce允许您以分布式和并行方式处理这个巨大的数据。但是MapReduce并不仅限于HDFS。
作为FS,HDFS缺乏随机的读/写能力。它有利于顺序数据访问。
而这正是HBase的出现。它是一个运行在您的Hadoop集群顶部的NoSQL数据库,为您的数据提供随机的实时读/写访问。

您可以将结构化和非结构化数据存储在Hadoop和HBase中。它们都为您提供了访问数据的多种机制,如shell和其他API。
而且,HBase以数据形式将数据作为键/值对存储,而HDFS将数据存储为平面文件。这两个系统的一些突出特点是:

Hadoop:
    优化大型文件的流式访问。
    遵循一读写许多意识形态。
    不支持随机读/写。

HBase:
    以柱状方式存储键/值对(列作为列系列共同组合)。
    提供对大数据集中的少量数据的低延迟访问。
    提供灵活的数据模型。
Hadoop最适合离线批量处理的东西,而HBase在您具有实时需求时被使用。
Posted in 编程技术类 | Leave a comment

Flume安装文档

下载与安装

wget http://archive.apache.org/dist/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz
tar -zxf apache-flume-1.7.0-bin.tar.gz
sudo mv apache-flume-1.7.0-bin /usr/local/flume
sudo chown -R hduser:hadoop /usr/local/flume

vim ~/.bashrc

export FLUME_HOME=/usr/local/flume
export PATH=$PATH:$FLUME_HOME/bin

source ~/.bashrc

cd /usr/local/flume/conf
cp flume-env.sh.template flume-env.sh
cp flume-conf.properties.template flume-conf.properties

vim flume-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_131
export JAVA_OPTS="-Xms100m -Xmx200m -Dcom.sun.management.jmxremote"

配置

cp flume-timestamp-interceptor-1.2.0.jar /usr/local/flume/lib

几个测试flume的小例子

连接telnet的flume配置

# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'

agent.sources = r1
agent.channels = c1
agent.sinks = s1

# For each one of the sources, the type is defined
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 8888

# The channel can be defined as follows.
agent.sources.r1.channels = c1
#Specify the channel the sink should use
agent.sinks.s1.channel = c1

# Each sink's type must be defined
agent.sinks.s1.type = file_roll
agent.sinks.s1.sink.directory = /tmp/log/flume

# Each channel's type is defined.
agent.channels.c1.type = memory

# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.c1.capacity = 100

查看方式

1.建立输出目录

mkdir -p /tmp/log/flume

2.启动服务

bin/flume-ng agent --conf conf -f conf/flume-conf.properties -n agent&
运行日志位于logs目录,或者启动时添加-Dflume.root.logger=INFO,console 选项前台启动,输出打印日志,查看具体运行日志,服务异常时查原因。

3.发送数据

telnet localhost 8888
输入
hello world!
hello Flume!

4.查看数据文件 查看 /tmp/log/flume 目录文件:

cat /tmp/log/flume/1447671188760-2
hello world!
hello Flume!

连接Kafka的flume配置

# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'

agent.sources = r1
agent.channels = c1
agent.sinks = s1

agent.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.r1.zookeeperConnect = 10.235.102.111:2181
agent.sources.r1.topic = wgame_log
agent.sources.r1.groupId = flume
agent.sources.r1.interceptors = i1
agent.sources.r1.interceptors.i1.type = timestamp
agent.sources.r1.kafka.consumer.timeout.ms = 100

# The channel can be defined as follows.
agent.sources.r1.channels = c1
#Specify the channel the sink should use
agent.sinks.s1.channel = c1


# Each sink's type must be defined
agent.sinks.s1.type = file_roll
agent.sinks.s1.sink.directory = /tmp/log/flume


# Each channel's type is defined.
agent.channels.c1.type = memory

# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.c1.capacity = 100

正式配置

# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'

agent.sources = r1
agent.channels = c1
agent.sinks = s1

agent.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.r1.zookeeperConnect = 10.235.102.111:2181
agent.sources.r1.topic = wgame_log
agent.sources.r1.groupId = flume
agent.sources.r1.kafka.consumer.timeout.ms = 100
agent.sources.r1.interceptors = timestamp
agent.sources.r1.interceptors.timestamp.type = org.apache.flume.interceptor.EventTimestampInterceptor$Builder
agent.sources.r1.interceptors.timestamp.preserveExisting = false        
agent.sources.r1.interceptors.timestamp.delimiter = |
agent.sources.r1.interceptors.timestamp.dateIndex = 12
agent.sources.r1.interceptors.timestamp.dateFormat = tsecond

# The channel can be defined as follows.
agent.sources.r1.channels = c1
#Specify the channel the sink should use
agent.sinks.s1.channel = c1

agent.channels.c1.type = memory
agent.channels.c1.capacity = 10000
agent.channels.c1.transactionCapacity = 1000

agent.sinks.s1.type = hdfs
agent.sinks.s1.hdfs.fileType = DataStream
agent.sinks.s1.hdfs.path = /user/hive/warehouse/wgame.db/log/tt=%Y%m%d

启动

#独占式
bin/flume-ng agent --conf conf/ -f conf/flume-conf.properties -n agent

#后台启动
nohup bin/flume-ng agent -n agent -c conf -f conf/flume-conf.properties &

关闭

bin/flume-ng agent stop

注意点1

bin/flume-ng agent --conf conf/ -f conf/flume-conf.properties -n agent中-n agent必须是与flume-conf.properties中的名字一致

注意点2

flume-timestamp-interceptor-1.2.0.jar的编译

Source kafka-source has been removed due to an error during configuration org.apache.flume.FlumeException: Interceptor.Builder not found. at org.apache.flume.channel.ChannelProcessor.configureInterceptors(ChannelProcessor.java:114)

Builder class not found. Exception follows.java.lang.ClassNotFoundException: org.apache.flume.interceptor.EventTimestampInterceptor$Builder

安装EventTimestampInterceptor
先安装maven


flume-timestamp-interceptor 安装
https://github.com/haebin/flume-timestamp-interceptor

git clone https://github.com/haebin/flume-timestamp-interceptor.git

Download zipped source.
Unzip and go into the flume-timestamp-interceptor-master directory.
$ mvn package
Go into target directory and copy flume-timestamp-interceptor-1.2.0.jar into FLUME_HOME/lib.


agent.sources.tail-source.interceptors = timestamp
agent.sources.tail-source.interceptors.timestamp.type = org.apache.flume.interceptor.EventTimestampInterceptor$Builder
agent.sources.tail-source.interceptors.timestamp.preserveExisting = false
agent.sources.tail-source.interceptors.timestamp.delimiter = |
agent.sources.tail-source.interceptors.timestamp.dateIndex = 0
agent.sources.tail-source.interceptors.timestamp.dateFormat = yyyy-MM-dd HH:mm:ss

#

Flume hbase
Flume mysql
Posted in 编程技术类 | Leave a comment

docker

hbase hadoop ./start-container.sh latest 2 进入到容器内部 docker exec -it master.krejcmat.com bash zookeeper分布式部署 cd /examples/zookeeper/five-server-docker docker-compose up 终端模式 docker-compose up -d 后台模式 cd /examples/zookeeper/five-server-docker docker-compose run –rm zkcli -server zookeeper1 docker-compose yml 指定port ports: – “4000:4000” docker退出shell Ctrl-D

Posted in 编程技术类 | Leave a comment

帧同步方案分享

帧同步方案分享 分享概要 帧同步方案介绍 相关重难点方案介绍 和传统C/S方案的对比 一、帧同步方案介绍 帧同步即LockStep,顾名思义,锁定每一步,RTS类型的大作,如War系列、星际争霸系列、帝国时代系列无一例外的采用了这种技术, 对RTS游戏来说,游戏中可能经常有成百数千个单位在同时活动,同时服务器还要同时跑多局游戏,如果用传统C/S同步方式同步每个单位的属性状态的话,网络流量和AI逻辑的CPU消耗都是非常的大的,而如果用只同步输入的方式,逻辑在客户端执行,会大大的减少服务器的资源消耗, 在联网的客户端(可能有主机)之间的一种步进和同步机制,目的是为了让所有客户端只需要同步操作,就能运行出同样的结果 举个例子,可把lockstep系统比喻成录放机,两台录放机要保证磁头以同样的角速度转动,并且要有相同的输入磁带源,电路特性要是一致的,才能播放出相同的声音 这个例子引出了帧同步的关键点:同步性与确定性 同步性:各客户端每秒帧数一致,在每一帧都处理同样的输入数据 确定性:系统在相同地输入下,要有相同的输出 网络层,网络模型的选择、缓存快播、断线重连等等 逻辑架构层,按一定的帧率执行,并保证在每一帧相同的输入下产生相同的输出,以确保同步性和确定性 网络层 P2P帧同步模式 客户端之间建立直接的UDP连接,每个客户端收到所有其他客户端的第N帧输入数据时,才执行第N帧。当长时间未收到某个客户端的输入时会先等待同步,未果该客户端会掉线 Host-Peer帧同步模式1 Host一定要等到所有客户端第N帧消息到达,才会向所有Peer同步第N帧。当长时间未收到某个客户端的输入时会先等待同步,未果该客户端会掉线 Host-Peer帧同步模式2 所有客户端直接向Host发玩家的当前输入数据,Host按固定的时间间隔发每一帧的所有玩家输入数据发给所有客户端,客户端收到时再执行这一帧 网络模型 Host-Peer模型2更适用一些,在一个客户端卡住时,不会影响到其他客户端继续游戏 缓冲与快播 因为客户端输入完全是通过网络获取,缓冲与快播解决网络延迟、网络波动等带来客户端帧数不平滑的问题 断线重连 客户端断线后重连,Host需要补发该客户端丢失的帧消息,有几种断线重连类型,后面会具体讨论相关方案 逻辑架构层 前面提到关键点:同步性和确定性的保证,如何保证? 同步性:所有客户端应该有一个可以统一达到固定执行帧率,而且只有在收到服务器的某帧输入才会执行这一帧 确定性:保证每帧执行的确定性,在相同的输入下有相同的输出 为了满足上述两个需求,首先需要对核心层和表现层进行分离 保持同步性时,需要等待网络的输入,如果网络卡住,核心逻辑可以等待,表现逻辑需要继续执行,这样不会导致呈现给用户的表现中断或不连贯(声音、动画、界面、操作等) 硬件本身会导致不确定性,因为PC机组装的特性,导致硬件的种类繁多,很难保证不同硬件运算结果的一致性,比如浮点计算,物理运算,GPU运算等等,核心层可以更少的接触硬件 分离后,核心层可以以较低的帧率跑,如8~16帧,运算所有必要的核心逻辑,如武器、技能、移动、AI、触发器等,低帧率可以降低CPU消耗 表现层可以以较高的帧率跑,运算当前视口可见单位的动作动画表现、移动表现、特效、声音、物理、UI等等 所以这里不同于传统MMOG的逻辑和渲染分离,但可以想象成传统MMOR的服务器(核心)和 客户端(表现) 越简化的逻辑越容易保证确定性,这也是把系统一分为二的主要原因,核心和表现分离后,核心层更加纯逻辑化,只用保证核心层的确定性即可 核心层要保证所有运算的确定性,这个是核心层的重要特性 核心层可以根据机器的性能和网络平均延迟,限定到8~16帧(星际、帝国参考值) 核心层通过消息队列发送事件到表现层,表现层根据配置处理这些事件,改变自身状态 核心层靠网络消息驱动,没有网络消息时会暂停运行 核心层逻辑比较干净,比较容易实现跨平台,当然如果从确定性角度来看跨平台,还是有很多工作要做 核心层要实现一些核心逻辑对象,如单位、武器、技能、行为、物品、视野、移动器、触发器等相关部分 FPU硬件,一些FPU像X87,默认内部精度是80bit,和内存中的类型精度不一样,不同的FPU精度也可能不同。精度和舍入方式不同,会带来运算结果的不一致,可以通过设定来降低FPU精度和内存一致,并采用最近舍入的方式。

_controlfp(_PC_24,_MCW_PC)

_controlfp(_RC_NEAR,_MCW_RC)

系统数学库 不同编译器版本的数学库可能会带来不同的运算结果 编译器及编译选项 一些编译选项可能会带来不同的运算结果,如浮点模式等,是否使用IEEE754标准浮点数 随机数:不同客户端环境的伪随机序列没同步前会不同 使用本地信息:如系统时针、内存地址、主玩家ID等 未初始化的变量:随机值,导致不同客户端表现不一致 多线程、多核计算:时序会出现不一致 算法:如排序、寻路、数学函数等 硬件/系统的输入:windows消息、外设输入等 第三方库:这些代码里如果使用了上面提到的功能点,也可能会出现问题 表现层不需要严谨的确定性,只需要能较为准确地处理核心层的事件即可 表现层不能直接修改核心层的数据,否则会影响到核心层的确定性 表现层可以高帧速跑,根据具体机器和设置来 用户操作放在表现层,因为单局所有客户端的核心层都需要保证一致的输入,并且所有操作都是从表现对象着手的,比如场景的模型点选、UI控件输入、场景地点点击等等 操作分为网络或本地,一些纯表现的操作,如摄像机移动、打开UI面板等就是在表现层本地处理的,而一些有逻辑的操作,如使用技能、使用物品等就是要通网络发给核心层处理 表现层要实现所有和表现相关的对象,如角色、特效、声音、物品、UI等,这些对象靠核心层的事件驱动而创建、播放、销毁,并调用相应的底层引擎处理 动画播放不会因为核心层在等待下一帧的同步而被卡住

相关重难点方案介绍 自动化测试 通过自动化测试,来查可能的同步问题,每夜测试会通过长时间、多案例覆盖,并利用多机环境进行测试 同步日志 核心层执行过程可以打印非常详细的日志到内存里,如果是完全同步的两个客户端,日志应该是完全一样的,如果有不同步问题可通过此日志的差异行进行定位 录像 可以在自动化测试时同时保存录像,如果测试失败可以通过回放来定位问题 客户端自验证 各客户端在每一逻辑帧计算关键数据的校验和(如单位血量、法力值、位置等),通过比较各个客户端在某一帧的校验和是否一致,来判断是否有客户端使用外挂,这种方法不能检查单局少于3个人的情况 服务器验证 核心层放在服务器做验证,在线抽查或 离线检查,通过实时或通过播放单局录像,计算和判断每帧的校验和是否和各客户端一致 客户端分布式验证 可以利用空闲的客户端离线验证历史游戏是否有人作弊,可以根据CPU负载仅核心层高倍数或低倍速回放进行验证 修改挂 前面提到三种验证方式可以有效的检测修改挂,只要动到关键数据,帧校验和肯定会不一样,除非只是在本地修改,这样结果没有任何意义 感知挂 帧同步客户端本地都有所有数据,这一块是传统帧同步方案较难处理的问题,如果游戏对感知挂特别敏感,需要权衡利弊,考虑好对这个方案和传统 C/S方案之间的选项,或在这个方案之上的针对特定游戏的改进方案 操作挂 模拟玩家操作,这个帧同步下和MMORPG一样,只能通过行为特征去防,而一般模拟操作用来刷PVE环境会更容易 私服/免服 如果官方平台社区运营的好,平台乐趣是单机无法复制的,所以从这个意义上来讲,免服本地意义不大,而私服可以通过法律途径打击

要保证录像回放和录制时一致性,需要回放时的EXE、DLL、脚本 、数据等核心层用到的文件的版本和录像时是一致的,所以录像要按版本保存,并同时保存相关文件版本 录像回放时,可以选择回放倍速,倍速在核心层就是每秒钟执行更多的逻辑帧,如一倍每秒16帧,两倍速就是32帧,表现层要加快动画的播放速度,按回放倍率调整动画的播放速度,按实际能达到的帧率正常执行即可,和核心层帧率无关 录像系统除了给玩家之间分享游戏过程外,还可以用于报错系统,对于外网一些难重现问题可以有录像辅助回放 因为录像保存了相应版本的可执行文件,要考虑可行性文件对资源的兼容问题,这样回放时,不会因为有新版本的资源无法解读而出现播放错误,有两个方法解决: 1,可执行文件对未来版本资源的向后兼容 2,资源的加载可经过虚拟文件系统重定向,播放录像时只加载相应版本的资源 帧同步架构的断线重连需要客户端从第一帧开始运行到当前帧,需要一定的处理时间,有这样一些方法加快速度 用高速快播的方式,让核心层快速快进到当前帧,因为核心层平时就跑16帧每秒,还不是全速,假如能跑到16倍速,加载时间就是游戏当前时间的1/16,比如进行了16分钟就是1分钟 为加载核心层快进速度,可以将密集计算的函数记录执行信息放在本地文件缓存,比如寻路,在重连快播的时候直接从记录中取函数结果,不需要执行这些耗时函数 表现层在核心层倍速快播的时候,可以将自己要处理的表现命令进行缓存并整理,在最后核心层快播结束时,再处理整理后的表现命令,减少表现层占用的CPU,使用核心层能以更快的速度运行,对诸如创建A,销毁A,可以进行裁剪,减少执行负载, 和传统C/S方案的对比 与传统架构比较  传统C/S模式

传统C/S模式 以服务器的状态为准,客户端对某些需要即时表现的内容预先处理,同时发给服务器,如果服务器验证有较大偏差再纠正客户端。客户端和服务器之间传递的多是状态数据,客户端之间无法保证在某一时刻或某一帧是一致的,因为每个客户端都可能随时发起本地的预处理 帧同步模式 各个客户端按照严格的帧的概念来同步执行,客户端之间只需要同步操作,单局游戏的各个客户端在每个逻辑帧运算结束时,各个客户端能达到一致的运算结果 以动态阻挡为例 C/S模式实现 因为角色在移动时,客户端会先移动,每个客户端的位置都会有差异,处理动态阻档的逻辑会比较复杂,特别是在移动的时候,如果以服务器为准,则可能会出现客户端表现没碰撞,而出现不能走的情况,如果以客户端碰撞为准,每个客户端的位置又不一样,会得到不一致的结果 帧同步模式实现 简化很多,动态和静态没什么区别,因为都是按帧来同步计算的,就像是做单机游戏,可以站到一个格子上立刻产生阻档,每个客户端都是一致的表现 帧同步方案就像做单机游戏一样,不存在客户端之间的异步问题,无论是动态阻挡,即时碰撞机关等都很容易做到, 手感精确度源于一致性,如果其他条件满足,同样的距离这次可攻击,下次不可攻击,手感不具备精确度,竞技因此会缺乏严谨性 C/S模式实现 因为客户端和客户端之间表现不同步,客户端服务器之间的表现不同步,带来很多本地差异,会影响到操作的判断,从而影响手感精确度,比如各个客户端角色位置不致,导致技能释放手感精确度问题 帧同步模式实现 如果网络环境正常,每帧角色的位置都是准确的,手感具有一定的精确度 C/S模式实现 因为来回交互的不定延迟带来的表现做的不好或不好做等问题。比如非指向型技能,在PVP时,不管是服务器算碰撞还是客户端算碰撞,都可能会有问题,不能在每个客户端表现得很精确 帧同步模式实现 可以把游戏当成单机游戏来做,效果实现更直接,对诸如非指向型技能很容易计算碰撞,并且各个客户端表现完全一致的 C/S模式实现 存储录像的内容会很多,比如输入、网络包、update的tick等等 帧同步模式实现 只用存输入数据,文件尺寸小很多,利于传到服务器保存和玩家间分享 这两种模式都要保存相应版本的可执行文件

减少了服务器的CPU消耗,因为逻辑在客户端本地运行 适合RTS类大量单位状态需要同步的场合 开发方式和做单机游戏一样,减少服务器、客户端同时开发、联调、出现问题时的定位等带来的开发成本 单机游戏的开发模式,调测效率高,一些技术实现也会变得更加容易 帧同步相对传统c/S方式,本地会有一定的延迟,因为帧同步是要以网络输入为准,而不是本地输入,所以不适合对手速要求太高的游戏,当然如果只针对网络环境非常好的除外 帧同步的安全性方面比传统C/S方式 弱,但比纯P2P的要强,通过帧校验和的机制可以有效防止修改挂 帧同步方案不能有效的防止感知挂,如果考虑感知挂的话,可以将核心层放到服务器运行,也兼具帧同步模式的一些开发上的优点,当然网络流量和服务器CPU消耗要大一些

Posted in 编程技术类 | Leave a comment

小昆山学车 科目三

进入车中问好,
拉开车门,出去,关上车门,车门有两节
逆时钟绕车一周,回到车内,
调节座位,
看左右后视镜,
关掉所有灯光,危险提示灯,向下确认转向灯已关,
拉上安全带,
转到空档,发动汽车,(空档发动)
有灯光则做灯光
如果没灯光,打左转向灯,一定要在一档前打左转向灯,
踩离合,踩刹车,挂一档,看左后视镜,松手刹,
向左15课钟,加油,挂两档,
当听到前方左转的指示时:
打左转向灯,如果同向有多条车道的,看左后视镜,左转向灯,滴三下后,换线,不要减速
注意红绿灯
绿灯时,,换二档,前进至车头与左万30公分时
向左打一圈,注意避让直行车,如果是多个同向车道的,加油后,打右转向灯,看右后视镜,滴三下后,换线,(注意光华路的前段有实线)
换线成功后关闭右转向灯
当听到前方调头的指示时:
打左转向灯,注意这是在哪种车道,如果是在思贤路这种东西方向的路时,要注意停止牌,
如果是大路,同方向有多条道的,看左后视镜,左转向灯,滴三秒后,换线,减慢,换一档,绿灯时,人肩过人行横道30公分时,向左打到底,
转到快车道,加油,换二档,打右转向灯,看右后视镜,滴三秒后,换线,
单方向一车道调头,第一时间打左向灯,如果有停止牌,在停止牌前刹车,挂一档,各路段不一样,看右后视镜,向右一圈,后打左转向灯,
向左打到底,看左边情况,
当听到前方右转的指示时:
打右转向灯,如果不是在车道右边,则换道,要重新开启右转向灯,
右转弯,打右转向灯,轻踩刹车,换档到二档,到的是慢车道,不需要看红绿灯,
当听到靠边停车的指示时
打右转向灯,踩刹车,踩离合,右车头一与线重合,调平行,踩刹车,离合到底,挂一档,拉手刹,熄火,按危险警示灯
下图为崇南公路与昆港公路的交汇处,有停止牌与掉头牌,是人到人行横道2/3处
思贤路虽然没有停止牌,但有红绿灯,
区间东路没有停止牌,没有红绿灯
光华路没有调头标志与停止杆,有红绿灯,双黄线调头
注意左转不要压实线
镇中心路有一个很隐迷的停止牌
有停止牌,双车道,到左边过人行横道调头,调头到慢车道
有停止牌
中德路文翔路口
看了一下发现有停止线的都需要停
思贤路小厂西侧调头
佘天昆公路与昆港公路的交叉
Posted in 生活 | Leave a comment

小昆山学车-科目二

科目二
系安全带,调座椅到最前,车窗正中,将左右后视镜往前往上推,把可以看到左右门把手是平行的
进入倒车区域,打左转向灯
进入倒车区域右侧,到肩膀与停止线(黄色虚线)平行时,停止,前进时车头左轴对准地面箭头的根部的中心
挂倒档,到肩部与右侧杆平行时,向右打到底,
看左边的后视镜,
快平行时,看到前面角时回半圈,看到后面角时回一圈,
当人的肩膀与第二格与第三格,(一般情况下第二格为黄色,第三格为黑色,)时,刹车
挂前进档
当车头与前面实线时,盖住时,要快,感觉不要等完全盖住,完全盖住可以压实线,向左打到底,之前是45度回圈,现在是与平行差30度,60度左右向右回半圈,平行时向右回一圈,前时至肩膀与虚线平行时,刹车,
挂倒档,至肩膀与杆过一点,(看过去杆的左侧)时,向左打到底,看右后视镜,出现前角时,打半圈,出现后角时,打一圈,(有可能是先出现后角,这样的话先向右回半圈,迅速向右回一圈,),
当人的肩膀与第二格与第三格,(一般情况下第二格为黄色,第三格为黑色,)时,刹车
挂前进档
当车头与前面实线时,盖住时,要快,感觉不要等完全盖住,向右打到底,平行时回正,
出虚线后
可能需要向左打方向进入侧方停车的区域
车的左轴沿着箭头至肩膀与杆平行处
刹车
看右边后视镜有几块,算出左后视应该关注的点是哪个
挂倒档,往右打到死(当中可以不松刹车)
一般是这个黄格子出现,即距离实际角1/4处,向左打一圈半,(一圈半的计算一般是重新到自己点后的相反方向),这个时候实际上车身是正的,
趴出去看后车轮(通过后视镜),一旦轮子触到线向左打死,趴出去看车身时线的平行时,
刹车,打左转向灯,挂前进档,注意不要在空档有停留,
前进,至车头中心到实线时,向右打一圈半,过个一二秒向右打一圈,平行后向左打一圈回正,
向左转弯进入上坡的阶段
我一般走的是中间的路线
左边的车头轴对前面线白实线的中心,缓慢前进,注意到前方有一个停车的标志,
到人与停车标志前的一个水泥线前一个方向盘的距离时,与人肩膀平行,停车,
黄格子的水泥处
相当于必须要停到这钉子下
一定要慢抬离合把车身震动(这个地方很容易熄火),松右脚的刹车,前进至坡项,
下坡离合器踩到底,轻踩刹车,很右转半圈,注意观察前视镜
很右转,回正,进入曲线驾驶路线,
将左车头车轴对准前方一水泥的曲线灯处,至左角的刚盖住灯,向左打一圈,注意观察左右前视镜,哪边宽往哪边,
这个时候一般情况是你的方向盘是向左打了一圈多加了一刻钟,注意前面车身已开阔,或者,左右两边前视镜的轮距离差不多时,回这个一刻钟,当右车头轴与前方的点相差一个方向盘时,
向右打两圈,注意观察左边的后视镜,别压线了,这时,实际上你的车是向右打了一圈,注意观查左边的别压线,近就向右打,左边距没变,右边情况不明时,别动,至右边慢慢开阔,慢慢向右打,
当发现左边的的点已经完全出来时,向左打一圈回正,
进入窄路调头的,
车头一被水泥线盖住,往左打到底,45度时向右回半圈,平行时向右回一圈,至车头被前方线盖住,向左打死,探出身去,看前左轮,一开始看不来,当前车轮与前黄实线差一个方向盘时,刹车,
这个时候可以左手拿方向盘,方便探出身,刹车的情况下,踩离合,挂倒档,向右打到底,松离合,松刹车,看左后视镜,后车轮与黄实线一个方向盘的距离,小于,必须要近,感觉这个时候后车轮是正的,
刹车,踩离合,挂1档,向左打到底,到车回正时,回一圈半,
进入直角拐弯,
左边车轴对准如图区域
第四个灯,
将人的肩膀与左边的水泥平行时,左边台阶前进一点点,
向左打到底,至平行时向回一圈半,回正,前进,左拐一圈,调整车头左轴对准黄线与后虚线之间的地方,对准后回正,
当车身与停车取卡处平行时,刹车,拉手刹,
探左身取卡,至栏杆开启,
松手刹,找启前视灯,左边按钮点两下,进入汇车区域,左右多看看,向右一圈多一刻钟至车洞行驶,车身回正后(向左打一圈),
前进至车头快盖住出口的一个水泥线时,摸黑关掉前视灯,按右边
前进,快进入紧急刹车,轻踩离合,轻踩刹车,听到一声前方时,快速踩离合与刹车,按下危险报警灯,
松开刹车,开始行驶,关掉危险报警灯
向右驶离考试区域
调坐位,
系安全带,
调左右反光镜,
松手刹,
开车,
进入考试区域,
打左转向灯,
对准前面箭头根部,左凸起,踩离合,轻点刹车,至左肩膀与虚线对齐,刹车,想一会,
倒车,当右窗口点与右标杆对齐时,向右打到底,看左边后视镜,抬一抬眼镜,想一想向哪回的问题
当左边蓝白前口出来时,回左半圈,后口出来时,向左回一圈,看左右是否对齐,后退至第二块与第三块的相交处,刹车,换前进档,
前进至车头与前黄线刚盖住,向左打到底,60度时回半圈,平行时回一圈,速度慢下来,前进至肩膀,窗口中间与虚线对齐,刹车,想一想,
挂倒档,当肩膀、左窗口,与标杆过一点时,向左打到底,看右后视镜,出来前面一块,向右回半圈,出来后面一块,向右回一圈,看左右平行,速度慢,
退至左肩膀与第二块与第三块相交处,刹车,换一档,前进至前与黄线刚盖住,向右打到底,平行后回一圈半,
开到倒车入库处,
减慢,踩离合,轻踩刹车,左经对准前箭头的根部,慢,前进至右肩膀与杆平行,刹车,挂倒档,看一眼右边的后视镜,估算出3/4处,向右打到底,看左边后视镜,
当3/4处出现时,向左回一圈半,即回正,探出去看后车轮,一压线,向左打到底,看平行,刹车,打左转向灯,挂前进档,一旦中心车头与前实线压到,向向打一圈半,然后快打一圈,
平行时回一圈 ,进入坡道起步,
想一想先松离合,再松刹车的事情,
对准前白线的中心,左车,前进吧,看左边,当到水泥块时,刹车,抬离合,松刹车,前进至最高点后,轻踩刹车,离合踩到底,向右一圈,回正,即前面,半离合,前进至前面,
一圈加一刻钟,对准回正,减速,轻踩刹车,至左点重合时,向左打一圈,左右前视镜,右邹差一方向盘时,向右打两圈,看左右,不要轻易回,右边开朗时,向右,出来时,
向左回一圈,减慢,慢右边开,至前水泥前,向左打到底,左车头对准前面一块水泥,与前面线盖住时,向左打到底,探身看前车轮,离一个方向盘时,刹车,换倒档,向右打到底,
看左后视镜,当车轮与后线相离一个方向盘时,感觉差不多垂直时,刹车,换前进档,向左打到底,平行时,向右回一圈半回正,前进至前时,向左一圈,沿着箭头,减速,左车头对准第四个点后,看左边,
水泥与肩膀平行时,向左打到底,平行时回正,不要串到别的区去,
前进,向左打圈,左车走对准黄线与白线中间的地方时,向右回正,减速,至标杆处,刹车,拉手刹,挂空档,按左边的按钮,点左前灯,两下,松手刹,挂一档,前进,至洞口,慢速无所谓,前进至快标杆处,左手放到位置,向右按两下,关掉前灯,前时,听到时,刹车与踩离合,按下危险报警灯,抬刹车,轻抬离合,启动后,关掉危险报警灯,
Posted in 生活 | Leave a comment

窝瓜游戏工作室

Posted in 生活 | Leave a comment