Python
- 1580 ответов
- 0 вопросов
2264
Вклад в тег
http {
...
limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=30r/s;
...
}
server {
...
location / {
...
limit_req zone=reqlimit burst=10 nodelay;
}
}
[Definition]
failregex = limiting requests, excess: .* by zone .*, client: <HOST>
ignoreregex =
[nginx-req-limit]
enabled = true
port = http,https
filter = nginx-req-limit
logpath = /var/www/*/*/logs/error.log # Здесь укажите свой путь к логам виртуального хоста
findtime = 600
maxretry = 10
bantime = 7200
import ast
import sys
class DumbLisp(ast.NodeTransformer):
def fix(self, source, result):
ast.copy_location(result, source)
ast.fix_missing_locations(result)
return result
def visit_Expr(self, node):
if isinstance(node.value, ast.Tuple):
t = node.value
if isinstance(t.elts[0], ast.Name):
if t.elts[0].id == 'newif':
_else = [ast.Expr(value=t.elts[3])] if len(t.elts) == 4 else []
_if = ast.If(test=t.elts[1],
body=[ast.Expr(value=t.elts[2])],
orelse=_else)
self.generic_visit(_if)
return self.fix(node, _if)
elif t.elts[0].id == 'define':
assign = ast.Assign(targets=[ast.Name(id=t.elts[1].id, ctx=ast.Store())],
value=t.elts[2])
return self.fix(node, assign)
else:
call = ast.Expr(value=ast.Call(func=t.elts[0], args=t.elts[1:], keywords=[]))
return self.fix(node, call)
return node
with open(sys.argv[1]) as fh:
tree = ast.parse(fh.read())
DumbLisp().visit(tree)
code = compile(tree, filename=sys.argv[1], mode="exec")
exec(code)
(define, a, 1)
(newif, a == 1, (print, 'Yes'), (print, 'No'))
python dumb_translator.py test.dl
JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
JVMWrapper("JVM_IHashCode");
// as implemented in the classic virtual machine; return 0 if object is NULL
return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
JVM_END
mark = monitor->header();
...
hash = mark->hash();
if (hash == 0) {
hash = get_next_hash(Self, obj);
...
}
...
return hash;
Если я переопределю хешкод и он иногда ( или всегда, например -1) будет выдавать отрицательные целые, что будет? Очевидно это число как-то преобразуется под капотом? потому что должен выдаваться номер бакета?
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
n
в этой точке равна количеству бакетов - положительному числу, а значит i
тоже будет положительным числом.import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.Name;
/**
* Класс эмулирующий для компилятора файлы исходного кода
* и позволяющий компилировать код прямо из памяти
*/
class JavaSourceFromString extends SimpleJavaFileObject {
private final String code;
public JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
public class CompilerDemo {
private static final String BASE_NAME = "DynamicHello";
private static final ClassLoader classLoader = ToolProvider.getSystemToolClassLoader();
private static final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
/**
* Метод формирующий абстрактное синтаксическое дерево
* и преобразующий его в исходный код
*/
private static String generateSource(String className) {
Context ctx = new Context();
JavacFileManager.preRegister(ctx);
TreeMaker treeMaker = TreeMaker.instance(ctx);
JavacElements elements = JavacElements.instance(ctx);
JCTree.JCModifiers modifiers = treeMaker.Modifiers(Flags.PUBLIC);
// Тело генерируемого метода
// выводящее имя класса
JCTree.JCBlock methodBody = treeMaker.Block(0, List.of(
treeMaker.Exec(
treeMaker.Apply(
List.<JCTree.JCExpression>nil(),
treeMaker.Select(
treeMaker.Select(
treeMaker.Ident(
elements.getName("System")
),
elements.getName("out")
),
elements.getName("println")
),
List.<JCTree.JCExpression>of(
treeMaker.Binary(
JCTree.Tag.PLUS,
treeMaker.Literal("I am "),
treeMaker.Apply(
List.<JCTree.JCExpression>nil(),
treeMaker.Select(
treeMaker.Apply(
List.<JCTree.JCExpression>nil(),
treeMaker.Select(
treeMaker.Ident(
elements.getName("this")
),
elements.getName("getClass")
),
List.<JCTree.JCExpression>nil()
),
elements.getName("getName")
),
List.<JCTree.JCExpression>nil()
)
)
)
)
)
));
// Определение генерируемого метода
JCTree.JCMethodDecl method = treeMaker.MethodDef(
modifiers,
elements.getName("introduceYourself"),
treeMaker.Type(new Type.JCVoidType()),
List.<JCTree.JCTypeParameter>nil(),
List.<JCTree.JCVariableDecl>nil(),
List.<JCTree.JCExpression>nil(),
methodBody,
null
);
// Определение генерируемого класса
JCTree.JCClassDecl tree = treeMaker.ClassDef(
modifiers,
elements.getName(className),
List.<JCTree.JCTypeParameter>nil(),
null,
List.<JCTree.JCExpression>nil(),
List.of(method)
);
return tree.toString();
}
/**
* Метод компилирующий исходный код
*/
public static void compile(Iterable<? extends JavaFileObject> compilationUnits) {
CompilationTask task = compiler.getTask(null, null, null, null, null, compilationUnits);
task.call();
}
/**
* Метод запускающий сгенерированные классы с помощью рефлексии
*/
public static void loadAndRun(String className) throws ReflectiveOperationException {
Class<?> cls = classLoader.loadClass(className);
Method method = cls.getDeclaredMethod("introduceYourself");
method.invoke(cls.newInstance());
}
public static void main(String[] args) throws Exception {
java.util.List<JavaFileObject> sources = new ArrayList<>();
// Генерируем исходный код десятка классов
for (int x = 0; x < 10; x++) {
String className = BASE_NAME + x;
sources.add(new JavaSourceFromString(className, generateSource(className)));
}
// Компилируем сгенерированный код
compile(sources);
// Запускаем скомпилированные классы
for (int x = 0; x < 10; x++) {
loadAndRun(BASE_NAME + x);
}
}
}