首页 文章 精选 留言 我的

精选列表

搜索[手动],共10002篇文章
优秀的个人博客,低调大师

手动安装Docker 17.06

以前我们已经讨论过如何使用yum 之类的包管理工具安装Docker(可在本博客搜索)。 然而有时,我们的机器无法联网,此时就需离线安装了。 本文详细探讨如何在Cent0S 7.1中离线安装Docker 17.06。为啥不是离线安装Docker 17.09呢?那是因为写这篇文章的时候,17.09尚未发布,而现在笔者又没有动力再写一篇。当然,本文也适用于17.09版本。 前往:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 下载Docker 17.06的包。本文使用的是docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm 。 执行如下命令安装Docker 17.06: rpm -ivh docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm 发现无法成功执行该命令,报如下异常: 警告:docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY 错误:依赖检测失败: container-selinux >= 2.9 被 docker-ce-17.06.2.ce-1.el7.centos.x86_64 需要 既然提示缺container-selinux ,于是我们得先安装container-selinux 。 前往:http://mirror.centos.org/centos/7/extras/x86_64/Packages/ ,下载container-selinux ,本文使用的是container-selinux-2.21-1.el7.noarch.rpm 。 执行如下命令,安装container-selinux rpm -ivh container-selinux-2.21-1.el7.noarch.rpm 再次执行如下命令,即可安装Docker 17.06了。 rpm -ivh docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm 参考文档: http://www.cnblogs.com/aguncn/p/6863710.html https://stackoverflow.com/questions/45272827/docker-ce-on-rhel-requires-container-selinux-2-9

优秀的个人博客,低调大师

手动安装hadoop集群

官网手册: http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html 主机信息 主机名 ip hadoop1 10.0.70.242 hadoop2 10.0.70.243 hadoop3 10.0.70.230 hadoop4 10.0.70.231 一.设置主机名映射 # vim /etc/hosts 127.0.0.1localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.70.242 hadoop1 10.0.70.243 hadoop2 10.0.70.230 hadoop3 10.0.70.231 hadoop4 并拷贝到其他3台机器。 二.配置免密码登录 # cd /root/.ssh/ # ssh-keygen -t rsa # cat id_rsa.pub >> authorized_keys 将其他3台机器的id_rsa.pub内容追加到authorized_keys文件中,并拷贝给其他3台机器。 #ssh hadoop1(hadoop2、hadoop3、hadoop4)进行验证。 三.安装jdk # tar zxvf jdk-8u51-linux-x64.tar.gz -C/app/zpy/ 配置环境变量 # vim /etc/profile JAVA_HOME=/app/zpy/jdk1.8.0_51 JAVA_BIN=/app/zpy/jdk1.8.0_51/bin PATH=$PATH:$JAVA_BIN export JAVA_HOME JAVA_BIN PATH # ./etc/profile # java –version进行验证 其他3台机器相同操作。 四.安装hadoop # cd /app/zpy/3rd # wgethttp://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz # tar zxvf hadoop-2.7.3.tar.gz -C /app/zpy/ 配置环境变量 # vim /etc/profile HADOOP_HOME=/app/zpy/hadoop-2.7.3 HADOOP_BIN=/app/zpy/hadoop-2.7.3/bin PATH=$PATH:$JAVA_BIN:$HADOOP_HOME:$HADOOP_BIN export JAVA_HOME JAVA_BIN PATH HADOOP_HOMEHADOOP_BIN # ./etc/profile 修改主要配置文件 # cd /app/zpy/hadoop-2.7.3/etc/hadoop # vim hadoop-env.sh 添加 export JAVA_HOME=/app/zpy/jdk1.8.0_51 export HADOOP_HOME_WARN_SUPPRESS=1 # vim yarn-env.sh 更改 JAVA_HOME=/app/zpy/jdk1.8.0_51 # vim core-site.xml 内容如下 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131702</value> </property> </configuration> # vim hdfs-site.xml 内容如下 <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/data/hdfs/name/</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/data/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop1:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration> # cp mapred-site.xml.templatemapred-site.xml # vim mapred-site.xml 内容如下 <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> # vim yarn-site.xml 内容如下 <configuration> <!-- Site specific YARN configurationproperties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>hadoop1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop1:8088</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>3000</value> </property> </configuration> # vim slaves 内容如下 hadoop1 hadoop2 hadoop3 hadoop4 创建必须的文件夹 # mkdir -p /data/tmp/ #mkdir /data/hdfs # mkdir /data/hdfs/data # mkdir /data/hdfs/name 五.将配置好的文件拷贝到其他主机 # scp –r hadoop-2.7.3 hadoop2:/app/zpy # scp –r hadoop-2.7.3 hadoop3:/app/zpy # scp –r hadoop-2.7.3 hadoop4:/app/zpy # scp /etc/profile hadoop2:/etc # scp /etc/profile hadoop3:/etc # scp /etc/profile hadoop4:/etc 刷新另外3台服务器的环境变量。 六.启动 首先格式化namenode节点,注意在master节点上! # cd /app/zpy/hadoop-2.7.3/bin/ # hadoop namenode –format 然后启动集群 # start-dfs.sh # start-yarn.sh 在master节点上运行 # jps 看到如下结果: 4083 Jps 30084 DataNode 30261 SecondaryNameNode 30550 NodeManager 29945 NameNode 30430 ResourceManager 切换到slave节点,运行 # jps 看到如下结果: 18561 NodeManager 4362 Jps 18443 DataNode 浏览器中打开http://10.0.70.242:50070/dfshealth.html#tab-overview可看见相应信息 七.运行测试用例 切换到hadoop根目录 执行如下命令解除hadoop安全模式: # ./bin/hadoop dfsadmin -safemode leave 再执行: # ./bin/hadoop jarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 1 1 显示如下结果: Number of Maps = 1 Samples per Map = 1 Wrote input for Map #0 Starting Job ...... Job Finished in 15.972 seconds Estimated value of Pi is 4.00000000000000000000 证明成功,至此完成! 本文转自 周新宇1991 51CTO博客,原文链接:http://blog.51cto.com/zhouxinyu1991/1870183,如需转载请自行联系原作者

优秀的个人博客,低调大师

手动创建活动

1.创建layout 2.新建layout文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 添加按钮 --> <Button android:id="@+id/button_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 1" /> </LinearLayout> 3.设置布局 package activitytest.example.com.activitytest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); // 设置默认布局 } } 4.注册活动,设置主活动 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="activitytest.example.com.activitytest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 注册活动 --> <activity android:name=".FirstActivity" android:label="This is FirstActivity"> <!-- 设为主活动 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 5.运行 6.增加按钮事件和toast提醒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); // 设置默认布局 Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(FirstActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show(); } }); } 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7459904.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

如何手动解析CrashLog

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 解决崩溃问题是移动应用开发者最日常的工作之一。如果是开发过程中遇到的崩溃,可以根据重现步骤调试,但线上版本就无能为力了。好在目前已经有很多不错的第三方CrashLog搜集平台(如友盟、Crashlytics等)为我们做好了解析工作,甚至在Xcode7里苹果也跟进了解析线上版本崩溃日志的功能,为开发者减轻了不少负担。尽管通常已经不需要我们手工处理CrashLog,了解CrashLog的还原原理和方法还是有必要的。 一、.dSYM .dSYM(debugging SYMbols)又称为调试符号表,是苹果为了方便调试和定位问题而使用的一种调试方案,本质上使用的是起源于贝尔实验室的DWARF(Debugging With Attributed Record Formats),其在.xcarchive目录中的层次结构为: .xcarchive --dSYMs |--Your.app.dSYM |--Contents |--Resources |--DWARF 关于DWARF的具体内容以后有机会再说。我们能解析CrashLog全靠.dSYM文件,解析方式见后文。 二、确定符号表和崩溃日志的一致性 有了符号表文件,有了崩溃日志文件,在解析之前一定要确保二者的对应关系,否则就算按照下述步骤解析出内容也肯定是不准确的。二者的对应关系可以通过UUID来确定。 1、从崩溃日志中获取UUID 崩溃日志比较靠下的位置有个Binary Images模块,其***行内容如下: BinaryImages: 0xa2000-0x541fffYourarmv7/var/mobile/Containers/Bundle/Application/645D3184-4C20-4161-924B-BDE170FA64CC/Your.app/Your 从中可以看到关于你应用的若干信息: 代码段的起终地址为:0xa2000 – 0x541fff 运行你应用的CPU指令集为:armv7 应用的UUID为:a5c8d3cfda65396689e4370bf3a0ac64(不区分大小写) 2、从符号表中获取UUID 执行以下命令从符号表中提取UUID: dwarfdump--uuidYour.app.dSYM 或者: dwarfdump--uuidYour.app.dSYM/Contents/Resources/DWARF/Your 执行结果为: UUID:A5C8D3CF-DA65-3966-89E4-370BF3A0AC64(armv7)Your.app.dSYM/Contents/Resources/DWARF/Your 由此得到armv7指令集的UUID为:A5C8D3CF-DA65-3966-89E4-370BF3A0AC64(如果你的二进制文件支持多个指令集,这里会列出每个指令集对应符号表的UUID),通过和崩溃日志中的对比发现二者一致,才可进行进一步的解析操作。 三、计算崩溃符号表地址 以下面的崩溃堆栈为例: Thread0: 0libobjc.A.dylib0x33f10f600x33efe000+77664 1Foundation0x273526ac0x2734a000+34476 2Foundation0x27355c3e0x2734a000+48190 3UIKit0x29ef9d1c0x29bbc000+3398940 4UIKit0x29ef9c9a0x29bbc000+3398810 5UIKit0x29ef954c0x29bbc000+3396940 6UIKit0x29c3a16a0x29bbc000+516458 7UIKit0x29e4b8e60x29bbc000+2685158 8UIKit0x29c3a1280x29bbc000+516392 9Your0x000f08460xa2000+321606 10UIKit0x29e90fb20x29bbc000+2969522 11UIKit0x29e910760x29bbc000+2969718 12UIKit0x29e867cc0x29bbc000+2926540 13UIKit0x29c9e8ea0x29bbc000+927978 14UIKit0x29bc8a6a0x29bbc000+51818 15QuartzCore0x295f0a080x295e4000+51720 16QuartzCore0x295ec3e00x295e4000+33760 17QuartzCore0x295ec2680x295e4000+33384 18QuartzCore0x295ebc4c0x295e4000+31820 19QuartzCore0x295eba500x295e4000+31312 20QuartzCore0x295e59280x295e4000+6440 21CoreFoundation0x266d0d920x26604000+839058 22CoreFoundation0x266ce44e0x26604000+828494 23CoreFoundation0x266ce8560x26604000+829526 24CoreFoundation0x2661c3bc0x26604000+99260 25CoreFoundation0x2661c1ce0x26604000+98766 26GraphicsServices0x2da1a0a40x2da11000+37028 27UIKit0x29c2a7ac0x29bbc000+452524 28Your0x0024643a0xa2000+1721402 29libdyld.dylib0x34484aac0x34483000+6828 1、 符号表堆栈地址计算方式 要想利用符号表解析出崩溃对应位置,需要计算出符号表中对应的崩溃堆栈地址。而从上述堆栈中第9行可以看到,应用崩溃发生在运行时地址0x000f0846,该进程的运行时起始地址是0xa2000,崩溃处距离进程起始地址的偏移量为十进制的321606(对应十六进制为0x4E846)。三者对应关系: 0x000f0846=0xa2000+0x4E846 对应的公式为: 运行时堆栈地址 = 运行时起始地址 + 偏移量 崩溃堆栈中的起始地址和崩溃地址均为运行时地址,根据虚拟内存偏移量不变原理,只要提供了符号表TEXT段的起始地址,再加上偏移量(这里为0x4E846)就能得到符号表中的堆栈地址,即: 符号表堆栈地址 = 符号表起始地址 + 偏移量 2、获取符号表中的TEXT段起始地址 符号表中TEXT段的起始地址可以通过以下命令获得: $otool-lYour.app.dSYM/Contents/Resources/DWARF/Your 运行结果中的片段如下: Loadcommand3 cmdLC_SEGMENT cmdsize736 segname__TEXT vmaddr0x00004000 vmsize0x00700000 fileoff0 filesize0 maxprot0x00000005 initprot0x00000005 nsects10 flags0x0 其中的vmaddr 0x00004000字段即为TEXT段的起始地址。 3、计算符号表地址 由公式: 符号表堆栈地址 = 符号表起始地址 + 偏移量 可得: 0x52846=0x4E846+0x4000 即符号表中的崩溃地址为0x52846,接下来就可以根据这个地址解析出崩溃位置了。 四、崩溃信息还原 有了符号表的崩溃地址,有以下几种方式解析崩溃信息: 1、dwarfdump 命令如下: $dwarfdump--archarmv7Your.app.dSYM--lookup0x52846|grep'Linetable' 需要注意的是: 这里的armv7是运行设备的CPU指令集,而不是二进制文件的指令集 比如armv7指令集的二进制文件运行在arm64指令集的设备上,这个地方应该写arm64。 —lookup后面跟的一定是经过准确计算的符号表中的崩溃地址 使用dwarfdump解析的结果较杂乱,因此使用grep命令抓取其中关键点展示出来 运行结果如下: Linetabledir:'/data/.../Src/OBDConnectSetting/Controller' Linetablefile:'OBDFirstConnectViewController.m'line882,column5withstartaddress0x000000000052768 其中***行是编译时文件目录,第二行包含了崩溃发生的文件名称以及文件中具体行号等信息,有了这些信息就能准确定位崩溃原因啦。 2、atos atos是另一种更加简洁的崩溃日志解析方法,使用方式如下: $atos-oLuBao-archarmv70x52846 其执行结果如下: -[OBDFirstConnectViewControllershowOilPricePickerView](inYour)(OBDFirstConnectViewController.m:882) 相对dwarfdump命令的解析结果,更加简洁直观的指出了崩溃发生的位置。 3、无需符号表崩溃地址的解析方式 实际上,atos还提供了另外一种无需计算崩溃地址对应的符号表地址的方式,命令格式如下: $atos-oYour.app.dSYM/Contents/Resources/DWARF/Your-archarmv7-l0xa20000x000f0846 其中-l选项指定了二进制文件在运行时的起始地址0xa2000(获取方式见Binary Images相关内容),后面跟的是崩溃发生的运行时地址0x000f0846,解析结果和使用计算得到的符号表中崩溃地址一致: -[OBDFirstConnectViewControllershowOilPricePickerView](inYour)(OBDFirstConnectViewController.m:882) 【责任编辑: chenqingxiang TEL:(010)68476606】

优秀的个人博客,低调大师

[Android]手动触发OnClick事件

正文 一、实现代码 1.1 将下面代码写在类中,注意不是方法内部! OnClickListenerOnClickEvent = new OnClickListener(){ @Override public void onClick(Viewv){ // ... } } 1.2 在onCreate中调用: OnClickEvent.onClick( null ); 1.3 注册事件: ImageViewbtnCustomer = (ImageView)findViewById(R.id.btnTest); btnCustomer.setOnClickListener(OnClickEvent); 维护 2010-11-9 可以用performClick来触发事件 :) 结束 当然把onClick的实现单独写一个方法,然后在onClick调用这个方法,同时在加载的时候调用这个方法也是可以的:) 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582242,如需转载请自行联系原作者

优秀的个人博客,低调大师

centos 手动安装mysql8

下载 官网太慢了,在清华镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/ 二进制版 二进制版是官方提供的预先编译好的版本 下载二进制版发行包 wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/mysql-8.0.11-el7-x86_64.tar.gz 创建用户 useradd mysql 初始化 目录: tar xvfz mysql-8.0.11-el7-x86_64.tar.gz cd mysql-8.0.11-el7-x86_64 ln -s $PWD /usr/local/mysql chown -R mysql:mysql /usr/local/mysql export PATH=$PATH:/usr/local/mysql/bin mkdir -p /var/log/mariadb chown -R mysql:mysql /var/log/mariadb mkdir -p /var/run/mariadb touch /var/log/mariadb/mariadb.log chown -R mysql:mysql /var/run/mariadb 数据库: mysqld --initialize --user=mysql 注意这一行日志:2018-04-25T08:19:15.332554Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: dCa0tyVgN1&o 检查配置 vi /etc/my.cnf 检查一下 /etc/my.cnf 中配置的 datadir 跟初始化时是否一样。 [mysqld] datadir=/var/lib/mysql [client] socket=/var/lib/mysql/mysql.sock 默认的datadir必须改成init的目录。 默认客户端是 /var/lib/mysql.sock方式,因此只能如下方式登录: mysql -uroot -p --socket=/var/lib/mysql/mysql.sock 所以必须修改默认的客户端访问时使用自定义的sock,应用才可以访问。 配置服务 cp support-files/mysql.server /etc/init.d/mysqld chmod a+x /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on service mysqld start 如果报错,检查一下 /etc/my.cnf 中配置的 datadir 跟初始化时是否一样。 初始化数据表及权限 mysql_secure_installation 编译安装 如无必要,不要考虑编译安装方式,因为编译很慢,而且一旦遇到依赖冲突,解决起来非常麻烦。 什么是必要? 需要修改源码。 需要将自己的插件编译进去。 需要新版本,包管理器安装的版本太低。 二进制版本没有新版,这个一般不太可能,官方一般源码和与编译版本一起发布。 某些特别的linux发行版,没有对应的二进制分发包可用。 你想好了?那就开始了。。。。(准备3个小时) 安装依赖 yum install libaio -y yum install glibc-devel.i686 glibc-devel -y yum install gcc gcc-c++ cmake boost-devel openssl-devel ncurses-devel -y 下载源码包 wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/mysql-8.0.11.tar.gz 编译 tar xvfz mysql-8.0.11.tar.gz cd mysql-8.0.11 cmake . \ -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/include/boost \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql # 以下过程非常缓慢 make && make install 后续的步骤和二进制差不多,只是在部分环节出现了一点问题。 创建用户 useradd mysql 初始化 目录: chown -R mysql:mysql /usr/local/mysql mkdir -p /var/log/mariadb chown -R mysql:mysql /var/log/mariadb export PATH=$PATH:/usr/local/mysql/bin mkdir -p /var/run/mariadb touch /var/log/mariadb/mariadb.log chown -R mysql:mysql /var/run/mariadb 数据库: mysqld --initialize --user=mysql 在这里我遇到了一个问题: 初始化失败:COLLATION 'utf8mb4_0900_ai_ci' is not valid for CHARACTER SET 'utf8' 这个问题在二进制版没有遇到,经过分析,按照下面官网配置修改配置文件: [mysqld] character_set_server=latin1 collation_server=latin1_swedish_ci https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html 重新初始化即可。 经过测试修改为如下也可以: character-set-server = utf8 collation-server = utf8_general_ci 这样更接近实际情况,不过这个所谓mysql8 新特性的字符集"utf8mb4_0900_ai_ci" 为什么就报错呢? 推测 utf8mb4_0900_ai_ci 对应的字符集不是 utf8,而是 utf8mb4,因此最初使用 -DDEFAULT_CHARSET=utf8 参数编译,与mysql8默认使用 utf8mb4_0900_ai_ci 作为 collation字符集是冲突的。 我最初测试的时候贱兮兮的添加了一个cmake选项:-DDEFAULT_CHARSET=utf8,他正是罪魁祸首。 因此,要么修改默认字符集为 utf8mb4 让它自适应: -DDEFAULT_CHARSET=utf8mb4 \ 要么完整的配置这两个字符集为匹配的关联字符集: -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ 配置服务 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chmod a+x /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on service mysqld start 初始化数据表及权限 mysql_secure_installation 编译失败了怎么办? 首先找到原因,或者线索,安装需要的依赖,或者修改需要的环境。 清理现场: make clean rm -f CMakeCache.txt 重新来过。 权限问题 mysql 8 的权限管理方式改变了,以前的方式可能不是很好用了。 mysql> create role app_read; Query OK, 0 rows affected (0.03 sec) mysql> grant all on *.* to app_read; Query OK, 0 rows affected (0.07 sec) mysql> create user root@'%' identified by 'dCa0tyVgN1&o'; 彩蛋 如果你只是想看一下mysql8是个什么鬼,可以用docker启动: docker run -de MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --name mysql mysql:8.0.11 测试: docker exec -ti mysql mysql -uroot -p 密码 123456 ,几分钟的事,砖头扔过来。

优秀的个人博客,低调大师

android手动调用振动器(Vibrator)

Vibrator vv=(Vibrator) getApplication().getSystemService(Service.VIBRATOR_SERVICE); vv.vibrate(500);//震半秒钟 vv.vibrate(new long[]{10, 100, 20, 200}, -1); 关于vv.vibrate(new long[]{10, 100, 20, 200}, -1); 参数1:表示停10ms, 震100ms, 停20ms,震200ms 参数2:-1 表示不重复,非-1表示从指定的下标开始重复震动! 注意 :如第二个参数是0, 则一圈一圈的循环震动下去了;如果是2,这第一遍震动后,从"20”这个参数开始再循环震动! 一般用vv.vibrate(500);//震半秒钟就行了 vv.cancel();//停止震动,基本只有在循环震动时才用得到这个 本文转自java豆子博客园博客,原文链接:http://www.cnblogs.com/error404/archive/2011/09/21/2184132.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。