首页 文章 精选 留言 我的

精选列表

搜索[文档抽取],共10000篇文章
优秀的个人博客,低调大师

Spring 框架文档之核心技术—— Resource

Resource Resource 接口定义 public interface Resource extends InputStreamSource { /** * 返回此资源的 URL 句柄 */ URL getURL() throws IOException; /** * 返回此资源的 URI 句柄 */ URI getURI() throws IOException; /** * 返回此资源的 File 句柄 */ File getFile() throws IOException; /** * 创建此资源的关联资源 */ Resource createRelative(String relativePath) throws IOException; } public interface InputStreamSource { /** * 返回底层资源内容的 InputStream */ InputStream getInputStream() throws IOException; } 内置 Resource 实现者 UrlResource —— 封装 java.net.URL,用于访问通过URL访问的任何对象,例如 file:、http:、ftp: 等 ClassPathResource —— 使用线程上下文类加载器、给定的类加载器或给定的类从类路径加载资源。如 classpath: FileSystemResource —— 从文件系统加载资源 ServletContextResource —— 从 Web 应用根目录的相对路径中加载资源,支持 URL、流、File(资源位于文件系统)访问 InputStreamResource —— 在没有特定的资源实现时使用 ByteArrayResource —— 从任何给定的字节数组加载资源 ResourceLoader 返回资源类型确认 //对于 ClassPathXmlApplicationContext, 返回 ClassPathResource //对于 FileSystemXmlApplicationContext, 返回 FileSystemResource //对于 WebApplicationContext, 返回 ServletContextResource Resource template = ctx.getResource("some/resource/path/myTemplate.txt"); //指定 classpath:,返回 ClassPathResource Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt"); //指定 file:、http:,返回 UrlResource Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt"); Resource template = ctx.getResource("https://myhost.com/resource/path/myTemplate.txt"); 与 ApplicationContext 协作 ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml"); //注意:FileSystemXmlApplicationContext 强制将 FileSystemResource 路径当作相对路径 ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml"); //如要使用绝对路径,推荐使用 file: 形式的 UrlResource ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");

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

scrapy官方文档提供的常见使用问题

Scrapy与BeautifulSoup或lxml相比如何? BeautifulSoup和lxml是用于解析HTML和XML的库。Scrapy是一个用于编写Web爬虫的应用程序框架,可以抓取网站并从中提取数据。 Scrapy提供了一种用于提取数据的内置机制(称为选择器),但如果您觉得使用它们感觉更舒服,则可以轻松使用BeautifulSoup(或lxml)。毕竟,他们只是解析可以从任何Python代码导入和使用的库。 换句话说,将BeautifulSoup(或lxml)与Scrapy进行比较就像将jinja2与Django进行比较一样。 我可以和BeautifulSoup一起使用Scrapy吗? 是的你可以。如所提到的上面,BeautifulSoup可用于在Scrapy回调解析HTML响应。您只需将响应的主体提供给BeautifulSo

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

ASCSDK-------通用包接入文档(COCOS篇)

先说下大体的思路。和之前说的在Unity中接入ASCSDK一样,在Cocos2dx中接入ASCSDK,我们也分为两步,一个Android中的部分,另 一个是Coccos2dx中的部分。同时,我们希望尽可能地封装不同平台之间数据的传递,以及接口的调用。使得大部分游戏基于这个封装,都可以最快地速度来完成ASCSDK的接入。 新建一个Android工程,作为ASCSDK和Cocos2dx的一个中间工程(ASCSDK_Cocos2dx),主要负责ASCSDK的接口调用封装,参数传递和解析等。这个工程,对于所有游戏都试用。 在Cocos2dx中封装JNI调用,以及和Android中交互的数据格式等的定义和解析。同样地,这部分对于所有游戏也都适用。游戏中只需要调用这里提供的相关接口,以及实现相应的回调即可完成接入。 首先, 我们使用cocos new 新建一个Cocos2dx(我这里使用的是Cocos2dx 3.10版本)工程,名为Cocos_Demo。 目录如下图 demo中我们创建了5个按钮,分别为登陆,支付,评价,展示横幅,展示插屏。代码以及运行效果如下。 #include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto bg = Sprite::create("HelloWorld.jpg"); bg->setAnchorPoint(Vec2(0.5f, 0.5f)); bg->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)); bg->setScale(2.0f); this->addChild(bg); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 - 5.0f , origin.y + closeItem->getContentSize().height/2 + 5.0f)); // create menu, it's an autorelease object auto menu = Menu::create(closeItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label this->labelUsername = Label::createWithTTF("ASCSDK", "fonts/Marker Felt.ttf", 24); // position the label on the center of the screen this->labelUsername->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height * 0.9 - this->labelUsername->getContentSize().height)); // add the label as a child to this layer this->addChild(this->labelUsername, 1); ui::Button* btnLogin = ui::Button::create("login_normal.png", "login_selected.png"); btnLogin->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y + 200)); btnLogin->addClickEventListener(CC_CALLBACK_1(HelloWorld::loginClickCallback, this)); btnLogin->setScale(0.6f); // add the sprite as a child to this layer this->addChild(btnLogin, 0); ui::Button* btnPay = ui::Button::create("pay_normal.png", "pay_selected.png"); btnPay->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y + 100)); btnPay->addClickEventListener(CC_CALLBACK_1(HelloWorld::payClickCallback, this)); btnPay->setScale(0.6f); // add the sprite as a child to this layer this->addChild(btnPay, 0); ui::Button* btnRate = ui::Button::create("rate_normal.png", "rate_selected.png"); btnRate->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); btnRate->addClickEventListener(CC_CALLBACK_1(HelloWorld::rateClickCallback, this)); btnRate->setScale(0.6f); // add the sprite as a child to this layer this->addChild(btnRate, 0); ui::Button* btnBanner = ui::Button::create("banner_normal.png", "banner_selected.png"); btnBanner->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y - 100)); btnBanner->addClickEventListener(CC_CALLBACK_1(HelloWorld::showBannerClickCallback, this)); btnBanner->setScale(0.6f); // add the sprite as a child to this layer this->addChild(btnBanner, 0); ui::Button* btnInters = ui::Button::create("inters_normal.png", "inters_selected.png"); btnInters->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y - 200)); btnInters->addClickEventListener(CC_CALLBACK_1(HelloWorld::showIntersClickCallback, this)); btnInters->setScale(0.6f); // add the sprite as a child to this layer this->addChild(btnInters, 0); //NDKHelper::addSelector("ASCSelectors", "onASCLoginResult", CC_CALLBACK_2(HelloWorld::onASCLoginResult, this), this); ASCSDKInterface::getInstance()->initSDK(this); return true; } void HelloWorld::OnInitSuc() { CCLOG("SDK初始化成功..."); //一般不需要做什么处理 } void HelloWorld::OnLoginSuc(ASCLoginResult* result) { CCLOG("SDK登录并认证成功...%s",result->userId.c_str()); this->labelUsername->setString(result->sdkUsername); if (result->isSwitchAccount) { //TODO:这里退回到登录界面,并且SDK是已经登录成功状态,不用再弹出SDK的登录界面 } else { //TODO:登录认证成功,获取服务器列表,进入游戏服... } } void HelloWorld::OnSwitchLogin() { CCLOG("切换帐号成功..."); //TODO:退回到登录界面,并弹出SDK登录界面(调用ASCSDKInterface::getInstance()->login()) } void HelloWorld::OnLogout() { CCLOG("SDK帐号退出成功..."); this->labelUsername->setString("ASCSDK"); //TODO:退回到登录界面,并弹出SDK登录界面(调用ASCSDKInterface::getInstance()->login()) } void HelloWorld::loginClickCallback(Ref *pSender) { CCLOG("Btn Login Clicked...ASC Login..."); ASCSDKInterface::getInstance()->login(); } void HelloWorld::payClickCallback(Ref *pSender) { CCLOG("Btn Pay Clicked...ASC Pay..."); ASCPayParams* params = ASCPayParams::create(); params->productId = "1"; params->productName = "元宝"; params->productDesc = "购买100元宝,赠送20元宝"; params->price = 100; params->buyNum = 1; params->coinNum = 300; params->serverId = "10"; params->serverName = "地狱之恋"; params->roleId = "asc_24532452"; params->roleName = "麻利麻利吼"; params->roleLevel = 15; params->vip = "v15"; //去服务器获取游戏中商品的订单号以及扩展数据,这里测试 params->orderID = "345435634534"; params->extension = "test111"; ASCSDKInterface::getInstance()->pay(params); } void HelloWorld::rateClickCallback(cocos2d::Ref* pSender){ CCLOG("Btn rate Clicked...ASC Rate..."); ASCSDKInterface::getInstance()->rate(); } void HelloWorld::showBannerClickCallback(cocos2d::Ref* pSender){ CCLOG("Btn showBanner Clicked...ASC showBanner..."); ASCSDKInterface::getInstance()->showBanner(); } void HelloWorld::showIntersClickCallback(cocos2d::Ref* pSender){ CCLOG("Btn showInters Clicked...ASC showInters..."); ASCSDKInterface::getInstance()->showInters(); } void HelloWorld::menuCloseCallback(Ref* pSender) { Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif } 说明: HelloWorldScene.cpp中init方法的最后,我们调用ASCSDK的初始化方法:ASCSDKInterface::getInstance()->initSDK(this); 实现回调接口 void HelloWorld::OnInitSuc() { CCLOG("SDK初始化成功..."); //一般不需要做什么处理 } void HelloWorld::OnLoginSuc(ASCLoginResult* result) { CCLOG("SDK登录并认证成功...%s",result->userId.c_str()); this->labelUsername->setString(result->sdkUsername); if (result->isSwitchAccount) { //TODO:这里退回到登录界面,并且SDK是已经登录成功状态,不用再弹出SDK的登录界面 } else { //TODO:登录认证成功,获取服务器列表,进入游戏服... } } void HelloWorld::OnSwitchLogin() { CCLOG("切换帐号成功..."); //TODO:退回到登录界面,并弹出SDK登录界面(调用ASCSDKInterface::getInstance()->login()) } void HelloWorld::OnLogout() { CCLOG("SDK帐号退出成功..."); this->labelUsername->setString("ASCSDK"); //TODO:退回到登录界面,并弹出SDK登录界面(调用ASCSDKInterface::getInstance()->login()) } 登陆以及支付以及广告调用,回调方法,具体调用,请参考demo。 3.将Cocos_Demo生成proj.android导入到eclipse中,然后将ASCSDK3和ASCSDK_Cocos2dx工程生成的jar包(分别是ascsdk2.jar和ascsdk_cocos2dx.jar)拷贝到HelloCocos安卓工程的libs目录下以及一些外部jar。然后,将生成的 AppActivity.java,本来是继承Cocos2dxActivity的,改为继承ASCCocosActivity。同时,将AndroidManifest.xml中的application节点中,加上android:name=”com.ascsdk.ASCApplication” 目录如图 AndroidManifest.xml内容 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.asc.sdk.demo.cocos" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> <uses-sdk android:minSdkVersion="19"/> <uses-feature android:glEsVersion="0x00020000" /> <application android:label="@string/app_name" android:icon="@drawable/icon" android:name="com.asc.sdk.ASCApplication" > <!-- Tell Cocos2dxActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="cocos2dcpp"/> <activity android:name=".AppActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:configChanges="orientation|keyboardHidden|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true"/> <uses-permission android:name="android.permission.INTERNET"/> </manifest> 最后,为了能够在Android中编译并运行,我们还需要将ASCSDK包含的这些Cpp文件,添加到Android.mk中,最终的文件如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp \ ../../Classes/jansson/value.c \ ../../Classes/jansson/utf.c \ ../../Classes/jansson/strconv.c \ ../../Classes/jansson/strbuffer.c \ ../../Classes/jansson/pack_unpack.c \ ../../Classes/jansson/memory.c \ ../../Classes/jansson/load.c \ ../../Classes/jansson/hashtable.c \ ../../Classes/jansson/error.c \ ../../Classes/jansson/dump.c \ ../../Classes/NDKHelper/CallFuncNV.cpp \ ../../Classes/NDKHelper/NDKCallbackNode.cpp \ ../../Classes/NDKHelper/NDKHelper.cpp \ ../../Classes/ascsdk/ASCSDKData.cpp \ ../../Classes/ascsdk/ASCSDKNativeCallback.cpp \ ../../Classes/ascsdk/ASCSDKInterface.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes # _COCOS_HEADER_ANDROID_BEGIN # _COCOS_HEADER_ANDROID_END LOCAL_STATIC_LIBRARIES := cocos2dx_static # _COCOS_LIB_ANDROID_BEGIN # _COCOS_LIB_ANDROID_END include $(BUILD_SHARED_LIBRARY) $(call import-module,.) # _COCOS_LIB_IMPORT_ANDROID_BEGIN # _COCOS_LIB_IMPORT_ANDROID_END 4.到这里,接入就算完成了。我们可以使用cocos compile -p android 命令来编译Android平台,之前的操作如果稍有不慎,这里编译的过程中,也许会遇到一些错误,不过,看着啥错误,一一解决即可。

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

Redisson官方文档 - 10. 额外功能

10.1. 对Redis节点的操作 Redisson的NodesGroup对象提供了许些对Redis节点的操作。 NodesGroup nodesGroup = redisson.getNodesGroup(); nodesGroup.addConnectionListener(new ConnectionListener() { public void onConnect(InetSocketAddress addr) { // Redis节点连接成功 } public void onDisconnect(InetSocketAddress addr) { // Redis节点连接断开 } }); 也可以用来PING单个Redis节点或全部节点。 NodesGroup nodesGroup = redisson.getNodesGroup(); Collection<Node> allNodes = nodesGroup.getNodes(); for (Node n : allNodes) { n.ping(); } // 或者 nodesGroup.pingAll(); 10.2. 复杂多维对象结构和对象引用的支持 Redisson突破了Redis数据结构维度的限制,通过一个特殊引用对象的帮助,Redisson允许以任意的组合方式构建多维度的复杂对象结构,实现了对象之间的类似传统数据库里的关联关系。使用范例如下: RMap<RSet<RList>, RList<RMap>> map = redisson.getMap("myMap"); RSet<RList> set = redisson.getSet("mySet"); RList<RMap> list = redisson.getList("myList"); map.put(set, list); // 在特殊引用对象的帮助下,我们甚至可以构建一个循环引用,这是通过普通序列化方式实现不了的。 set.add(list); list.add(map); 可能您已经注意到了,在map包含的元素发生改变以后,我们无需再次“保存/持久”这些对象。因为map对象所记录的并不是序列化以后的值,而是元素对象的引用。这让Redisson提供的对象在使用方法上,与普通Java对象的使用方法一致。从而让Redis成为内存的一部分,而不仅仅是一个储存空间。 以上范例中,一共创建了三个Redis数据结构:一个Redis HASH,一个Redis SET和一个Redis LIST。 10.3. 命令的批量执行 多个连续命令可以通过RBatch对象在一次网络会话请求里合并发送,这样省去了产生多个请求消耗的时间和资源。这在Redis中叫做管道。 RBatch batch = redisson.createBatch(); batch.getMap("test").fastPutAsync("1", "2"); batch.getMap("test").fastPutAsync("2", "3"); batch.getMap("test").putAsync("2", "5"); batch.getAtomicLongAsync("counter").incrementAndGetAsync(); batch.getAtomicLongAsync("counter").incrementAndGetAsync(); // 原子化(事务)批量执行所有的命令 batch.atomic(); // 告知Redis不用返回结果(可以减少网络用量) batch.skipResult(); // 将写入操作同步到从节点 // 同步到2个从节点,等待时间为1秒钟 batch.syncSlaves(2, 1, TimeUnit.SECONDS) // 处理结果超时为2秒钟 batch.timeout(2, TimeUnit.SECONDS); // 命令重试等待间隔时间为2秒钟 batch.retryInterval(2, TimeUnit.SECONDS); // 命令重试次数,仅适用于未发送成功的命令 batch.retryAttempts(4); BatchResult res = batch.execute(); // 或者 Future<BatchResult> asyncRes = batch.executeAsync(); 在集群模式下,所有的命令会按各个槽所在的节点,筛选分配到各个节点并同时发送。每个节点返回的结果将会汇总到最终的结果列表里。 10.4. 脚本执行 redisson.getBucket("foo").set("bar"); String r = redisson.getScript().eval(Mode.READ_ONLY, "return redis.call('get', 'foo')", RScript.ReturnType.VALUE); // 通过预存的脚本进行同样的操作 RScript s = redisson.getScript(); // 首先将脚本保存到所有的Redis主节点 String res = s.scriptLoad("return redis.call('get', 'foo')"); // 返回值 res == 282297a0228f48cd3fc6a55de6316f31422f5d17 // 再通过SHA值调用脚本 Future<Object> r1 = redisson.getScript().evalShaAsync(Mode.READ_ONLY, "282297a0228f48cd3fc6a55de6316f31422f5d17", RScript.ReturnType.VALUE, Collections.emptyList()); 10.5. 底层Redis客户端 Redisson在底层采用了高性能异步非阻塞式Java客户端,它同时支持异步和同步两种通信模式。如果有哪些命令Redisson还没提供支持,也可以直接通过调用底层Redis客户端来实现。Redisson支持的命令在Redis命令和Redisson对象匹配列表里做了详细对比参照。 // 在使用多个客户端的情况下可以共享同一个EventLoopGroup EventLoopGroup group = new NioEventLoopGroup(); RedisClientConfig config = new RedisClientConfig(); config.setAddress("redis://localhost:6379") // 或者用rediss://使用加密连接 .setPassword("myPassword") .setDatabase(0) .setClientName("myClient") .setGroup(group); RedisClient client = RedisClient.create(config); RedisConnection conn = client.connect(); // 或 RFuture<RedisConnection> connFuture = client.connectAsync(); conn.sync(StringCodec.INSTANCE, RedisCommands.SET, "test", 0); // 或 conn.async(StringCodec.INSTANCE, RedisCommands.GET, "test"); conn.close() // 或 conn.closeAsync() client.shutdown(); // 或 client.shutdownAsync();

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

Ubuntu 14.04+Apache+PHP+MySQL+EduSoho[文档]

版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396611 参考原文:http://www.qiqiuyu.com/course/20/task/793/show注意: 本教程基于Ubuntu系统 14.04版本并且需要以root用户操作机器,请在确保您的环境是否符合以上两个条件之后,再进行后续的操作。切记:我们的edusoho访问目录是edusoho/web,只有在nginx或者Apache配置里面把根目录定位到web目录下,才不会出现奇怪的问题,否则就会出现图片不能显示或者文件无法上传的问题。 1、更新和升级系统 sudo apt-get update sudo apt-get upgrade 2、安装和配置apache 2.1、安装apache sudo apt-get install apache2 sudo apt-get install libapache2-mod-xsendfile 2.2、配置apache虚拟主机 apache说2.2的版本: 打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉。没有则添加,但必选独占一行,使apache支持 mod_rewrite 模块 apache说2.4的版本: 默认开启,在/etc/apache2/mods-available下存在rewrite.load 这个配置说明已启用 sudo a2enmod rewrite #启用rewrite模块 sudo a2enmod xsendfile #启用xsendfile模块 vi /etc/apache2/sites-enabled/edusoho.conf 将以下代码添加到虚拟主机配置中 <VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/project/web <Directory /var/www/project/web> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> ErrorLog /var/log/apache2/project_error.log CustomLog /var/log/apache2/project_access.log combined </VirtualHost> 注意:apache2.2和2.4稍有不同,如果您是2.2,将<Directory>节点修改为: <Directory /var/www/project/web> # enable the .htaccess rewrites AllowOverride All Order allow,deny Allow from All </Directory> 注意: 1、将DocumentRoot、ServerName、伪静态路径修改为您安装系统的目录,保存修改。 2、rm /etc/apache2/sites-enabled/000-default -Rf 3、安装和配置PHP 3.1、安装PHP以及相关的插件 sudo apt-get install php5 php5-cli php5-curl php5-fpm php5-intl php5-mcrypt php5-mysqlnd php5-gd libapache2-mod-php5 3.2、修改PHP配置 #编辑php.ini , 将以下配置的值修改为1024M vi /etc/php5/apache2/php.ini memory_limit = 1024M post_max_size = 1024M upload_max_filesize = 1024M 重启Apache service apache2 restart 4、安装MySql和创建EduSoho数据库 apt-get install mysql-server 备注:安装过程中注意设定MySql的root密码,不设置默认为空,通常密码设置为root。 mysql -uroot -p 然后你需要输入MySQL数据库的root密码。 进入数据库命令行模式后,创建edusoho数据库,执行: CREATE DATABASE `edusoho` DEFAULT CHARACTER SET utf8 ; GRANT ALL PRIVILEGES ON `edusoho`.* TO 'esuser'@'localhost' IDENTIFIED BY 'edusoho'; quit; 注意:这里为edusoho数据库创建了一个用户名,用户名为:esuser,密码为edusoho,在后面安装的第三步需要用到,不建议直接填写root账户。 5、下载和解压EduSoho程序 mkdir /var/www cd /var/www wget http://download.edusoho.com/edusoho-VERSION.tar.gz (注:将VERSION替换为当前EduSoho最新版本号,可从官网www.edusoho.com查询获取) tar -zxvf edusoho-VERSION.tar.gz chown www-data:www-data edusoho/ -Rf 注:这里的下载地址可以在http://download.edusoho.com/中可以获取到,VERSION为下载来之后压缩包后面的版本号。 最后一步: 浏览器中打开:http://YOU_DOMAIN 安装,当然这里的YOU_DOMAIN是您的域名。

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

Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams

正文 一、结构 public static classAbsoluteLayout.LayoutParamsextendsViewGroup.LayoutParams java.lang.Object android.view.ViewGroup.LayoutParams android.widget.AbsoluteLayout.LayoutParams 二、概述 每个子元素布局信息与绝对布局相关联。参见绝对布局属性中该类所支持的子视图属性列表。(译者注: AbsoluteLayout的这种“绝对”定位的布局方式和我们非常熟悉的Windows编程中的Left和Top设置UI元素的位置是基本一致的。) 三、字段 public int x 在View Group内部子元素中的X水平位置。 public int y 在View Group内部子元素中的Y垂直位置。 四、构造函数 public AbsoluteLayout.LayoutParams(int width, int height, int x, int y) 创建一个新的具有指定宽度、高度和位置的布局参数。 参数: widthMATCH_PARENT,WRAP_CONTENT或者固定大小的像素 heightMATCH_PARENT,WRAP_CONTENT或者固定大小的像素 x子元素的X位置 y子元素的Y位置 public AbsoluteLayout.LayoutParams(Context c, AttributeSet attrs) 创建一组新的布局参数,通过上下文提取的相关属性值设置。XML属性映射到这个布局参数设置如下: ·layout_x:子元素的X位置 ·layout_y:子元素的Y位置 ·所有来自ViewGroup.LayoutParams的XML属性 参数: c上下文环境. attrs从属性设置中提取布局参数值。 public AbsoluteLayout.LayoutParams(ViewGroup.LayoutParams source) (译者注:根据ViewGroup.LayoutParams实例化布局参数,从源码可以看出: 五、公共方法 public String debug (String output) 返回设置的布局参数的字符串表示形式。 参数 output用于内部表示的预置字符串 返回值 返回如下格式字符串:输出+ "ViewGroup.LayoutParams={ width=WIDTH, height=HEIGHT }" 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582598,如需转载请自行联系原作者

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

Android 中文 API 文档 (44) —— Chronometer.OnChronometerTickListener

正文 一、结构 public static interfaceChronometer.OnChronometerTickListener 二、概述 计时器递增的时候通知这个回调。 三、公共方法 public abstract voidonChronometerTick(Chronometer chronometer) 在计时器变化时通知。 参数 chronometer计时器对象。 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582600,如需转载请自行联系原作者

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

Rancher-k8s加速安装文档

Kubernetes是一个强大的容器编排工具,帮助用户在可伸缩性系统上可靠部署和运行容器化应用。Rancher容器管理平台原生支持K8s,使用户可以简单轻松地部署K8s集群。 很多同学正常部署k8s环境后无法进入Dashboard,基础设施应用栈均无报错。但通过查看 基础架构|容器 发现并没有Dashboard相关的容器。 因为k8s在拉起相关服务(如Dashboard、内置DNS等服务)是通过应用商店里面的YML文件来定义的,YML文件中定义了相关的镜像名和版本。而Rancher部署的k8s应用栈属于k8s的基础框架,相关的镜像通过dockerhub/rancher 仓库拉取。 默认Rancher-catalog k8s YML中服务镜像都是从谷歌仓库拉取,在没有科学上网的情况下,国内环境几乎无法成功拉取镜像。 为了解决这一问题,优化中国区用户的使用体验,我们修改了http://git.oschina.net/rancher/rancher-catalog仓库中的YML文件,将相关的镜像也同步到国内仓库,通过替换默认商店地址来实现加速部署。 环境准备 整个演示环境由以下4台本地虚拟机组成,相关信息说明如下: 操作说明 具体演示操作说明如下: 第一步 1、直接运行Rancher_server: 1 Sudodockerrun-d--restartalways–namerancher_server-p 8080 : 8080 rancher/server:stable&&sudodockerlogs-francher-server 容器初始化完成后,通过主机IP:8080访问WEB。 2、添加变量启动Rancher_server: 1 2 3 Sudodockerrun-d--namerancher-server-p 8080 : 8080 --restart=unless-stopped-eDEFAULT_CATTLE_CATALOG_URL= '{"catalogs":{"library":{"url":"http://git.oschina.net/rancher/rancher-catalog.git","branch":"k8s-cn"}}}' \ rancher/server:stable&&sudodockerlogs-francher-server 变量的作用后面介绍。 第二步,Rancher基本配置: 因为Rancher修改过的设置参数无法同步到已创建的环境,所以在创建环境前要把相关设置配置好。比如,如果你想让Rancher默认去拉取私有仓库的镜像,需要配置registry.default= 参数等。 应用商店(Catalog)地址配置:在系统管理\系统设置中,找到应用商店。禁用Rancher 官方认证仓库并按照下图配置。 名称:library (全小写) 地址:https://git.oschina.net/rancher/rancher-catalog.git 分支: k8s-cn PS:回到最开始的启动命令,如果以第二种方式启动,这个地方就会被默认配置好。所以,根据自己的情况选择哪一种配置方式, 最后点击保存。 第三步,Kubernetes环境配置查看对比: 重启并进入WEB后,选择环境管理。如图: 在环境模板中,找到Kubernetes 模板,点击右边的编辑图标,接着点击编辑配置。 以下是Rancher-k8s的默认配置对比,图一为默认商店的参数,图二为自定义商店的参数。 这里只是查看参数不做相关修改。点击cancel返回模板编辑页面。 在这里,根据需要可以定制组件,比如可以把默认的ipsec网络改为vxlan网络等,这里不再叙述。 最后点保存或者cancle返回环境管理界面。 第四步,添加环境: 在环境管理界面中,点击页面上方的添加环境按钮: 填写环境名称,选择环境模板(Kubernetes),点击创建。创建后: PS:default环境由于没有添加host,会显示Unhealthy。 切换模板 等待添加主机 第五步,添加主机: 如上图,进入添加主机界面 指定用于注册这台主机的公网IP。如果留空,Rancher会自动检测IP注册。通常在主机有唯一公网IP 的情况下这是可以的。如果主机位于防火墙/NAT设备之后,或者主机同时也是运行rancher/server容器的主机时,则必须设置此IP。 以上这段话会在添加主机页面显示,这段话的意思就是:如果准备添加的节点有运行Rancher-server容器,那么在添加节点的时候就要输入节点可被直接访问的主机IP地址(如果做的Rancher-HA,那么每台运行Rancher-server的节点都要添加主机IP地址),如果不添加主机IP地址,那么在添加节点后获取到的地址很可能会是Rancher-server容器内部的私网地址,导致无法使各节点通信。所以需要注意一下! 本示例三个节点都没有运行rancher_server,所以直接复制生成的代码,在三个节点执行。 节点添加成功,应用栈创建完毕,正在启动服务: 镜像拉取中 到此为止,k8s就部署完成。 服务容器查看:点击基础架构|主机 对比基础设施中kubernetes 应用栈,可以发现有以下容器是不在应用栈中的: 这些应用是在k8s框架运行起来之后,再通过YML配置文件拉起的k8s服务,比如Dashboard服务 那些点击 kubernetes UI 提示服务不可达的。 可以先看看有没有此服务容器。 接下来在k8s中简单部署一个应用。 第六步,k8s应用部署: 进入k8s的Dashboard后,默认显示的是default 命名空间。 可以通过下拉箭头切换到kube-system命名空间,这里显示了CPU、内存使用率,以及一些系统组件的运行状况。 应用部署: 页面右上角点击create 按钮,进入部署配置界面,并简单做一写设置: 注:在service中,如果选择Internal, 将需要ingress功能,ingress类似于LB的功能,这个后续讲解。这里我们选择External 。 最后点击deploy .点击deploy后将会跳转到部署状态界面,如图: 部署完成后显示状态: 页面右侧点击service 可以看到部署的服务以及访问信息。 返回Rancher,进入基础设施 可以看到自动增加了一个kubernetes-loadbalancers 应用栈。 这个应用栈的信息是通过k8s传递到Rancher,所以在部署应用后,在Rancher中很容易找到服务访问点。 原文来源:Rancher Labs 本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1946612

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册