Очень неудобно, когда открываешь броузер и все табы, кроме текущего, являются 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), чтобы зареплейсить строку конфига
Если вы привыкли использовать одно имя, то добавьте this
class WildCat(name: String, weight: Int, breed: String){
val this.name = name
var this.weight = weight
val this.breed = breed
}
> 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
Никому не попадался таймер такой специфики: я нажимаю старт - тикает время. Я нажимаю стоп. Далее я нажимаю на кнопку еще раз - тикает в обратном порядке:
Есть сорсы ядра /usr/src/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. набор действий, чтобы сделать патч(вопрос топика)
Т.к многие примеры не работают вне контекста андроид приложения, было принято решение разбирать примеры 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)
}
}
}