Herbst-Gesichts-Sutra [Huawei | DJI | Kuaishou] [Java] (3)

Auch die Rekrutierung im Herbst geht allmählich zu Ende. Ich werde einige Interviewerfahrungen während des Rekrutierungsprozesses im Herbst in einem Blog aufzeichnen, der hauptsächlich aus meinem eigenen Praktikum, der Vorabgenehmigung, den Erfahrungen mit Rekrutierungsinterviews im Herbst und der Zusammenstellung von niuke stammt.

Huawei

1. Schwierigkeiten im Projekt

2. Der Unterschied zwischen volatil und synchronisiert

Eigenschaften von beiden

Zwei Aspekte der Thread-Sicherheit:Ausführungskontrolle, Speicher sichtbar

Ausführungskontrolle: KontrollcodeAusführungsreihenfolge und ob er gleichzeitig ausgeführt werden kann;

Speicher sichtbar: Steuert die Sichtbarkeit von ThreadAusführungsergebnissen im Speicher für andere Threads.

Java内存模型的实现:线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。

  • synchronized löst das Problem der Ausführungskontrolle. Dadurch wird verhindert, dass andere Threads die Überwachungssperre des aktuellen Objekts erhalten, sodass der durch das Schlüsselwort synchronized im aktuellen Objekt geschützte Codeblock dies nicht kann von anderen Threads verwendet werden. Der Zugriff kann also nicht gleichzeitig ausgeführt werden. synchronizedEs wird außerdem eine Speicherbarriere erstellt. Diese Anweisung stellt sicher, dass alle Operationsergebnisse direkt in den Speicher geleert werden, wodurch die Speichersichtbarkeit der Operation sichergestellt wird< /a >.

  • volatile löst das Problem der Speichersichtbarkeit, das dazu führt, dass alle Lese- und Schreibvorgänge in volatile-Variablen direkt in den Hauptspeicher geschrieben werden, und stellt sicher Sichtbarkeit von Variablen. Dies kann einige Anforderungen erfüllen, die eine variable Sichtbarkeit erfordern, jedoch nicht die Lese- und Schreibreihenfolge.

Der Unterschied zwischen den beiden
  1. volatile teilt dem JVM im Wesentlichen mit, dass der Wert der aktuellen Variablen im Register unsicher ist und aus dem Hauptspeicher gelesen werden muss; synchronized sperrt die aktuelle Variable und nur der aktuelle Thread kann dies tun Greifen Sie auf die Variable zu. Andere Threads werden blockiert.
  2. volatile kann nur auf Variablenebene verwendet werden; synchronized kann auf Variablen-, Methoden- und Klassenebene verwendet werden.
  3. volatile kann nur die Modifikationssichtbarkeit von Variablen realisieren, aber keine Atomizität garantieren; synchronized kann die Modifikationssichtbarkeit und Atomizität von Variablen garantieren.
  4. volatile führt nicht zu einer Thread-Blockierung; synchronized kann zu einer Thread-Blockierung führen.

3. Wie lösche ich den Wurzelknoten eines großen oberen Heaps und eines kleinen oberen Heaps?

Der Heap ist eine vollständige binäre Baumstruktur:

  • Seinübergeordneter Knoten befindet sich unteri/2
  • Seinlinker untergeordneter Knoten befindet sich unter2i
  • Seinrechter untergeordneter Knoten befindet sich unter2i+1

Löschen Sie den Wurzelknoten: Ersetzen Sie das letzte Element oben im Heap und stapeln Sie es dann, sodass der neue Heap übereinstimmen muss zu seiner eigenen Charakteristik. Offensichtlich handelt es sich dabei um einen Häufungsvorgang von oben nach unten.

Bild

4. Was ist ein CSRF-Angriff? Wie kann man es verhindern?

CSRF(Cross-Site Request Forgery), auch bekannt als One-Click-Angriff oder Session-Riding, also Cross-Site-Request-Forgery-Angriff.

CSRF-Prinzip

1. Benutzer C öffnet den Browser, besucht die vertrauenswürdige Website A, gibt den Benutzernamen und das Passwort ein, um die Anmeldung bei Website A anzufordern.

2. Nachdem die Benutzerinformationen überprüft wurden, generiert Website A Cookie-Informationen und gibt sie an den Browser zurück. Zu diesem Zeitpunkt meldet sich der Benutzer erfolgreich bei Website A an und kann normal Anfragen an Website A senden.

3. Bevor der Benutzer Website A verlässt, öffnet er eine TAB-Seite im selben Browser, um Website B zu besuchen.

4. Nach Erhalt der Benutzeranfrage gibt Website B einen anstößigen Code zurück und sendet eine Anfrage zum Zugriff auf die Website A eines Drittanbieters.

5. Nach dem Empfang dieser anstößigen Codes trägt der Browser die Cookie-Informationen und sendet ohne Wissen des Benutzers eine Anfrage an Website A entsprechend der Anfrage von Website B. Website A weiß nicht, dass die Anfrage tatsächlich von B initiiert wurde, daher wird sie die Anfrage mit den Berechtigungen von C basierend auf den Cookie-Informationen von Benutzer C verarbeiten, was zu … Der Schadcode von Website B wird ausgeführt.

Verteidigungsmethode
  1. Erkennung von CSRF-Schwachstellen

Der einfachste Weg, CSRF-Schwachstellen zu erkennen, besteht darin, ein normales Anforderungsdatenpaket zu erfassen, das Referer-Feld zu entfernen und es dann erneut zu senden. Wenn die Wenn die Einreichung noch gültig ist, ist es grundsätzlich sicher, dass eine CSRF-Schwachstelle vorliegt.

Referer字段:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

  1. Serverseitige Verteidigung

Standard-GET-Aktionen befolgen: Nur eine GET-Anfrage darf Daten abrufen, es ist jedoch nicht gestattet, Daten darauf zu ändern Server.

Fügen Sie der Seite eine Zufallszahl hinzu: Wenn ein Benutzer die Website besucht, sollte die Website ein (kryptografisch starkes) Pseudo- generieren. Zufallszahlenwert und setzt ihn als Cookie auf dem Computer des Benutzers. Websites sollten verlangen, dass jedes Formular diesen pseudozufälligen Wert enthält (sowohl als Formularwert als auch als Cookie-Wert). Wenn eine POST-Anfrage an die Site gesendet wird, wird die Anfrage nur dann als gültig betrachtet, wenn der Formularwert und der Cookie-Wert identisch sind.

  1. Fügen Sie ein Token hinzu und überprüfen Sie es in einer Nicht-GET-Anfrage

​ Sie können der HTTP-Anfrage ein zufällig generiertes Token in Form eines Parameters hinzufügen und auf der Serverseite einen Interceptor erstellen, um das Token zu überprüfen. Wenn die Anfrage kein Token enthält oder der Token-Inhalt falsch ist, kann dies der Fall sein wird als CSRF-Angriff betrachtet und die Anfrage wird abgelehnt. fragen.

  1. Überprüfen Sie das Feld „HTTP-Referer“.

Im HTTP-Header gibt es ein Referrer-Feld, das zur Angabe der Adresse verwendet wird, von der die Anfrage kommt.

5. Kommunikationsmethoden zwischen Prozessen

Rohr

Pipes sind eine Halbduplex-Kommunikationsmethode. Daten können nur in eine Richtung fließen und nur zwischen Prozessen mit Affinität (Eltern-Kind-Prozessbeziehung) verwendet werden.

Namepipe

Die berühmte Pipe ist ebenfalls eine Halbduplex-Kommunikationsmethode, ermöglicht jedoch die Kommunikation zwischen unabhängigen Prozessen.

Semaphor

Ein Semaphor ist ein Zähler, mit dem der Zugriff mehrerer Prozesse auf gemeinsam genutzte Ressourcen gesteuert werden kann. Call Eating wird als Sperrmechanismus verwendet, um zu verhindern, dass andere Prozesse auf gemeinsam genutzte Ressourcen zugreifen, wenn ein Prozess auf die Ressource zugreift. Daher wird es hauptsächlich als Mittel zur Synchronisierung zwischen Prozessen und zwischen verschiedenen Threads innerhalb desselben Prozesses verwendet.

Nachrichtenwarteschlange (messagequeue)

Eine Nachrichtenwarteschlange ist eine verknüpfte Liste von Nachrichten, die im Kernel gespeichert und durch eine Nachrichtenwarteschlangen-ID identifiziert wird. Die Nachrichtenwarteschlange überwindet den Mangel der Signalübertragung von weniger Informationen.

Signal

Signale sind eine relativ komplexe Kommunikationsmethode, mit der der empfangende Prozess darüber informiert wird, dass ein Ereignis eingetreten ist.

geteilte Erinnerung

Gemeinsamer Speicher dient dazu, einen Speicherabschnitt abzubilden, auf den andere Prozesse zugreifen können. Dieser gemeinsam genutzte Speicher wird von einem Prozess erstellt, kann aber von mehreren Prozessen aufgerufen werden.

Steckdose

Sockets stellen auch einen prozessübergreifenden Kommunikationsmechanismus dar. Im Gegensatz zu anderen Prozessmechanismen können sie für die Prozesskommunikation zwischen verschiedenen Geräten und zwischen ihnen verwendet werden.

6. Kommunikationsmethoden zwischen Threads

Sperrmechanismus: einschließlich Mutex-Sperre, Bedingungsvariable, Lese-/Schreibsperre
  • Mutex-Sperren bieten eine Möglichkeit, ausschließlich zu verhindern, dass Datenstrukturen gleichzeitig geändert werden
  • Lese-/Schreibsperren ermöglichen es mehreren Threads, gemeinsam genutzte Daten gleichzeitig zu lesen, während sich Schreibvorgänge gegenseitig ausschließen.
  • Bedingungsvariablen können einen Prozess atomar blockieren, bis eine bestimmte Bedingung wahr ist.
Semaphor-Mechanismus: einschließlich unbenannter Thread-Semaphore und benannter Thread-Semaphore
Signalmechanismus: ähnlich der Signalverarbeitung zwischen Prozessen

7. Häufig verwendete Datenstrukturen in MySQL

  • Wohlgeformt (xxxint)
  • Ortstyp(bit)
  • Gleitkommatyp (float, double, real)
  • Anzahl der Fixpunkte (decimal,numeric)
  • Datums-/Uhrzeittyp (date,time,datetime,year) < /span>
  • Zeichenspieß (char,varchar,xxxtext)
  • Zwei-Wege-Zahlensystem (xxxBlob, xxbinary)
  • Blatt (enum)
  • set(set)

Referenzlink

8. Singleton-Modus

Lazy-Man-Stil (neu, wenn Sie ihn verwenden)

1, Doppelsperre(volatile & synchronized)

public class DoubleCheckSingleton {
    
    
    private static volatile DoubleCheckSingleton instance;
    private DoubleCheckSingleton() {
    
    }
    public static synchronized DoubleCheckSingleton getInstance() {
    
    
        if(instance == null) {
    
     //判断是否实例化
            synchronized (DoubleCheckSingleton.class) {
    
    
                if(instance == null) {
    
    
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance; //否则直接return
    }
}

2, 100 % (synchronized

public class SafeSingleton {
    
    
    private static SafeSingleton instance;
    private SafeSingleton() {
    
    }
    //synchronized同步处理
    public static synchronized SafeSingleton getInstance() {
    
    
        if(instance == null) {
    
    
            instance = new SafeSingleton();
        }
        return instance;
    }
}

3. Unsicherer Modus

public class NoneSafeSingleton {
    
    
    private static NoneSafeSingleton instance;
    private NoneSafeSingleton() {
    
    }
    public static NoneSafeSingleton getInstance() {
    
      //调用时才实例化对象,懒汉式
        if(instance == null) {
    
    
            instance = new NoneSafeSingleton();
        }
        return instance;
    }
}
Hungriger chinesischer Stil (neue Instanz zuerst)

1. Statische Variablenform

public class Singleton_1 {
    
    
    //私有化构造器
    private Singleton_1() {
    
    }
    //内部创建对象实例
    private final static Singleton_1 instance = new Singleton_1();
    //对外公有的静态方法
    public static Singleton_1 getInstance() {
    
    
        return instance;
    }
}

2. Statischer Codeblockmodus

public class Singleton_2 {
    
    
    //私有化构造器
    private Singleton_2() {
    
    }
    //内部创建对象实例
    private static Singleton_2 instance;
    static {
    
     // 在静态代码块中,创建单例对象
        instance = new Singleton_2();
    }
    //对外公有的静态方法
    public static Singleton_2 getInstance() {
    
    
        return instance;
    }
}

9. Der Unterschied zwischen Prozessen und Threads

Verfahren

​ Eine Anwendung, die im Speicher ausgeführt wird. Jeder Prozess verfügt über seinen eigenen unabhängigen Speicherbereich und ein Prozess kann mehrere Threads haben. In einem Windows-System ist beispielsweise eine laufende xx.exe ein Prozess.

Faden

​ Eine Ausführungsaufgabe (Steuereinheit) in einem Thread, die für die Ausführung von Programmen im aktuellen Prozess verantwortlich ist. Ein Prozess verfügt über mindestens einen Thread, ein Prozess kann mehrere Threads ausführen und mehrere Threads können Daten gemeinsam nutzen.

schneller Arbeiter

1. Die ersten k Hochfrequenzelemente

public static int[] method(int[] nums, int k){
    
    
    int[] topK = new int[k];
    Map<Integer, Integer> map = new HashMap<>();
    PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> (a[1] - b[1]));
    for(int num : nums){
    
    
        map.put(num, map.getOrDefault(num, 0) +1);
    }
    for(Map.Entry<Integer, Integer> mapEntry : map.entrySet()){
    
    
        int temp = mapEntry.getKey();
        int count = mapEntry.getVaule();
        if(queue.size() < k) queue.offer(new int[]{
    
    temp, count});
        else{
    
    
            if(queue.peek()[1] < count){
    
    
                queue.poll();
                queue.offer(new int[]{
    
    temp, count});
            }
        }
    }
    int i = 0;
    while(!queue.isEmpty()) topK[i] = queue.poll()[0];
    return topK;
}

2. Anzahl neuer Benutzer in einem bestimmten Zeitraum

SELECT DATE_FORMAT(create_date, "%Y-%m-%d") AS time, count(*) AS total
FROM survey_user
WHERE time BETWEEN "2021-11-21 00:00:00" AND "2022-11-21 00:00:00"
GROUP BY time
ORDER BY total ASC;

3. Erfassen Sie iPhone-Pakete im LAN

Um Charles zum Erfassen von iPhone-Nachrichten zu verwenden, sind die folgenden Schritte erforderlich:
1.配置 Charles 代理:在 Charles 中选择“Proxy”菜单,然后选择“Proxy Settings”,在“Proxy Settings”对话框中选择“Proxies”选项卡,在“Proxies”选项卡中勾选“Enable macOS Proxy”和“Enable iOS Simulator Proxy”(如果你使用的是 iOS 模拟器)。

2.在 iPhone 上配置代理:打开 iPhone 的设置,选择“无线局域网”,然后选择当前连接的 Wi-Fi 网络,在网络详情页面中选择“配置代理”,选择“手动”,在“服务器”和“端口”输入 Charles 的 IP 地址和端口号(默认为8888)。

3.安装 Charles 的 SSL 证书:在 Charles 中选择“Help”菜单,然后选择“SSL Proxying”和“Install Charles Root Certificate”,然后按照提示安装证书。

4.开始抓取手机报文:在 Charles 中选择“Proxy”菜单,然后选择“SSL Proxying Settings”,在“SSL Proxying Settings”对话框中选择“Add”按钮,将需要抓取的域名添加到“Location”列表中,然后在 iPhone上打开需要抓取的应用程序,Charles 就会开始抓取该应用程序的手机报文。

5.需要注意的是,有些应用程序可能使用了 HTTPS 加密,这时需要在 Charles 中对 HTTPS 流量进行解密才能抓取到明文数据。在“Proxy”菜单中选择“SSL Proxying”和“Install Charles Root Certificate on a Mobile Device or Remote Browser”,然后按照提示安装证书并在 iPhone中信任该证书即可。

DJI

1. Verwenden Sie einen automatisierten Prozess zum Schreiben von Testfällen

  • Anforderungen und Spezifikationen verstehen

Bevor Tester Testfälle schreiben, müssen sie die Anforderungen und Spezifikationen der Software vollständig verstehen, um sicherzustellen, dass die Testfälle alle Funktionen und Szenarien abdecken können. EinschließlichLesen von Anforderungsdokumenten, Analyse von Spezifikationen, Bestätigen Sie die Details der Anforderungen.

  • Schreiben Sie Testfälle

Nachdem Sie die Anforderungen verstanden haben, können Sie Testfälle schreiben. Testfälle sollten in der Lage sein, verschiedene Funktionen und Szenarien der Software abzudecken, um die Softwarequalität sicherzustellen. EinschließlichAuswahl von Testtools, Bestimmung von Testszenarien, < a i=5>Testfälle schreiben, Testfälle bestätigen, Klassifizierungstest Anwendungsfall.

2. Welche Teile umfasst der Testfall?

  • Anwendungsfallnummer
  • Zugehöriges Modul
  • Titel des Anwendungsfalls
  • Voraussetzungen
  • Schritte
  • Testdaten
  • Erwünschtes Ergebnis
  • tatsächliche Ergebnisse

3. Wie beurteilt man die Qualität von Testfällen?

  • Integrität

Überprüfen Sie, ob die Anwendungsfälle verschiedene Szenarien, Grenzwerte und abnormale Situationen abdecken, um die Vollständigkeit und Vollständigkeit des Tests sicherzustellen

  • Lesbarkeit

Testfälle sollten klare Beschreibungen und Schritte enthalten, damit Tester die Tests leicht verstehen und ausführen können

  • Konsistenz

Testfälle sollten konsistenten Formaten, Namenskonventionen und Konventionen folgen, um die Verwaltung und Ausführung zu vereinfachen

  • Wiederholbarkeit

Testfälle sollten wiederholt unter verschiedenen Umgebungen und Bedingungen ausgeführt werden können und die gleichen Ergebnisse liefern

  • Unabhängigkeit

Testfälle sollten unabhängig voneinander sein und nicht von den Ausführungsergebnissen anderer Testfälle abhängig sein

  • Messbarkeit

Bestimmen Sie, ob Testfälle klare erwartete Ergebnisse und Metriken haben, damit Testergebnisse genau ausgewertet werden können

  • Effizienz

Testfälle sollten innerhalb einer angemessenen Zeit ausgeführt werden können und gleichzeitig die Wirksamkeit und Effektivität des Tests verbessern

  • Ausnahmebehandlung

Testfälle sollten in der Lage sein, verschiedene abnormale Situationen abzudecken und das Verhalten und die Reaktion des Systems in abnormalen Situationen zu überprüfen

  • Robustheit

Testfälle sind in der Lage, verschiedene extreme und negative Situationen zu bewältigen und die Stabilität und Robustheit des Systems zu überprüfen

  • Wartbarkeit

Testfälle sollten einfach zu warten und als Reaktion auf Änderungen in Anforderungen und Systemen zu aktualisieren sein.

4. Statische Tests und dynamische Tests

  • statische Prüfung

Es bezieht sich auf eine Technologie, die nicht das zu testende Softwaresystem ausführt, sondern andere Mittel und Technologien verwendet, um die zu testende Software zu erkennen. Zum Beispiel: Codelesen, Dokumentenprüfung, Programmanalyse. Zu den häufig verwendeten statischen Analysetechniken gehören: Kontrollfluss, Informationsfluss und Datenfluss. Jetzt werden viele Probleme im Editor gelöst. Während unseres Testprozesses ist die Überprüfung von Dokumenten die am häufigsten verwendete Methode für statische Tests.

  • Dynamisches Testen

Durch die Beobachtung der Aktionen des Codes während der Ausführung liefert es Informationen zur Ausführungsverfolgung, Zeitanalyse und Testabdeckung. Dynamische Tests finden Fehler, indem sie das Programm tatsächlich ausführen. Analysieren Sie den Betriebsstatus des zu testenden Programms anhand effektiver Testfälle und entsprechender Eingabe- und Ausgabebeziehungen.

5. Nachrichten-Middleware

Während Sie Nachrichten von einer Partei erhalten, können andere Orte auch Nachrichten von hier erhalten.

Beispiel: Cainiao-Station: Jede Gemeinde hat eine Cainiao-Station. Die Menschen in jeder Gemeinde kümmern sich nur um die Cainiao-Station in ihrer eigenen Gemeinde; wenn Sie etwas online kaufen, wird dies nicht der Fall sein Die Lieferung erfolgt direkt an Ihre Hände, jedoch an den Bahnhof Cainiao.

1. Aus Sicht des Kuriers: Der Kurier muss nicht jeden Artikel an den Kunden liefern. Er kann das Produkt einfach an der Cainiao-Station abstellen und losfahren, was die Effizienz der Lieferung verbessert;

2. Aus Sicht des Benutzers: Wenn der Express ankommt, befinden Sie sich möglicherweise auf der Arbeit oder in der Schule und haben keine Zeit, den Express in Empfang zu nehmen. Mit Cainiao Station können Sie den Express jedoch entsprechend Ihrer eigenen Zeit abholen.

3. Bei Shopping-Events wie Double Eleven: Wenn das Bestellvolumen steigt, weil die Kuriere von Cainiao Post nicht ausgelastet sind, müssen sich Benutzer nur bei Cainiao Post anstellen, um die gekauften Waren abzuholen.

Tatsächliches Szenario:

1. In Microservices können zwei nicht miteinander verbundene Systeme, wenn es Schnittstellenaufrufe gibt, beide auf die MQ-Programmierung ausgerichtet sein , sodass die beiden dies tun können unabhängig voneinander ändern. Der Aufrufer kapselt die Anfrage in eine Nachricht und sendet sie direkt an mq. Der Angerufene konsumiert die Nachricht in mq und verarbeitet die spezifische Geschäftslogik. Dies ermöglicht mehreren Systemen, die sich gegenseitig aufrufen, die Implementierung vollständig entkoppelt;

2. Mit mq kehrt der Anrufer direkt nach dem Senden der Nachricht zurück, wodurch auch die Reaktionsgeschwindigkeit der Schnittstelle erheblich verbessert und asynchrone Aufrufe in mehreren Systemen realisiert werden können.

3. Bei gleichzeitigen Szenarien mit extrem hohem Datenverkehr kann das Front-End Anforderungen auch in Nachrichten kapseln und zur direkten Rückgabe an mq senden. Auf diese Weise kann der Front-End-Dienst eine höhere Verkehrsgleichzeitigkeit unterstützen, während das Back-End Dienste erfordern zeitaufwändige und arbeitsintensive E/A-Vorgänge. Der Dienst verbraucht mq, um ihn zu verarbeiten, wodurch Spitzenglättung und Talfüllung erreicht werden. Bei großem Datenverkehr und hoher Parallelität darf das Front-End kontinuierlich Nachrichten schreiben. Die Geschwindigkeit Das Schreiben von Nachrichten ist viel schneller als die Verarbeitungsgeschwindigkeit von Nachrichten. Viel mehr, und die von der Back-End-Geschäftslogikverarbeitung unterstützte Parallelität ist äußerst begrenzt, sodass die akkumulierten Nachrichten vom Back-End langsam verarbeitet werden können.

Es kann den Grad der Kopplung zwischen Diensten reduzieren, die Reaktionsgeschwindigkeit von Schnittstellen verbessern und Spitzenausgleichs- und Entkopplungsfunktionen für großen Datenverkehr bereitstellen.

Supongo que te gusta

Origin blog.csdn.net/weixin_55488173/article/details/134311168
Recomendado
Clasificación