目录

Kerberos术语
KDC:密钥分发中心,负责存储用户信息,管理发放票据
Realm:Kerberos所管理的一个领域或范围,称之为一个Realm
Principal:Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号,格式为:primary/instance@realm
Keytab:Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件
安装Kerberos相关服务
选择集群中的一台主机作为Kerberos服务端,安装KDC。其他主机都需要部署Kerberos客户端
# 服务端主机执行以下安装命令
yum install -y krb5-server
# 客户端主机执行以下安装命令
yum install -y krb5-workstation krb5-libs

修改配置文件
服务端主机:修改/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}

客户端主机(所有主机):修改/etc/krb5.conf

初始化KDC数据库
在服务端主机执行以下命令,并根据提示输入密码
kdb5_util create -s

修改管理员权限配置文件
在服务端主机修改/var/kerberos/krb5kdc/kadm5.acl
*/admin@EXAMPLE.COM *

启动Kerberos相关服务
在主节点启动KDC,并配置开机自启
systemctl start krb5kdc
systemctl enable krb5kdc

在主节点启动Kadmin,该服务为KDC数据库访问入口
systemctl start kadmin
systemctl enable kadmin

创建Kerberos管理员用户
在KDC所在主机执行,并按提示输入密码
kadmin.local -q "addprinc admin/admin"

登录数据库
本地登录(无需认证)
kadmin.local

远程登录(需要进行主体认证)
kadmin

退出数据库
q

创建Kerberos主体
登录数据库并执行,按提示输入密码
addprinc test

也可以通过shell命令直接创建主体
kadmin.local -q"addprinc test"

修改主体密码
cpw test

查看所有主体
list_principals

密码认证
使用kinit进行主体认证,并按提示输入密码
kinit test

查看认证凭证
klist

密钥文件认证
生成主体test的keytab文件到指定目录/root/test/test.keytab
# -norandkey的作用是声明不随机生成密码,若不加该参数,会导致之前的密码失效
kadmin.local -q "xst -norandkey -k /root/test.keytab test@EXAMPLE.COM"
使用keytab进行认证
kinit -kt /root/test.keytab test


销毁凭证
kdestroy

执行创建主体的语句,需要登录Kerberos数据客户端,登录之前需要先使用Kerberos的管理员用户进行认证,执行如下代码并按提示输入密码
kinit admin/admin
登录数据库客户端
kadmin
执行创建主体的语句
# addprinc创建主体
# -randkey:密码随机,因hadoop各服务均通过keytab文件认证,故密码可随机生成
# test/test:新增的主体
addprinc -randkey test/test
# 将主体的密钥写入keytab文件
# -k 指明keytab文件路径和文件名
# test/test:主体
xst -norandkey -k /etc/security/keytab/test.keytab test/test

上述认证、登录、执行三步骤创建主体,可以在shell用如下快捷创建
# -p 主体
# -w 密码
# -q 执行语句
kadmin -padmin/admin -wadmin -q"addprinc -randkey test/test"
kadmin -padmin/admin -wadmin -q"xst -norandkey -k /etc/security/keytab/test.keytab test/test"

为Hadoop开启Kerberos,需为不同服务准备不同的用户,启动服务时需要使用相应的用户。须在所有节点创建以下用户和用户组
| User:Group | Daemons |
|---|---|
| hdfs:hadoop | NameNode, Secondary NameNode, JournalNode, DataNode |
| yarn:hadoop | ResourceManager, NodeManager |
| mapred:hadoop | MapReduce JobHistory Server |
创建hadoop组
集群中都要创建
groupadd hadoop
创建各个用户并设置密码
集群中都要创建
useradd hdfs -g hadoop
echo hdfs | passwd --stdin hdfs
useradd yarn -g hadoop
echo yarn | passwd --stdin yarn
useradd mapred -g hadoop
echo mapred | passwd --stdin mapred
主体格式为serviceName/hostName@REALM如:datanode/bigdata100@EXAMPLE.COM
环境:3台节点,主机分别为bigdata100、bigdata102、bigdata104
| 服务 | 所在主机 | 主体 |
|---|---|---|
| NameNode | bigdata100 | nn/bigdata100 |
| DataNode | bigdata100、bigdata102、bigdata104 | dn/bigdata100、dn/bigdata102、dn/bigdata104 |
| Secondary NameNode | bigdata104 | sn/bigdata104 |
| ResourceManager | bigdata102 | rm/bigdata102 |
| NodeManager | bigdata100、bigdata102、bigdata104 | nm/bigdata100、nm/bigdata102、nm/bigdata104 |
| JobHistory Server | bigdata100 | jhs/bigdata100 |
| Web UI | bigdata100、bigdata102、bigdata104 | HTTP/bigdata100、HTTP/bigdata102、HTTP/bigdata104 |
创建keytab存放位置
为服务创建的主体,需要通过密钥文件keytab文件进行认证,故需要准备一个安全的路径来存放keytab文件,在所有集群中创建keytab文件目录
mkdir /etc/security/keytab/
chown -R root:hadoop /etc/security/keytab/
chmod 770 /etc/security/keytab/

创建主体
NameNode:bigdata100执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey nn/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nn.service.keytab nn/bigdata100"
DataNode:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata104"
Secondary NameNode:bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey sn/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/sn.service.keytab sn/bigdata104"
ResourceManager:bigdata102执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey rm/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/rm.service.keytab rm/bigdata102"
NodeManager:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata104"
JobHistory Server:bigdata100执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey jhs/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/bigdata100"
Web UI:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata104"
修改所有集群中keytab文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/
chmod 660 /etc/security/keytab/*
各文件新增如下内容,并且分发到集群中
core-site.xml
<!-- Kerberos主体到系统用户的映射机制 -->
<property>
<name>hadoop.security.auth_to_local.mechanism</name>
<value>MIT</value>
</property>
<!-- Kerberos主体到系统用户的具体映射规则 -->
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/
RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/
RULE:[2:$1/$2@$0](jhs\/.*@EXAMPLE\.COM)s/.*/mapred/
DEFAULT
</value>
</property>
<!-- 启用Hadoop集群Kerberos安全认证 -->
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<!-- 启用Hadoop集群授权管理 -->
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<!-- Hadoop集群间RPC通讯设为仅认证模式 -->
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
hdfs-site.xml
<!-- 访问DataNode数据块时需通过Kerberos认证 -->
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<!-- NameNode服务的Kerberos主体,_HOST会自动解析为服务所在的主机名 -->
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>nn/_HOST@EXAMPLE.COM</value>
</property>
<!-- NameNode服务的Kerberos密钥文件路径 -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/security/keytab/nn.service.keytab</value>
</property>
<!-- Secondary NameNode服务的Kerberos主体 -->
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/security/keytab/sn.service.keytab</value>
</property>
<!-- Secondary NameNode服务的Kerberos密钥文件路径 -->
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>sn/_HOST@EXAMPLE.COM</value>
</property>
<!-- NameNode Web服务的Kerberos主体 -->
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<!-- WebHDFS REST服务的Kerberos主体 -->
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<!-- Secondary NameNode Web UI服务的Kerberos主体 -->
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<!-- Hadoop Web UI的Kerberos密钥文件路径 -->
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/spnego.service.keytab</value>
</property>
<!-- DataNode服务的Kerberos主体 -->
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>dn/_HOST@EXAMPLE.COM</value>
</property>
<!-- DataNode服务的Kerberos密钥文件路径 -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/security/keytab/dn.service.keytab</value>
</property>
<!-- 配置NameNode Web UI 使用HTTPS协议 -->
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<!-- 配置DataNode数据传输保护策略为仅认证模式 -->
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
yarn-site.xml
<!-- Resource Manager 服务的Kerberos主体 -->
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/_HOST@EXAMPLE.COM</value>
</property>
<!-- Resource Manager 服务的Kerberos密钥文件 -->
<property>
<name>yarn.resourcemanager.keytab</name>
<value>/etc/security/keytab/rm.service.keytab</value>
</property>
<!-- Node Manager 服务的Kerberos主体 -->
<property>
<name>yarn.nodemanager.principal</name>
<value>nm/_HOST@EXAMPLE.COM</value>
</property>
<!-- Node Manager 服务的Kerberos密钥文件 -->
<property>
<name>yarn.nodemanager.keytab</name>
<value>/etc/security/keytab/nm.service.keytab</value>
</property>
mapred-site.xml
<!-- 历史服务器的Kerberos主体 -->
<property>
<name>mapreduce.jobhistory.keytab</name>
<value>/etc/security/keytab/jhs.service.keytab</value>
</property>
<!-- 历史服务器的Kerberos密钥文件 -->
<property>
<name>mapreduce.jobhistory.principal</name>
<value>jhs/_HOST@EXAMPLE.COM</value>
</property>
生成密钥对
Keytool是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书
-keystore:指定密钥库的名称及位置(产生的各类信息将存在.keystore文件中)
-genkey(或者-genkeypair):生成密钥对
-alias:为生成的密钥对指定别名,如果没有默认是mykey
-keyalg:指定密钥的算法RSA/DSA 默认是DSA
生成keystore的密码及相应信息的密钥库
keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA

修改keystore文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/keystore
chmod 660 /etc/security/keytab/keystore
密钥库的密码至少6个字符,可以是纯数字或者字母或者数字和字母的组合等等
确保hdfs用户(HDFS的启动用户)具有对所生成keystore文件的读权限
将该证书分发到集群中的每台节点相同路径
xsync /etc/security/keytab/keystore
修改hadoop配置文件ssl-server.xml
该文件位于$HADOOP_HOME/etc/hadoop下
mv $HADOOP_HOME/etc/hadoop/ssl-server.xml.example $HADOOP_HOME/etc/hadoop/ssl-server.xml
<!-- SSL密钥库路径 -->
<property>
<name>ssl.server.keystore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL密钥库密码 -->
<property>
<name>ssl.server.keystore.password</name>
<value>123456</value>
</property>
<!-- SSL可信任密钥库路径 -->
<property>
<name>ssl.server.truststore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL密钥库中密钥的密码 -->
<property>
<name>ssl.server.keystore.keypassword</name>
<value>123456</value>
</property>
<!-- SSL可信任密钥库密码 -->
<property>
<name>ssl.server.truststore.password</name>
<value>123456</value>
</property>
分发ssl-server.xml

xsync $HADOOP_HOME/etc/hadoop/ssl-server.xml
修改所有节点的container-executor所有者和权限,要求其所有者为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为6050。其默认路径为$HADOOP_HOME/bin,所有集群中都要执行
chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor
修改所有节点的container-executor.cfg文件的所有者和权限,要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为400。其默认路径为$HADOOP_HOME/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc
chown root:hadoop /opt/module/hadoop-3.1.3
chown root:hadoop /opt/module
chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
修改container-executor.cfg和yarn-site.xml
文件位于$HADOOP_HOME/etc/hadoop下
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred
min.user.id=1000
allowed.system.users=
feature.tc.enabled=false

<!-- 配置Node Manager使用LinuxContainerExecutor管理Container -->
<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<!-- 配置Node Manager的启动用户的所属组 -->
<property>
<name>yarn.nodemanager.linux-container-executor.group</name>
<value>hadoop</value>
</property>
<!-- LinuxContainerExecutor脚本路径 -->
<property>
<name>yarn.nodemanager.linux-container-executor.path</name>
<value>/opt/module/hadoop-3.1.3/bin/container-executor</value>
</property>
分发container-executor.cfg和yarn-site.xml文件
xsync container-executor.cfg
xsync yarn-site.xml
修改特定本地路径权限
| Location | Args | User:Group | rwx |
|---|---|---|---|
| lcocal | $HADOOP_LOG_DIR | hdfs:hadoop | drwxrwxr-x |
| lcocal | dfs.namenode.name.dir | hdfs:hadoop | drwx------ |
| lcocal | dfs.namenode.data.dir | hdfs:hadoop | drwx------ |
| lcocal | dfs.namenode.checkpoint.dir | hdfs:hadoop | drwx------ |
| lcocal | yarn.nodemanager.local-dirs | yarn:hadoop | drwxrwxr-x |
| lcocal | yarn.nodemanager.log-dirs | yarn:hadoop | drwxrwxr-x |
$HADOOP_LOG_DIR所有节点:bigdata100、bigdata102、bigdata104
该变量位于hadoop-env.sh文件,默认值为 ${HADOOP_HOME}/logs
chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
chmod 775 /opt/module/hadoop-3.1.3/logs/
dfs.namenode.name.dir(NameNode节点):bigdata100
该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/name
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/name/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/name/
dfs.datanode.data.dir(DataNode节点):bigdata100、bigdata102、bigdata104
该参数为于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/data
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/
dfs.namenode.checkpoint.dir(SecondaryNameNode节点):bigdata104
该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/namesecondary
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
yarn.nodemanager.local-dirs(NodeManager节点):bigdata100、bigdata102、bigdata104
该参数位于yarn-site.xml文件,默认值为file://${hadoop.tmp.dir}/nm-local-dir
chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/
yarn.nodemanager.log-dirs(NodeManager节点):bigdata100、bigdata102、bigdata104
该参数位于yarn-site.xml文件,默认值为$HADOOP_LOG_DIR/userlogs
chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/
启动不同服务时需要使用对应的用户
单点启动
启动NameNode:bigdata100
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start namenode
启动DataNode,所有集群都要执行bigdata100、bigdata102、bigdata104
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start datanode
启动SecondaryNameNode,bigdata104
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start secondarynamenode
群起
在主节点bigdata100配置hdfs用户到所有节点的免密登录
# 切换到hdfs用户
su hdfs
# 生成公钥私钥
ssh-keygen -t rsa
# 拷贝到集群上
ssh-copy-id bigdata100
ssh-copy-id bigdata102
ssh-copy-id bigdata104

修改主节点bigdata100节点的$HADOOP_HOME/sbin/start-dfs.sh脚本,在顶部增加以下环境变量
HDFS_DATANODE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs

$HADOOP_HOME/sbin/stop-dfs.sh也需在顶部增加上述环境变量才可使用
HDFS_DATANODE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs



单点启动
启动Resource Manager:bigdata103
sudo -i -u yarn yarn --daemon start resourcemanager
启动Node Manager:bigdata100、bigdata102、bigdata104
sudo -i -u yarn yarn --daemon start nodemanager
群起
在Yarn主节点(bigdata102)配置yarn用户到所有节点的免密登录
# 切换到hdfs用户
su hdfs
# 生成公钥私钥
ssh-keygen -t rsa
# 拷贝到集群上
ssh-copy-id bigdata100
ssh-copy-id bigdata102
ssh-copy-id bigdata104
修改主节点(bigdata102)的$HADOOP_HOME/sbin/start-yarn.sh,在顶部增加以下环境变量
YARN_RESOURCEMANAGER_USER=yarn
YARN_NODEMANAGER_USER=yarn

stop-yarn.sh也需在顶部增加上述环境变量才可使用

sbin/start-yarn.sh

启动历史服务器:bigdata100
sudo -i -u mapred mapred --daemon start historyserver
后续开发中更新…
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称