AWS Invalid value '******' for instanceId. Instance does not have a volume attached at root (/dev/sda1)

原因:ボリュームの設定時に適切にDeviseが設定されていないときに発生するエラー

ボリュームとは?

簡単にいうとメモリのことです。
AWSのサーバーはスケールアウトできます。
つまり、メモリの増設ができるのです。 素晴らしい。
このボリューム(メモリ)を増やすときに、一度インスタンスから取り外す必要があります。
それをボリュームの デタッチ と言います。 デタッチした後に、 アタッチ します。(メモリの取り付け)
それからインスタンスの起動します。
そのときに出たのが次のエラー
f:id:happy_teeth_ago:20200404223617p:plain

dev/sda1 

につけなさいと出ていますね。 指示通りに、ボリュームのアタッチ時に設定します。

f:id:happy_teeth_ago:20200404223824p:plain

そうすると、インスタンスは正常に起動します。

注意 ボリュームのアタッチ(メモリの取り付け)、デタッチ(メモリの取り外し)は、必ず、インスタンスを停止した状態で行います。

ここは、通常のPCと同じですね。

めでたし、めでたし

JavaScript forEachの解説

このページのforEachがわからないから説明してほしいと質問された。 【JavaScript入門】連想配列(Dictionary)の取得/追加/ソートまとめ | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

さらに、第2引数へ連想配列を指定していることから、ループ処理内の「this」が連想配列「arr」と同じになります。そのため、「this[value]」と記述することで連想配列の「値」を取得できるというわけですね。」

質問

上記の文の、「第2引数へ連想配列を指定している」というのが、この文の上にある配列の式のどの部分に当たるのかイマイチわかりません。

var arr = { apple: "400yen", banana: "300yen", cake: "600yen" };
 
Object.keys(arr).forEach( function(value) {
 
    console.log( value + ':' + this[value] );
 
}, arr)

ここでObject.keys(arr)は連想配列のkeyで新しい配列を作る。

その内容は、この様になる。 f:id:happy_teeth_ago:20200329204456p:plain

ただのkeyだけの配列になってしまった。 ここからだけど、

逆に質問 forEachメソッドの引数はいくつあるか?

答えは2つである。

第2引数に arrを渡している。

ここが ポイント

//console.log(value)は当然、いまのキーだけの配列の値。

//this[value]はもとの連想配列 arrのvalueが取得できる。

  console.log( value + ':' + this[value] );

以上。 めでたし、めでたし

django モデル リレーション

ポイント1 親モデルにリレーションを記載する

ER図

親のAK_wordが子モデルの、JP_wordsを持っている

f:id:happy_teeth_ago:20200322001328p:plain

Modelには小モデルを先に記載する

models.ForeignKey(User, unique=True)

この例は、Userの1レコードに対して1つの拡張レコードを対応付けています。 つまり、ユーザID(主キー)が確定すると、ひとつのレコードが決定することを意味します。

models.ForeignKey(User)

この例は、Userの1レコードに対して、複数の拡張レコードが対応付けられます。 つまり、ユーザID(主キー)が確定すると、複数のレコードが抽出されます。

models.ManyToManyField(User)

この例は、複数のUserレコードそれぞれに対して、複数の拡張レコードが対応付けられます

記載例 親Model のAK_words

class AK_words(models.Model):
    jp_word =  models.ForeignKey(JP_words, on_delete=models.CASCADE, null=True)
    en_word = models.ForeignKey(EN_words, on_delete=models.CASCADE,null=True)
    ak_word = models.CharField(max_length=255, null=False)
    renketu = models.BooleanField(null=True)
    pronounce = models.CharField(max_length=255, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  
    def __str__(self):
        return self.ak_word
    class Meta:
        verbose_name_plural = "AK_word"   

Model記載例 子モデルのJP_words,EN_words

class JP_words(models.Model):
    jp_word = models.CharField(max_length=255, null=False)
    
    def __str__(self):
        return self.jp_word
    class Meta:
        verbose_name_plural = "JP_word"

class EN_words(models.Model):
    en_word = models.CharField(max_length=255, null=False)
    
    def __str__(self):
        return self.en_word
    class Meta:
        verbose_name_plural = "EN_word"  

View 記載例 index_akha.html

ループの場所だけ

    {% for ak_word in ak_words %}    
      <div class="word-card">
        <div class="word-container container p-4">
          <ul class="word-container-left">
            <li class="word"><a href="{% url 'show_akha_word' ak_word.id %}">{{ ak_word.ak_word }}</a></li>
            <li class="pronounsation">{{ ak_word.pronounce }}</li>
          </ul>        
          <ul class="word-container-right">

//モデルのリレーションが完了しているので、ak_word.ak_word で取り出せる
            <li class="word-meaning-japanese">{{ ak_word.jp_word }}</li>
            <li class="word-meaning-english">{{ ak_word.en_word }}</li>
          </ul>
        </div>
        <hr class="container">
      </div>      
    {% endfor %}   

当たり前のことだけど、日本語の記事が少なかったので書きました。

めでたし、めでたし

Swift UIImageViewにタップ判定を付ける(ボタン化)

このセルの丸印のイメージをクリックしたら、処理を書きたい

f:id:happy_teeth_ago:20200312172249p:plain

UITapGestureRecognizerのインスタンスを生成し、セットするだけ

//isUserInteractionEnabledをtrueにする StoryBoardからも設定できるが、間違いのもとなので、ソースでできるものはソースで設定する
        circleImage.isUserInteractionEnabled = true
        
//UITapGestureRecognizerのインスタンスを生成
        let tap = UITapGestureRecognizer(target: self, action: #selector(circleImageTapped))

//セットするだけ
        circleImage.addGestureRecognizer(tap)

このときの#selector(circleImageTapped))の関数を書いてあげる

//selectorで呼ぶ関数には@objcをつけること ob

    @objc func circleImageTapped(){

//ここはデリゲートのメソッドを利用している。
//好きなように記載して良い
        delegate?.circleImagetapped(todo: self.todo)
    }

めでたし、めでたし

firebase delete サブコレクション

firebaseのdeleteについての記事がなかったのでまとめ

まず、Firebaseはdeleteする際、サブコレクションがあっても、firebaseはカスケードしない。(小モデルも同時に削除しない)

よって、サブコレクションを削除し、その上で、コレクションを削除する必要がある。

まずdeleteの処理をみてみる

    //サブコレクションを含めたdelete処理 引数のcollectionにはサブコレクションを渡す
    func delete(collection: CollectionReference, batchSize: Int = 100, completion: @escaping (Error?) -> ()){
        collection.limit(to: batchSize).getDocuments{ (docset, error) in
            //error occured
            guard let docset = docset else {
                completion(error)
                return
            }
            guard docset.count > 0 else {
                completion(nil)
                return
            }
            //batchはトランザクションのようなもの
            let batch = collection.firestore.batch()
            //batchをforEachで回して、削除する
            docset.documents.forEach{
                //forEachの中では$0でアクセスする
                batch.deleteDocument($0.reference)
                }
            //batchをコミットして保存
            batch.commit { (batchError) in
                if let batchError = batchError {
                    completion(batchError)
                }else {
                    //commit時にエラーがなければ deleteを実行
                    self.delete(collection: collection, batchSize: batchSize, completion: completion)
                }
            }
        }
    }

この上で、親コレクション削除時に、このメソッドを呼び出す

下記の場合は、アラートでdeleteを選択したときに deleteを呼び出す処理

    //delete
        let deleteAction = UIAlertAction(title: "Delete", style: .default) { (action) in
            self.delete(collection: Firestore.firestore().collection(THOUGHTS_REF).document(thought.documentId).collection(COMMENT_REF), completion:  { (error) in
                if let err = error{
                    debugPrint(err.localizedDescription)
                }else{                    Firestore.firestore().collection(THOUGHTS_REF).document(thought.documentId).delete(completion: { (error) in
                        if let error = error {
                            debugPrint(error)
                        }else{
                            alert.dismiss(animated: true, completion: nil)
                        }
                    })
                }
            })
        }

Nosqlは, コレクションとドキュメントで成り立っていることがわかります。
この記事のなかで、わかりにくい点は、コメントいただけると助かります。 必ず修正します。

JAVA 格闘記-1

PrintWriterメソッドを利用するには、ライブラリーを読み込んでおく必要がある

/// import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ///

そもそも、お前はなにをしているのか教えてほしい  Printwriter型とは? PrintWriter writer = response.getWriter();

で調べてみると オブジェクトの書式付き表現をテキスト出力ストリームに出力します。 らしい。 サーブレットでget postの時のレスポンス、リクエストをすべて書かないといけないようだ ?? コード量がRailsの10倍?

確かに疎結合になっていて、大規模開発にむいているとはいえ、?? 大企業以外では使わないとおもいつつ、そんなことはいまは関係なく、与えられた仕事をこなすのみ。

サーブレットを作成して、tomcatでみるとエラー utf-8 知らないって? ひどくない?

The method setCharacterEncording(String) is undefined for the type HttpServletResponse

でこの記事をみて ワークスペース全体をuft-8に変更

itsakura.com

今度はこんなエラー

javax.servlet.ServletException: Servlet execution threw an exception org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) で調査してみると、ビルドパスが2つあったようだ。 修正する。 ありがとうstackOverFlow みんなの血と汗が流れているんだね。

stackoverflow.com

ちなみに、スタックとは 「スタック車」の意味は雪やぬかるみなどに車輪を取られて動けなくなっている(立ち往生している)状況の車を指す言い方のこと オーバーフローとは オーバーフローとは、あふれ(る)、あふれ出たもの、という意味の英単語。ITの分野では、数値の計算結果がその格納領域に収まる範囲を超えること(算術オーバーフロー/桁あふれ)や、与えられたデータが多すぎて指定の領域に収まりきらないこと

つまり、問題にぶつかって、立ち往生して、動けなくなって、汗や涙があふれ出ることを言う。

その汗や涙のかたまりが、あのサイトなのね。と妙に納得してしまう。 だからうそだって、、、

f:id:happy_teeth_ago:20200309204811p:plain

f:id:happy_teeth_ago:20200309204823p:plain

ちなみに、内容を修正するとtomcat管理画面の再ロード ボタンを押す必要があるようだ。 f:id:happy_teeth_ago:20200309205132p:plain

かなり書く量が多いと思うJAVAでした。

WSGI互換アプリとは Python

WSGI互換アプリとは

Web Server Gateway Interface (WSGI; ウィスキー)の略です。 PythonとWEBサーバーをつなぐための、ソフトウエアです。

PHPはWEBサーバーのApachのモジュールです。 つまり発展型なので、そのままHTMLに組み込んで動きます。 f:id:happy_teeth_ago:20200307131715p:plain

それで昔はPHPは人気でした。

でもPythonはそうではありません。

WEBサーバーの上で動かさなくては、WEB上で見ることができません。

でPythonにはいろんなフレームワークがあります

DjangoやFlaskといったところが有名ですね。他にもたくさんあります。 で、そのたびにWEBサーバーとのやり取りをFastCGIやmod_pythonやAPIを使ってつなげてました。

f:id:happy_teeth_ago:20200307131940p:plain

めんどくさいね! となって、WEBサーバーとの共通のやり取りを決めたのが、WSGI(ウイスキー)です。

これがPythonのフレームワークとサーバーとの仲立ちをしてくれるのです。

おおまかな、ながれはこんなイメージ

1-ネットにつないでいるクライアントから、サーバーがリクエストを受け取る

2-サーバーはWSGIにオブジェクトを渡す

3-アプリケーションはWSGIから受け取った情報をもとに、レスポンスを返す

4-サーバーはWSGIから受け取ったレスポンスから、ネットに接続している クライアントにレスポンスを返す。

これが良かったので、Rubyとかでも似たような仕組みが提供されるようになりました。

Rack (Ruby Web Server Interface)と呼ばれています

ではまた