提供openssl -aes-256-cbc兼容加密/解密的简单python函数

原文链接:http://joelinoff.com/blog/?p=885

 

这里的示例显示了如何使用python以与openssl aes-256-cbc完全兼容的方式加密和解密数据。它是基于我在本网站上发布的C ++ Cipher类中所做的工作。它适用于python-2.7和python-3.x。

关键思想是基于openssl生成密钥和iv密码的数据以及它使用的“Salted__”前缀的方式。

 

因为我也掌握openssl的内部细节,所以先留着,等以后要是遇到需要了,在研究

使用方法

提供openssl -aes-256-cbc兼容加密/解密的简单python函数_第1张图片

代码:

#!/usr/bin/env python
'''
Implement openssl compatible AES-256 CBC mode encryption/decryption.

This module provides encrypt() and decrypt() functions that are compatible
with the openssl algorithms.

This is basically a python encoding of my C++ work on the Cipher class
using the Crypto.Cipher.AES class.

URL: http://projects.joelinoff.com/cipher-1.1/doxydocs/html/
'''

# LICENSE
#
# MIT Open Source
#
# Copyright (c) 2014 Joe Linoff
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import argparse
import base64
import os
import re
import hashlib
import inspect
import sys
from getpass import getpass
from Crypto.Cipher import AES

VERSION='1.2'


# ================================================================
# debug
# ================================================================
def _debug(msg, lev=1):
    '''
    Print a debug message with some context.
    '''
    sys.stderr.write('DEBUG:{} ofp {}\n'.format(inspect.stack()[lev][2], msg))


# ================================================================
# get_key_and_iv
# ================================================================
def get_key_and_iv(password, salt, klen=32, ilen=16, msgdgst='md5'):
    '''
    Derive the key and the IV from the given password and salt.

    This is a niftier implementation than my direct transliteration of
    the C++ code although I modified to support different digests.

    CITATION: http://stackoverflow.com/questions/13907841/implement-openssl-aes-encryption-in-python

    @param password  The password to use as the seed.
    @param salt      The salt.
    @param klen      The key length.
    @param ilen      The initialization vector length.
    @param msgdgst   The message digest algorithm to use.
    '''
    # equivalent to:
    #   from hashlib import  as mdf
    #   from hashlib import md5 as mdf
    #   from hashlib import sha512 as mdf
    mdf = getattr(__import__('hashlib', fromlist=[msgdgst]), msgdgst)
    password = password.encode('ascii', 'ignore')  # convert to ASCII

    try:
        maxlen = klen + ilen
        keyiv = mdf(password + salt).digest()
        tmp = [keyiv]
        while len(tmp) < maxlen:
            tmp.append( mdf(tmp[-1] + password + salt).digest() )
            keyiv += tmp[-1]  # append the last byte
        key = keyiv[:klen]
        iv = keyiv[klen:klen+ilen]
        return key, iv
    except UnicodeDecodeError:
        return None, None


# ================================================================
# encrypt
# ================================================================
def encrypt(password, plaintext, chunkit=True, msgdgst='md5'):
    '''
    Encrypt the plaintext using the password using an openssl
    compatible encryption algorithm. It is the same as creating a file
    with plaintext contents and running openssl like this:

    $ cat plaintext
    
    $ openssl enc -e -aes-256-cbc -base64 -salt \\
        -pass pass:<password> -n plaintext

    @param password  The password.
    @param plaintext The plaintext to encrypt.
    @param chunkit   Flag that tells encrypt to split the ciphertext
                     into 64 character (MIME encoded) lines.
                     This does not affect the decrypt operation.
    @param msgdgst   The message digest algorithm.
    </span><span style="color:#800000;">'''</span><span style="color:#000000;">
    salt </span>= os.urandom(8<span style="color:#000000;">)
    key, iv </span>= get_key_and_iv(password, salt, msgdgst=<span style="color:#000000;">msgdgst)
    </span><span style="color:#0000ff;">if</span> key <span style="color:#0000ff;">is</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> None

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> PKCS#7 padding</span>
    padding_len = 16 - (len(plaintext) % 16<span style="color:#000000;">)
    </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> isinstance(plaintext, str):
        padded_plaintext </span>= plaintext + (chr(padding_len) *<span style="color:#000000;"> padding_len)
    </span><span style="color:#0000ff;">else</span>: <span style="color:#008000;">#</span><span style="color:#008000;"> assume bytes</span>
        padded_plaintext = plaintext + (bytearray([padding_len] *<span style="color:#000000;"> padding_len))

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> Encrypt</span>
    cipher =<span style="color:#000000;"> AES.new(key, AES.MODE_CBC, iv)
    ciphertext </span>=<span style="color:#000000;"> cipher.encrypt(padded_plaintext)

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> Make openssl compatible.</span>
    <span style="color:#008000;">#</span><span style="color:#008000;"> I first discovered this when I wrote the C++ Cipher class.</span>
    <span style="color:#008000;">#</span><span style="color:#008000;"> CITATION: http://projects.joelinoff.com/cipher-1.1/doxydocs/html/</span>
    openssl_ciphertext = b<span style="color:#800000;">'</span><span style="color:#800000;">Salted__</span><span style="color:#800000;">'</span> + salt +<span style="color:#000000;"> ciphertext
    b64 </span>=<span style="color:#000000;"> base64.b64encode(openssl_ciphertext)
    </span><span style="color:#0000ff;">if</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> chunkit:
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> b64

    LINELEN </span>= 64<span style="color:#000000;">
    chunk </span>= <span style="color:#0000ff;">lambda</span> s: b<span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span>.join(s[i:min(i+<span style="color:#000000;">LINELEN, len(s))]
                                </span><span style="color:#0000ff;">for</span> i <span style="color:#0000ff;">in</span><span style="color:#000000;"> range(0, len(s), LINELEN))
    </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> chunk(b64)


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> decrypt</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span> decrypt(password, ciphertext, msgdgst=<span style="color:#800000;">'</span><span style="color:#800000;">md5</span><span style="color:#800000;">'</span><span style="color:#000000;">):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Decrypt the ciphertext using the password using an openssl
    compatible decryption algorithm. It is the same as creating a file
    with ciphertext contents and running openssl like this:

    $ cat ciphertext
    # ENCRYPTED
    <ciphertext>
    $ egrep -v '^#|^$' | \\
        openssl enc -d -aes-256-cbc -base64 -salt -pass pass:<password> -in ciphertext
    @param password   The password.
    @param ciphertext The ciphertext to decrypt.
    @param msgdgst    The message digest algorithm.
    @returns the decrypted data.
    </span><span style="color:#800000;">'''</span>

    <span style="color:#008000;">#</span><span style="color:#008000;"> unfilter -- ignore blank lines and comments</span>
    <span style="color:#0000ff;">if</span><span style="color:#000000;"> isinstance(ciphertext, str):
        filtered </span>= <span style="color:#800000;">''</span><span style="color:#000000;">
        nl </span>= <span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">
        re1 </span>= r<span style="color:#800000;">'</span><span style="color:#800000;">^\s*$</span><span style="color:#800000;">'</span><span style="color:#000000;">
        re2 </span>= r<span style="color:#800000;">'</span><span style="color:#800000;">^\s*#</span><span style="color:#800000;">'</span>
    <span style="color:#0000ff;">else</span><span style="color:#000000;">:
        filtered </span>= b<span style="color:#800000;">''</span><span style="color:#000000;">
        nl </span>= b<span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">
        re1 </span>= b<span style="color:#800000;">'</span><span style="color:#800000;">^\\s*$</span><span style="color:#800000;">'</span><span style="color:#000000;">
        re2 </span>= b<span style="color:#800000;">'</span><span style="color:#800000;">^\\s*#</span><span style="color:#800000;">'</span>
        
    <span style="color:#0000ff;">for</span> line <span style="color:#0000ff;">in</span><span style="color:#000000;"> ciphertext.split(nl):
        line </span>=<span style="color:#000000;"> line.strip()
        </span><span style="color:#0000ff;">if</span> re.search(re1,line) <span style="color:#0000ff;">or</span><span style="color:#000000;"> re.search(re2, line):
            </span><span style="color:#0000ff;">continue</span><span style="color:#000000;">
        filtered </span>+= line +<span style="color:#000000;"> nl

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> Base64 decode</span>
    raw =<span style="color:#000000;"> base64.b64decode(filtered)
    </span><span style="color:#0000ff;">assert</span>(raw[:8] == b<span style="color:#800000;">'</span><span style="color:#800000;">Salted__</span><span style="color:#800000;">'</span><span style="color:#000000;"> )
    salt </span>= raw[8:16]  <span style="color:#008000;">#</span><span style="color:#008000;"> get the salt</span>

    <span style="color:#008000;">#</span><span style="color:#008000;"> Now create the key and iv.</span>
    key, iv = get_key_and_iv(password, salt, msgdgst=<span style="color:#000000;">msgdgst)
    </span><span style="color:#0000ff;">if</span> key <span style="color:#0000ff;">is</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> None

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> The original ciphertext</span>
    ciphertext = raw[16<span style="color:#000000;">:]

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> Decrypt</span>
    cipher =<span style="color:#000000;"> AES.new(key, AES.MODE_CBC, iv)
    padded_plaintext </span>=<span style="color:#000000;"> cipher.decrypt(ciphertext)

    </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> isinstance(padded_plaintext, str):
        padding_len </span>= ord(padded_plaintext[-1<span style="color:#000000;">])
    </span><span style="color:#0000ff;">else</span><span style="color:#000000;">:
        padding_len </span>= padded_plaintext[-1<span style="color:#000000;">]
    plaintext </span>= padded_plaintext[:-<span style="color:#000000;">padding_len]
    </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> plaintext

</span><span style="color:#008000;">#</span><span style="color:#008000;"> include the code above ...</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _open_ios</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _open_ios(args):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Open the IO files.
    </span><span style="color:#800000;">'''</span><span style="color:#000000;">
    ifp </span>=<span style="color:#000000;"> sys.stdin
    ofp </span>=<span style="color:#000000;"> sys.stdout

    </span><span style="color:#0000ff;">if</span> args.input <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">try</span><span style="color:#000000;">:
            ifp </span>= open(args.input, <span style="color:#800000;">'</span><span style="color:#800000;">rb</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        </span><span style="color:#0000ff;">except</span><span style="color:#000000;"> IOError:
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">ERROR: cannot read file: {}</span><span style="color:#800000;">'</span><span style="color:#000000;">.format(args.input))
            sys.exit(</span>1<span style="color:#000000;">)

    </span><span style="color:#0000ff;">if</span> args.output <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">try</span><span style="color:#000000;">:
            ofp </span>= open(args.output, <span style="color:#800000;">'</span><span style="color:#800000;">wb</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        </span><span style="color:#0000ff;">except</span><span style="color:#000000;"> IOError:
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">ERROR: cannot write file: {}</span><span style="color:#800000;">'</span><span style="color:#000000;">.format(args.output))
            sys.exit(</span>1<span style="color:#000000;">)

    </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> ifp, ofp


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _close_ios</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _close_ios(ifp, ofp):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Close the IO files if necessary.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">if</span> ifp !=<span style="color:#000000;"> sys.stdin:
        ifp.close()

    </span><span style="color:#0000ff;">if</span> ofp !=<span style="color:#000000;"> sys.stdout:
        ofp.close()


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _write</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span> _write(ofp, out, newline=<span style="color:#000000;">False):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Write out the data in the correct format.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">if</span> ofp == sys.stdout <span style="color:#0000ff;">and</span><span style="color:#000000;"> isinstance(out, bytes):
        out </span>= out.decode(<span style="color:#800000;">'</span><span style="color:#800000;">utf-8</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">ignored</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        ofp.write(out)
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> newline:
            ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    </span><span style="color:#0000ff;">elif</span><span style="color:#000000;"> isinstance(out, str):
        ofp.write(out)
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> newline:
            ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    </span><span style="color:#0000ff;">else</span>:  <span style="color:#008000;">#</span><span style="color:#008000;"> assume bytes</span>
<span style="color:#000000;">        ofp.write(out)
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> newline:
            ofp.write(b</span><span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    

</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _write</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _read(ifp):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Read the data in the correct format.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">return</span><span style="color:#000000;"> ifp.read()


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _runenc</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _runenc(args):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Encrypt data.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">if</span> args.passphrase <span style="color:#0000ff;">is</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">while</span><span style="color:#000000;"> True:
            passphrase </span>= getpass(<span style="color:#800000;">'</span><span style="color:#800000;">Passphrase: </span><span style="color:#800000;">'</span><span style="color:#000000;">)
            tmp </span>= getpass(<span style="color:#800000;">'</span><span style="color:#800000;">Re-enter passphrase: </span><span style="color:#800000;">'</span><span style="color:#000000;">)
            </span><span style="color:#0000ff;">if</span> passphrase ==<span style="color:#000000;"> tmp:
                </span><span style="color:#0000ff;">break</span>
            <span style="color:#0000ff;">print</span>(<span style="color:#800000;">''</span><span style="color:#000000;">)
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">Passphrases do not match, please try again.</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    </span><span style="color:#0000ff;">else</span><span style="color:#000000;">:
        passphrase </span>=<span style="color:#000000;"> args.passphrase

    ifp, ofp </span>=<span style="color:#000000;"> _open_ios(args)
    text </span>=<span style="color:#000000;"> _read(ifp)
    out </span>= encrypt(passphrase, text, msgdgst=<span style="color:#000000;">args.msgdgst)
    _write(ofp, out, True)
    _close_ios(ifp, ofp)


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _rundec</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _rundec(args):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Decrypt data.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">if</span> args.passphrase <span style="color:#0000ff;">is</span><span style="color:#000000;"> None:
        passphrase </span>= getpass(<span style="color:#800000;">'</span><span style="color:#800000;">Passphrase: </span><span style="color:#800000;">'</span><span style="color:#000000;">)
    </span><span style="color:#0000ff;">else</span><span style="color:#000000;">:
        passphrase </span>=<span style="color:#000000;"> args.passphrase

    ifp, ofp </span>=<span style="color:#000000;"> _open_ios(args)
    text </span>=<span style="color:#000000;"> _read(ifp)
    out </span>= decrypt(passphrase, text, msgdgst=<span style="color:#000000;">args.msgdgst)
    _write(ofp, out, False)
    _close_ios(ifp, ofp)


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _runtest</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _runtest(args):
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Run a series of iteration where each iteration generates a random
    password from 8-32 characters and random text from 20 to 256
    characters. The encrypts and decrypts the random data. It then
    compares the results to make sure that everything works correctly.

    The test output looks like this:

    $ crypt 2000
    2000 of 2000 100.00%  15 139 2000    0
    $ #     ^    ^        ^  ^   ^       ^
    $ #     |    |        |  |   |       +-- num failed
    $ #     |    |        |  |   +---------- num passed
    $ #     |    |        |  +-------------- size of text for a test
    $ #     |    |        +----------------- size of passphrase for a test
    $ #     |    +-------------------------- percent completed
    $ #     +------------------------------- total
    # #+------------------------------------ current test

    @param args  The args parse arguments.
    </span><span style="color:#800000;">'''</span>
    <span style="color:#0000ff;">import</span><span style="color:#000000;"> string
    </span><span style="color:#0000ff;">import</span><span style="color:#000000;"> random
    </span><span style="color:#0000ff;">from</span> random <span style="color:#0000ff;">import</span><span style="color:#000000;"> randint

    </span><span style="color:#008000;">#</span><span style="color:#008000;"> Encrypt/decrypt N random sets of plaintext and passwords.</span>
    num =<span style="color:#000000;"> args.test
    ofp </span>=<span style="color:#000000;"> sys.stdout
    </span><span style="color:#0000ff;">if</span> args.output <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
        </span><span style="color:#0000ff;">try</span><span style="color:#000000;">:
            ofp </span>= open(args.output, <span style="color:#800000;">'</span><span style="color:#800000;">w</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        </span><span style="color:#0000ff;">except</span><span style="color:#000000;"> IOError:
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">ERROR: can open file for writing: {}</span><span style="color:#800000;">'</span><span style="color:#000000;">.format(args.output))
            sys.exit(</span>1<span style="color:#000000;">)

    chset </span>=<span style="color:#000000;"> string.printable
    passed </span>=<span style="color:#000000;"> 0
    failed </span>=<span style="color:#000000;"> []
    maxlen </span>=<span style="color:#000000;"> len(str(num))
    </span><span style="color:#0000ff;">for</span> i <span style="color:#0000ff;">in</span><span style="color:#000000;"> range(num):
        ran1 </span>= randint(8,32<span style="color:#000000;">)
        password </span>= <span style="color:#800000;">''</span>.join(random.choice(chset) <span style="color:#0000ff;">for</span> x <span style="color:#0000ff;">in</span><span style="color:#000000;"> range(ran1))

        ran2 </span>= randint(20, 256<span style="color:#000000;">)
        plaintext </span>= <span style="color:#800000;">''</span>.join(random.choice(chset) <span style="color:#0000ff;">for</span> x <span style="color:#0000ff;">in</span><span style="color:#000000;"> range(ran2))

        ciphertext </span>= encrypt(password, plaintext, msgdgst=<span style="color:#000000;">args.msgdgst)
        verification </span>= decrypt(password, ciphertext, msgdgst=<span style="color:#000000;">args.msgdgst)

        </span><span style="color:#0000ff;">if</span> plaintext !=<span style="color:#000000;"> verification:
            failed.append( [password, plaintext] )
        </span><span style="color:#0000ff;">else</span><span style="color:#000000;">:
            passed </span>+= 1<span style="color:#000000;">

        output </span>= <span style="color:#800000;">'</span><span style="color:#800000;">%*d of %d %6.2f%% %3d %3d %*d %*d %s</span><span style="color:#800000;">'</span> % (maxlen,i+1<span style="color:#000000;">,
                                                           num,
                                                           </span>100*(i+1)/<span style="color:#000000;">num,
                                                           len(password),
                                                           len(plaintext),
                                                           maxlen, passed,
                                                           maxlen, len(failed),
                                                           args.msgdgst)
        </span><span style="color:#0000ff;">if</span> args.output <span style="color:#0000ff;">is</span><span style="color:#000000;"> None:
            ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">\b</span><span style="color:#800000;">'</span>*80<span style="color:#000000;">)
            ofp.write(output)
            ofp.flush()
        </span><span style="color:#0000ff;">else</span><span style="color:#000000;">:
            ofp.write(output</span>+<span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)

    ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)

    </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> len(failed):
        </span><span style="color:#0000ff;">for</span> i <span style="color:#0000ff;">in</span><span style="color:#000000;"> range(len(failed)):
            ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">%3d %2d %-34s %3d %s\n</span><span style="color:#800000;">'</span> %<span style="color:#000000;"> (i,
                                                  len(failed[i][0]),
                                                  </span><span style="color:#800000;">'</span><span style="color:#800000;">"</span><span style="color:#800000;">'</span>+failed[i][0]+<span style="color:#800000;">'</span><span style="color:#800000;">"</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                                                  len(failed[i][</span>1<span style="color:#000000;">]),
                                                  </span><span style="color:#800000;">'</span><span style="color:#800000;">"</span><span style="color:#800000;">'</span>+failed[i][1]+<span style="color:#800000;">'</span><span style="color:#800000;">"</span><span style="color:#800000;">'</span><span style="color:#000000;">))
        ofp.write(</span><span style="color:#800000;">'</span><span style="color:#800000;">\n</span><span style="color:#800000;">'</span><span style="color:#000000;">)

    </span><span style="color:#0000ff;">if</span> args.output <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
        ofp.close()


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> _cli_opts</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> _cli_opts():
    </span><span style="color:#800000;">'''</span><span style="color:#800000;">
    Parse command line options.
    @returns the arguments
    </span><span style="color:#800000;">'''</span><span style="color:#000000;">
    mepath </span>= os.path.abspath(sys.argv[0]).encode(<span style="color:#800000;">'</span><span style="color:#800000;">utf-8</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    mebase </span>=<span style="color:#000000;"> os.path.basename(mepath)

    description </span>= <span style="color:#800000;">'''</span><span style="color:#800000;">
        Implements encryption/decryption that is compatible with openssl
        AES-256 CBC mode.

        You can use it as follows:

            EXAMPLE 1: {0} -> {0} (MD5)
                $ # Encrypt and decrypt using {0}.
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    {0} -e -p secret | \\
                    {0} -d -p secret
                Lorem ipsum dolor sit amet

            EXAMPLE 2: {0} -> openssl (MD5)
                $ # Encrypt using {0} and decrypt using openssl.
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    {0} -e -p secret | \\
                    openssl enc -d -aes-256-cbc -md md5 -base64 -salt -pass pass:secret
                Lorem ipsum dolor sit amet

            EXAMPLE 3: openssl -> {0} (MD5)
                $ # Encrypt using openssl and decrypt using {0}
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    openssl enc -e -aes-256-cbc -md md5 -base64 -salt -pass pass:secret
                    {0} -d -p secret
                Lorem ipsum dolor sit amet

            EXAMPLE 4: openssl -> openssl (MD5)
                $ # Encrypt and decrypt using openssl
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    openssl enc -e -aes-256-cbc -md md5 -base64 -salt -pass pass:secret
                    openssl enc -d -aes-256-cbc -md md5 -base64 -salt -pass pass:secret
                Lorem ipsum dolor sit amet

            EXAMPLE 5: {0} -> {0} (SHA512)
                $ # Encrypt and decrypt using {0}.
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    {0} -e -m sha512 -p secret | \\
                    {0} -d -m sha512 -p secret
                Lorem ipsum dolor sit amet

            EXAMPLE 6: {0} -> openssl (SHA512)
                $ # Encrypt using {0} and decrypt using openssl.
                $ echo 'Lorem ipsum dolor sit amet' | \\
                    {0} -e -m sha512 -p secret | \\
                    openssl enc -d -aes-256-cbc -md sha1=512 -base64 -salt -pass pass:secret
                Lorem ipsum dolor sit amet

            EXAMPLE 7:
                $ # Run internal tests.
                $ {0} -t 2000
                2000 of 2000 100.00%%  21 104 2000    0 md5
                $ #     ^    ^        ^  ^   ^       ^ ^
                $ #     |    |        |  |   |       | +- message digest
                $ #     |    |        |  |   |       +--- num failed
                $ #     |    |        |  |   +----------- num passed
                $ #     |    |        |  +--------------- size of text for a test
                $ #     |    |        +------------------ size of passphrase for a test
                $ #     |    +--------------------------- percent completed
                $ #     +-------------------------------- total
                # #+------------------------------------- current test
</span><span style="color:#800000;">'''</span>.format(mebase.decode(<span style="color:#800000;">'</span><span style="color:#800000;">ascii</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">ignore</span><span style="color:#800000;">'</span><span style="color:#000000;">))

    parser </span>= argparse.ArgumentParser(prog=<span style="color:#000000;">mebase,
                                     formatter_class</span>=<span style="color:#000000;">argparse.RawDescriptionHelpFormatter,
                                     description</span>=<span style="color:#000000;">description,
                                     )

    group </span>= parser.add_mutually_exclusive_group(required=<span style="color:#000000;">True)
    group.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-d</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--decrypt</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store_true</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">decryption mode</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    group.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-e</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--encrypt</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store_true</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">encryption mode</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-i</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--input</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">input file, default is stdin</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-m</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--msgdgst</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        default</span>=<span style="color:#800000;">'</span><span style="color:#800000;">md5</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">message digest (md5, sha, sha1, sha256, sha512), default is md5</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-o</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--output</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">output file, default is stdout</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-p</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--passphrase</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">passphrase for encrypt/decrypt operations</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    group.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-t</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--test</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">store</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                       default</span>=-1<span style="color:#000000;">,
                       type</span>=<span style="color:#000000;">int,
                       help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">test mode (TEST is an integer)</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-v</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--verbose</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">count</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        help</span>=<span style="color:#800000;">'</span><span style="color:#800000;">the level of verbosity</span><span style="color:#800000;">'</span><span style="color:#000000;">)
    parser.add_argument(</span><span style="color:#800000;">'</span><span style="color:#800000;">-V</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">--version</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        action</span>=<span style="color:#800000;">'</span><span style="color:#800000;">version</span><span style="color:#800000;">'</span><span style="color:#000000;">,
                        version</span>=<span style="color:#800000;">'</span><span style="color:#800000;">%(prog)s </span><span style="color:#800000;">'</span>+<span style="color:#000000;">VERSION)

    args </span>=<span style="color:#000000;"> parser.parse_args()
    </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> args


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> main</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">def</span><span style="color:#000000;"> main():
    args </span>=<span style="color:#000000;"> _cli_opts()
    </span><span style="color:#0000ff;">if</span> args.test ><span style="color:#000000;"> 0:
        </span><span style="color:#0000ff;">if</span> args.input <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">WARNING: input argument will be ignored.</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        </span><span style="color:#0000ff;">if</span> args.passphrase <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None:
            </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">WARNING: passphrase argument will be ignored.</span><span style="color:#800000;">'</span><span style="color:#000000;">)
        _runtest(args)
    </span><span style="color:#0000ff;">elif</span><span style="color:#000000;"> args.encrypt:
        _runenc(args)
    </span><span style="color:#0000ff;">elif</span><span style="color:#000000;"> args.decrypt:
        _rundec(args)


</span><span style="color:#008000;">#</span><span style="color:#008000;"> ================================================================</span><span style="color:#008000;">
#</span><span style="color:#008000;"> MAIN</span><span style="color:#008000;">
#</span><span style="color:#008000;"> ================================================================</span>
<span style="color:#0000ff;">if</span> <span style="color:#800080;">__name__</span> == <span style="color:#800000;">"</span><span style="color:#800000;">__main__</span><span style="color:#800000;">"</span><span style="color:#000000;">:
    main()</span></pre> 
    </div> 
    <span class="cnblogs_code_collapse">View Code</span> 
   </div> 
   <p> </p> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1304717771254304768"></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">你可能感兴趣的:(提供openssl -aes-256-cbc兼容加密/解密的简单python函数)</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/1950233199242178560.htm"
                           title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a>
                        <span class="text-muted">十除以十等于一</span>

                        <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div>
                    </li>
                    <li><a href="/article/1950233167633903616.htm"
                           title="男士护肤品哪个牌子好?十大男士护肤品排行榜" target="_blank">男士护肤品哪个牌子好?十大男士护肤品排行榜</a>
                        <span class="text-muted">高省APP珊珊</span>

                        <div>很多男生意识到护肤的必要性,开始着手护肤,但不知道该选哪个男士护肤品品牌使用好。目前市面上很多男士护肤品品牌,可谓琳琅满目,让人眼花缭乱。男士挑选护肤品时,根据自己皮肤需求去正规渠道挑选合适的知名护肤品比较放心靠谱。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入</div>
                    </li>
                    <li><a href="/article/1950233072825856000.htm"
                           title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div>
                    </li>
                    <li><a href="/article/1950233040592629760.htm"
                           title="2022-10-20" target="_blank">2022-10-20</a>
                        <span class="text-muted">体力劳动者</span>

                        <div>不因感觉稍纵即逝就不加记录。在女儿睡觉后我记下今天的小故事。接手新班级后,今天是第二次收到家长的感谢信(微信)。是我表扬次数最多的两位学生家长致来的感谢,他们明显感受到孩子自信、阳光了不少,写作业由被动变为了主动,家庭氛围也由鸡飞狗跳变成了其乐融融。在被顽皮的学生气得头晕之后,我感到了久违的价值感,责任感甚至使命感,我回复家长这样一句话:我们也需要家长的反馈好让我们的教育工作更有劲头。我也认识到,</div>
                    </li>
                    <li><a href="/article/1950232912192401408.htm"
                           title="程翔授《评价一篇记叙文》" target="_blank">程翔授《评价一篇记叙文》</a>
                        <span class="text-muted">行吟斯基</span>

                        <div>桂林十一中高一2中学生自读程老师学生文章板书课题师巡看。看完举手。问:它是记叙文。不商量。独立打分。学生评价打分。师:高低都正常,不受干扰。师巡,略评。打完举手。调查:分层次举手——高分先举手。最低分。最高95分。最低45分。女:差距太大!师:同一篇,相差55分。若是你的文章,愿落谁手?男:身临其境感觉。师:你有此经历?没也没关系。女:不优美……,结尾无升华……无感悟……师:辞藻不美?(师追问)男</div>
                    </li>
                    <li><a href="/article/1950232910862807040.htm"
                           title="《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单" target="_blank">《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单</a>
                        <span class="text-muted">windy天意晚晴</span>

                        <div>《玉骨遥》里,朱颜就是时影的命劫之人。重明与时影早就知道,他们一直瞒着大司命,如今大司命也知道了真相。可是大司命却没有杀朱颜,而是给朱颜下了诛心咒,还说时影的命劫已经破了,真的如此吗?1、计划总是赶不上变化的大司命从目前剧情来说,大司命还不如时影,他信心十足的事情总会有纰漏。他不让时影见命劫之女,结果时影还是遇上了。他想让时影走火入魔,一心复仇,结果时影在朱颜的劝说下放下了仇恨。大司命让时影开山收</div>
                    </li>
                    <li><a href="/article/1950232820773351424.htm"
                           title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</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/1950232783670538240.htm"
                           title="自律打卡第四天:比昨天进步一点点" target="_blank">自律打卡第四天:比昨天进步一点点</a>
                        <span class="text-muted">花儿的念想</span>

                        <div>今天新闻我们县城又确诊了一例,截止目前已经确诊的三例了,打开,看了一篇简友写的武汉的真实情况,有病住不了院,还没等到床位已经去世的消息,心里更加的难受,武汉尚且这样,如果是我们这没有高速没有火车的十八线的小县城发生这种情况,那情况将是更加的不堪设想,不敢想,唯有祈求灾难早点快去,平安才是最大的福气。突然觉得我的自律打卡,比昨天进步一点点。更希望疫情战争每一天都要比昨天好一点,希望一觉醒来听到的是好</div>
                    </li>
                    <li><a href="/article/1950232781174927360.htm"
                           title="15个小技巧,让我的Windows电脑更好用了!" target="_blank">15个小技巧,让我的Windows电脑更好用了!</a>
                        <span class="text-muted">曹元_</span>

                        <div>01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们</div>
                    </li>
                    <li><a href="/article/1950232316974526464.htm"
                           title="(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析" target="_blank">(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析</a>
                        <span class="text-muted"></span>

                        <div>数据如何从子公司流转到合并报表的全过程,即数据采集→合并引擎→报表输出,特别是HANA内存计算如何优化传统ETL瓶颈。SAPGroupReporting(GR)核心模块功能及数据流向的架构解析,涵盖核心组件、数据处理流程和关键集成点,适用于S/4HANA1809+版本:一、核心功能模块概览模块功能关键事务码/FioriApp数据采集(DataCollection)整合子公司财务数据(SAP/非SA</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/1950232275262173184.htm"
                           title="月光下的罪恶(5)" target="_blank">月光下的罪恶(5)</a>
                        <span class="text-muted">允歌玖沐</span>

                        <div>5.被孤立顾纨是转校过来的,进入学校后,回头率很高“诶诶诶,你看那女生,哪个系的?”“不知道没见过。”“看那样,一看就是个胆小的货。”顾纨当做没听到,更狠的话她都听过,更何况女生们耍心眼?“他爸爸是做黑生意的,估计女儿也不是什么好的,你以后离他一家子远点。”她走向自己要上课的教室,一进门,所有人的目光看向她,顾纨若无其事的走进教室,开始上课。下课,一群人站起来,但是很显然,她周围的一圈人都不愿意和</div>
                    </li>
                    <li><a href="/article/1950232190038110208.htm"
                           title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a>
                        <span class="text-muted">universe_01</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</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/1950231513744338944.htm"
                           title="IK分词" target="_blank">IK分词</a>
                        <span class="text-muted">初心myp</span>

                        <div>实现简单的分词功能,智能化分词添加依赖配置:4.10.4org.apache.lucenelucene-core${lucene.version}org.apache.lucenelucene-analyzers-common${lucene.version}org.apache.lucenelucene-queryparser${lucene.version}org.apache.lucenel</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/1950231509906550784.htm"
                           title="25-1-2019" target="_blank">25-1-2019</a>
                        <span class="text-muted">树藤与海岛呢</span>

                        <div>hello八月来报道了今天看到了一篇文章就只想记下那两句话:良田千顷不过一日三餐广夏万间只睡卧榻三尺大概的意思就是要珍惜当下不要等来不及的时候才珍惜分享今天的两餐最近没有时间运动呢下个月补回好了说完了哈哈goodnight图片发自App图片发自App</div>
                    </li>
                    <li><a href="/article/1950231381485350912.htm"
                           title="《极简思维》第三部分" target="_blank">《极简思维》第三部分</a>
                        <span class="text-muted">小洋苏兮</span>

                        <div>整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别</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/1950231254427299840.htm"
                           title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a>
                        <span class="text-muted">香尧</span>

                        <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</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/1950230114205757440.htm"
                           title="现在发挥你的优势" target="_blank">现在发挥你的优势</a>
                        <span class="text-muted">爱生活的佑嘉</span>

                        <div>来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习</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/1950229986984128512.htm"
                           title="贫穷家庭的孩子考上985以后会怎样?" target="_blank">贫穷家庭的孩子考上985以后会怎样?</a>
                        <span class="text-muted">Mellisa蜜思言</span>

                        <div>我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我</div>
                    </li>
                    <li><a href="/article/1950229922647699456.htm"
                           title="实时数据流计算引擎Flink和Spark剖析" target="_blank">实时数据流计算引擎Flink和Spark剖析</a>
                        <span class="text-muted">程小舰</span>
<a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                        <div>在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin</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/118.htm"
                                       title="异常的核心类Throwable" target="_blank">异常的核心类Throwable</a>
                                    <span class="text-muted">无量</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/1.htm">异常处理</a><a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a>
                                    <div>java异常的核心是Throwable,其他的如Error和Exception都是继承的这个类 里面有个核心参数是detailMessage,记录异常信息,getMessage核心方法,获取这个参数的值,我们可以自己定义自己的异常类,去继承这个Exception就可以了,方法基本上,用父类的构造方法就OK,所以这么看异常是不是很easy 
 
 
 
package com.natsu;


</div>
                                </li>
                                <li><a href="/article/245.htm"
                                       title="mongoDB 游标(cursor) 实现分页 迭代" target="_blank">mongoDB 游标(cursor) 实现分页 迭代</a>
                                    <span class="text-muted">开窍的石头</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>上篇中我们讲了mongoDB 中的查询函数,现在我们讲mongo中如何做分页查询 
 
&nbsp;&nbsp;&nbsp;&nbsp; 如何声明一个游标 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mycursor = db.user.find({_id:{$lte:5}}); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 迭代显示游标数</div>
                                </li>
                                <li><a href="/article/372.htm"
                                       title="MySQL数据库INNODB 表损坏修复处理过程" target="_blank">MySQL数据库INNODB 表损坏修复处理过程</a>
                                    <span class="text-muted">0624chenhong</span>
<a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时候,出现Waiting for N instance(s) to be deallocated 信息。查了下,大概就是程序没有对数据库连接释放,导致Connection泄露了。因为用的是开元集成的平台,内部程序也不可能一下子给改掉的,就验证一下咯。启动Tomcat,用户登录系统,用netstat -</div>
                                </li>
                                <li><a href="/article/499.htm"
                                       title="剖析如何与设计人员沟通" target="_blank">剖析如何与设计人员沟通</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a>
                                    <div>最近做图烦死了,不停的改图,改图……。烦,倒不是因为改,而是反反复复的改,人都会死。很多需求人员不知该如何与设计人员沟通,不明白如何使设计人员知道他所要的效果,结果只能是沟通变成了扯淡,改图变成了应付。 
 
那应该如何与设计人员沟通呢? 
 
我认为设计人员与需求人员先天就存在语言障碍。对一个合格的设计人员来说,整天玩的都是点、线、面、配色,哪种构图看起来协调;哪种配色看起来合理心里跟明镜似的,</div>
                                </li>
                                <li><a href="/article/626.htm"
                                       title="qq空间刷评论工具" target="_blank">qq空间刷评论工具</a>
                                    <span class="text-muted">换个号韩国红果果</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>

var a=document.getElementsByClassName('textinput');
					var b=[];
					for(var m=0;m&lt;a.length;m++){
						if(a[m].getAttribute('placeholder')!=null)
							b.push(a[m])
					}
					var l</div>
                                </li>
                                <li><a href="/article/753.htm"
                                       title="S2SH整合之session" target="_blank">S2SH整合之session</a>
                                    <span class="text-muted">灵静志远</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a>
                                    <div>错误信息: 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cartService': Scope 'session' is not active for the current thread; consider defining a scoped</div>
                                </li>
                                <li><a href="/article/880.htm"
                                       title="xmp标签" target="_blank">xmp标签</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/%E6%A0%87%E7%AD%BE/1.htm">标签</a>
                                    <div>今天在处理数据的显示上遇到一个问题: 
var html = '&lt;li&gt;&lt;div class=&quot;pl-nr&quot;&gt;&lt;span class=&quot;user-name&quot;&gt;' + user
           + '&lt;/span&gt;' + text + '&lt;/div&gt;&lt;/li&gt;';
ulComme</div>
                                </li>
                                <li><a href="/article/1007.htm"
                                       title="Ajax的常用技巧(2)---实现Web页面中的级联菜单" target="_blank">Ajax的常用技巧(2)---实现Web页面中的级联菜单</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a>
                                    <div>在网络上显示数据,往往只显示数据中的一部分信息,如文章标题,产品名称等。如果浏览器要查看所有信息,只需点击相关链接即可。在web技术中,可以采用级联菜单完成上述操作。根据用户的选择,动态展开,并显示出对应选项子菜单的内容。 在传统的web实现方式中,一般是在页面初始化时动态获取到服务端数据库中对应的所有子菜单中的信息,放置到页面中对应的位置,然后再结合CSS层叠样式表动态控制对应子菜单的显示或者隐</div>
                                </li>
                                <li><a href="/article/1134.htm"
                                       title="天-安-门,好高" target="_blank">天-安-门,好高</a>
                                    <span class="text-muted">atongyeye</span>
<a class="tag" taget="_blank" href="/search/%E6%83%85%E6%84%9F/1.htm">情感</a>
                                    <div>&nbsp;&nbsp;&nbsp; 我是85后,北漂一族,之前房租1100,因为租房合同到期,再续,房租就要涨150。最近网上新闻,地铁也要涨价。算了一下,涨价之后,每次坐地铁由原来2块变成6块。仅坐地铁费用,一个月就要涨200。内心苦痛。 
 
&nbsp;&nbsp;&nbsp; 晚上躺在床上一个人想了很久,很久。 
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 我生在农</div>
                                </li>
                                <li><a href="/article/1261.htm"
                                       title="android 动画" target="_blank">android 动画</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E9%80%8F%E6%98%8E%E5%BA%A6/1.htm">透明度</a><a class="tag" taget="_blank" href="/search/%E5%B9%B3%E7%A7%BB/1.htm">平移</a><a class="tag" taget="_blank" href="/search/%E7%BC%A9%E6%94%BE/1.htm">缩放</a><a class="tag" taget="_blank" href="/search/%E6%97%8B%E8%BD%AC/1.htm">旋转</a>
                                    <div>android的动画有两种 &nbsp;tween动画和Frame动画 
&nbsp; 
tween动画;,透明度,缩放,旋转,平移效果 
&nbsp; 
Animation &nbsp; 动画 
AlphaAnimation 渐变透明度 
RotateAnimation 画面旋转 
ScaleAnimation 渐变尺寸缩放 
TranslateAnimation 位置移动 
Animation</div>
                                </li>
                                <li><a href="/article/1388.htm"
                                       title="查看本机网络信息的cmd脚本" target="_blank">查看本机网络信息的cmd脚本</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a>
                                    <div>@echo 您的用户名是:%USERDOMAIN%\%username%&gt;&quot;%userprofile%\网络参数.txt&quot;
@echo 您的机器名是:%COMPUTERNAME%&gt;&gt;&quot;%userprofile%\网络参数.txt&quot;
@echo ___________________&gt;&gt;&quot;%userprofile%\</div>
                                </li>
                                <li><a href="/article/1515.htm"
                                       title="plsql 清除登录过的用户" target="_blank">plsql 清除登录过的用户</a>
                                    <span class="text-muted">征客丶</span>
<a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a>
                                    <div>tools---preferences----logon history---history&nbsp; 把你想要删除的删除 
 
 
-------------------------------------------------------------------- 
若有其他凝问或文中有错误,请及时向我指出, 
我好及时改正,同时也让我们一起进步。 
email : binary_spac</div>
                                </li>
                                <li><a href="/article/1642.htm"
                                       title="【Pig一】Pig入门" target="_blank">【Pig一】Pig入门</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/pig/1.htm">pig</a>
                                    <div>Pig安装 
1.下载pig 
&nbsp; 
wget http://mirror.bit.edu.cn/apache/pig/pig-0.14.0/pig-0.14.0.tar.gz 
&nbsp; 
2. 解压配置环境变量 
&nbsp; 
&nbsp;&nbsp; 如果Pig使用Map/Reduce模式,那么需要在环境变量中,配置HADOOP_HOME环境变量 
&nbsp; 
expor</div>
                                </li>
                                <li><a href="/article/1769.htm"
                                       title="Java 线程同步几种方式" target="_blank">Java 线程同步几种方式</a>
                                    <span class="text-muted">BlueSkator</span>
<a class="tag" taget="_blank" href="/search/volatile/1.htm">volatile</a><a class="tag" taget="_blank" href="/search/synchronized/1.htm">synchronized</a><a class="tag" taget="_blank" href="/search/ThredLocal/1.htm">ThredLocal</a><a class="tag" taget="_blank" href="/search/ReenTranLock/1.htm">ReenTranLock</a><a class="tag" taget="_blank" href="/search/Concurrent/1.htm">Concurrent</a>
                                    <div>为何要使用同步?&nbsp;  &nbsp; &nbsp; java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),&nbsp;   &nbsp; &nbsp; 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,&nbsp;   &nbsp; &nbsp; 从而保证了该变量的唯一性和准确性。    1.同步方法&</div>
                                </li>
                                <li><a href="/article/1896.htm"
                                       title="StringUtils判断字符串是否为空的方法(转帖)" target="_blank">StringUtils判断字符串是否为空的方法(转帖)</a>
                                    <span class="text-muted">BreakingBad</span>
<a class="tag" taget="_blank" href="/search/null/1.htm">null</a><a class="tag" taget="_blank" href="/search/StringUtils/1.htm">StringUtils</a><a class="tag" taget="_blank" href="/search/%E2%80%9C%E2%80%9D/1.htm">“”</a>
                                    <div>转帖地址:http://www.cnblogs.com/shangxiaofei/p/4313111.html 
&nbsp; 
public&nbsp;static&nbsp;boolean&nbsp;isEmpty(String str)  &nbsp;   
  判断某字符串是否为空,为空的标准是 str== 
null&nbsp; 
或 str.length()== 
0   &nbsp;</div>
                                </li>
                                <li><a href="/article/2023.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/%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><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LevelTraverseBinaryTree {

    /**
     * 编程之美 分层遍历二叉树
     * 之前已经用队列实现过二叉树的层次遍历,但这次要求输出换行,因此要</div>
                                </li>
                                <li><a href="/article/2150.htm"
                                       title="jquery取值和ajax提交复习记录" target="_blank">jquery取值和ajax提交复习记录</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/jquery%E5%8F%96%E5%80%BC/1.htm">jquery取值</a><a class="tag" taget="_blank" href="/search/ajax%E6%8F%90%E4%BA%A4/1.htm">ajax提交</a>
                                    <div>
// 取值
	// alert($(&quot;input[name='username']&quot;).val());
	// alert($(&quot;input[name='password']&quot;).val());
	// alert($(&quot;input[name='sex']:checked&quot;).val());
	// alert($(&quot</div>
                                </li>
                                <li><a href="/article/2277.htm"
                                       title="推荐国产工作流引擎嵌入式公式语法解析器-IK Expression" target="_blank">推荐国产工作流引擎嵌入式公式语法解析器-IK Expression</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/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/Excel/1.htm">Excel</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a>
                                    <div>这个开源软件包是国内的一位高手自行研制开发的,正如他所说的一样,我觉得它可以使一个工作流引擎上一个台阶。。。。。。欢迎大家使用,并提出意见和建议。。。 
----------转帖--------------------------------------------------- 
 IK Expression是一个开源的(OpenSource),可扩展的(Extensible),基于java语言</div>
                                </li>
                                <li><a href="/article/2404.htm"
                                       title="关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer" target="_blank">关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>1、PropertyPlaceholderConfigurer 
Spring中PropertyPlaceholderConfigurer这个类,它是用来解析Java Properties属性文件值,并提供在spring配置期间替换使用属性值。接下来让我们逐渐的深入其配置。 
 
基本的使用方法是:(1) 
 
&lt;bean id=&quot;propertyConfigurerForWZ&q</div>
                                </li>
                                <li><a href="/article/2531.htm"
                                       title="二叉树:二叉搜索树" target="_blank">二叉树:二叉搜索树</a>
                                    <span class="text-muted">dieslrae</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%A0%91/1.htm">二叉树</a>
                                    <div>&nbsp;&nbsp;&nbsp; 所谓二叉树,就是一个节点最多只能有两个子节点,而二叉搜索树就是一个经典并简单的二叉树.规则是一个节点的左子节点一定比自己小,右子节点一定大于等于自己(当然也可以反过来).在树基本平衡的时候插入,搜索和删除速度都很快,时间复杂度为O(logN).但是,如果插入的是有序的数据,那效率就会变成O(N),在这个时候,树其实变成了一个链表. 
 
tree代码: 
 
</div>
                                </li>
                                <li><a href="/article/2658.htm"
                                       title="C语言字符串函数大全" target="_blank">C语言字符串函数大全</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a>
                                    <div>C语言字符串函数大全 
&nbsp; 
&nbsp; 
函数名: stpcpy 
功&nbsp;能: 拷贝一个字符串到另一个 
用&nbsp;法: char *stpcpy(char *destin, char *source); 
程序例: 
&nbsp; 
#include &lt;stdio.h&gt; 
#include &lt;string.h&gt; 
&nbsp; 
int main</div>
                                </li>
                                <li><a href="/article/2785.htm"
                                       title="友盟统计页面技巧" target="_blank">友盟统计页面技巧</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E5%B7%A7/1.htm">技巧</a>
                                    <div>在基类调用就可以了, 基类ViewController示例代码 
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [MobClick beginLogPageView:[NSString stringWithFormat:@&quot;%@&quot;,self.class]];
</div>
                                </li>
                                <li><a href="/article/2912.htm"
                                       title="window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法" target="_blank">window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法</a>
                                    <span class="text-muted">flyvszhb</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a>
                                    <div>window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 
 
本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 
 安装jdk1.6前,执行java -version得到 
C:\Users\liuxiang2&gt;java -version 
java version &quot;1.7.0_21&quo</div>
                                </li>
                                <li><a href="/article/3039.htm"
                                       title="Java在创建子类对象的同时会不会创建父类对象" target="_blank">Java在创建子类对象的同时会不会创建父类对象</a>
                                    <span class="text-muted">happyqing</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA/1.htm">创建</a><a class="tag" taget="_blank" href="/search/%E5%AD%90%E7%B1%BB%E5%AF%B9%E8%B1%A1/1.htm">子类对象</a><a class="tag" taget="_blank" href="/search/%E7%88%B6%E7%B1%BB%E5%AF%B9%E8%B1%A1/1.htm">父类对象</a>
                                    <div>&nbsp; 
1.在thingking in java 的第四版第六章中明确的说了,子类对象中封装了父类对象, 
&nbsp; 
2.&quot;When you create an object of the derived class, it contains within it a subobject of the base class. This subobject is the sam</div>
                                </li>
                                <li><a href="/article/3166.htm"
                                       title="跟我学spring3 目录贴及电子书下载" target="_blank">跟我学spring3 目录贴及电子书下载</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>&nbsp; 
&nbsp; 一、《跟我学spring3》电子书下载地址: 
《跟我学spring3》 &nbsp;(1-7 和&nbsp;8-13)&nbsp;http://jinnianshilongnian.iteye.com/blog/pdf&nbsp;&nbsp; 
&nbsp; 
跟我学spring3系列 word原版 下载 
&nbsp; 
&nbsp; 二、
源代码下载  
最新依</div>
                                </li>
                                <li><a href="/article/3420.htm"
                                       title="第12章 Ajax(上)" target="_blank">第12章 Ajax(上)</a>
                                    <span class="text-muted">onestopweb</span>
<a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a>
                                    <div>index.html 
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/</div>
                                </li>
                                <li><a href="/article/3547.htm"
                                       title="BI and EIM 4.0 at a glance" target="_blank">BI and EIM 4.0 at a glance</a>
                                    <span class="text-muted">blueoxygen</span>
<a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a>
                                    <div>http://www.sap.com/corporate-en/press.epx?PressID=14787 
&nbsp; 
有机会研究下EIM家族的两个新产品~~~~ 
&nbsp; 
New features of the 4.0 releases of BI and EIM solutions include:  
 
  Real-time in-memory computing – </div>
                                </li>
                                <li><a href="/article/3674.htm"
                                       title="Java线程中yield与join方法的区别" target="_blank">Java线程中yield与join方法的区别</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。 
&nb</div>
                                </li>
                                <li><a href="/article/3801.htm"
                                       title="android Manifest.xml选项" target="_blank">android Manifest.xml选项</a>
                                    <span class="text-muted">阿尔萨斯</span>
<a class="tag" taget="_blank" href="/search/Manifest/1.htm">Manifest</a>
                                    <div>结构 
继承关系 
public final class Manifest extends Objectjava.lang.Objectandroid.Manifest 
内部类 
 
 
 class Manifest.permission权限 
 class Manifest.permission_group权限组 
 构造函数 
 
public Manifest () 详细  androi</div>
                                </li>
                                <li><a href="/article/3928.htm"
                                       title="Oracle实现类split函数的方" target="_blank">Oracle实现类split函数的方</a>
                                    <span class="text-muted">zhaoshijie</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>关键字:Oracle实现类split函数的方 
项目里需要保存结构数据,批量传到后他进行保存,为了减小数据量,子集拼装的格式,使用存储过程进行保存。保存的过程中需要对数据解析。但是oracle没有Java中split类似的函数。从网上找了一个,也补全了一下。 
 
CREATE OR REPLACE TYPE t_split_100 IS TABLE OF VARCHAR2(100); 
 
cr</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>