Learn Python 3 :Flask Web开发小记

最近看了Flask Web开发:基于Python的Web应用开发实战,书中详细介绍了Web程序的开发、测试、部署过程,值得一读!我在书中例子的基础上做了些更改,实现了一个简单的个人博客:NiceBlog,仅作为个人学习,还有许多不足的地方待完善,这里做一些简单的记录,方便以后查阅,代码放在了Github上:https://github.com/SheHuan/NiceBlog。

一、功能

1、对于普通用户,主要有如下功能:

  • 注册、登录、重置密码(邮箱验证)
  • 文章列表、详情
  • 评论
  • 喜欢

2、对于管理员,除了有普通用户的功能,主要有如下功能:

  • 写文章(Markdown编辑)
  • 用户权限管理(管理喜欢、评论的权限)
  • 评论管理(删除、屏蔽)

3、为移动端提供相关api接口

二、项目结构

遵循了书中多文件Flask程序的基本结构,下边是NiceBlog的项目结构:
|-NiceBlog
   |-app/ 主目录
      |-api/ 为移动端提供接口的蓝本
      |-auth/ 权限认证的蓝本
      |-main/ 主体功能的蓝本
      |-manage/ 管理相关功能的蓝本
      |-static/ 静态资源目录(icon、js、css)
      |-templates/ html模板目录
      |-__init__.py 初始化项目的工厂函数
      |-decorators.py 自定义的装饰器
      |-email.py 发送邮件功能
      |-excepitions.py 自定义异常处理
      |-models.py 数据模型
   |-migrations/ 数据库迁移脚本目录
   |-nb_env/ 虚拟环境
   |-tests/ 单元测试目录
   |-config.py 配置文件
   |-manage.py 启动程序以及其他的程序任务
   |-requirements.txt 项目的依赖包列表

三、实现

1、工厂函数

一个简单的Flask Web程序可以写在单文件中,test.py

app = Flask(__name__)

# 定义的路由
@app.route('/')
def index():
    return '

Hello World!

' if __name__ == '__main__': app.run()

但是执行程序时,由于在全局作用域创建导致无法动态修改配置,也导致了单元测试时无法在不同配置环境运行程序。所以可以把程序的创建转移到可显示调用的工厂函数中,也就是前边项目结构中的__init__.py,在工厂函数中导入需要的Flask扩展:

def create_app(config_name):
    app = Flask(__name__)
    # 导致指定的配置对象
    app.config.from_object(config[config_name])
    # 调用config.py的init_app()
    config[config_name].init_app(app)

    # 初始化扩展
    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    pagedown.init_app(app)
    return app

2、蓝本

新的问题来了,使用工厂函数后,程序在运行时创建,而不是在全局作用域,必须等到执行create_app()后才能使用@app.route()装饰器,这时就要使用蓝本了,在蓝本中也可以定义路由,但是定义的路由处于休眠状态直到蓝本注册到程序后在成为程序一部分,例如main蓝本的目录结构如下:
|-NiceBlog
   |-app/ 主目录
      |-main/ 主体功能的蓝本
         |-__init__.py 创建蓝本
         |-errors.py 蓝本的错误处理
         |-forms.py 蓝本的表单
         |-views.py 蓝本的路由

首先看一下__init__.py

# 两个参数分别指定蓝本的名字、蓝本所在的包或模块(使用 __name__即可)
main = Blueprint('main', __name__)
# 导入路由模块、错误处理模块,将其和蓝本关联起来
# 在蓝本的末尾导入在两个模块里还要导入蓝本,防止循环导入依赖
from app.main import views, errors
2.1、表单

forms.py是当前蓝本中的表单,项目中使用了FlaskForm,可以方便的完成表单校验,例如创建、编辑文章的表单:

class BlogForm(FlaskForm):
    title = StringField('请输入文章标题', validators=[DataRequired(), Length(1, 128)])
    labels = StringField('文章标签(标签之间用空格隔开)', validators=[DataRequired()])
    summary = TextAreaField('文章概要', validators=[DataRequired()])
    content = TextAreaField('文章内容', validators=[DataRequired()])
    preview = TextAreaField('文章预览', validators=[DataRequired()])
    publish = SubmitField('发布')
    save = SubmitField('保存')
2.2、路由

views.py就是在蓝本中定义的路由,例如主页的路由:

@main.route('/create-blog', methods=['GET', 'POST'])
@admin_required
def create_blog():
    """
    写新文章
    """
    form = BlogForm()
    if form.validate_on_submit():
        blog = None
        if form.publish.data:
            # 发布
        elif form.save.data:
            # 保存草稿
        return redirect(url_for('main.index'))
    return render_template('markdown_editor.html', form=form, type='create')

注意装饰器为当前蓝本的名字main,而不是之前的appcreate_blog()称为视图函数,一个路由保存了URL到视图函数的映射关系。redirect(url_for('main.index'))代表重定向到主页,url_for()的参数为要跳转到的URL对应的视图函数名,但需要加上视图函数所在的蓝本名,即main.indexrender_template()是Flask提供的函数,把Jinja2模板引擎集成到了程序中,第一个参数是模板名称对应一个html文件,即执行该视图函数后最终要渲染的页面,后边的参数为传递给模板的参数。

2.3、错误处理

errors.py是蓝本中的错误处理程序,例如:

@main.app_errorhandler(404)
def page_not_found(e):
    if request.url.find('api') != -1:
        return jsonify({'error': '请求的资源不存在', 'code': '404', 'data': ''})
    return render_template('error/404.html'), 404

如果使用@main.errorhandler装饰器只有当前蓝本的错误才能触发,为了使其它错误也能触发所以使用了@main.app_errorhandler装饰器

2.4、注册蓝本

其它蓝本的定义也类似,最后需要在工厂函数中重注册蓝本,例如:

def create_app(config_name):
    # ......
    # 注册main蓝本
    from app.main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    # 注册auth蓝本
    from app.auth import auth as auth_blueprint
    # 使用url_prefix注册后,蓝本中定义的所有路由都会加上指定前缀,/login --> /auth/login
    app.register_blueprint(auth_blueprint, url_prefix='/auth')

    return app

3、前端

3.1、Jinja2

Flask使用Jinja2作为模板引擎,模板是一个包含响应文本的HTML文件,其中包含只有在请求的上下文才知道的动态占位变量。默认情况下,模板保存在templates目录。

Jinja2模板中{{ 变量名 }}代表一个变量(注意变量名两边有一个空格,可以识别任意类型的变量),从渲染模板时使用的数据中获取。如果变量的值是HTML,由于转义的原因导致浏览器不能正常显示HTML代码,所以需要使用safe过滤器,例如文章详情的HTML显示就需要这样处理,过滤器写在变量名后用竖线隔开{{ 变量名|过滤器名 }}

Jinja2中用{% 控制语句 %}代表控制结构来改变模板的渲染流程,例如:

# 条件控制
{% if xxx %}
    

Android

{% else %}

iOS

{% endif %}
# for循环
{% for x in xs %}
    
  • {{ x }}
  • {% endfor %}
    # 导入
    {% import 'xxx.html' %}
    
    # 包含
    {% include 'xxx.html' %}
    

    导入、包含的目的都是为了复用,还可以通过继承实现复用,类似于类的继承:

    # 继承
    {% extends "base.html" %}
    

    通过继承,模板中重复的代码都可以写在父模板里,例如导航条和页面底部footer就可以放在父模板里。

    3.2、Bootstrap

    前端使用了Bootstrap框架,它提供了良好的CSS规范,可以帮助我们更好的美化界面,具体的可参考:
    https://v3.bootcss.com/,要在项目中集成它可以使用Flask的Flask-Bootstrap扩展,直接在PyCharm安装,并在工厂函数中初始化,还要让项目的父模板继承Bootstrap的基类模板:

    # common_base.html
    {% extends "bootstrap/base.html" %}
    

    Bootstrap的基类模板base.html提供了一个网页框架,包含了Bootstrap中的所有CSS和JS文件。除此之外基类模板还定义了许多可在其子类模板中重定义的块,使用格式如下:

    {% block 块名称 %}
    {% endblock %}
    

    常用的块如下:

    块名称 含义
    head 标签中的内容
    title 标签中的内容</td> </tr> <tr> <td>body</td> <td><body>标签中的内容</td> </tr> <tr> <td>styles</td> <td>css样式单的定义</td> </tr> <tr> <td>navbar</td> <td>自定义的导航条</td> </tr> <tr> <td>content</td> <td>自定义的页面内容</td> </tr> <tr> <td>page_content</td> <td>定义content在内部</td> </tr> <tr> <td>scripts</td> <td>JS声明,一般在模板尾部</td> </tr> </tbody> </table> <p>注意如在子模板在模板已有的块中添加新内容,需要使用<code>super()</code>函数:</p> <pre><code>{% block scripts %} {{ super() }} <!-- 新加的内容 --> {% endblock %} </code></pre> <h5>3.3、Flask-WTF</h5> <p>在<strong>2.1</strong>中我们已经看到了用<code>Flask-WTF</code>定义表单的方式,即自定义的表单类继承<code>FlaskForm</code>类,并添加需要的类变量,<code>Flask-WTF</code>定义了许多标准字段可以被渲染成指定的表单类HTML标签,例如:</p> <table> <thead> <tr> <th>字段名</th> <th>对应的H5标签</th> </tr> </thead> <tbody> <tr> <td>StringField</td> <td>文本框</td> </tr> <tr> <td>TextAreaField</td> <td>多行文本框</td> </tr> <tr> <td>PasswordField</td> <td>密码输入框</td> </tr> <tr> <td>BooleanField</td> <td>复选框</td> </tr> <tr> <td>SubmitField</td> <td>表单提交按钮</td> </tr> </tbody> </table> <p>同时<code>Flask-WTF</code>还提供了许多常用的表单校验函数,例如:<code>Email()</code>、<code>EqualTo()</code>、<code>DataRequired()</code>、<code>Length()</code>等等,当点击提交按钮时,会自动校验表单是否满足预定义的条件。</p> <p>在<strong>2.2</strong>中,我们通过参数把表单类的实例同步<code>form</code>参数传入模板:</p> <pre><code>render_template('markdown_editor.html', form=form, type='create') </code></pre> <p>在模板中可以通过如下方式生表单(只保留了部分核心代码):</p> <pre><code class="html"><form method="post" role="form" class="height-full"> {{ form.hidden_tag() }} {{ form.title(id="title", class="form-control editor-blog-title", placeholder=form.title.label.text) }} {{ form.labels(class="form-control editor-blog-area", placeholder=form.labels.label.text) }} {{ form.summary(class="form-control editor-blog-area", placeholder=form.summary.label.text, rows=3) }} {{ form.publish(class="btn btn-info") }} {{ form.save(class="btn btn-success") }} </form> </code></pre> <p>这样的好处是我们能自定义表单的样式等等,但是工作量蛮大的,如果对表单样式没有特殊的需求,Bootstrap中的表单样式可以满足需求,可以通过<code>Flask-Bootstrap</code>提供的辅助函数快速的渲染表单,只需要如下两步:</p> <pre><code class="html">{% import "bootstrap/wtf.html" as wtf %} {{ wtf.quick_form(form) }} </code></pre> <p>例如登录的H5模板就是这样做的。<br> <code>form.hidden_tag()</code> 模板参数将被替换为一个隐藏字段,用来实现在配置中激活的 <strong>CSRF</strong> 保护。如果你已经激活了CSRF,这个字段需要出现在你所有的表单中。</p> <p>在<strong>2.2</strong>中,如果点击表单提交按钮,所有的表单都能成功通过校验,则<code>form.validate_on_submit()</code>的值为<code>True</code>,否则校验失败,网页会出现对应提示。如果有两个提交按钮,那么在校验成功后,还需要判断点击的是哪个按钮,否则所有的按钮都执行了同一个操作。例如我们的文章发布和保存按钮,当表单类中的按钮字段的<code>data</code>属性为<code>True</code>则代表该按钮被点击,例如:</p> <pre><code class="python">if form.publish.data: # 发布 elif form.save.data: # 保存草稿 </code></pre> <h5>3.4、jQuery</h5> <p>有些页面需要在相关操作后修改控件的CSS样式,例如文章详情的<strong>喜欢</strong>和<strong>取消喜欢</strong>按钮,最简单的方式是操作成功后直接刷新整个页面,但这样体验并不好,更好的方式是局部刷新。这里直接使用jQuery(Bootstrap也提供了类似的操作,同时包含了jQuery,不需要单独导入jQuery)来实现。使用<code>jQuery</code>强大的选择器功能可以方便的得到要操作的<code>DOM节点</code>,按钮的点击也是发起一个请求,<code>jQuery</code>也集成了<code>ajax</code>,可以方便的处理请求,在请求完成后根据响应结果来更改<code>DOM节点</code>的样式。看下按钮的点击事件:</p> <pre><code>favourite = function (id) { if ($('.blog-favourite-btn').length > 0) {//取消喜欢 $.get('/manage/blog/cancel_favourite', { id: id }).done(function (data) { $('.blog-favourite-btn span').removeClass('glyphicon-heart').addClass('glyphicon-heart-empty'); $('.blog-favourite-btn').removeClass('blog-favourite-btn').addClass('blog-unfavourite-btn'); }) } else if ($('.blog-unfavourite-btn').length > 0) {//喜欢 $.get('/manage/blog/favourite', { id: id }).done(function (data) { if ('200' === data) { $('.blog-unfavourite-btn span').removeClass('glyphicon-heart-empty').addClass('glyphicon-heart'); $('.blog-unfavourite-btn').removeClass('blog-unfavourite-btn').addClass('blog-favourite-btn'); } if ('403' === data) { alert('没有操作权限'); } }) } } </code></pre> <h4>4、Markdown</h4> <p>书中使用的是<code>Flask-PageDown</code>、<code>Markdown</code>两个库来实现对<strong>Markdown</strong>功能的支持,但是不够理想,有些Markdown语法并不能很好的支持,例如<code>Flask-PageDown</code>实时预览时并不支持代码块和表格等。最后使用了marked这个库,它是一个全功能的Markdown解析器和编译器,用JavaScript编写,构建速度快,其实就是实时将用Markdown语法编辑的内容转换成对应的HTML预览,但是没有CSS样式的HTML还是有点丑,github-markdown-css是一个不错的选择,可以帮助我们实现github风格的Markdwon预览。既然是要编辑文章那么直接使用HTML里的<code><textarea></code>肯定难以实现理想的效果,这里使用了ace,它是一个用JavaScript编写的独立代码编辑器,下载<code>ace-builds/arc-min</code>即可。核心的帮助工具就这些了,接下来就是把他们组合起来,首先看HTML界面主要有编辑和预览两部分:</p> <pre><code><!--编辑--> <div class="col-md-6 markdown-panel"> <div id="markdown-edit"></div> </div> <!--预览--> <div class="col-md-6 markdown-panel"> <div id="markdown-preview" class="markdown-body"></div> </div> </code></pre> <p>接下来就是编辑器的初始化了:</p> <pre><code><script> //编辑器配置 var ace_edit = ace.edit('markdown-edit'); ace_edit.setTheme('ace/theme/chrome'); ace_edit.getSession().setMode('ace/mode/markdown'); ace_edit.renderer.setShowPrintMargin(false); //字体大小 ace_edit.setFontSize(15); //自动换行 ace_edit.setOption('wrap', 'free'); $("#markdown-edit").keyup(function () { // 实现Markdown到HTML的预览 $("#preview").text(marked(ace_edit.getValue())); }); </script> </code></pre> <p>更多细节可参考markdown_editor.html,看一下效果:<br> </p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 373px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/fc71a2d1589b4b10af2386c8a2191672.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/fc71a2d1589b4b10af2386c8a2191672.jpg" width="650" height="347" alt="Learn Python 3 :Flask Web开发小记_第1张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> Markdwon </div> </div> <p></p> <h4>5、数据库</h4> <p>数据库使用的是<code>MySql</code>,同时使用了<code>ORM</code>框架<code>SQLAlchemy</code>把关系数据库的表结构映射到对象上,来简化数据库的操作,Flask有一个<code>Flask-SQLAlchemy</code>扩展可以方便的在程序中使用<code>SQLAlchemy</code>,首先需要指定数据库URL,这一步在<code>config.py</code>完成:</p> <pre><code>SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/niceblog_dev' </code></pre> <p>然后在工厂函数完成配置。之后就是定义数据模型了,项目中一共定义了6个数据模型:<code>User</code>、<code>Role</code>、<code>Blog</code>、<code>Comment</code>、<code>Favourite</code>、<code>Label</code>,都继承<code>db.Model</code>,在数据模型中指定表名称、列名称等信息,例如保存文章信息的<code>Blog</code>:</p> <pre><code class="python">class Blog(db.Model): """ 博客数据Model """ __tablename__ = 'blogs' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(128)) summary = db.Column(db.Text) content = db.Column(db.Text) content_html = db.Column(db.Text) # 发布日期 publish_date = db.Column(db.DateTime, index=True) # 最后的编辑日期 edit_date = db.Column(db.DateTime, index=True) # 外键,和User表对应 user_id = db.Column(db.Integer, db.ForeignKey('users.id')) # 是否是草稿 draft = db.Column(db.Boolean) # 是否禁用评论 disable_comment = db.Column(db.Boolean, default=False) # 被浏览的次数 views = db.Column(db.Integer, default=0) comments = db.relationship('Comment', backref='blog', lazy='dynamic') favourites = db.relationship('Favourite', backref='blog', lazy='dynamic') </code></pre> <p>配置好了数据库、定义好了数据模型,就可以通过如下命令来操作数据库了:</p> <ul> <li> <code>db.create_all()</code>:创建表</li> <li> <code>db.session.add()</code>:插入行、修改行,最后需要执行<code>db.session.commit()</code> </li> <li> <code>db.session.delete()</code>:删除行,最后需要执行<code>db.session.commit()</code> </li> <li> <code>数据模型名.query().查询过滤器.查询执行函数</code>:查询行</li> </ul> <p>常用的查询过滤器有:<code>filter()</code>、<code>filter_by()</code>、<code>limit</code>、<code>offset()</code>、<code>order_by()</code>、<code>group_by()</code><br> 常用的查询执行函数有:<code>all()</code>、<code>first()</code>、<code>first_or_404()</code>、<code>get()</code>、<code>get_or_404()</code>、<code>count()</code>、<code>paginate()</code></p> <p>如果在shell中操作数据库,每次都要导入数据库实例和数据模型,如何避免这个问题呢?由于项目使用了<code>Flask-Script</code>命令行解释器,支持自定义命令,可以让<code>Flask-Script</code>的shell命令自动导入特定对象即可:</p> <pre><code class="python">def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role, Blog=Blog, Comment=Comment, Favourite=Favourite, Label=Label, Permission=Permission) manager.add_command('shell', Shell(make_context=make_shell_context)) </code></pre> <p>开发中修改数据模型是不可避免的,为了不发生删表重建导致数据丢失的问题,我们需要使用<code>数据库迁移框架</code>,增量式的把数据模型的改变应用到数据库中,我们可以直接使用<code>Flask-Migrate</code>来完成,在<code>Flask-Script</code>集成数据库迁移功能:</p> <pre><code class="python">migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) </code></pre> <p>数据库迁移只要有如下三个命令:</p> <ol> <li> <code>python manage.py db init</code>:创建迁移仓库,初始执行一次即可</li> <li> <code>python manage.py db migrate --message "initial migration"</code>:创建迁移脚本</li> <li> <code>python manage.py db upgrade</code>:更新数据库</li> </ol> <p>每次修改数据模型后需要更新数据库时执行命令2、3即可。</p> <h4>6、接口开发</h4> <p>api蓝本的目录结构如下:<br> <strong>|-NiceBlog</strong><br> <strong>   |-app/</strong> 主目录<br> <strong>      |-api/</strong> 为移动端提供接口的蓝本<br> <strong>         |-__init__.py</strong> 创建蓝本<br> <strong>         |-authentication.py</strong> 登录、注册、token检验<br> <strong>         |-blogs.py</strong> 文章列表、详情的接口<br> <strong>         |-comments.py</strong> 评论相关接口<br> <strong>         |-decorators.py</strong> 自定义装饰器<br> <strong>         |-favourites.py</strong> 喜欢操作相关的接口<br> <strong>         |-labels.py</strong> 文章分类标签接口<br> <strong>         |-responses.py</strong> 帮助返回JSON数据</p> <p><strong>Flask</strong>提供的<code>jsonify()</code>函数可以方便的把一个字典转换成JSON串返,例如返回文章分类标签的路由可以这么写:</p> <pre><code class="python">@api.route('/labels/') def get_labels(): labels = Label.query.all() data = {'labels': [label.to_json() for label in labels]} return jsonify({'error': '', 'code': '200', 'data': data}) </code></pre> <p><code>to_json()</code>方法是数据模型中<code>Label</code>类的方法,完成数据模型到JSON格式化的序列化字典转换:</p> <pre><code class="python"> def to_json(self): json_label = { 'id': self.id, 'name': self.name, } return json_label </code></pre> <p>为了保证接口有一定的安全性,不被随意访问,除了登录、注册、以及文章预览的html页面外其他接口都需要一个<strong>token</strong>参数,token可以在登录后得到,token过期后需要重新请求。由于要对请求携带的token参数校验,可以定义一个<code>before_request</code>钩子,在每次请求前统一完成token的校验:</p> <pre><code>@api.before_request def before_request(): url = request.url if url.find('login') == -1 and url.find('register') == -1 and url.find('preview') == -1: token = request.args.get('token') if token is None: return unauthorized('token缺失') user = User.verify_auth_token(token) if user is None: return forbidden('token过期,请重新登录') else: # g是程序上下文,用作临时存储对象, # 保存当前的请求对应的user,每次请求都会更新 g.current_user = user </code></pre> <p>测试接口可以使用<strong>HTTPie</strong>,通过<strong>PyCharm</strong>在虚拟环境安装HTTPie后,启动Web服务,windows下通过cmd进入虚拟环境目录,执行<code>Scripts\activate</code>激活虚拟环境(退出虚拟环境执行<code>deactivate</code>):<br> </p> <div class="image-package"> <div class="image-container" style="max-width: 221px; max-height: 33px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/dfd77d15131d4706924b829a4605e60d.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/dfd77d15131d4706924b829a4605e60d.png" width="221" height="33"></a> </div> </div> <div class="image-caption"> 激活虚拟环境 </div> </div> <br> 执行登录请求,命令如下: <p></p> <pre><code>http POST http://127.0.0.1:5000/api/login/ email==shehuan320@163.com password==123456 </code></pre> <p>响应如下:</p> <br> <div class="image-package"> <div class="image-container" style="max-width: 644px; max-height: 354px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/e5f62791120e43c48e753261737d3be2.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/e5f62791120e43c48e753261737d3be2.png" width="644" height="354" alt="Learn Python 3 :Flask Web开发小记_第2张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> 登录 </div> </div> <p>使用登录的得到的token请求文章分类标签接口:</p> <pre><code>http GET http://127.0.0.1:5000/api/labels/ token==eyJhbGciOiJIUzI1NiIsImlhdCI6MTUxODEzOTQwNiwiZXhwIjoxNTE4NzQ0MjA2fQ.eyJpZCI6MX0.EujL1Pb4lg20Bb2QWngop1N79os0LdFWniA8bL4JQHo </code></pre> <p>响应如下:</p> <br> <div class="image-package"> <div class="image-container" style="max-width: 644px; max-height: 596px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/cbd13cc0d451431c962dbeb2c4f8424b.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/cbd13cc0d451431c962dbeb2c4f8424b.png" width="644" height="596" alt="Learn Python 3 :Flask Web开发小记_第3张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> 文章分类标签 </div> </div> <h3>四、安装</h3> <p>以下的安装步骤是基于Windows环境的!</p> <ol> <li>从Guthub clone NiceBlog到本地</li> <li>安装Python 3 的开发环境</li> <li>安装PyCharm开发工具,导入项目,建议使用虚拟环境,可直接在 PyCharm 中创建一个虚拟环境,或者使用命令行创建。</li> <li>在虚拟环境中安装<code>requestments.txt</code>中的扩展包,直接在 PyCharm 的 Terminal 执行如下命令:<br> <code>pip install -r requirements.txt</code> </li> <li>安装MySql,创建数据库,并在<code>config.py</code>中替换为自己创建的数据名,并修改用户名和密码</li> <li>在 Terminal 执行<code>python manage.py shell</code>切换到 shell 环境,再执行<code>db.create_all()</code>创建数据表</li> <li>由于注册账号使用了qq邮箱验证,请在<code>config.py</code>中替换自己的qq邮箱和授权登录密码,并更改管理员邮箱为自己的邮箱。</li> <li>执行<code>exit()</code>退出 shell 环境,再执行<code>python manage.py runserver</code>就可以启动 Web 服务了,默认运行在<code>http://127.0.0.0.1:5000</code>。</li> <li>在浏览器访问<code>http://127.0.0.0.1:5000</code>,你就可以进行注册账号,创建文章等操作了,希望一切顺利吧!</li> </ol> <p>最后附上几张截图:</p> <table> <thead> <tr> <th> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 594px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/fa792ed012184aae83d79a1786320c89.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/fa792ed012184aae83d79a1786320c89.jpg" width="650" height="552" alt="Learn Python 3 :Flask Web开发小记_第4张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></th> <th> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 633px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/c48bc874a535450a92a386f7f904aa62.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/c48bc874a535450a92a386f7f904aa62.jpg" width="650" height="589" alt="Learn Python 3 :Flask Web开发小记_第5张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></th> </tr> </thead> <tbody> <tr> <td> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 535px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/1f2ec5e65b4d4f1a940538117fe5d914.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/1f2ec5e65b4d4f1a940538117fe5d914.jpg" width="650" height="497" alt="Learn Python 3 :Flask Web开发小记_第6张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></td> <td> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 354px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/3c551fca6cea490a8f587e856ed63afc.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/3c551fca6cea490a8f587e856ed63afc.jpg" width="650" height="194" alt="Learn Python 3 :Flask Web开发小记_第7张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></td> </tr> </tbody> </table> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1242911823531986944"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Learn Python 3 :Flask Web开发小记)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950233451282100224.htm" title="python 读excel每行替换_Python脚本操作Excel实现批量替换功能" target="_blank">python 读excel每行替换_Python脚本操作Excel实现批量替换功能</a> <span class="text-muted">weixin_39646695</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%AF%BBexcel%E6%AF%8F%E8%A1%8C%E6%9B%BF%E6%8D%A2/1.htm">读excel每行替换</a> <div>Python脚本操作Excel实现批量替换功能大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet,Cell这三个最根本的元素~明确需求原始excel如下我们的目标是把下面excel工作表的sheet1表页A列的内容“替换我吧”批量替换为B列的“我用来替换的</div> </li> <li><a href="/article/1950232782412247040.htm" title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a> <span class="text-muted">懒cici</span> <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div> </li> <li><a href="/article/1950232316408295424.htm" title="9、汇编语言编程入门:从环境搭建到简单程序实现" target="_blank">9、汇编语言编程入门:从环境搭建到简单程序实现</a> <span class="text-muted">神经网络酱</span> <a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/MEPIS/1.htm">MEPIS</a><a class="tag" taget="_blank" href="/search/GNU%E5%B7%A5%E5%85%B7%E9%93%BE/1.htm">GNU工具链</a> <div>汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载</div> </li> <li><a href="/article/1950231640819167232.htm" title="贝多芬诞辰250周年纪念" target="_blank">贝多芬诞辰250周年纪念</a> <span class="text-muted">万千星河赴远方</span> <div>就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极</div> </li> <li><a href="/article/1950231508648259584.htm" title="三件事—小白猫·雨天·八段锦" target="_blank">三件事—小白猫·雨天·八段锦</a> <span class="text-muted">咸鱼月亮</span> <div>1.最近楼下出现一只非常漂亮的粘人小白猫,看着不像是流浪猫,非常亲人。眼睛比蓝球的还大,而且是绿色的,很漂亮。第一次遇到它,它就跟我到电梯口,如果我稍微招招手,肯定就跟我进电梯了。后来我喂过它几次,好可惜不能养它,一只蓝球就是我的极限了。2.下雨天就心烦,好奇怪。明明以前我超爱看窗外的雨和听雨声,看来近来的心情不够宁静了。3.最近在练八段锦,从第一次就爱上了这个运动,很轻松缓慢,但是却出汗。感觉可</div> </li> <li><a href="/article/1950231308781285376.htm" title="力扣热题100-------54. 螺旋矩阵" target="_blank">力扣热题100-------54. 螺旋矩阵</a> <span class="text-muted">海航Java之路</span> <a class="tag" taget="_blank" href="/search/%E5%8A%9B%E6%89%A3/1.htm">力扣</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn</div> </li> <li><a href="/article/1950230873060208640.htm" title="你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。" target="_blank">你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。</a> <span class="text-muted">霖霖z</span> <div>打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪</div> </li> <li><a href="/article/1950230804957294592.htm" title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a> <span class="text-muted">国服冰</span> <a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div> </li> <li><a href="/article/1950230678696161280.htm" title="C++ 计数排序、归并排序、快速排序" target="_blank">C++ 计数排序、归并排序、快速排序</a> <span class="text-muted">每天搬一点点砖</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>计数排序:是一种基于哈希的排序算法。他的基本思想是通过统计每个元素的出现次数,然后根据统计结果将元素依次放入排序后的序列中。这种排序算法适用于范围较小的情况,例如整数范围在0到k之间计数排序步骤:1初始化一个长度为最大元素值加1的计数数组,所有元素初始化为02遍历原始数组,将每个元素值作为索引,在计数数组中对应位置加13将数组清空4遍历计数器数组,按照数组中的元素个数放回到元数组中计数排序的优点和</div> </li> <li><a href="/article/1950229985633562624.htm" title="2023-11-02" target="_blank">2023-11-02</a> <span class="text-muted">一帆f</span> <div>发现浸润心田的感觉:今天一个机缘之下突然想分享我的婆媳关系,我一边分享一边回忆我之前和儿媳妇关系的微妙变化,特别是分享到我能感受到儿媳妇的各种美好,现在也能心平气和的和老公平等对话,看到自己看到老公,以己推人以人推己自然而然的换位思考,心中有一种美好的能量在涌动,一种浸润心田的感觉从心胸向全身扩散,美好极了……我很想记住这种感觉,赶紧把它写下来以留纪念,也就是当我看见他人的美好,美好的美妙的浸润心</div> </li> <li><a href="/article/1950229040682037248.htm" title="48. 旋转图像 - 力扣(LeetCode)" target="_blank">48. 旋转图像 - 力扣(LeetCode)</a> <span class="text-muted">Fiee-77</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a> <div>题目:给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2:输入:matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,</div> </li> <li><a href="/article/1950228596207448064.htm" title="日更50天有什么收益?" target="_blank">日更50天有什么收益?</a> <span class="text-muted">星湾二宝</span> <div>坚持在平台上日更50天了,平台也为我生成了日更50天徽章,小开心一下这份坚持。日更50天徽章那坚持50天都有哪些收益呢?收益一,就是最直观的那些钻和贝,我这边确实不太高,但是这些贝足够支撑我保持会员的资格,能够在发文的时候帮助友友们去除广告,方便阅读。钻和贝收益二,文章的收获,日更50天,坚持写作3.7万文字,书写的文字也从开始的流水账/碎碎念逐渐加入自己的思考和观点。以前,一个念头会一晃而过,如</div> </li> <li><a href="/article/1950228158863175680.htm" title="英伟达靠什么支撑起了4万亿?AI泡沫还能撑多久?" target="_blank">英伟达靠什么支撑起了4万亿?AI泡沫还能撑多久?</a> <span class="text-muted"></span> <div>英伟达市值突破4万亿美元,既是AI算力需求爆发的直接体现,也暗含市场对未来的狂热预期。其支撑逻辑与潜在风险并存,而AI泡沫的可持续性则取决于技术、商业与地缘政治的复杂博弈。⚙️一、英伟达4万亿市值的核心支撑因素技术垄断与生态壁垒硬件优势:英伟达GPU在AI训练市场占有率超87%,H100芯片的FP16算力达1979TFLOPS,领先竞品3-5倍。CUDA生态:400万开发者构建的软件护城河,成为A</div> </li> <li><a href="/article/1950227023859347456.htm" title="Linux系统配置(应用程序)" target="_blank">Linux系统配置(应用程序)</a> <span class="text-muted">1风天云月</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/1.htm">应用程序</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85/1.htm">编译安装</a><a class="tag" taget="_blank" href="/search/rpm/1.htm">rpm</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a> <div>目录前言一、应用程序概述1、命令与程序的关系2、程序的组成3、软件包封装类型二、RPM1、RPM概述2、RPM用法三、编译安装1、解包2、配置3、编译4、安装5、启用httpd服务结语前言在Linux中的应用程序被视为将软件包安装到系统中后产生的各种文档,其中包括可执行文件、配置文件、用户手册等内容,这些文档被组织为一个有机的整体,为用户提供特定的功能,因此对于“安装软件包”与“安装应用程序”这两</div> </li> <li><a href="/article/1950227023192453120.htm" title="MotionLCM 部署优化 踩坑解决bug" target="_blank">MotionLCM 部署优化 踩坑解决bug</a> <span class="text-muted">AI算法网奇</span> <a class="tag" taget="_blank" href="/search/aigc%E4%B8%8E%E6%95%B0%E5%AD%97%E4%BA%BA/1.htm">aigc与数字人</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%AE%9D%E5%85%B8/1.htm">深度学习宝典</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E7%94%9Fmotion/1.htm">文生motion</a> <div>目录依赖项windowstorchok:渲染黑白图问题解决:humanml3d:sentence-t5-large下载数据:报错:Nomodulenamed'sentence_transformers'继续报错:fromtransformers.integrationsimportCodeCarbonCallback解决方法:推理相关转mesh:module‘matplotlib.cm‘hasno</div> </li> <li><a href="/article/1950225785054883840.htm" title="Java | 多线程经典问题 - 售票" target="_blank">Java | 多线程经典问题 - 售票</a> <span class="text-muted">Ada54</span> <div>一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3</div> </li> <li><a href="/article/1950225530758426624.htm" title="2021-会说话的人运气都不会太差-会说话的人更善于倾听(5)沉默、留白" target="_blank">2021-会说话的人运气都不会太差-会说话的人更善于倾听(5)沉默、留白</a> <span class="text-muted">12_德德</span> <div>21、说话时,如想强调某一部分,一个有效方法是,以沉默留出空白。留出多大空白才好呢?7秒。22、沉默所营造的“空白”长度,说的人感觉到的,是实际长度的3倍,而听的人感觉到的,则只有实际长度的1/3。23、只要善于用“一直”来表达,就不会给人以不过是一时任性之感。能说“一直”的人,会得到周围的支持,在合适的时候想到你。24、要得到“是把好手”的高度评价,就要展示你对公司的热爱。特别是,如能对上司或公</div> </li> <li><a href="/article/1950225532016717824.htm" title="恩小希美食成长日记之118:“摘星女神”王亚平归来,她的婚姻,治愈了多少职场女性的痛" target="_blank">恩小希美食成长日记之118:“摘星女神”王亚平归来,她的婚姻,治愈了多少职场女性的痛</a> <span class="text-muted">恩小希</span> <div>上周最为热闹的消息,无疑是神舟13号的三位航天英雄回来了.其中,最为瞩目的就是王亚平.她是我国首位进行太空行走的女航天员,也是为自己小女儿“摘星星的妈妈”。作为最受关注的职场妈妈,王亚平之所以能够成就这样一番事业,跟背后默默支持她的丈夫--赵鹏分不开。01王亚平1980年出生于山东烟台。父母都是地地道道的农民。王亚平这个姑娘从小体质好,一直练习长跑。高中时,空军来家乡招收女飞行员,作为体育班里唯一</div> </li> <li><a href="/article/1950225255557558272.htm" title="力扣面试题07 - 旋转矩阵" target="_blank">力扣面试题07 - 旋转矩阵</a> <span class="text-muted">茶猫_</span> <a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>题目:给你一幅由N×N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。不占用额外内存空间能否做到?示例1:给定matrix=[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例2:给定matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,</div> </li> <li><a href="/article/1950225020974329856.htm" title="2019-07-30" target="_blank">2019-07-30</a> <span class="text-muted">西域社群</span> <div>天地之间,分外热闹。望热浪涛涛,引无数帅哥竞开撩,夕窈窕淑女皆露腰。一代天骄,群里热闹。不见美女露妖娆,唯见帅哥手机忙,唐诗宋词,广为流传,惜字如金,声情并茂。君悉吾析,今日之局有套路,昨日之生惹人恋。聚往矣,数风流人物还看今朝!!</div> </li> <li><a href="/article/1950224639502381056.htm" title="2018-09-27 aop相关" target="_blank">2018-09-27 aop相关</a> <span class="text-muted">蒋超_58dc</span> <div>1.静态织入,需要使用aspectj专用的compilermaven工程可以采用:https://www.mojohaus.org/aspectj-maven-plugin/2.动态织入,配合spring,创建代理来执行3.</div> </li> <li><a href="/article/1950224132230672384.htm" title="氧惠官方邀请码333777,氧惠邀请码怎么获得?氧惠邀请码有什么套路?" target="_blank">氧惠官方邀请码333777,氧惠邀请码怎么获得?氧惠邀请码有什么套路?</a> <span class="text-muted">知行导师</span> <div>问:氧惠邀请码怎么获得?答:氧惠官方邀请码333777返点高佣金高真的高。问:氧惠邀请码有什么套路?答:氧惠官方邀请码333777返点高佣金高真的高。氧惠APP汇聚各大主流电商和生活服务平台优惠,展示全网全品类商品,满足网购爱好者对品质好货与极致性价比的追求,并同时享受大平台购物权益保障。满足用户日常吃喝玩乐衣食住行的聚合APP,独特的商业模式,响应国家号召,为实现全民共富而努力奋斗。氧惠邀请码3</div> </li> <li><a href="/article/1950223497875746816.htm" title="最新阿里四面面试真题46道:面试技巧+核心问题+面试心得" target="_blank">最新阿里四面面试真题46道:面试技巧+核心问题+面试心得</a> <span class="text-muted">风平浪静如码</span> <div>前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni</div> </li> <li><a href="/article/1950223483048882176.htm" title="【ARM】FPU,VFP,ASE,NEON,SVE...是什么意思?" target="_blank">【ARM】FPU,VFP,ASE,NEON,SVE...是什么意思?</a> <span class="text-muted">亿道电子Emdoor</span> <a class="tag" taget="_blank" href="/search/ARM/1.htm">ARM</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/ARM/1.htm">ARM</a> <div>1、文档目标对执行浮点和SIMD操作的逻辑的各种名称的缩写词进行简要解释。2、问题场景Arm处理器内核中有用于执行浮点和SIMD操作的逻辑,有各种名称。它们通常是一系列的缩写形式,因此本文旨在对每一个缩写词进行简要解释。3、软硬件环境1、软件版本:不涉及2、电脑环境:不涉及4、相关缩写FPU(Floating-PointUnit)浮点单元浮点单元是处理器核心中的一个模块,用于使用浮点数执行算术运算</div> </li> <li><a href="/article/1950223244883718144.htm" title="上半年居民消费榜出炉!这个城市的人最能花" target="_blank">上半年居民消费榜出炉!这个城市的人最能花</a> <span class="text-muted">BBM优选官方</span> <div>上半年居民消费榜出炉哪个地方的人最能花钱?国家统计局公布的数据显示上海上半年居民人均可支配收入32612元居民人均消费支出21321元均为全国最高成为最能挣钱也最能花钱的城市1上海人均消费支出全国第一国家统计局公布的31省份居民人均消费支出数据显示,上海、北京、天津上半年居民人均消费支出排名前三。其中,上海上半年居民人均消费支出21321元,位居榜首。上海也是上半年全国仅有的居民人均消费支出突破2</div> </li> <li><a href="/article/1950222990553706496.htm" title="可处理!环境排放3.0项目怎么提现?裕华投资会刘裕华免费荐股骗局曝光!" target="_blank">可处理!环境排放3.0项目怎么提现?裕华投资会刘裕华免费荐股骗局曝光!</a> <span class="text-muted">墨守成法</span> <div>骗子冒充裕华投资会刘裕华通过伪造或仿冒投资平台,向股民发送虚假环境排放3.0项目链接,引导股民者下载进行投资,以送一万体验金操作小额投资能提现作为诱饵,不断引导消费者加大资金投入。不法分子随后迅速转移资金,当投资者要提现时候就以“流水未完成”“登录异常”“服务器维护”“比赛未结束”等借口不让提现,直到平台关闭跑了或者完成流水任务为由一波亏完。在以翻本为借口继续让投资者加入资金。若你不幸遭遇到裕华投</div> </li> <li><a href="/article/1950222852074565632.htm" title="2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”" target="_blank">2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”</a> <span class="text-muted">上海云盾商务经理杨杨</span> <a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>副标题:从客户端加密到AI反外挂,拆解全链路防护如何重塑游戏攻防天平引言:当传统高防在手游战场“失效”2025年全球手游市场规模突破$2000亿,黑客单次攻击成本却降至$30——某SLG游戏因协议层CC攻击单日流失37%玩家,某开放世界游戏遭低频DDoS瘫痪6小时损失千万。传统高防IP的致命短板暴露无遗:无法识别伪造客户端流量、难防协议篡改、误杀率超15%。而集成于游戏终端的SDK游戏盾,正以“源</div> </li> <li><a href="/article/1950222723200380928.htm" title="LVS+Keepalived实现高可用和负载均衡" target="_blank">LVS+Keepalived实现高可用和负载均衡</a> <span class="text-muted">2401_84412895</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/lvs/1.htm">lvs</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>2、开启网卡子接口配置VIP[root@a~]#cd/etc/sysconfig/network-scripts/[root@anetwork-scripts]#cp-aifcfg-ens32ifcfg-ens32:0[root@anetwork-scripts]#catifcfg-ens32:0BOOTPROTO=staticDEVICE=ens32:0ONBOOT=yesIPADDR=10.1</div> </li> <li><a href="/article/1950222602781913088.htm" title="2023-01-26" target="_blank">2023-01-26</a> <span class="text-muted">胡喜平</span> <div>我觉得《可见的学习》一书确实从底层逻辑说清楚了,教学的本质。可是太多术语和概念,一时间难以消化啊。而且知道和懂得有距离,运用就更不行了,需要高手和专家的指导。我需要多听听新课标的讲座了,来反复印证。读论文也有了一点点灵感,明天修改我的论文。</div> </li> <li><a href="/article/1950222345163567104.htm" title="深入理解汇编语言子程序设计与系统调用" target="_blank">深入理解汇编语言子程序设计与系统调用</a> <span class="text-muted">网安spinage</span> <a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96/1.htm">汇编</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>本文将全面解析汇编语言中子程序设计的核心技术以及系统调用的实现方法,涵盖参数传递的多种方式、堆栈管理、API调用等关键知识点,并提供实际案例演示。一、子程序设计:参数传递的艺术1.寄存器传参:高效简洁.386.modelflat,stdcalloptioncasemap:none.dataxdd5;定义变量ydd6sumdd?.code;函数定义:addxy1addxy1procpushebpmo</div> </li> <li><a href="/article/128.htm" title="scala的option和some" target="_blank">scala的option和some</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>原文地址: http://blog.sina.com.cn/s/blog_68af3f090100qkt8.html 对于学习 Scala 的 Java™ 开发人员来说,对象是一个比较自然、简单的入口点。在 本系列 前几期文章中,我介绍了 Scala 中一些面向对象的编程方法,这些方法实际上与 Java 编程的区别不是很大。我还向您展示了 Scala 如何重新应用传统的面向对象概念,找到其缺点</div> </li> <li><a href="/article/255.htm" title="NullPointerException" target="_blank">NullPointerException</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/BaseAdapter/1.htm">BaseAdapter</a> <div>    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference     出现以上异常.然后就在baidu上</div> </li> <li><a href="/article/382.htm" title="PHP使用文件和目录" target="_blank">PHP使用文件和目录</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/php%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95/1.htm">php文件和目录</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E5%92%8C%E5%86%99%E5%85%A5/1.htm">读取和写入</a><a class="tag" taget="_blank" href="/search/php%E9%AA%8C%E8%AF%81%E6%96%87%E4%BB%B6/1.htm">php验证文件</a><a class="tag" taget="_blank" href="/search/php%E9%94%81%E5%AE%9A%E6%96%87%E4%BB%B6/1.htm">php锁定文件</a> <div>PHP使用文件和目录 1.使用include()包含文件 (1):使用include()从一个被包含文档返回一个值 (2):在控制结构中使用include()   include_once()函数需要一个包含文件的路径,此外,第一次调用它的情况和include()一样,如果在脚本执行中再次对同一个文件调用,那么这个文件不会再次包含。   在php.ini文件中设置</div> </li> <li><a href="/article/509.htm" title="SQL SELECT DISTINCT 语句" target="_blank">SQL SELECT DISTINCT 语句</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 SELECT DISTINCT column_name,column_name F</div> </li> <li><a href="/article/636.htm" title="java冒泡排序" target="_blank">java冒泡排序</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a> <div>package com.algorithm; /** * @Description 冒泡 * @author FuJianyong * 2015-1-22上午09:58:39 */ public class MaoPao { public static void main(String[] args) { int[] mao = {17,50,26,18,9,10</div> </li> <li><a href="/article/763.htm" title="struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!" target="_blank">struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a> <div>struts2.18  出来有段时间了! (貌似是 稳定版)   闲时研究下下!  貌似 sruts2 搭配 json 做 ajax 很吃香!   实践了下下! 不当之处请绕过! 呵呵   网上一大堆 struts2+json  不过大多的json 插件 都是 jsonplugin.34.jar   strut</div> </li> <li><a href="/article/890.htm" title="struts2 数据标签说明" target="_blank">struts2 数据标签说明</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/Scheme/1.htm">Scheme</a> <div>数据标签主要用于提供各种数据访问相关的功能,包括显示一个Action里的属性,以及生成国际化输出等功能 数据标签主要包括: action :该标签用于在JSP页面中直接调用一个Action,通过指定executeResult参数,还可将该Action的处理结果包含到本页面来。 bean :该标签用于创建一个javabean实例。如果指定了id属性,则可以将创建的javabean实例放入Sta</div> </li> <li><a href="/article/1017.htm" title="链表.简单的链表节点构建" target="_blank">链表.简单的链表节点构建</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/1.htm">编程技巧</a> <div>/*编程环境WIN-TC*/ #include "stdio.h" #include "conio.h" #define NODE(name, key_word, help) \  Node name[1]={{NULL, NULL, NULL, key_word, help}} typedef struct node {  &nbs</div> </li> <li><a href="/article/1144.htm" title="tomcat下jndi的三种配置方式" target="_blank">tomcat下jndi的三种配置方式</a> <span class="text-muted">avords</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称 访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。          tomcat配置</div> </li> <li><a href="/article/1271.htm" title="关于敏捷的一些想法" target="_blank">关于敏捷的一些想法</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7/1.htm">敏捷</a> <div>从网上看到这样一句话:“敏捷开发的最重要目标就是:满足用户多变的需求,说白了就是最大程度的让客户满意。” 感觉表达的不太清楚。 感觉容易被人误解的地方主要在“用户多变的需求”上。 第一种多变,实际上就是没有从根本上了解了用户的需求。用户的需求实际是稳定的,只是比较多,也比较混乱,用户一般只能了解自己的那一小部分,所以没有用户能清楚的表达出整体需求。而由于各种条件的,用户表达自己那一部分时也有</div> </li> <li><a href="/article/1398.htm" title="富养还是穷养,决定孩子的一生" target="_blank">富养还是穷养,决定孩子的一生</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a> <div> 是什么决定孩子未来物质能否丰盛?为什么说寒门很难出贵子,三代才能出贵族?真的是父母必须有钱,才能大概率保证孩子未来富有吗?-----作者:@李雪爱与自由 事实并非由物质决定,而是由心灵决定。一朋友富有而且修养气质很好,兄弟姐妹也都如此。她的童年时代,物质上大家都很贫乏,但妈妈总是保持生活中的美感,时不时给孩子们带回一些美好小玩意,从来不对孩子传递生活艰辛、金钱来之不易、要懂得珍惜</div> </li> <li><a href="/article/1525.htm" title="oracle 日期时间格式转化" target="_blank">oracle 日期时间格式转化</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>oracle 系统时间有 SYSDATE 与 SYSTIMESTAMP; SYSDATE:不支持毫秒,取的是系统时间; SYSTIMESTAMP:支持毫秒,日期,时间是给时区转换的,秒和毫秒是取的系统的。 日期转字符窜: 一、不取毫秒: TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') 简要说明, YYYY 年 MM   月</div> </li> <li><a href="/article/1652.htm" title="【Scala六】分析Spark源代码总结的Scala语法四" target="_blank">【Scala六】分析Spark源代码总结的Scala语法四</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>1. apply语法   FileShuffleBlockManager中定义的类ShuffleFileGroup,定义:   private class ShuffleFileGroup(val shuffleId: Int, val fileId: Int, val files: Array[File]) { ... def apply(bucketId</div> </li> <li><a href="/article/1779.htm" title="Erlang中有意思的bug" target="_blank">Erlang中有意思的bug</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>  代码中常有一些很搞笑的bug,如下面的一行代码被调用两次(Erlang beam) commit f667e4a47b07b07ed035073b94d699ff5fe0ba9b Author: Jovi Zhang <bookjovi@gmail.com> Date: Fri Dec 2 16:19:22 2011 +0100 erts:</div> </li> <li><a href="/article/1906.htm" title="移位打印10进制数转16进制-2008-08-18" target="_blank">移位打印10进制数转16进制-2008-08-18</a> <span class="text-muted">ljy325</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a> <div> /** * Description 移位打印10进制的16进制形式 * Creation Date 15-08-2008 9:00 * @author 卢俊宇 * @version 1.0 * */ public class PrintHex { // 备选字符 static final char di</div> </li> <li><a href="/article/2033.htm" title="读《研磨设计模式》-代码笔记-组合模式" target="_blank">读《研磨设计模式》-代码笔记-组合模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.List; abstract class Component { public abstract void printStruct(Str</div> </li> <li><a href="/article/2160.htm" title="利用cmd命令将.class文件打包成jar" target="_blank">利用cmd命令将.class文件打包成jar</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a> <div>cmd命令打jar是如下实现: 在运行里输入cmd,利用cmd命令进入到本地的工作盘符。(如我的是D盘下的文件有此路径 D:\workspace\prpall\WEB-INF\classes) 现在是想把D:\workspace\prpall\WEB-INF\classes路径下所有的文件打包成prpall.jar。然后继续如下操作: cd D: 回车 cd workspace/prpal</div> </li> <li><a href="/article/2287.htm" title="[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明" target="_blank">[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a> <div>                       JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明     &nb</div> </li> <li><a href="/article/2414.htm" title="SecureCRT右键粘贴的设置" target="_blank">SecureCRT右键粘贴的设置</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/secureCRT/1.htm">secureCRT</a><a class="tag" taget="_blank" href="/search/%E5%8F%B3%E9%94%AE/1.htm">右键</a><a class="tag" taget="_blank" href="/search/%E7%B2%98%E8%B4%B4/1.htm">粘贴</a> <div>一般都习惯鼠标右键自动粘贴的功能,对于SecureCRT6.7.5 ,这个功能也已经是默认配置了。 老版本的SecureCRT其实也有这个功能,只是不是默认设置,很多人不知道罢了。 菜单: Options->Global Options ...->Terminal 右边有个Mouse的选项块。 Copy on Select Paste on Right/Middle</div> </li> <li><a href="/article/2541.htm" title="Linux 软链接和硬链接" target="_blank">Linux 软链接和硬链接</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连</div> </li> <li><a href="/article/2668.htm" title="DIV底部自适应" target="_blank">DIV底部自适应</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q</div> </li> <li><a href="/article/2795.htm" title="Centos6.5使用yum安装mysql——快速上手必备" target="_blank">Centos6.5使用yum安装mysql——快速上手必备</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>第1步、yum安装mysql [root@stonex ~]#  yum -y install mysql-server 安装结果: Installed:     mysql-server.x86_64 0:5.1.73-3.el6_5                   &nb</div> </li> <li><a href="/article/2922.htm" title="如何调试JDK源码" target="_blank">如何调试JDK源码</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>相信各位小伙伴们跟我一样,想通过JDK源码来学习Java,比如collections包,java.util.concurrent包。 可惜的是sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar。 下面是编译jdk的具体步骤:         1.把C:\java\jdk1.6.0_26\sr</div> </li> <li><a href="/article/3049.htm" title="Maximal Rectangle" target="_blank">Maximal Rectangle</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/max/1.htm">max</a> <div>Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.   public class Solution { public int maximalRectangle(char[][] matrix)</div> </li> <li><a href="/article/3176.htm" title="Spring MVC测试框架详解——服务端测试" target="_blank">Spring MVC测试框架详解——服务端测试</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+mvc+test/1.htm">spring mvc test</a> <div>随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的。从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2中了)。   Spring MVC测试框架提供了对服务器端和客户端(基于RestTemplate的客户端)提供了支持。 &nbs</div> </li> <li><a href="/article/3303.htm" title="Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0" target="_blank">Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0</a> <span class="text-muted">liyong0802</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>一、准备编译软件   1.在官网下载jdk1.7、maven3.2.1、ant1.9.4,解压设置好环境变量就可以用。     环境变量设置如下:   (1)执行vim /etc/profile (2)在文件尾部加入: export JAVA_HOME=/home/spark/jdk1.7 export MAVEN_HOME=/ho</div> </li> <li><a href="/article/3430.htm" title="StatusBar 字体白色" target="_blank">StatusBar 字体白色</a> <span class="text-muted">pangyulei</span> <a class="tag" taget="_blank" href="/search/status/1.htm">status</a> <div> [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; /*you'll also need to set UIViewControllerBasedStatusBarAppearance to NO in the plist file if you use this method</div> </li> <li><a href="/article/3557.htm" title="如何分析Java虚拟机死锁" target="_blank">如何分析Java虚拟机死锁</a> <span class="text-muted">sesame</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div>英文资料: Thread Dump and Concurrency Locks   Thread dumps are very useful for diagnosing synchronization related problems such as deadlocks on object monitors. Ctrl-\ on Solaris/Linux or Ctrl-B</div> </li> <li><a href="/article/3684.htm" title="位运算简介及实用技巧(一):基础篇" target="_blank">位运算简介及实用技巧(一):基础篇</a> <span class="text-muted">tw_wangzhengquan</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>http://www.matrix67.com/blog/archives/263    去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个r</div> </li> <li><a href="/article/3811.htm" title="jsearch的索引文件结构" target="_blank">jsearch的索引文件结构</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/jsearch/1.htm">jsearch</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2/1.htm">全文检索</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2/1.htm">信息检索</a><a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D/1.htm">word分词</a> <div>jsearch是一个高性能的全文检索工具包,基于倒排索引,基于java8,类似于lucene,但更轻量级。   jsearch的索引文件结构定义如下:     1、一个词的索引由=分割的三部分组成:        第一部分是词        第二部分是这个词在多少</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>