mk-toolブログ

エンジニアと家のことをごちゃごちゃと書いてます

【Python】AttributeError: 'dict' object has no attribute 'has_key'

概要

以下のエラーメッセージが表示されたので対処。

AttributeError: 'dict' object has no attribute 'has_key'

解決策

has_keyはpython3で使えないらしいので、inを使ってキーの存在確認を行う。

if 'Item' in raw_data:
    # code
else:
    # code

参考

https://stackoverflow.com/questions/33727149/dict-object-has-no-attribute-has-key

【Python】Python3でnew.instancemethodが使えないテーブル作成時にエラー

概要

boto3を利用してテーブルを作成する際に以下のエラーが発生したためメモ。

An error occurred (ValidationException) when calling the CreateTable operation: Hash Key not specified in Attribute Definitions.
  Type unknown.

解決方法

テーブル作成時に与えるKeySchemaAttributeDefinitionsの値が一致していない場合に発生。 同じ値を指定すればOK。

【Docker】OCI runtime exec failedと言われた

【概要】 Dockerコンテナに入る際に以下のことを言われたのでメモ。

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

【解決方法】 docker exec -it [コンテナ名] /bin/bash/bin/bashbin/shにする。

【Docker】docker-composeでExited (0)とかでるとき

概要

docker-composeでExited (0)が出て全然コンテナが立ち上がらないので困り果てたのでメモ。

本文

dockerコンテナの立ち上げ結果をみた際にExited (0)が出るので対策を調べてみたら、dockerのimageから起動してみる記事にありついた。 以下のコマンドでimageからdockerコンテナを起動することができる。

docker run -d -t -i [イメージ名] /bin/bash

これを実行してみると、imageからの起動は問題なかった。 ということはdocker-compose側での問題なんだろうな、という問題の切り分けができた。 なので「docker-compose Exited (0)」で調べたらstackoverflowがヒットした。

docker-compose.yml中のコンテナの設定にtty: trueを記載すれば良いとのことだったので追記したところうまく動いた。ちなみに、ttyは上記のdockerコマンドの-tと同一の指定とのこと。

【Python】The session is unavailable because no secret key was set.

概要

以下のエラーが発生したため対処。

The session is unavailable because no secret key was set.

本題

Flaskでsession変数を扱う際は、以下のようにする。

from flask import session

// 略

session['user_id'] = "hogehoge"

しかしながら、secret keyを設定していないとエラーが発生する。 そのためsession変数を扱うより前の場所でsecret keyを設定する。

if __name__ == "__main__":
    app.secret_key = 'secret key'

これで解決

参考

stackoverflow.com

【Go】逆ポーランドを出力

概要

いまさらですが逆ポーランドを出力するものを書く。 元ネタは改訂第4版 C言語によるはじめてのアルゴリズム入門

本題

逆ポーランドを出力するためには、数値と演算子の優先度を比較しながらstackに値を一時格納する。 逆ポーランドの出力が確定した部分からpolishへ格納していく。

豆知識として、Goは*p++のようなポインタの演算ができないことを知った。また、polish[sp2++]のようにindexでインクリメントを利用することは、インクリメントがコンパイラに式ではなく文として解釈されるためできないことも知った。

以下ソースコード

package main

import (
    "fmt"
)

var stack [10]string
var polish [10]string

func main() {
    formula := "a+b-c*d/e"
    sp1, sp2 := 0, 0

    // 優先順位テーブル
    pri := map[string]int{
        "a": 3, "b": 3, "c": 3, "d": 3, "e": 3,
        "+": 1, "-": 1, "*": 2, "/": 2, "": -1,
    }

    for _, v := range formula {
        for pri[string([]rune{v})] <= pri[stack[sp1]]{
            popAndPush(&sp1, &sp2)
        }
        sp1++
        stack[sp1] = string([]rune{v})
    }
        // stackにたまっているものをpolishへ
    for sp1 > 0{
        popAndPush(&sp1, &sp2)
    }
    fmt.Println(polish)
}

func popAndPush(sp1 *int, sp2 *int){
    *sp2++
    polish[*sp2] = stack[*sp1]
    *sp1--
}

出力結果

[ a b + c d * e / -]

参考

Goのポインタの使いかた

1文字ずつアクセスする

mapの作り方(今回使っていないけど)

mapについて(今回使っていないけど)