首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

区块链开发(零)如何开始学习以太坊及区块链

一、 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取了技术架构和体系,称之为区块链技术。从比特币提取的区块链技术称之为区块链1.0时代,那个时候的应用主要以电子货币和去中心化交易为主,比如各种山寨币。而以太坊将区块链带入了2.0的时代,区块链2.0不是推翻了1.0,而是在1.0的基础上实现了区块知晓、价值知晓、图灵完备,并进行了细节优化,从而形成了以智能合约为特色的区块链2.0。比特币定位于一个应用,而以太坊定位于平台,你可以在这个平台上利用智能合约做各种应用。 所以,学习区块链,直接学习以太坊就好了 二、 以太坊入门的方法 对于没有接触过区块链的人,建议先参会以太坊的日常应用。 1、 使用客户端 这里的教程

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

基于hi-nginx的web开发(python篇)——路由装饰器

现在,有了起步的基本认识,现在需要一个可以媲美flask或者bottle的简洁易用的路由功能,可以用装饰器写法任意映射 URLs 到代码。 这个,并不难。首先,来一个叫做hi的模块:hi.py: 1 import re 2 3 class hi: 4 def __init__(self): 5 self.uri_map={} 6 self.uri_regex_map={} 7 8 def route(self,pattern,method): 9 def wrapper_a(func): 10 self.uri_map[pattern]={'method':method,'callback':func} 11 self.uri_regex_map[pattern]=re.compile(pattern) 12 def wrapper_b(req,res,param): 13 func(req,res,param) 14 return wrapper_b 15 return wrapper_a 16 17 def run(self,req,res): 18 for k,v in self.uri_map.items(): 19 if req.method() in v['method']: 20 m=self.uri_regex_map[k].match(req.uri()) 21 if m: 22 v['callback'](req,res,m.groupdict()) 23 break 把它和index.py放在同一个目录中。以下就是使用路由装饰器后的新代码: 1 import sys 2 sys.path.append('/usr/local/nginx/python') 3 4 from hi import hi 5 app =hi() 6 7 @app.route(r'^/test/?$',['GET','POST']) 8 @app.route(r"^/$",['GET']) 9 def hello_world(req,res,param): 10 res.header('Content-Type','text/plain;charset=utf-8') 11 res.content('hello,world') 12 res.status(200) 13 14 @app.route(r"^/client/?$",['GET','POST']) 15 def client(req,res,param): 16 res.content('{}<br>{}<br>{}<br>{}<br>{}'.format(req.client(),req.method(),req.uri(),req.user_agent(),req.param())) 17 res.status(200) 18 19 @app.route(r"^/hello/(?P<who>\w+)?$",['GET']) 20 def hello(req,res,param): 21 res.content('{}={}'.format('who',param['who'])) 22 res.status(200) 23 24 25 26 if __name__ == '__main__': 27 app.run(hi_req,hi_res) 是不是跟些flask或者bottle一样简单?而且还快得多喔! 访问http://localhost:8080/,http://localhost:8080/client?a=90,http://localhost:8080/hello/cnblogs即可查看结果。 当然,也可以先安装hi.py:https://github.com/webcpp/hi.py 这样的话,上面代码的第1,2行就可以免了。

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

07.Android Studio下Ndk开发(使用fmod播放声音)

(创建于2017/12/28) 已实现 注意几点: 1.main下cpp文件夹放置c文件和相关头文件 2.main下JniLibs文件夹放置第三方so文件 3.app下libs文件夹放置jar包 4.CMakeLists配置文件: cmake_minimum_required(VERSION 3.4.1) add_library( //打包多个cpp文件为同一个so文件qq_voice qq_voice SHARED src/main/cpp/common.cpp src/main/cpp/play_sound.cpp src/main/cpp/common_platform.cpp ) //引入第三方 add_library( libfmod SHARED IMPORTED ) //配置第三方路径 set_target_properties( libfmod PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libfmod.so ) //引入第三方 add_library( libfmodL SHARED IMPORTED ) //配置第三方路径 set_target_properties( libfmodL PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libfmodL.so ) find_library( log-lib log ) target_link_libraries( qq_voice libfmod libfmodL ${log-lib} ) 5.build.gradle文件配置 android { compileSdkVersion 26 buildToolsVersion "26.0.0" defaultConfig { ... externalNativeBuild { cmake { cppFlags "" } } ndk { //和JniLibs下的api相对应,不然会报错 abiFilters 'armeabi', 'armeabi-v7a','arm64-v8a','x86' } } ... externalNativeBuild { cmake { //配置CMakeLists文件路径 path 'CMakeLists.txt' } } }

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

08.Eclipse下Ndk开发(使用fmod实现QQ变声功能)

(创建于2017/12/30) 1.编写native package org.fmod.example; public class EffectUtils { //音效的类型 public static final int MODE_NORMAL = 0; public static final int MODE_LUOLI = 1; public static final int MODE_DASHU = 2; public static final int MODE_JINGSONG = 3; public static final int MODE_GAOGUAI = 4; public static final int MODE_KONGLING = 5; /** * 音效处理 * @param path * @param type */ public native static void fix(String path,int type); static{ System.loadLibrary("fmodL"); System.loadLibrary("fmod"); System.loadLibrary("qq_voice"); } } 2.进入src目录下,使用命令行生成头文件 javah 包名+类名 3.创建项目根目录下jni文件夹,将头文件拷贝进去 4.下载fmod源码,复制api中lowlevel中的inc中的头文件到jni目录下 5.复制fmod jar包到根目录下libs文件夹并添加依赖 6.复制需要的api平台的so文件到jni目录下 7.修改报错的地方,比如头文件的路径等问题 8.Android Tools -> Add native support 添加本地支持(在此之前,确认你的项目中已经配置了ndk相关的头文件目录支持,参考前边的笔记),填写你要生成的 so库的文件名,确认和loadLibrary中加载的(如qq_voice)保持一致 9.配置mk文件: Android.mk LOCAL_PATH := $(call my-dir) //编译libfmod.so include $(CLEAR_VARS) LOCAL_MODULE := fmod LOCAL_SRC_FILES := libfmod.so include $(PREBUILT_SHARED_LIBRARY) //编译libfmodL.so include $(CLEAR_VARS) LOCAL_MODULE := fmodL LOCAL_SRC_FILES := libfmodL.so include $(PREBUILT_SHARED_LIBRARY) //编译我们自己写的c代码为so文件,并添加上边编译的so支持 include $(CLEAR_VARS) LOCAL_MODULE := qq_voice LOCAL_SRC_FILES := effect_fix.cpp LOCAL_SHARED_LIBRARIES := fmod fmodL //添加log支持 LOCAL_LDLIBS := -llog //添加c++异常类支持 LOCAL_CPP_FEATURES := exceptions include $(BUILD_SHARED_LIBRARY) Application.mk ##支持C++异常处理,标准莫板块(针对string.h等头文件的处理,去掉了common.c之后,这个不再需要了,但是保留也没问题) APP_STL := gnustl_static 10.不断的build project,直到所有异常解决编译成功 部分源码: effect_fix.cpp #include "org_fmod_example_EffectUtils.h" #include "inc/fmod.hpp" #include <stdlib.h> #include <unistd.h> #include <android/log.h> #define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"renzhenming",FORMAT,##__VA_ARGS__) #define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"renzhenming",FORMAT,##__VA_ARGS__) #define MODE_NORMAL 0 #define MODE_LUOLI 1 #define MODE_DASHU 2 #define MODE_JINGSONG 3 #define MODE_GAOGUAI 4 #define MODE_KONGLING 5 using namespace FMOD; JNIEXPORT void JNICALL Java_org_fmod_example_EffectUtils_fix (JNIEnv *env, jclass jcls, jstring path_jstr, jint type){ System *system; FMOD_RESULT result; Sound *sound; Channel *channel; DSP *dsp; float frequency = 0; bool isPlaying = true; const char *media_path = env->GetStringUTFChars(path_jstr,NULL); try { //初始化 result = System_Create(&system); result = system->init(32, FMOD_INIT_NORMAL, NULL); //创建声音 //这里进坑了,写作下边的样子是无法播放的,正确的方式是第二行 因为sound如果是null,那么,播放的时候的sound也就是null,怎么播放呢 //result = system->createSound(media_path, FMOD_DEFAULT, 0, NULL); LOGI("%s",media_path); system->createSound(media_path, FMOD_DEFAULT, NULL, &sound); switch(type){ case MODE_NORMAL: //原生播放 result = system->playSound(sound, 0, false, &channel); break; case MODE_LUOLI: //dsp -- 音效 //FMOD_DSP_TYPE_PITCHSHIFT 提升或者降低音调用的一种音效 system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp); //设置音调的参数 dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,2); //播放(播放和添加channel的顺序必须是先播放,再添加,否则音效无法生效) //猜测原因 //playSound之后并不是立即播放,而是在system->update();之后开始播放, //playSound的作用是创造了一个sound载体一个channel载体,然后在这个载体基础上添加一系列的效果,所以,只能现有载体 //效果才有放置的位置,所以需要先play再添加 result = system->playSound(sound, 0, false, &channel); //添加到channel channel->addDSP(0,dsp); break; case MODE_DASHU: //dsp -- 音效 //FMOD_DSP_TYPE_PITCHSHIFT 提升或者降低音调用的一种音效 system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp); //设置音调的参数 dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.6); //播放(播放和添加channel的顺序必须是先播放,再添加,否则音效无法生效) result = system->playSound(sound, 0, false, &channel); //添加到channel channel->addDSP(0,dsp); break; case MODE_GAOGUAI: //提高说话的速度 result = system->playSound(sound, 0, false, &channel); channel->getFrequency(&frequency);\ frequency = frequency*1.5; channel->setFrequency(frequency); break; case MODE_KONGLING: system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp); dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,300); dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,2); result = system->playSound(sound, 0, false, &channel); channel->addDSP(0,dsp); break; case MODE_JINGSONG: //紧张 system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp); dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW,0.5); result = system->playSound(sound, 0, false, &channel); channel->addDSP(0,dsp); break; default: break; } while(isPlaying){ channel->isPlaying(&isPlaying); //<unistd.h> //单位微秒,不断的睡眠保证声音播放完成之后再释放资源 usleep(1000*1000); } LOGI("%s","播放完成"); system->update(); } catch(...){ LOGE("%s","发生异常"); goto end; } goto end; end: env->ReleaseStringUTFChars(path_jstr,media_path); result = sound->release(); system->close(); system->release(); } QQActivity.java package org.fmod.example; import java.io.File; import com.renzhenming.qq_voice.R; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; public class QQActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); org.fmod.FMOD.init(this); setContentView(R.layout.activity_main); } public void mFix(View view){ String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + "singing.wav"; Log.d("renzhenming", path); switch (view.getId()) { case R.id.btn_record: EffectUtils.fix(path, EffectUtils.MODE_NORMAL); Log.d("renzhenming", "MODE_NORMAL"); break; case R.id.btn_luoli: EffectUtils.fix(path, EffectUtils.MODE_LUOLI); Log.d("renzhenming", "MODE_LUOLI"); break; case R.id.btn_dashu: EffectUtils.fix(path, EffectUtils.MODE_DASHU); Log.d("renzhenming", "MODE_DASHU"); break; case R.id.btn_jingsong: EffectUtils.fix(path, EffectUtils.MODE_JINGSONG); break; case R.id.btn_gaoguai: EffectUtils.fix(path, EffectUtils.MODE_GAOGUAI); break; case R.id.btn_kongling: EffectUtils.fix(path, EffectUtils.MODE_KONGLING); break; default: break; } } @Override protected void onDestroy(){ org.fmod.FMOD.close(); super.onDestroy(); } } EffectUtils.java package org.fmod.example; public class EffectUtils { //音效的类型 public static final int MODE_NORMAL = 0; public static final int MODE_LUOLI = 1; public static final int MODE_DASHU = 2; public static final int MODE_JINGSONG = 3; public static final int MODE_GAOGUAI = 4; public static final int MODE_KONGLING = 5; /** * 音效处理 * @param path * @param type */ public native static void fix(String path,int type); static{ System.loadLibrary("fmodL"); System.loadLibrary("fmod"); System.loadLibrary("qq_voice"); } } 程序运行界面 18404062.png

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

用C#开发较完整的Windows任务管理器

这个代码没有什么技术含量,仅仅使用 WMI 和 API 实现了 Windows 任务管理器的部分功能。但代码里面封装了一个 SystemInfo 的类,它提供了一些方法,可以获取以下系统信息:CPU个数,CPU占用率可用内存,物理内存分区信息进程列表,结束指定进程根据物理地址获取 IP 地址,根据 IP 地址获取物理地址获取网络信息查找所有应用程序标题源代码:/Files/lemony/SystemInfo.rar注:关于获取网络信息的方法可以参考文章:http://www.cnblogs.com/lemony/archive/2007/03/29/692967.html,然而后来我发现其实 WMI 也能实现这个功能,只是我懒得改而已^_^。

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

20.Eclipse下Ndk开发(pthread开启线程调用Java方法)

本项目最终的目的是在pthread线程中,调用Java一个工具类得到多个uuid,然后调用类中另一个方法弹出toast,实现在c中获取安卓上下文对象Context 编译native方法,生成头文件的一系列过程不再赘述,直接上代码,都在注释中 PosixUtils: package com.example.ndk_pthread; public class PosixUtils { static{ System.loadLibrary("ndk_pthread"); } /** * pthread开启子线程前的一些初始化操作,比如获取本类的jclass对象,生成需要的 * 全局引用等等,在子线程中无法获取到类的jclass对象,就是这行代码,获取class必须要在主线程中 * jclass uuidutils_class_tmp = (*env)->FindClass(env,"com/example/ndk_pthread/UUIDUtils"); */ public native void init(); /** * 执行一些善后的操作,比如init方法中生成的全局引用的销毁等等 */ public native void destroy(); /** * 子线程操作 */ public native void pthread(); } UUIDUtils: package com.example.ndk_pthread; import java.util.UUID; import android.content.Context; import android.widget.Toast; public class UUIDUtils { public static String get(){ return UUID.randomUUID().toString(); } public static void showToast(Context context){ Toast.makeText(context, "c端弹出了toast", 0).show(); } } 编译生成的头文件com_example_ndk_pthread_UUIDUtils.h: package com.example.ndk_pthread; import java.util.UUID; import android.content.Context; import android.widget.Toast; public class UUIDUtils { public static String get(){ return UUID.randomUUID().toString(); } public static void showToast(Context context){ Toast.makeText(context, "c端弹出了toast", 0).show(); } } MainActivity: package com.example.ndk_pthread; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { private PosixUtils p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); p = new PosixUtils(); p.init(); } public void start(View btn){ p.pthread(); } @Override protected void onDestroy() { super.onDestroy(); //页面销毁时同时销毁c端的一些东西 p.destroy(); } } ndk_pthread.c #include "com_example_ndk_pthread_PosixUtils.h" #include <stdio.h> #include <pthread.h> #include <android/log.h> #include <unistd.h> #define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"renzhenming",FORMAT,##__VA_ARGS__); #define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"renzhenming",FORMAT,##__VA_ARGS__); JavaVM *javaVM; jobject uuidutils_jcls; jmethodID get_mid; jmethodID toastId; jobject jcontext; //动态库加载时会被调用执行,不需要我们手动调用 //兼容Android SDK 2.2之后,2.2没有这个函数 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){ LOGI("%s","JNI_OnLoad"); javaVM = vm; return JNI_VERSION_1_4; } /** * 目标:调用UUIDUtils类中的方法得到一个uuid */ void thread_fun(void* arg){ //得到这个类UUIDUtils,需要用到JNIEnv,但是这是一个子线程,每个线程都有独立的JNIEnv,所以我们需要获取到 //这个线程的JNIEnv,通过JavaVM关联当前线程,获取当前线程的JNIEnv,(*javaVM)->AttachCurrentThread(javaVM,&env,NULL); //那么就需要先获取到JavaVM //如何获取JavaVM? //1.在JNI_OnLoad函数中获取 //2.(*env)->GetJavaVM(env,&javaVM); //的到JavaVM后,会得到env并赋值给变量 JNIEnv* env = NULL; (*javaVM)->AttachCurrentThread(javaVM,&env,NULL); char* no = (char*)arg; int i; for (i = 0; i < 5; ++i) { LOGI("thread %s, i:%d",no,i); jobject uuid = (*env)->CallStaticObjectMethod(env,uuidutils_jcls,get_mid); char* uuid_char = (*env)->GetStringUTFChars(env,uuid,NULL); LOGI("%s",uuid_char); if(i == 4){ goto end; } (*env)->ReleaseStringUTFChars(env,uuid,uuid_char); sleep(1); } end: //如果直接将这两行写在循环之后是有问题的,当i=4的时候,线程直接退出,导致没有执行DetachCurrentThread,报异常 (*javaVM)->DetachCurrentThread(javaVM); pthread_exit((void*)0); } /** * 当在JNI调用Android自带的类时,经常需要传入Context参数,那怎么在JNI层获取Context呢? * 我们知道Application和Activity是Context的子类,由于每个Activity对应的Context是不一样的, * 所以一般情况下我们使用Application的Context,它在整个程序中只有一个实例。所以现在问题就变成了 * 怎么在JNI中获取Application呢? * Android APP在启动时会创建一个Activity Thread作为主线程,只要程序存活,这个线程就一直存在, * 所以我们可以考虑从Activity Thread中获取Application,查看Activity Thread的源码发现, * 它提供了一个方法可以获取Application,如下: * * public Application getApplication() { * return mInitialApplication; * } * * 也就是说我们只需要获取到Activity Thread的对象即可,Activity Thread提供了一个静态方法用于获取其实例,如下: * * public static ActivityThread currentActivityThread() { * return sCurrentActivityThread; * } * * 至此获取Context的步骤已经很清晰了 */ JNIEXPORT void JNICALL Java_com_example_ndk_1pthread_PosixUtils_init (JNIEnv *env, jobject jobj){ /** * 打印uuid */ //获取class必须要在主线程中 jclass uuidutils_class_tmp = (*env)->FindClass(env,"com/example/ndk_pthread/UUIDUtils"); //创建全局引用 uuidutils_jcls = (*env)->NewGlobalRef(env,uuidutils_class_tmp); //获取jmethodId也可以在子线程中 get_mid = (*env)->GetStaticMethodID(env,uuidutils_jcls,"get","()Ljava/lang/String;"); /** * show toast */ //获取jmethodId也可以在子线程中 toastId = (*env)->GetStaticMethodID(env,uuidutils_jcls,"showToast","(Landroid/content/Context;)V"); //获取Activity Thread的实例对象 jclass activityThread = (*env)->FindClass(env,"android/app/ActivityThread"); jmethodID currentActivityThread = (*env)->GetStaticMethodID(env,activityThread, "currentActivityThread", "()Landroid/app/ActivityThread;"); jobject at = (*env)->CallStaticObjectMethod(env,activityThread, currentActivityThread); //获取Application,也就是全局的Context jmethodID getApplication = (*env)->GetMethodID(env,activityThread, "getApplication", "()Landroid/app/Application;"); jobject context = (*env)->CallObjectMethod(env,at, getApplication); jcontext = (*env)->NewGlobalRef(env,context); } JNIEXPORT void JNICALL Java_com_example_ndk_1pthread_PosixUtils_destroy (JNIEnv *env, jobject jobj){ //释放全局引用 (*env)->DeleteGlobalRef(env,uuidutils_jcls); } JNIEXPORT void JNICALL Java_com_example_ndk_1pthread_PosixUtils_pthread (JNIEnv *env, jobject jobj){ LOGI("%s","begin"); //获取JavaVM的第一种方式,本项目中我们采用在JNI_OnLoad中获取的方式 //(*env)->GetJavaVM(env,&javaVM); pthread_t tid; pthread_create(&tid,NULL,thread_fun,(void*)"NO1"); //调用Java函数show toast (*env)->CallStaticVoidMethod(env,uuidutils_jcls,toastId,jcontext); } Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndk_pthread LOCAL_SRC_FILES := ndk_pthread.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册