Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
GAE/Goにてdatastoreのメタデータを取得する場合はdatastore.Kinds等を利用できますが、それを使わない場合の取得方法についてまとめたメモです。 ※公式ドキュメントはこちら 取得できるメタデータ Namespace Kind Property Namespace func Namespaces(ctx context.Context, client *datastore.Client) ([]string, error) { q := datastore.NewQuery("__namespace__").KeysOnly() keys, err := client.GetAll(ctx, q, nil) if err != nil { return nil, err } namespaces := make([]string, 0, len(keys)) for _
Qiita初投稿です。 個人のブログを書いていますが、技術的なことはQiitaに書いていこうと思い今回がその初回ということになります。 まだまだ勉強中の身で、情報の発信というよりは自分が学習したことの整理や記録という意味合いが強いですが、もし誰かの役に立ったならばそれはそれで大変嬉しいです。 概要 論理削除とは、データベースからデータそのものを物理的に削除するのではなく、そのレコードに対して削除の操作がなされた時刻のタイムスタンプを保持し、それをフラグのように扱うことで見かけ上削除されたような挙動をさせることをいいます。 削除された時刻のタイムスタンプが入るカラムをテーブルに追加し、そこに時刻が入っていればそのデータは削除されたものとして扱うといった形になります(削除されていない通常のデータの場合はnullが入ります)。 このように処理をすることで削除からの復活処理が容易になります。物理的
はじめに AppEngineのMailAPIでもメールを送ることができますが、SendGridも利用できます。 GAEからの利用であれば、月12,000件まで無料で使えます。(2018年9月8日時点) 詳しくはドキュメントを参照してください。 以下は go1.9 で試しました。 SendGrid APIv3を使う GAE/Goのドキュメントではv2を使うやり方が紹介されていますが、より新しいAPIであるv3を使う方法を以下で紹介します。 コードはこんな感じです。Email helperを使うと jsonベタ書きしなくてもOKです。 import ( "context" "fmt" "os" "github.com/sendgrid/rest" sendgrid "github.com/sendgrid/sendgrid-go" "github.com/sendgrid/sendgrid-g
Go言語 初心者向けハンズオン用資料です。 https://techdo.connpass.com/event/100306/ 簡単なWebサーバーの書き方と動かし方を説明します。 Go言語ではパッケージと呼ばれる様々なライブラリを取り込んで使うことのできる機能が備わっています。 パッケージには言語に組み込まれている内部パッケージ、有志によって開発された外部パッケージがあります。 net/http(内部パッケージ) julienschmidt/httprouter(外部パッケージ) 1. 外部パッケージを導入する package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "github.com/julienschmidt/httprouter" ) // /Hello/:langにハンドルされているHe
go-ethereumを読む(1) 準備編の続きで、 今回はローカルでgethを起動するために必要なGemesisブロックの生成辺りを解説します。 ローカルで動かすときはPOAで動かした方が処理が早いのでPOAの説明がメインです。 v1.8.15ベースに解説します puppeth gethを起動するときにdevフラグを付けない場合、gensis.jsonを作成する必要があります。 genesis.json作成についてはこの記事が詳しいです geth init gethをdevフラグをつけて起動する場合 geth init は必要ありません。 その場合下記の状態で起動されます。 POAになる アカウントを作成・アンロックする GasPriceが1になる geth init実行時に処理されるコードを追っていきます。 makeFullNode > makeConfigNode > SetEthC
// cmd/utils/flags.go // RegisterEthService adds an Ethereum client to the stack. func RegisterEthService(stack *node.Node, cfg *eth.Config) { var err error if cfg.SyncMode == downloader.LightSync { err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return les.New(ctx, cfg) }) } else { err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { fullNode, er
gethのソースコードを読んでいるとgoroutineとchannelが頻出します。 特にFeedという使った1対多の通知のための独自structはselectをリフレクションしているため、非常に追いにくくなっています v1.8.15ベースに解説します Feed SubscribeでFeedを購読するようにして、Sendで購読しているchannelに一斉に配信します // event/feed.go package event import ( "errors" "reflect" "sync" ) var errBadChannel = errors.New("event: Subscribe argument does not have sendable channel type") // フィードは、イベントのキャリアがチャネルである場合、1対多のサブスクリプションを実装する //
go-ethereumを読む(2) geth init編の続きです。 go-thereumにはいろいろなコマンドがありますが、gethコマンドでフルノードを起動する処理を追うのが、一番基本だと思うので、そのソースを追って行きます。 今回はノードのセットアップを追っていきます。 途中アカウントマネジャーが登場し、Ethereumの鍵とアカウント管理が出てくるためちょっと追いにくいです。 v1.8.15ベースに解説します。 cmd/geth/main.goのmain関数がgethコマンドの起動ルートになります。 urfave/cliを使用しているのでぱっと見分かりにくいですが、geth関数を実行します。 func main() { if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) }
func (n *Node) Start() error { // 省略 // データを保存するディレクトリをセットアップする if err := n.openDataDir(); err != nil { return err } // p2pの設定をっセットアップする // 省略 // p2pを作成 running := &p2p.Server{Config: n.serverConfig} n.log.Info("Starting peer-to-peer node", "instance", n.serverConfig.Name) // makeFullNodeで登録したServiceをここで取り出す services := make(map[reflect.Type]Service) for _, constructor := range n.serviceFuncs { //
// Backend gethで使うAPIのインタフェース type Backend interface { // General Ethereum API Downloader() *downloader.Downloader ProtocolVersion() int SuggestPrice(ctx context.Context) (*big.Int, error) ChainDb() ethdb.Database EventMux() *event.TypeMux AccountManager() *accounts.Manager // BlockChain API SetHead(number uint64) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? func (self *worker) update() { defer self.txsSub.Unsubscribe() defer self.chainHeadSub.Unsubscribe() defer self.chainSideSub.Unsubscribe() for { // A real event arrived, process interesting content select { // Handle ChainHeadEvent case <-self.chainHeadCh: self.commitNew
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? types.Message{ to: &common.Address{ 0xf3, 0x0a, 0x67, 0x01, 0xff, 0x5e, 0x70, 0xaa, 0xbf, 0x27, 0xf4, 0x74, 0xb3, 0xb4, 0xae, 0x72, 0x56, 0x3c, 0x32, 0x17, }, from: common.Address{ 0x0b, 0xe2, 0x6a, 0x38, 0x8d, 0x05, 0x24, 0xee, 0xb0, 0xaf, 0xbc, 0x08, 0xee, 0x01, 0x5e,
type Engine interface { // Authorは、指定されたブロックを作成したアカウントのEthereumアドレスを読み出す // 但し、コンセンサスエンジンが署名に基づいている場合、ヘッダーのコインベースのアドレスと異なる場合がある Author(header *types.Header) (common.Address, error) // VerifyHeaderは、ヘッダーが指定されたエンジンのコンセンサスルールに準拠しているかどうかをチェックする // ここでオプションでシールを検証することも、VerifySealメソッドを使って明示的にシールを検証することもできる VerifyHeader(chain ChainReader, header *types.Header, seal bool) error // VerifyHeadersはVerifyHead
このwikiを前半を翻訳してまとめたものになります EthashはEthereum 1.0の為に作られたPoWのアルゴリズム. Dagger-Hashimotoの最新バージョンではあるが、両方のアルゴリズムが大幅に進歩しているので、そのように呼ぶのは適切ではない。 大雑把なアルゴリムズは下記のようなものである その時点までブロックヘッダを走査することにより、各ブロックについて計算可能なシードが存在する。 シードから16MBの疑似ランダムキャッシュを計算する。ライトクライアントはキャッシュを保存する。 キャッシュからは、データセット内の各アイテムがキャッシュからの少数のアイテムのみに依存するという特性を持つ、1 GBのデータセットを生成することができる。フルクライアントとマイナーがデータセットを格納する。データセットは時間とともに線形増加する。 マイニングでは、データセットのランダムなスライ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く