我被以下陈述误导了:“虚拟化(在您的情况下是 Docker)使用主机操作系统内核。”
出现了一个合理的问题:如何在基于Windows NT内核的主机操作系统上运行容器?那么运行容器是否依赖于 WSL(以及在这种情况下模拟的 Linux 内核)?例如,在Linux主机操作系统上运行时,是否会使用其内核?
就上下文而言,我试图定义容器化和模拟的“边界”。它们的区别(更多细节请参见上面的问题)。
我被以下陈述误导了:“虚拟化(在您的情况下是 Docker)使用主机操作系统内核。”
出现了一个合理的问题:如何在基于Windows NT内核的主机操作系统上运行容器?那么运行容器是否依赖于 WSL(以及在这种情况下模拟的 Linux 内核)?例如,在Linux主机操作系统上运行时,是否会使用其内核?
就上下文而言,我试图定义容器化和模拟的“边界”。它们的区别(更多细节请参见上面的问题)。
我需要从访问日志中排除所有具有指定地址的记录,为此我写道:
map $remote_addr $no_log_by_ip {
"xx.xx.xx.xx" 0;
default 1;
}
access_log /path_to_log/access.log combined if=$no_log_by_ip;
还需要从访问日志中排除所有代码为 403 的记录,我写道:
map $status $no_log_by_status {
403 0;
default 1;
}
access_log /path_to_log/access.log combined if=$no_log_by_status;
它是单独工作的。我们如何才能使这两种条件同时发挥作用,即这样日志中就没有指定 IP 的条目和来自任何 IP 的 403 条目了吗?
尝试过:
access_log /path_to_log/access.log combined if=$no_log_by_status if=$no_log_by_ip;
但只有最后一个 if 有效,即在这种情况下,if=$no_log_by_ip。
场景:有一张表,其中发生行的更新。该表还具有一个BEFORE UPDATE 行触发器,它在工作开始时使用 pg_advisory_xact_lock。
问题:先使用哪把锁?因为 UPDATE 操作本身没有密钥更新而阻塞?或者 pg_advisory_xact_lock?
根据Postgresql 文档,“语句级 BEFORE 触发器在语句开始执行任何操作之前触发”。这让人觉得应该首先应用 pg_advisory_xact_lock 锁。
但是在进行实验之后:在并行事务中,我首先手动应用 pg_advisory_xact_lock,然后进行无键更新,然后尝试使用触发器触发来更新行。我得到的结果是第二个事务由于无法获取表记录锁而被取消,而不是由于无法获取咨询锁。表示先获取行锁,再执行触发器。
但我在文档中没有找到任何证实我的实验结果的证据。有人知道我可以在哪里阅读此场景中的操作顺序吗?
如何从 Java 类中的另一个包调用 Kotlin 函数?
有一个包fcmpushnotificationshttpv1,其中有一个用 Kotlin 实现的类ChatViewModel.kt。
还有一个dem.corp.androidmessenger包含类的包NewChatFragment。我想从类中另一个包中的类中NewChatFragment调用一个函数。sendMessageChatViewModel
为此我编写了以下代码:
//ymy NEW test
new fcmpushnotificationshttpv1.ChatViewModel.ChatViewModel();
fcmpushnotificationshttpv1.sendMessage(true);
但是我收到一个编译错误:
C:\androidSDK\AndroidStudioProjects\AndroidMessenger-main\app\src\main\java\dem\corp\androidmessenger\bottomnav\new_chat\NewChatFragment.java:56: error: package fcmpushnotificationshttpv1.ChatViewModel does not exist
new fcmpushnotificationshttpv1.ChatViewModel.ChatViewModel();
为什么看不到这个包?
它甚至没有帮助//import com.plcoding.fcmpushnotificationshttpv1.ChatViewModel;
也没有看到SDK包。
我按照 Nowhere Man 所说的写了,但是出现了错误:
C:\androidSDK\AndroidStudioProjects\AndroidMessenger-main\app\src\main\java\dem\corp\androidmessenger\bottomnav\new_chat\NewChatFragment.java:30: error: package fcmpushnotificationshttpv1 does not exist
import fcmpushnotificationshttpv1.ChatViewModel;
^
以下是该文件的内容NewChatFragment.java:
package dem.corp.androidmessenger.bottomnav.new_chat;
import static androidx.fragment.app.FragmentManager.TAG;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
//import fcmpushnotificationshttpv1.ChatViewModel;
//import fcmpushnotificationshttpv1.ChatViewModel;
import java.util.ArrayList;
import dem.corp.androidmessenger.databinding.FragmentNewChatBinding;
import dem.corp.androidmessenger.users.User;
import dem.corp.androidmessenger.users.UsersAdapter;
//import fcmpushnotificationshttpv1.ChatViewModel;
//import fcmpushnotificationshttpv1.ChatViewModel;
//import fcmpushnotificationshttpv1.ChatViewModel;
//import fcmpushnotificationshttpv1.ChatViewModel;
//import fcmpushnotificationshttpv1.ChatViewModel;
public class NewChatFragment extends Fragment {
private FragmentNewChatBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragmentNewChatBinding.inflate(inflater, container, false);
loadUsers();
return binding.getRoot();
}
private void loadUsers(){
ArrayList<User> users = new ArrayList<User>();
FirebaseDatabase.getInstance().getReference().child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot userSnapshot : snapshot.getChildren()){
if (userSnapshot.getKey().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){
continue;
}
//ymy NEW test
// вызов конструктора класса ChatViewModel
// вызов конструктора класса ChatViewModel
ChatViewModel chatViewModel = new fcmpushnotificationshttpv1.ChatViewModel();
// вызов package-level функции
fcmpushnotificationshttpv1.ChatViewModel.sendMessage(true);
// вызов package-level функции
fcmpushnotificationshttpv1.ChatViewModel.sendMessage(true);
// ChatViewModel.sendMessage(true);
// new fcmpushnotificationshttpv1.ChatViewModel();
// fcmpushnotificationshttpv1.ChatViewModel.class.
//my test OK
//показывает flase у всех юзеров String username = String.valueOf(userSnapshot.getKey().equals(FirebaseAuth.getInstance().getCurrentUser().getUid()));
String username = userSnapshot.child("username").getValue().toString();
Log.w(TAG, "Error getting documents. 2222 username=" + username);
String uid = userSnapshot.getKey();
Log.w(TAG, "Error getting documents. 2222 uid=" + uid);
//String username = Objects.requireNonNull(userSnapshot.child("username").getValue()).toString();
String profileImage = String.valueOf(userSnapshot.child("profileImage").getValue());
users.add(new User(uid, username, profileImage));
}
binding.usersRv.setLayoutManager(new LinearLayoutManager(getContext()));
binding.usersRv.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
binding.usersRv.setAdapter(new UsersAdapter(users));
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
以下是该文件的内容ChatViewModel.kt:
@file:JvmName("ChatViewModel")
package fcmpushnotificationshttpv1
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.firebase.ktx.Firebase
import com.google.firebase.messaging.ktx.messaging
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
import retrofit2.HttpException
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.create
import java.io.IOException
class ChatViewModel: ViewModel() {
var state by mutableStateOf(ChatState())
private set
private val api: FcmApi = Retrofit.Builder()
// .baseUrl("http://10.0.2.2:8084/")
.baseUrl("http://109.195.103.21:8084/")
.addConverterFactory(MoshiConverterFactory.create())
.build()
.create()
init {
viewModelScope.launch {
Firebase.messaging.subscribeToTopic("chat").await()
}
}
fun onRemoteTokenChange(newToken: String) {
state = state.copy(
remoteToken = newToken
)
}
fun onSubmitRemoteToken() {
state = state.copy(
isEnteringToken = false
)
}
fun onMessageChange(message: String) {
state = state.copy(
messageText = message
)
}
fun sendMessage(isBroadcast: Boolean) {
viewModelScope.launch {
val messageDto = SendMessageDto(
to = if(isBroadcast) null else state.remoteToken,
notification = NotificationBody(
title = "New message!",
body = state.messageText
)
)
try {
if(isBroadcast) {
api.broadcast(messageDto)
} else {
api.sendMessage(messageDto)
}
state = state.copy(
messageText = ""
)
} catch(e: HttpException) {
e.printStackTrace()
} catch(e: IOException) {
e.printStackTrace()
}
}
}
}
任务是这样的:表单有一个只读字段,其中显示学生的姓名(为了方便可视化)。
<input id="student" name="student" value="{{ student.full_name }}" readonly>
但是 Django 当然拒绝在库中保存这个表格,因为...需要学生 ID。问题:是否可以在只读字段中显示一件事(姓名,文本等),并在填写其他字段后,单击提交时,此字段的值将替换为student.id并发送到数据库?是的,如果您将其显示在 student.id 字段中 - 一切正常,但看起来不太好。