亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Robert Michael Kim
Suivre

Après avoir suivi, vous pouvez suivre ses informations dynamiques en temps opportun

Dernières nouvelles
Mise à jour efficace des valeurs du tableau par clé dans les tableaux associatifs

Mise à jour efficace des valeurs du tableau par clé dans les tableaux associatifs

UsageRectKeyAssigmentforo (1) mises à jour.2.CheckKeyExistanceoNly WHNENECESSARYTOAVOIDOVEAGH.3.BatchupDatesusingspreadorObject.Assignforefficiency.4.PreferMapoverPlainObjectsForfrequectUpDates.5

Aug 06, 2025 pm 02:13 PM
PHP Update Array Items
Comment gérer les paniques et récupérer

Comment gérer les paniques et récupérer

La fonction de récupération doit être appelée en report pour capturer la panique; 2. Utilisez la récupération dans des programmes de longue durée tels que Goroutine ou Server pour empêcher l'ensemble du programme de se bloquer; 3. La récupération ne doit pas être abusée, uniquement utilisée lorsqu'elle est manipulée, pour éviter de remplacer la gestion des erreurs normale; 4. Les meilleures pratiques incluent l'enregistrement des informations de panique, en utilisant Debug.stack () pour obtenir des traces de pile et récupérer à un niveau approprié. La récupération n'est valable que dans le report et doit être utilisée pour le débogage avec des journaux. Les bogues potentiels ne peuvent pas être ignorés. En fin de compte, le code doit être con?u en renvoyant l'erreur plut?t qu'en panique.

Aug 06, 2025 pm 02:08 PM
go Gestion des erreurs
Sessions collantes nginx

Sessions collantes nginx

Des collisions sont nécessaires car l'équilibrage de charge par défaut entra?nera une perte de session, en particulier lors de l'application de sessions de stockage locales; 1. Utilisez un module collant pour implémenter en fonction des cookies, allouer automatiquement et maintenir le routage; 2. Utilisez Sticky-Route pour prendre en charge la logique de routage complexe; 3. Utilisez IP_HASH pour être simple mais provoquez facilement une charge inégale; Il est recommandé d'utiliser temporairement les colmycookies pour migrer, et la session doit être affectée à l'extérieur à Redis pendant longtemps pour améliorer la flexibilité architecturale.

Aug 06, 2025 pm 02:04 PM
Comment utiliser des expressions régulières dans 'Find and Replay' de Sublime Text?

Comment utiliser des expressions régulières dans 'Find and Replay' de Sublime Text?

TouseRegexInSublimeText'sFindandreplace, PremierEnableRegexmodeByopeeningtheFindPanelwithctrl f (Windows / Linux) Orcmd F (macOS), Clickingthe.Button, Orusingalt R (Windows / Linux) Oroption R (macO FORDIGITS, \ B \ W {5} \ BFOR5-LETTERWOSS

Aug 06, 2025 pm 01:58 PM
Expressions régulières
Gérer les modules de noyau Linux avec ?modprobe?, `lsmod? et `insmod?

Gérer les modules de noyau Linux avec ?modprobe?, `lsmod? et `insmod?

LSMOD répertorie les modules chargés, INSMOD insère directement le module mais ne gère pas les dépendances, modprobe charge et résout intelligemment les dépendances; 1. Utilisez LSMOD pour afficher le module actuellement chargé et ses dépendances; 2. Utilisez insmod./mymodule.ko pour charger manuellement un seul module et assurez-vous que les dépendances sont respectées; 3. Utilisez modprobeusb_storage pour charger automatiquement le module avec des dépendances, ou modprobe-rusb_storage pour décharger le module; Il est recommandé d'utiliser MODPROBE dans la vie quotidienne, d'utiliser INSMOD pour déboguer si nécessaire, de surveiller l'état via LSMOD, de mettre à jour la base de données de dépendance avec DePmod-A et d'afficher les informations du module dans modinfo, afin de

Aug 06, 2025 pm 01:48 PM
Mise en ?uvre de stratégies de mise en cache dans une application Java

Mise en ?uvre de stratégies de mise en cache dans une application Java

Sélectionnez le type de cache approprié, tel que la caféine est préférable pour le cache en tas, et Redis ou Hazelcast est utilisé dans des environnements distribués; 2. Utilisez de la caféine pour obtenir un cache local haute performance, configurer les politiques de taille et d'expiration, et charger automatiquement les données via des méthodes GET; 3. Utilisez @EnableCaching et @Cacheable Annotations dans Springboot pour implémenter un cache déclaratif pour simplifier la gestion; 4. échec du cache en temps opportun pendant les opérations d'écriture, définissez un TTL raisonnable et utilisez RefreshafterWrite pour éviter la ventilation du cache; 5. Surveiller les performances du cache en enregistrant des indicateurs tels que le taux de réussite et le taux d'expulsion, et intégrer la surveillance avec des outils tels que le micromètre.

Aug 06, 2025 pm 01:45 PM
Comprendre le mot-clé ?transitoire? de Java pour la sérialisation

Comprendre le mot-clé ?transitoire? de Java pour la sérialisation

TheTransientKeywordInjavaExcludsFieldsfromSerialization; 1) itPreventsSensiveDatArikePasswordSfrombeingsaved; 2) ithandlesnon-serializableObjectsSuchasThreadorsocket; 3)

Aug 06, 2025 pm 01:39 PM
Comment lier les données de formulaire à un modèle?

Comment lier les données de formulaire à un modèle?

Lors de la liaison des données de forme au modèle dans le développement Web, il est recommandé d'utiliser d'abord le mécanisme du cadre du cadre, suivi de la liaison manuelle et de l'attention à la correspondance du champ, à la nidification de la structure et à la vérification des données. Les pratiques spécifiques incluent: 1. Utilisez des fonctions intégrées du cadre, telles que ModelBinder d'Asp.Netcore, @Requestbody de Springboot, Modelform de Django, etc., pour terminer automatiquement la conversion de type et la vérification de sécurité; 2. Obtenez des données de demande en séquence, créez des instances de modèle et affectez les champs un par un (comme attribuer req.body à l'objet utilisateur dans express); 3. Assurez-vous que le nom du champ de formulaire est cohérent avec les attributs du modèle, gérer les structures imbriquées et il est recommandé d'utiliser le DTO pour isoler les entrées.

Aug 06, 2025 pm 01:19 PM
Comprendre et gérer les autorisations de fichiers dans Linux

Comprendre et gérer les autorisations de fichiers dans Linux

Les autorisations de fichiers Linux sont utilisées pour contr?ler l'accès des utilisateurs aux fichiers, assurer la sécurité du système et l'utilisation légale des ressources. 1. Les autorisations de fichiers sont divisées en lecture (r), écriture (w) et exécuter (x), correspondant aux valeurs 4, 2 et 1, respectivement; 2. Les objets d'autorisation sont divisés en propriétaire (U), groupe (g) et autres (o); 3. Utilisez LS-L pour afficher les autorisations, et ChMOD modifie les autorisations via le mode symbolique (comme U X) ou le mode numérique (comme 755); 4. Chown et CHGRP sont utilisés pour modifier le propriétaire et le groupe de fichiers, et nécessitent généralement des autorisations racines; 5. Les autorisations spéciales incluent SUID (exécuter en tant que propriétaire lorsque le fichier est en cours d'exécution), SGID (exécuter en groupe ou groupe d'héritage de fichiers dans le répertoire) et des bits collants (stickbit, seulement du texte

Aug 06, 2025 pm 12:56 PM
Optimisation de boucles FOFEACH imbriquées pour des structures de données complexes

Optimisation de boucles FOFEACH imbriquées pour des structures de données complexes

Pour optimiser les boucles de Foreach imbriquées, les itérations redondantes doivent être évitées en premier et la complexité temporelle peut être réduite de O (n × m) à O (n m); Deuxièmement, si la structure n'est pas vraiment hiérarchique, les données doivent être aplaties à l'aide de méthodes telles que SelectMany; Troisièmement, sautez à l'avance ou sautez un traitement inutile par jugement conditionnel; Quatrièmement, sélectionnez les structures de données appropriées telles que les ensembles de dictionnaire ou de hachage pour améliorer l'efficacité de la recherche; Cinquièmement, la parallélisation peut être utilisée avec prudence lorsque les opérations sont indépendantes et prennent du temps; Sixièmement, extraire la logique complexe dans des méthodes ou des requêtes indépendantes pour améliorer la lisibilité et la maintenabilité. Le c?ur de l'optimisation est de réduire la complexité, d'organiser raisonnablement les données et d'évaluer toujours la nécessité de nicher, en fin de compte de code efficace, clair et extensible.

Aug 06, 2025 pm 12:53 PM
java programmation
Un guide complet du durcissement du système Linux

Un guide complet du durcissement du système Linux

KeepTheSystemUpdatedAndRemoveUncesseySoftwaretominimizeVulnerabilities; 2.EnforcestrongPasswordpolicies, DisableRootSshlogin, usudo, andManageUserAccesscyleftain

Aug 06, 2025 pm 12:43 PM
Schémas de concurrence Java pour des problèmes complexes

Schémas de concurrence Java pour des problèmes complexes

Thread-SafeSingleton utilise le mode d'initialisation à la demande pour assurer la sécurité des filetages et éviter la synchronisation explicite; 2. Le mode producteur-consommateur utilise BlockingQueue pour découpler les producteurs et les consommateurs, et utilise ses caractéristiques de blocage pour réaliser une livraison efficace des taches, adaptée aux systèmes de traitement des événements et de journalisation; 3. WearchThreadPool gère les ressources de thread via ThreadPoolExecutor, définit le nombre de threads de base et maximum, de files d'attente délimitées et de stratégies de rejet raisonnables, améliore l'efficacité de la planification des taches et empêche l'épuisement des ressources, largement

Aug 06, 2025 pm 12:29 PM
Tuning des performances Java: un guide de l'optimisation JVM

Tuning des performances Java: un guide de l'optimisation JVM

Tout d'abord, nous devons clarifier la réponse: le c?ur du réglage JVM est de configurer raisonnablement la mémoire, de choisir des politiques GC appropriées et de surveiller en continu. 1. Comprenez la structure de la mémoire JVM et concentrez-vous sur l'optimisation du rapport de la nouvelle génération aux personnes agées dans le tas; 2. Sélectionnez le type GC en fonction du scénario d'application et recommandez G1 ou ZGC pour équilibrer le retard et le débit; 3. Définir finement les paramètres -xms, -xmx, -xmn et métaspaces pour éviter les frais généraux d'expansion de la capacité dynamique; 4. Allumez le journal GC et utilisez GCViewer ou GCEASY Analysis pour ajuster la stratégie en fonction des données; 5. évitez les pièges de code tels que la création d'objets importants, les fuites de mémoire et l'épissage fréquent de cha?ne; 6. Surveillance continue d'outils tels que JSTAT, JMAP, JSTACK et PROMETHEUS à construire

Aug 06, 2025 pm 12:13 PM
Les pièges de la suppression des éléments du tableau dans une boucle ?Foreach?

Les pièges de la suppression des éléments du tableau dans une boucle ?Foreach?

Lors de la suppression des éléments de tableau, le tableau ne doit pas être modifié directement dans la boucle FOREACH, car cela entra?nera la saute des éléments ou le comportement est imprévisible. La bonne manière est: 1. Utilisez la boucle inversée pour traverser et supprimer pour éviter le désalignement de l'indice; 2. Collectez d'abord les touches ou les index à supprimer, puis retirez-les uniformément après la fin de la boucle; 3. Utilisez le filtre et d'autres méthodes pour créer de nouveaux tableaux au lieu de modifier le tableau d'origine. Ces méthodes garantissent un traitement s?r et fiable des tableaux et évitent les bogues causés par la confusion du pointeur de l'itérateur. La conclusion finale est que vous ne devez jamais modifier directement le tableau qui est traversé dans Forach.

Aug 06, 2025 pm 12:09 PM
PHP Delete Array Items
MONGODB Schema Design Best Practices

MONGODB Schema Design Best Practices

Le schéma est con?u selon le motif de requête. Les données vérifiées à haute fréquence sont intégrées et plusieurs sont utilisées pour les mises à jour indépendantes sont mises à jour; 2. L'intégration convient à une petite paire, et les références conviennent aux mégadonnées ou aux mises à jour fréquentes; 3. Contr?lez la taille du document pour éviter l'expansion et se déplacer, et construire une collection de données croissantes séparément; 4. Conception précise de l'index, analyser les requêtes lentes et faire bon usage des index composites et de superposition; 5. Unifiez le style et le type de dénomination du champ pour éviter le chaos dans la maintenance ultérieure. Ces pratiques vous aident à tirer parti des avantages de performance MongoDB et à rendre la structure efficace et facile à maintenir.

Aug 06, 2025 am 11:59 AM
Développeurs YII: Exigences de compétences en 2024

Développeurs YII: Exigences de compétences en 2024

Devenir un développeur YII en 2024 nécessite de ma?triser les compétences suivantes: 1. Compartie dans le cadre YII et ses composants principaux; 2. Compéoint dans les technologies PHP et Web modernes; 3. Ayez des compétences frontales, familiarisées avec JavaScript, etc.; 4. être capable de développer et d'utiliser Restulapi; 5. Faites attention à la sécurité et aux meilleures pratiques; 6. Comprendre DevOps et les outils de déploiement; 7. Avoir de bonnes compétences générales et des capacités de résolution de problèmes; 8. Continuez à prêter attention aux dernières tendances de l'écosystème YII.

Aug 06, 2025 am 11:58 AM
yii Compétences de développeur
Construire une API REST Performant avec Node.js, Express et TypeScript

Construire une API REST Performant avec Node.js, Express et TypeScript

ConfigureTypeScriptwithStRICTSettingSandModerNestargetsFortTyPesAfetyandPerformance.2.OptimeSeExpressMiddlewareBylitingPayloadSize, ApplicationdMiddleDaSerelectively, andavoidingUnneceSaryFunctions.3.USEACELACHISTERCURE (ROUTES → Colenders → Services → Repo.

Aug 06, 2025 am 11:57 AM
node.js rest api
Nginx Alias vs Directive racine

Nginx Alias vs Directive racine

Après que la directive racine ajoute le chemin d'accès à l'URL vers le répertoire spécifié, si l'emplacement / static / est équipé de root / var / www / html, le chemin de fichier correspondant de /static/css/app.css est demandé comme /var/www/html/static/css/app.css; 2. La directive Alias remplace complètement le chemin d'accès à l'emplacement avec le répertoire spécifié, si l'emplacement / statique / est équipé d'alias / var / www / actifs /, le chemin de fichier correspondant de la même demande est /var/www/assets/css/app.css; 3. Une erreur commune consiste à confondre la racine comme alias

Aug 06, 2025 am 11:51 AM
Comprendre l'architecture du moteur de stockage MySQL InnoDB

Comprendre l'architecture du moteur de stockage MySQL InnoDB

La conception d'architecture d'Innodb comprend une structure de stockage logique, une structure de mémoire, un système de transaction et de journalisation et des fonctionnalités d'optimisation. 1. La structure de stockage logique est divisée en espace table, segments, zones et pages, des transactions de support et une gestion efficace des données. 2. Le pool de tampons dans la structure de mémoire cache les données, réduit les E / S de disque et gère l'échange de pages dans et hors de l'algorithme LRU. 3. Le mécanisme de transaction dépend de Redolog et Undolog, qui est utilisé pour la récupération des accidents, et undolog est utilisé pour Rollback et MVCC. 4. INSéRER L'optimisation du tampon inique iniège inique insertion, index de hachage adaptatif accélère une requête équivalente et est permis par défaut d'améliorer les performances.

Aug 06, 2025 am 11:42 AM
HTML ?Canvas? pour les graphiques dynamiques

HTML ?Canvas? pour les graphiques dynamiques

Pour commencer avec Canvas rapidement, vous devez d'abord ajouter des balises à HTML et définir la largeur et la hauteur; Utilisez ensuite JavaScript pour obtenir le contexte de contexte, qui est le c?ur du dessin. Par exemple, dessinez un rectangle rouge: ctx.fillStyle = 'Red'; ctx.fillrect (50,50,100,100). La clé des graphiques dynamiques est d'effacer constamment la toile et de repeindre, et d'utiliser le chame de demande de demande pour contr?ler la fréquence d'images. De plus, notez que l'origine du système de coordonnées sur toile est dans le coin supérieur gauche; Le flou d'image peut être résolu en ajustant la densité des pixels; Utilisez ctx.save () et ctx.restore () pour gérer les changements d'état; Bien que Canvas ne prenne pas en charge

Aug 06, 2025 am 11:35 AM
Dépannage des goulots d'étranglement des performances MySQL communes

Dépannage des goulots d'étranglement des performances MySQL communes

Les raisons courantes des problèmes de performances MySQL incluent une mauvaise utilisation d'index, le journal de requête lente non activé, la conception de structure de table déraisonnable et la configuration insuffisante des ressources du serveur. 1. Si vous êtes lent, vous devez d'abord vérifier l'utilisation de l'index, analyser le plan d'exécution via Expliquer, créer raisonnablement des index composites et éviter les conversions implicites; 2. Allumez le journal de requête lent et utilisez des outils pour analyser les "mauvaises requêtes"; 3. Optimiser la structure du tableau pour éviter les abus de grands champs, de types de champs déraisonnables et de champs redondants excessifs; 4. Vérifiez la configuration du serveur pour vous assurer que la mémoire, le nombre de connexions et les performances du disque dur répondent aux besoins et peuvent aider à dépanner les outils de surveillance.

Aug 06, 2025 am 11:15 AM
Connexion à une base de données PostgreSQL avec Go

Connexion à une base de données PostgreSQL avec Go

Installez le pilote PGX: utilisez gogetgithub.com/jackc/pgx/v5; 2. Définissez la cha?ne de connexion: contient l'utilisateur, le mot de passe, l'h?te, le port, le nom de la base de données et SSLMode; 3. Utilisez la connexion de la base de données / SQL: initialisez la connexion via SQL.Open ("PGX", Connstr) et appelez db.ping () test; 4. Effectuer des requêtes paramétrées: utilisez des espaces réservés tels que QueryRow et 1 $ pour empêcher l'injection SQL; 5. Configurer le pool de connexions: Définissez le nombre maximum de connexions ouvertes, de connexions libres et de cycle de vie de connexion maximale pour optimiser les performances; Il est recommandé d'utiliser des variables d'environnement pour gérer les informations sensibles afin d'assurer la sécurité et la maintenabilité.

Aug 06, 2025 am 11:13 AM
Un guide pratique de l'injection de dépendance dans TypeScript

Un guide pratique de l'injection de dépendance dans TypeScript

DiinTypeScriptimProves amaintyitability and testabilisy injectant les dépenses en cours de réalisation de thémènes.

Aug 06, 2025 am 10:47 AM
Injection de dépendance
Implémentation de middleware pour les serveurs HTTP GO

Implémentation de middleware pour les serveurs HTTP GO

MiddlewareingOisImplementedasfonctionnementthatwrapanhttp.handlertohandlecross-cuttingconcernslikelogging, authentication, anderrorrecover

Aug 06, 2025 am 10:40 AM
Attributs HTML `Min` et? Max ?pour les entrées numériques

Attributs HTML `Min` et? Max ?pour les entrées numériques

Dans les formes HTML, les attributs MIN et MAX sont utilisés pour limiter les valeurs minimales et maximales des contr?les d'entrée numériques, améliorant la précision des données et l'expérience utilisateur. La méthode d'utilisation consiste à ajouter des valeurs correspondantes à la balise d'entrée. Par exemple, les scénarios d'application courants incluent: 1. Entrée de restriction d'age, comme min = "18"; 2. Sélection de la quantité de produit, comme min = "1" max = "5"; 3. Contr?le des curseurs de plage, tels que type = "plage" combiné avec Min, Max et Step. Les notes incluent: la bo?te d'entrée peut être contournée, l'attribut étape affecte le comportement d'entrée et l'attribut n'a que les types de nombre et de plage.

Aug 06, 2025 am 10:27 AM
React vs Vue vs Angular: une comparaison 2023

React vs Vue vs Angular: une comparaison 2023

La courbe d'apprentissage de Vue est la plus douce et la plus adaptée aux débutants; 2. React est de difficulté moyenne et doit ma?triser JSX et des crochets, adaptés à ceux qui ont des bases; 3. Angular est les concepts dactylographiques les plus difficiles, forcés et complexes, conviennent aux grandes équipes; 4. L'écologie React est la plus active et les ressources communautaires sont riches; 5. L'écologie Vue est parfaite, un bon soutien chinois et de larges applications domestiques; 6. L'écologie angulaire est complète mais fermée, et la cha?ne d'outils officielle est complète; 7. Les performances des trois sont proches, et les différences sont principalement dans l'architecture: la réaction est flexible mais doit être sélectionnée par elle-même, l'équilibre Vue est flexible et standardisé, et les contraintes fortes angulaires conviennent aux grands projets; 8. Sélectionnez Vue pour les prototypes rapides, réagissez pour les interactions complexes et la sélection angulaire pour les systèmes de niveau d'entreprise et les projets intérieurs

Aug 06, 2025 am 10:05 AM
Approches immuables pour ajouter des éléments aux tableaux PHP

Approches immuables pour ajouter des éléments aux tableaux PHP

Pour implémenter des éléments d'addition immuables des tableaux PHP, utilisez Array_merge () ou l'opérateur d'extension de PHP7.4 (...). 1. Utiliser les opérateurs pour fusionner les tableaux associatifs, conserver la clé gauche, qui convient aux scénarios où la clé n'est pas écrasée; 2. Array_merge () peut fusionner de manière fiable des index ou des tableaux associatifs et renvoyer un nouveau tableau, qui est la méthode la plus courante; 3. L'opérateur d'extension (...) fournit une syntaxe concise dans PHP7.4, qui peut créer un nouveau tableau après expansion des éléments ou des tableaux, des index de support et des clés associatives; 4. Pour éviter les effets secondaires, vous devez éviter d'utiliser array_push () ou une affectation directe pour modifier le tableau d'origine et utiliser Array_merge () ou l'opérateur d'extension pour obtenir des mises à jour vraiment immuables.

Aug 06, 2025 am 10:04 AM
PHP Add Array Items
Résolution de fuites de mémoire communes dans les applications Java

Résolution de fuites de mémoire communes dans les applications Java

StaticFieldSholdingObjectreferencesCanpreventGarBageCollection; useweakhashmaporcleanupmechanisms.2.UnclosedResourceslikestReamsorConnectionscauseleleaks; toujours usuretw

Aug 06, 2025 am 09:47 AM
java Fuite de mémoire
Gestion de la version de la base de données MySQL et versioning

Gestion de la version de la base de données MySQL et versioning

En utilisant des outils de contr?le de version pour enregistrer les modifications de la base de données, formuler des processus de publication clairs, faire attention à la compatibilité des versions et à la migration des données, et recommander que CI / CD réalise l'automatisation est la clé pour faire un bon travail dans la gestion et la gestion des versions de la version de la base de données MySQL. 1. Il est recommandé d'utiliser des outils Liquibase ou de voies de route pour enregistrer les modifications de la base de données, prendre en charge l'exécution automatique des scripts de mise à niveau et coopérer avec CI / CD; 2. Le processus de version doit inclure la génération de scripts de changement à l'étape de développement, la vérification de l'environnement de test, l'examen du code, l'inspection pré-ligne, l'exécution de l'enregistrement en ligne et des journaux; 3. Lors de la migration des données, il est nécessaire d'assurer la compatibilité de l'avant, la migration en lots et la conservation des anciens champs; 4. Inclure les modifications de la base de données dans CI / CD pour réaliser le déploiement automatisé et les tests, et améliorer l'efficacité de la libération et la contr?labilité des changements.

Aug 06, 2025 am 09:32 AM
Comment migrer une grande base de code JavaScript vers TypeScript

Comment migrer une grande base de code JavaScript vers TypeScript

Configurer tsconfig.json et activer les permis et les chèques pour prendre en charge la migration progressive; 2. Ajouter des invites de type dans les fichiers JavaScript via JSDOC; 3. Renommer les fichiers .js sur .ts un par un avec des stratégies de priorité de la zone ascendante ou à haute impact et corriger les erreurs de type; 4. Activer CheckJS et @ TS-Check pour découvrir progressivement les problèmes de type dans les fichiers JS existants; 5. Installez le package @Types ou créez des fichiers .d.ts pour gérer les types de bibliothèques tiers; 6. Intégrer Babel, Eslint et CI / CD pour s'assurer que le processus de construction est compatible et renforce progressivement la vérification du type; 7. Promouvoir la collaboration par équipe par la formation, les spécifications et l'examen du code; Le but ultime est d'améliorer continuellement

Aug 06, 2025 am 09:30 AM