- golang option pattern
2022/12/15
2022/12/14
what is good bulk insert
golang chunk
- chunk
big array goroutine
- https://qiita.com/tutuz/items/057452fbbe9a5ae26d37
2022/12/08
golang fmt %q
文字列を””で囲んで出力する。
これで実際の を””に表現して、わかりやすい
spannerのgolang clientで%qを使っている
It's just quite a strange decision made by Google here, to assume that the String()
function is only used for logging and it's ok to add quotes...
package main
import (
"fmt"
)
func main() {
str := "Gopherくん"
slice := []string{"g", "o", "h", "e", "r"}
integer := 12450
fmt.Printf("1:出力は %q となります。\n", str)
fmt.Printf("2:出力は %s となります。\n", str)
fmt.Printf("3:出力は %q となります。\n", slice)
fmt.Printf("4:出力は %s となります。\n", slice)
fmt.Printf("5:出力は %d となります。\n", integer)
fmt.Printf("6:出力は %q となります。\n", integer)
}
//1:出力は "Gopherくん" となります。
//2:出力は Gopherくん となります。
//3:出力は ["g" "o" "h" "e" "r"] となります。
//4:出力は [g o h e r] となります。
//5:出力は 12450 となります。
//6:出力は 'ア' となります。 (アのunicode の十進制は12345)
2022/12/07
spanner nullable data type golang
spanner nullable data type
var user User
db.First(&user)
db.Model(&user).Updates(User{Age: 18, Name: nil})
// 実行 SQL : UPDATE `users` SET `age` = '18' WHERE `users`.`id` = '1'
GORM のドキュメントを見ると以下のように書いてあったので、構造体で実行すると無視されてしまうようです。 When query with struct, GORM will only query with those fields has non-zero value,
that means if your field's value is 0, '', false or other zero values,
it won't be used to build query conditions,
go instal where ?
go install xxx..xxx
==>the location is ~/go/bin
so ,set the ~/go/bin to .bash_profiles 's PATH
go version
go help environment
```
GOBIN
The directory where 'go install' will install a command.
GOPATH
For more details see: 'go help gopath'.
GOROOT
The root of the go tree.
```
go help gopath
```
If the environment variable is unset, GOPATH defaults
to a subdirectory named "go" in the user's home directory
($HOME/go on Unix, %USERPROFILE%\go on Windows),
unless that directory holds a Go distribution.
Run "go env GOPATH" to see the current GOPATH.
```
go env GOPATH
==>~/go
go help install
````
usage: go install [build flags] [packages]
Install compiles and installs the packages named by the import paths.
Executables are installed in the directory named by the GOBIN environment
variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH
environment variable is not set. Executables in $GOROOT
are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN.
```
golang model
https://go.dev/play/p/B7ErJjt8JqU
-- go.mod --
2022/12/02
mock static java method in kotlin use mockk
2022/11/25
mockk kotlin no return value
val mockedFile = mockk<File>()
every { mockedFile.write(any()) } returns Unit
Kotlin mocking a var with get/set using Mockk
coEvery {
someClass getProperty "now"
} returns now
2022/11/22
select force index,use index,ignore index
select * from table use index(index1,index2)
select * from table ignore index(index1)
select * from table force index(index1)
sql join on using
select * from join1 inner join join2 on join1.join1_id = join2.join1_id;
select * from join1 inner join join2 using(join1_id);
usingで同じ名の列は一つになり、列減少する
基本、usingの方が便利と思う。
big query 配列 uunest
キー以外の内容はkey-valueの配列かな
RDBと違う
配列の中身を取るに UNNEST関数を使う
NESTは階層で、UNNESTは階層をなくす、平準化にする
例えば。
epは配列で
select 他のカラム、ep.key, ep.value.string_value
from xxxx, UNNEST(配列のカラム) ep
以上は検索できるが、
問題は、配列中の値の複数を条件として検索できない
ep.a=a AND ep.b=b で取れない
で、それで別々に検索して、JIONなどのSQL技で解決。
複雑なSQLになる。
SELECT GENERATE_ARRAU(11,33,2) AS some
start,end,step(default 1)
+--------------------------------------------------+
| some |
+--------------------------------------------------+
| [11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33] |
+--------------------------------------------------+
GENERATE_ARRAU(1,10)
cloud spanners shard
- record->split->node
- どこに保存されるはprimary keyで決める
- autoIncrementの仕組みがない、順番に保存するのは特定のnodeに集中するので、望ましくない(hotspot発生)
- autoIncrement以外のIDの生成方法
uuid 1~uuid4
- uuid1はtimestampペース、mac addressを使う
連番になる可能性
- uuid4はランダムの乱数で、分散性が高い、衝突になる可能性が0ではない
snowflake
ULID
timestampを使ってIDを生成する場合、どうしても分散率が低い。
なので、
shardId=hash(key)%N
PRIMARY KEY(shardId,分散率低い値のcolumn)
の複合キーで対応する
内部のHash関数を使う。
- farm_fingerprint
- など
2022/07/04
@MockkBean SpykBean
@MockkBean
ではevery文で定義しなかった関数は何も返さない関数に置き換わりますが、
@SpykBean
ではevery文で定義しなかった関数はそのままオリジナルの関数の定義を引き継ぎます。2022/07/03
When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead
Use config.setAllowedOriginPatterns("*")
instead of config.setAllowedOrigins(Collections.singletonList("*"));
2022/06/29
CONDITIONS EVALUATION REPORT
logging.level.org.springframework.boot.autoconfigure=ERROR
What is username and password when starting Spring Boot with Tomcat?
user name: user
password:
2022-06-29 17:17:09.586 WARN 1242 --- [ main] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 7b324ed9-1181-461e-bd5e-0a26ebdd3013
This generated password is for development use only. Your security configuration must be updated before running your application in production.
curl post json file
curl -X POST -H 'Content-type:application/json' \
--data-binary @some.json some_url
2022/02/20
mac java version
久しぶりにJavaを触った。
many many jdks ...so how to mange so many jdks
- show jdks version on your mac pc
/usr/libexec/java_home -V - env is a good idea.
- python->pyenv
- node->nodenv
- ruby->rbenv
- golang->gvm
- java->jenv
- install jenv
brew install jenv
export JENV_ROOT="$HOME/.jenv"
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
jenv doctor - add jdk path to jenv
jenv add /Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home - use some version
jenv local 11
2022/02/16
Gradle The JavaExec.main property has been deprecated
deprecated gradle features were used in this build, making it incompatible with gradle 8.0.
=> add ↓ to gradle.properties
org.gradle.warning.mode=all
then
he JavaExec.main property has been deprecated
change build.gradle
plugins {
id "application"
}
apply plugin : "java"
application {
mainClass = 'xxx.xxx'
}
then
gradle run
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
slf4j has more implements. but you have none in you class path, that is the reason.
add it
gradle example
build.gradle
```
dependencies { implementation 'org.slf4j:slf4j-log4j12:1.7.36' }
```