主頁 >  其他 > 無所不能的NumPy:我用它彈奏出了CD音質的吉他名曲“愛的羅曼史”

無所不能的NumPy:我用它彈奏出了CD音質的吉他名曲“愛的羅曼史”

2021-01-30 12:35:08 其他

文章目錄

  • 1 前言
  • 2 發出單一頻率的聲音
  • 3 模擬吉他音色
  • 4 彈出吉他上所有的音符
  • 5 吉他譜的格式約定
  • 6 彈奏吉他譜

1 前言

在Python的世界里,沒有一個模塊能夠像NumPy那樣支撐并影響著整個生態系統:從科學計算到資料處理,從視覺識別到機器學習,從神經網路到虛擬現實,處處都有它的身影,無論是OpenCV、OpenGL,還是Pandas、Matplotlib,抑或是Scikti-learn、TensorFlow、Keras、Theano、PyTorch,無不依賴于NumPy,尤其是依賴它所創造的陣列物件(numpy.ndarray),

NumPy幾乎無所不能,NumPy最廣為人知的能力是影像處理,而它最基礎的應用是科學計算,我曾經在《C/C++/Java/Go/Rust,Python喊你來打擂:3秒鐘內統計出小于1億的素數個數》一文中應用NumPy將查找素數的速度提升到接近編譯語言的程度,

本文則是獨辟蹊徑,討論如何使用NumPy發出聲音,以及如何模擬吉他音色,最終生成CD級別的音樂檔案,除了生成wave檔案時用到標準模塊wave,全部代碼僅依賴NumPy單個模塊,此外,采集吉他音頻資料(供頻譜分析用)和播放wave檔案時,還用到了PyAudio模塊,如果有同學想重復頻譜分析、使用代碼播放wave檔案,請使用如下的命令安裝PyAudio模塊,

pip install PyAudio

2 發出單一頻率的聲音

想用NumPy彈奏吉他,先得讓NumPy發出聲音,比如,生成頻率為196Hz(吉他3弦空弦音的頻率)且持續3秒鐘的聲音,這需要3x196=588個周期的波形,假定采樣頻率為22.05kHz(相當于調頻收音機的音質),3秒鐘會采集到66150個資料,如果每個資料用兩個位元組的整數表示,則聲音幅度的動態范圍從-32768到32767,

以下代碼在 [ 0 , 1176 π ] [0,1176\pi] [0,1176π]之間均勻采樣66150點,求其正弦值,逐點連線,即可得到頻率為196Hz、持續時間3秒、量化精度16位、采樣頻率為22.05kHz的正弦波,

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 1176*np.pi, 66150, endpoint=False)
>>> y = np.sin(x) * 32767
>>> y.dtype
dtype('float64')
>>> y = y.astype(np.int16)
>>> y.dtype
dtype('int16')
>>> plt.plot(x, y, color='green')
>>> plt.show()

下圖左側畫出了全部66150個點,影像變成綠色塊了;右側只畫出了前1000個點,可以看出清晰的正弦波形,
在這里插入圖片描述

現在,聲波有了,怎樣才能聽到聲音呢?用PyAudio模塊可以直接在聲卡上播放這個資料(后面的代碼有實作),也可以借助于Python的標準模塊wave將聲波資料保存為wave檔案,wave模塊是一個讀寫后綴名為.wav檔案的工具模塊,用起來非常簡單,

>>> import wave
>>> with wave.open(r'd:\sound_196Hz_3s.wav', 'wb') as fp:
		fp.setparams((1, 2, 22050, 0, 'NONE', 'NONE'))
		fp.writeframes(y.tobytes())

去D盤下看看,多了一個名為sound_196Hz_3s.wav的檔案,點擊并播放它,就會聽到類似輪船開動時的汽笛聲,

3 模擬吉他音色

剛才生成的聲音,雖然和吉他3弦的空弦音頻率相同,但聽起來卻一點不像吉他,那么吉他發出的聲音是什么樣的呢?下圖是我用聲卡采集的吉他1弦和2弦的空弦音的波形圖,時長大約4秒鐘左右,
在這里插入圖片描述
下面是采集聲音的代碼,有興趣的同學可以拿出吉他或者其他樂器錄制一段,然后做一下頻譜分析,

import pyaudio
import numpy as np
import time

def capture(rate, chunk):
    pa = pyaudio.PyAudio()
    stream = pa.open(
        format = pyaudio.paInt16,       # 設定量化精度(每個采樣資料占用的位數)
        channels = 1,                   # 設定單聲道模式           
        rate = 22050,                   # 設定采樣頻率
        frames_per_buffer = 2205,       # 設定聲卡讀寫緩沖區     
        input = True                    # 設定聲卡輸出模式
    )
    
    data = list()
    while len(data) < 50:
        data.append(np.frombuffer(stream.read(2205), dtype=np.int16))
    stream.close()
    pa.terminate()
    
    return np.hstack(data)

if __name__ == '__main__':
    for i in range(5):
        print(5-i)
        time.sleep(1)
    print('Start')
    
    data = capture(22050, 1024)
    np.save('吉他10.npy', data)

NumPy提供了快速傅里葉分析工具,可以分析剛才采集到的吉他聲音的頻率成分及其強度,關于傅里葉分析,有興趣的同學可以翻閱我的博文《假期無聊,我用傅里葉變換做了一個頻率計,吉他定調口哨定音,樣樣好使!》,

import numpy as np
import matplotlib.pyplot as plt
import time
import wave

plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False

d1 = np.load('吉他10.npy')
d2 = np.load('吉他20.npy')

plt.subplot(221)
plt.plot(d1, c='g')
plt.title('吉他1弦空弦音')
plt.subplot(222)
plt.plot(d2, c='m')
plt.title('吉他2弦空弦音')

fd1 = np.fft.fft(d1[22050:44100]) # 截取吉他1弦空弦音1秒鐘的資料進行傅里葉分析
fd2 = np.fft.fft(d2[22050:44100]) # 截取吉他2弦空弦音1秒鐘的資料進行傅里葉分析

plt.subplot(223)
plt.plot(np.abs(fd1[:11025]/22050), c='g')
plt.title('吉他1弦單邊頻譜圖')
plt.subplot(224)
plt.plot(np.abs(fd2[:11025]/22050), c='m')
plt.title('吉他2弦單邊頻譜圖')
plt.show()

不難看出,吉他發出的聲音有以下兩個特點:

  1. 聲音幅度在振動中逐漸變小
  2. 頻譜顯示存在較強幅度的二倍頻、三倍頻、四倍頻
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 3*np.pi, 22050, endpoint=False)
>>> y1 = 1 - x/(10*np.pi) + (1-x/(6*np.pi))*np.sin(x)*0.5
>>> x = np.arange(3*22050)/22050
>>> y2 = 0.7*np.exp(-x)
>>> GUITAR_EFFECT_ARRAY = np.hstack((y1, y2))
>>> y_guitar = y*GUITAR_EFFECT_ARRAY[:y.shape[0]]
>>> plt.subplot(121)
>>> plt.plot(GUITAR_EFFECT_ARRAY)
>>> plt.subplot(122)
>>> plt.plot(y_guitar)
>>> plt.show()

上面的代碼,生成了一個模擬吉他波形的包絡線,將等幅的正弦波模擬成吉他波形,效果如下圖所示,
在這里插入圖片描述
解決了聲波的振幅衰減,還需要疊加二倍頻、三倍頻、四倍頻,對于NumPy來說,這都是小菜一碟,

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif'] = ['FangSong']
>>> plt.rcParams['axes.unicode_minus'] = False
>>> x1 = np.linspace(0, 4*np.pi, 300)
>>> x2 = np.linspace(0, 8*np.pi, 300)
>>> x3 = np.linspace(0, 12*np.pi, 300)
>>> y1 = np.sin(x1)
>>> y2 = np.sin(x2)
>>> y3 = np.sin(x3)
>>> y = np.sum(np.dstack((y1,y2,y3))[0], axis=1)
>>> plt.subplot(221)
>>> plt.title('基波')
>>> plt.plot(y1, c='be')
>>> plt.subplot(222)
>>> plt.title('二倍頻')
>>> plt.plot(y2, c='cn')
>>> plt.subplot(223)
>>> plt.title('三倍頻')
>>> plt.plot(y3, c='y')
>>> plt.subplot(224)
>>> plt.title('復合波形')
>>> plt.plot(y, c='m')
>>> plt.show()

不同頻率的波形疊加在一起,效果如下圖所示,
在這里插入圖片描述

4 彈出吉他上所有的音符

寫到這里,必須要感謝中國古代的一位貴族——明朝皇室子弟朱載堉,他是一位被嚴重低估了的天才,他也是我認為最類似以解決數學問題為樂趣的歐洲貴族、最配得上貴族這一稱號的中國人之一,他的主要學術成果是十二平均律,經過傳教士利瑪竇傳到西方后,直接導致了西方現代音樂理論的興起,朱載堉同時也是手工開方的先驅,他自制81檔算盤開12次方,堪稱前無古人后無來者,

扯遠了,如果理解十二平均律的話,很容易計算出吉他上所有品格的音頻頻率,簡單說,同一根弦上,從低到高所有品格的頻率是一個等比數列,比例為 2 12 \sqrt[12]{2} 122 ?,知道A=440Hz的話,也很容易根據十二平均律計算出從1弦到6弦的頻率分別為329.6Hz、246.9Hz、196.0Hz、146.8Hz、110.0Hz、82.4Hz,

這里定義1弦空弦用字串’10’表示,1弦3品用字串’13’表示,字串’212’則表示2弦12品,字串’0’則表示休止,計算吉他上指定弦品音頻頻率的代碼如下,

def get_frequency(pos):
    """回傳指定弦品pos的頻率"""
    
    fs = (329.6, 246.9, 196.0, 146.8, 110.0, 82.4)
    if pos[0] == '0':
        return 0
    else:
        return fs[int(pos[0])-1] * pow(2, int(pos[1:])/12)

5 吉他譜的格式約定

僅有吉他弦品的表示法還不夠,還需要定義每個音符的時值表示,這里約定使用節拍數表示,如果以4分音符為1拍,則4表示全音符,2表示2分音符,1表示4分音符,0.5表示8分音符,0.25表示16分音符,依次類推,

有了吉他弦品和時值的表示,如何描述吉他譜呢?這里約定,一個吉他譜是若干樂譜小節的有序集合,每個樂譜小節又是多個聲部的有序集合,每個聲部又是一根琴弦上品格和時值的元組的有序集合,這里說的有序集合,就是Pytho的串列,下面是根據這個約定翻譯過來的“天空之城”的序曲部分,

castle_in_the_sky= [
    [ # 第1節
        [('10',0.5),('12',0.5)] # 1弦
    ],
    [ # 第2節
        [('13',1.5),('12',0.5),('13',1),('13',0.5),('17',0.5)], # 1弦
        [('0',1),('20',3)], # 2弦
        [('0',0.5),('30',2),('30',1.5)], # 3弦
        [('60',2),('60',2)] # 6弦
    ],
    [ # 第3節
        [('12',4)], # 1弦
        [('0',1),('23',2),('20',1)], # 2弦
        [('0',0.5),('32',1),('32',2.5)], # 3弦
        [('40',2),('40',2)] # 4弦
    ],
    [ # 第4節
        [('10',2),('10',1),('13',1)], # 1弦
        [('21',1.5),('23',2.5)], # 2弦
        [('0',1),('30',1.5),('30',1),('30',0.5)], # 3弦
        [('0',0.5),('42',3.5)], # 4弦
        [('53',4)] # 5弦
    ],
    [ # 第5節
        [('23',3),('20',1)], # 2弦
        [('0',1),('30',1),('30',2)], # 3弦
        [('0',0.5),('40',1),('40',2.5)], # 4弦
        [('52',4)] # 5弦
    ],
    [ # 第6節
        [('0',2.5),('13',1.5)], # 1弦
        [('21',1.5),('20',0.5),('21',2)], # 2弦
        [('0',1),('30',2.5),('30',0.5)], # 3弦
        [('0',0.5),('42',2.5),('42',1)], # 4弦
        [('50',2),('50',2)] # 5弦
    ],
    [ # 第7節
        [('0',3),('13',0.5),('13',0.5)], # 1弦
        [('20',2),('20',2)], # 2弦
        [('0',1),('30',3)], # 3弦
        [('0',0.5),('42',1),('42',2.5)], # 4弦
        [('60',4)] # 6弦
    ],
    [ # 第8節
        [('12',3),('12',0.5),('10',0.5)], # 1弦
        [('0',1.5),('22',0.5),('22',2)], # 2弦
        [('0',1),('33',1.5),('33',1.5)], # 3弦
        [('0',0.5),('44',3.5)], # 4弦
        [('62',2),('62',2)] # 6弦
    ],
    [ # 第9節
        [('12',2),('12',2)], # 1弦
        [('0',1.5),('24',0.5),('24',2)], # 2弦
        [('0',1),('34',1),('34',2)], # 3弦
        [('0',0.5),('44',1.5),('44',2)], # 4弦
        [('51',4)] # 5弦
    ]
]

6 彈奏吉他譜

有了以上這些儲備,寫一段彈奏吉他譜的代碼就是水到渠成了,全部代碼不足100行,重點位置已有注釋,

import numpy as np
import wave
import pyaudio

SPEED = 80 # 用每分鐘節拍數表示彈奏速度
FRAME_RATE = 44100 # 采樣速率(44100為CD音質,22050為調頻廣播音質)
STEREO = True # 立體聲(雙聲道)

# 生成吉他音色包絡線
x = np.linspace(0, 3*np.pi, 2*int(FRAME_RATE*60/SPEED), endpoint=False)
y1 = 1 - x/(10*np.pi) + (1-x/(6*np.pi))*np.sin(x)*0.5
x = np.arange(6*int(FRAME_RATE*60/SPEED))/int(FRAME_RATE*60/SPEED)
y2 = 0.7*np.exp(-x)
GUITAR_EFFECT_ARRAY = np.hstack((y1, y2))

def get_frequency(pos):
    """回傳指定弦品pos的頻率"""
    
    fs = (329.6, 246.9, 196.0, 146.8, 110.0, 82.4)
    if pos[0] == '0':
        return 0
    else:
        return fs[int(pos[0])-1] * pow(2, int(pos[1:])/12)

def get_wave(f, beat):
    """回傳指定頻率和節拍數的波形資料"""
    
    data = list()
    duration = beat*60/SPEED
    sample_num = int(duration*FRAME_RATE)
    
    for k, p in [(1,0.4), (2,0.3), (3,0.2), (4,0.1)]:
        x = np.linspace(0, 2*duration*f*k*np.pi, sample_num, endpoint=False)
        y = np.sin(x)*p
        data.append(y)
    
    return guitar_effect(np.sum(np.dstack(data)[0], axis=1))

def guitar_effect(data):
    """將等幅聲波變成吉他音色的聲波資料"""
    
    return data*GUITAR_EFFECT_ARRAY[:data.shape[0]]

def play(melody, wave_file=None):
    """彈奏吉他譜,若wave_file存在,同時生成.wav檔案"""
    
    data = list()
    for section in melody:
        data_section = list()
        for cord in section:
            data_cord = list()
            for pos, beat in cord:
                f = get_frequency(pos)
                dw = get_wave(f, beat)
                data_cord.append(dw)
            data_cord = np.hstack(data_cord)
            data_section.append(data_cord)
        
        d = data_section[0]
        for i in range(1, len(data_section)):
            if d.shape[0] > data_section[i].shape[0]:
                d[:data_section[i].shape[0]] += data_section[i]
            else:
                data_section[i][:d.shape[0]] += d
                d = data_section[i]
        data.append(d)
    
    data = np.hstack(data)
    data = data*20000/data.max()
    data = data.astype(np.int16)
    
    if STEREO:
        blank = np.zeros(int(0.006*FRAME_RATE), dtype=np.int16)
        d_left = np.hstack((data, blank))
        d_right = np.hstack((blank, data))
        data = np.dstack((d_left, d_right))[0].ravel()
    
    if wave_file:
        with wave.open(wave_file, 'wb') as fp:
            fp.setparams((int(STEREO)+1, 2, FRAME_RATE, 0, 'NONE', 'NONE'))
            fp.writeframes(data.tobytes())
    
    pa = pyaudio.PyAudio()
    stream = pa.open(
        format = pyaudio.paInt16,   # 設定量化精度:每個采樣資料占用的位數
        channels = int(STEREO)+1,   # 設定通道數量           
        rate = FRAME_RATE,          # 設定采樣頻率
        frames_per_buffer = 1024,   # 設定聲卡讀寫緩沖區     
        output = True               # 設定聲卡輸出模式
    )
    
    for i in range(0, data.shape[0], 1024):
        stream.write(data[i:i+1024].tobytes())
    
    stream.stop_stream()
    stream.close()
    pa.terminate()

用哪一首曲子來體驗一下代碼的效果呢?愛的羅曼史!這首曲子第二段的指法實在變態,對于手指僵硬的我來說,這輩子是不可能彈出第二段的,現在終于有機會彈出我所理解的這首世界名曲了,下面是根據約定翻譯過來的吉他名曲“愛的羅曼史”的樂譜,

romance= [
    [
        [('17',1),('17',1),('17',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('17',1),('15',1),('13',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('13',1),('12',1),('10',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('10',1),('13',1),('17',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('112',1),('112',1),('112',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('112',1),('110',1),('18',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('18',1),('17',1),('15',1)],
        [('0',0.33),('25',1),('25',1),('25',0.66)],
        [('0',0.66),('35',1),('35',1),('35',0.33)],
        [('50',3)]
    ],
    [
        [('15',1),('17',1),('18',1)],
        [('0',0.33),('25',1),('25',1),('25',0.66)],
        [('0',0.66),('35',1),('35',1),('35',0.33)],
        [('50',3)]
    ],
    [
        [('17',1),('18',1),('17',1)],
        [('0',0.33),('27',1),('27',1),('27',0.66)],
        [('0',0.66),('38',1),('38',1),('38',0.33)],
        [('67',3)]
    ],
    [
        [('111',1),('18',1),('17',1)],
        [('0',0.33),('27',1),('27',1),('27',0.66)],
        [('0',0.66),('38',1),('38',1),('38',0.33)],
        [('67',3)]
    ],
    [
        [('17',1),('15',1),('13',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('13',1),('12',1),('10',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('60',3)]
    ],
    [
        [('12',1),('12',1),('12',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('32',1),('32',1),('32',0.33)],
        [('52',3)]
    ],
    [
        [('12',1),('13',1),('12',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('32',1),('32',1),('32',0.33)],
        [('52',3)]
    ],
    [
        [('10',1),('10',1),('10',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('30',1),('30',1),('30',0.33)],
        [('42',1),('52',1),('63',1)]
    ],
    [
        [('10',3)],
        [('20',3)],
        [('30',3)],
        [('60',3)]
    ],
    [
        [('14',1),('14',1),('14',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('31',1),('31',1),('31',0.33)],
        [('60',3)]
    ],
    [
        [('14',1),('12',1),('10',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('31',1),('31',1),('31',0.33)],
        [('60',3)]
    ],
    [
        [('25',1),('24',1),('24',1)],
        [('0',0.33),('32',1),('32',1),('32',0.66)],
        [('0',0.66),('44',1),('44',1),('44',0.33)],
        [('50',3)]
    ],
    [
        [('24',1),('23',1),('24',1)],
        [('0',0.33),('32',1),('32',1),('32',0.66)],
        [('0',0.66),('44',1),('44',1),('44',0.33)],
        [('50',3)]
    ],
    [
        [('19',1),('19',1),('19',1)],
        [('0',0.33),('27',1),('27',1),('27',0.66)],
        [('0',0.66),('38',1),('38',1),('38',0.33)],
        [('67',3)]
    ],
    [
        [('19',1),('111',1),('19',1)],
        [('0',0.33),('27',1),('27',1),('27',0.66)],
        [('0',0.66),('38',1),('38',1),('38',0.33)],
        [('67',3)]
    ],
    [
        [('19',1),('17',1),('17',1)],
        [('0',0.33),('29',1),('29',1),('29',0.66)],
        [('0',0.66),('39',1),('39',1),('39',0.33)],
        [('60',3)]
    ],
    [
        [('17',1),('19',1),('111',1)],
        [('0',0.33),('29',1),('29',1),('29',0.66)],
        [('0',0.66),('39',1),('39',1),('39',0.33)],
        [('60',3)]
    ],
    [
        [('112',1),('112',1),('112',1)],
        [('0',0.33),('29',1),('29',1),('29',0.66)],
        [('0',0.66),('39',1),('39',1),('39',0.33)],
        [('60',3)]
    ],
    [
        [('112',1),('111',1),('110',1)],
        [('0',0.33),('29',1),('29',1),('29',0.66)],
        [('0',0.66),('39',1),('39',1),('39',0.33)],
        [('60',3)]
    ],
    [
        [('19',1),('19',1),('19',1)],
        [('0',0.33),('25',1),('25',1),('25',0.66)],
        [('0',0.66),('36',1),('36',1),('36',0.33)],
        [('50',3)]
    ],
    [
        [('19',1),('17',1),('15',1)],
        [('0',0.33),('25',1),('25',1),('25',0.66)],
        [('0',0.66),('36',1),('36',1),('36',0.33)],
        [('50',3)]
    ],
    [
        [('14',1),('14',1),('14',1)],
        [('0',0.33),('24',1),('24',1),('24',0.66)],
        [('0',0.66),('32',1),('32',1),('32',0.33)],
        [('52',3)]
    ],
    [
        [('14',1),('15',1),('12',1)],
        [('0',0.33),('24',1),('24',1),('24',0.66)],
        [('0',0.66),('32',1),('32',1),('32',0.33)],
        [('52',3)]
    ],
    [
        [('10',1),('10',1),('10',1)],
        [('0',0.33),('20',1),('20',1),('20',0.66)],
        [('0',0.66),('31',1),('31',1),('31',0.33)],
        [('42',1),('52',1),('64',1)]
    ],
    [
        [('10',3)],
        [('20',3)],
        [('30',3)],
        [('60',3)]
    ]
]

激動人心的時刻來了,運行下面的代碼,美妙的旋律就會從你的聲卡中源源不斷地飛出來,

play(romance)

若想同時保存成檔案,請使用下面的命令,

play(romance, '愛的羅曼史.wav')

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254479.html

標籤:其他

上一篇:她因重倉馬斯克和位元幣封神!現在分享了十大2021技術趨勢

下一篇:騰訊會議、釘釘如何使用虛擬攝像頭?詳細教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more