Как опмитизировать такой кусок кода?
var temp_str = ""
if(opsos.size == 4) {
temp_str = opsos[2]
} else {
val phone_size = 10
for(i in 0..phone_size-opsos[0].toInt()) {
temp_str += "#"
}
}
var temp_str = ""
if(opsos.size == 4) {
temp_str = opsos[2]
} else {
val phone_size = 10
for(i in 0..phone_size-opsos[0].toInt()) {
temp_str += "#"
}
}
Очень неудобно, когда открываешь броузер и все табы, кроме текущего, являются suspend, перехожу на любой из них и они начинают рефрешиться. Как запретить firefox’у это делать?
Хочу спросить общие вопросы, чтобы понимать общие моменты. Я делаю приложение, у которого будет авторизация по номеру телефона и верификация. Бекенд будет на djangorest. Я думал сделать так:
Так же в приложении будут push messages. Они реально нужны. Отсюда возникают вполне закономерные вопросы:
Верификация:
Прайс firebase: 10к юзеров бесплатно в месяц, за авторизацию +10к юзеров придется заплатить $600 т.е $0.06 верификация
Прайс twilio: $0.0075 за каждую смс
По идее twilio дешевле, чем firebase. Но тут есть несколько вопросов по всем этим платформам
возможно ли в firebase сделать так, чтобы я только делал верификацию юзеров при реге, а потом я им выдавал токен и авторизовывал их у себя на бекенде?
если я использую twilio для верификации, смогу ли я использовать push message в firebase? Или юзеры должны обязательно авторизоваться в firebase, чтобы принимать push message?
Можно ли как-то организовать push message без участия firebase? Т.е, допустим, аплекейшен подписывается на на какую-то ветку rabbitmq, слушает ее и как только туда прилетает message «адресованный» ей - она этот message показывает как push message
У меня есть измененный конфиг docker’a. При обновлении пакетов, конфиг докера меняется на дефолтный. Думаю, может есть какая-то система хуков в дебиане, чтобы если обновляется какой-то пакет, внутри хука выполнить команду(sed), чтобы зареплейсить строку конфига
т.е если Украина - +3, если Россия - +7 и тд
в книге написано:
Если вы привыкли использовать одно имя, то добавьте this
class WildCat(name: String, weight: Int, breed: String){
val this.name = name
var this.weight = weight
val this.breed = breed
}
Делаю:
package com.example.socialkotlin
import android.graphics.Color.*
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.Executors
import kotlin.system.*
import kotlinx.android.synthetic.main.content_main.*
// import kotlinx.coroutines.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
// import kotlinx.coroutines.CommonPool
import kotlinx.coroutines.async
import kotlinx.coroutines.AbstractCoroutine
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import java.util.concurrent.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.channels.actor
class WildCat(name: String, weight: Int, breed: String){
val this.name = name
var this.weight = weight
val this.breed = breed
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.d("TAG", "----------------------------")
val test = WildCat("zzzz", 12, "zzzz1")
Log.d("TAG", test.name.toString())
super.onCreate(savedInstanceState)
setContentView(R.layout.content_main)
text_id.setText("zzz2")
// text_id.setText(getWarmth(c).toString())
}
}
out:
> Task :app:compileDebugKotlin FAILED
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (26, 9): Type expected
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (27, 9): Type expected
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (28, 9): Type expected
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (26, 21): Extension property cannot be initialized because it has no backing field
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (27, 23): Extension property cannot be initialized because it has no backing field
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (28, 22): Extension property cannot be initialized because it has no backing field
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (37, 27): Unresolved reference: name
class Cat(val name: String, weight_param: Int, breed_param: String) {
var activities = arrayOf("Play")
val breed = breed_param.toUpperCase()
var weight = weight_param
set(value) {
Log.d("TAG", "in set()")
if (value > 0) {
Log.d("TAG", "yes")
field = value
}
else {
Log.d("TAG", "no")
field = 0
}
}
val weightInGramms: Int
get() = weight * 1000
fun sleep() {
println(if (weight < 3) "сопит!" else "храпит!")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.d("TAG", "----------------------------")
val cat = Cat("Васька", -3, "Дворовая")
Log.d("TAG", cat.weightInGramms.toString()) // возвращает 3000
super.onCreate(savedInstanceState)
setContentView(R.layout.content_main)
text_id.setText("zzz2")
// text_id.setText(getWarmth(c).toString())
}
}
Никому не попадался таймер такой специфики: я нажимаю старт - тикает время. Я нажимаю стоп. Далее я нажимаю на кнопку еще раз - тикает в обратном порядке:
старт --> 1, 2, 3, 4, 5
стоп --> 5
старт --> 5, 4, 3, 2, 1
Есть ли для дебиана какие-то скрипты\репы, которые позволяют накладывать какие-то патчи, по типу geek-sources(не знаю живо ли это сейчас)?
Есть сорсы ядра /usr/src/linux-source-4.19, я накладываю патч и он накладывается с ошибками. Я их исправляю. После того, как я пофиксил ошибки, я хочу сделать патч, который я смогу без проблем наложить в следующий раз. Как это правильно сделать. Итак, есть набор действий:
cd /usr/src
1. rm -rf linux-source-4.19
2. tar xJpf linux-source-4.19.tar.xz
3. cp -prf cp -prf /boot/config-"$(uname -r)" .config
cd linux-source-4.19
4. patch -p1 < kernel_gcc_patch/usr/src/kernel_gcc_patch/enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v4.13+.patch
5. фиксим ошибки после наложения ядра
6. набор действий, чтобы сделать патч(вопрос топика)
package com.example.socialkotlin
import android.graphics.Color.*
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.Executors
import kotlin.system.*
import kotlinx.android.synthetic.main.content_main.*
// import kotlinx.coroutines.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
// import kotlinx.coroutines.CommonPool
import kotlinx.coroutines.async
import kotlinx.coroutines.AbstractCoroutine
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import java.util.concurrent.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.channels.actor
val threadPoolExecutor = Executors.newCachedThreadPool()
// val threadPoolExecutor = Executors.newFixedThreadPool(5)
val threadPool = threadPoolExecutor.asCoroutineDispatcher()
sealed class CounterMsg {
object IncCounter : CounterMsg() // one-way message to increment counter
class GetCounter(val response: SendChannel<Int>) : CounterMsg() // a request with channel for reply.
}
fun counterActor() = GlobalScope.actor<CounterMsg>(threadPool) { //(1)
var counter = 0 //(9) actor state, not shared
for (msg in channel) { // handle incoming messages
when (msg) {
is CounterMsg.IncCounter -> counter++ //(4)
is CounterMsg.GetCounter -> msg.response.send(counter) //(3)
}
}
}
suspend fun getCurrentCount(counter: ActorJob<CounterMsg>): Int { //(8)
val response = Channel<Int>() //(2)
counter.send(CounterMsg.GetCounter(response))
val receive = response.receive()
println("Counter = $receive")
return receive
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.d("TAG", "----------------------------")
// val counter = counterActor()
// GlobalScope.launch(threadPool) {
// //(5)
// while(getCurrentCount(counter) < 100){
// delay(100)
// Log.d("TAG", "sending IncCounter message")
// counter.send(CounterMsg.IncCounter) //(7)
// }
// }
// GlobalScope.launch(threadPool) {
// //(6)
// while (getCurrentCount(counter) < 100) {
// delay(200)
// }
// }.join()
// counter.close() // shutdown the actor
// GlobalScope.launch {
// val channel = basicActor()
// channel.send(Message.Increment(1))
// channel.send(Message.Increment(2))
// val deferred = CompletableDeferred<Int>()
// channel.send(Message.GetValue(deferred))
// Log.d("TAG", deferred.await().toString()) // prints "3"
// channel.close()
// }
GlobalScope.launch {
val counter = counterActor()
launch(threadPool) { //(5)
while(getCurrentCount(counter) < 100){
delay(100)
println("sending IncCounter message")
counter.send(CounterMsg.IncCounter) //(7)
}
}
launch(threadPool) { //(6)
while ( getCurrentCount(counter) < 100) {
delay(200)
}
}.join()
counter.close() // shutdown the actor
}
super.onCreate(savedInstanceState)
setContentView(R.layout.content_main)
text_id.setText("zzz2")
// text_id.setText(getWarmth(c).toString())
}
}
out:
> Task :app:compileDebugKotlin FAILED
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (45, 38): Unresolved reference: ActorJob
> Task :app:compileDebugKotlin FAILED
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (39, 5): Unresolved reference: GlobalScope
e: /home/user/media/source_project/socialkotlin/app/src/main/java/com/example/socialkotlin/MainActivity.kt: (40, 7): Unresolved reference: delay
Нужно добавить coroutines в build.gradle. Не могу понять, как это правильно сделать
Есть какие-то сборники направления future garage?
Т.к многие примеры не работают вне контекста андроид приложения, было принято решение разбирать примеры kotlin в контексте андроид приложения. Создал минимальное приложение в андроид студио с mainactivity, которое имеет код
package com.example.socialkotlin
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_main.*
import android.util.Log
// class SomeActivity : Activity(), AnkoLogger {
// private fun someMethod() {
// info("London is the capital of Great Britain")
// debug(5) // .toString() method will be executed
// warn(null) // "null" will be printed
// }
// }
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.d("TAG", "----------------------message")
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener {
view -> Snackbar.make(
view,
"Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null
).show()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
}
я так понимаю, что информация выводится в
setContentView(R.layout.activity_main)
которая тянет информацию с
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!9992"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Как бы сделать так, чтобы можно было результат работы примеров отображать в setContentView?
Хочу, чтобы при старте системы при неактивности система уходила в standby
Делаю так:
cat /etc/systemd/sleep.conf
[Sleep]
AllowSuspend=yes
SuspendMode=disk
cat /etc/systemd/logind.conf
[Login]
IdleAction=suspend
IdleActionSec=1min
В итоге при неактивности в 1 минуту ничего не происходит
Если умное приведение вам не нужно, то используйте запись с безопасным оператором ?.
val a: Int? = null
a?.toLong()
Функция будет вызвана только в том случае, если значение a отлично от null. Безопасные вызовы можно сцеплять.
Проверяем:
fun main(args: Array<String>) {
// throw CustomException("Threw custom exception")
val a: Int? = null
print(a?.toString())
}
out:
null
при чем здесь emacs?
Притом, что https://github.com/lassik/emacs-format-all-the-code не умеет в аргументы. И не получится прописать внутри него опцию -F
Взял тестовый сорс из книги, немного его подрихтовал на запуск 1000 тредов. Запустил, меряю ps_mem -p pid и вижу, что потихонечку память процесса увеличивается. Это нормально или где-то тут протекает? :)
// Create a second thread.
class NewThread implements Runnable {
Thread t;
NewThread(String name) {
// Create a new, second thread
t = new Thread(this, name);
System.out.println("Child thread: " + t);
}
// This is the entry point for the second thread.
public void run() {
try {
// for (int i = 5; i > 0; i--) {
for (int i = 5;; i--) {
System.out.println(Thread.currentThread());
System.out.println("Child Thread: " + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
class HelloWorld {
public static void main(String[] args) {
// NewThread nt = new NewThread(); // create a new thread
// nt.t.start(); // Start the thread
for(int x = 0; x <= 1000; x++) {
System.out.println("aaaa");
NewThread nt = new NewThread("some" + x); // create a new thread
nt.t.start(); // Start the thread
}
try {
for (int i = 5;; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
| ← назад | следующие → |