寿命が来て壊れたHDDからデータを抜き取る

HDDからデータを抜き取る前に

個人的に気をつけようとしたのは以下です。 ・HDDは衝撃に強くないので保管する際には注意 ・HDDを取り出す際には静電気防止手袋をつける ・自己責任で最終手段として行う

個人で取り出せる範囲

記号|区分|症状の内容 :-|:-:|:-: A|論理|回復不能かつ広範囲なデータ欠損 B|論理|ディレクトリ構造やファイル名に関する情報が回復不可能 C|論理|回復・代替可能なデータの欠損 D|物理|散発的なセクタ異常 E|物理|基盤異常等開封を伴わずに回復可能な異常 F|物理|ヘッドスタックアセンブリ等回復に開封作業を伴う異常 G|物理|プラッタが損傷している 引用:nas-rescue.com

A,G - 専門業者でも対処不可能 E,F - 個人では対処不可能 B,C,D - 個人でできる範囲はここ!!

HDDをSSDに交換した際にSATAのものを買ったので、SATAタイプを購入。 www.amazon.co.jp

HDDの接続規格にはSATAIDEがあり、データの転送方式が大きな違いなようです。 IDEー複数の線を利用してデータを並行して転送する SATAー1本の線のみで連続してデータの転送する

現在はSATAが主流。 参考: www.dospara.co.jp

日頃からバックアップを

いつ壊れるかわからないのは、HDDが壊れたときに身にしみたのでクラウド上に保存しくことを心がけないといけない。

Ubuntu18.04にnodebrew使ってnode.jsをインストールした

Angularを使ってみるということでまずはNode.jsをインストールしました。

Node.js

node.js の環境管理ツール nodebrewをインストール

node.js の環境管理ツールについて

他の環境管理ツールはnvm, nave , n , nodeenvなどがあるみたいです。

Jxckさんがnodebrewを絶賛してます。 jxck.hatenablog.com

nvmをインストールしてた方はアンインストールする必要があります。 chaika.hatenablog.com

nodebrewをインストール

以下のREADMEの手順でインストールしていきます。 github.com

curl -L git.io/nodebrew | perl - setupをしたのだが、curlをインストールしてなかったのでまずはそちらをインストール。

curlとはまざまなプロトコルに対応したデータを転送するためのコマンドです。

 「wget」コマンドのように、“HTMLを解析して、リンク先もダウンロードする”ような機能はありませんが、URLに連番を指定するといった使い方ができます。

www.atmarkit.co.jp

POSTDの記事が分かりやすかったです。 postd.cc

機能の比較表。 curl - Comparison Table

Install and Learn to Use Curl on Ubuntu 18.04 – Linux Hint 上記のブログに従ってUpdateして、その後にcurlを入れました。

sudo apt-get update

sudo apt-get install curl
curl --version

curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3

インストールできたみたい。

nodebrewをインストール。

curl -L git.io/nodebrew | perl - setup

.bash_profileに環境変数のパスを追加

echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

.bash_profileを再読込み

source ~/.bash_profile

nodebrewがインストールされたか確認

nodebrew help

インストールされてたら以下のような感じになる。

nodebrew 1.0.0

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install <version> (from binary)
    nodebrew compile <version>            Download and install <version> (from source)
    nodebrew install-binary <version>     Alias of `install` (For backword compatibility)
    nodebrew uninstall <version>          Uninstall <version>
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <value>          Set alias
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> using specified <version

node.jsのインストール

nodebrewで最新版のNode.jsをインストール

nodebrew install-binary stable

nodebrew install-binaryを使うと、通常と違いコンパイルしないので速くインストールできます。 qiita.com

nodebrewでインストールされたNode.jsのバージョンを確認

nodebrew ls

// 以下が表示された
v10.7.0

current: none

nodebrewで利用するNode.jsのバージョンを指定

nodebrew use v10.7.0

v10.7.0しかなかったのでこのバージョンにしました。7/29現在の最新版です。

リリース一覧 | Node.js

Node.jsのバージョンを確認

node -v

v10.7.0

とりあえずインストール完了

無事インストールできたみたいです。 よかったです。

BitbucketにPushできなかったときの対処

git pushできなかった

エラーが出ました。

git remote set-url origin git@bitbucket.org:mongpa/calculatesales.git
fatal: No such remote 'origin'

どうやらremoteにaddしていなかったので、以下のようにしたら無事にpushまでできました。

// まずこれ
$ git remote add git@bitbucket.org:mongpa/calculatesales.git

// それから
$ git remote set-url origin git@bitbucket.org:mongpa/calculatesales.git

// プッシュ
$ git push -u origin master

git remote set-urlは向き先を変えるということなのでエラーが出たとのこと。

現在のアドレスを確認するのは以下。

git remote -v

解決

よかったよかった。

Markdown記法

一覧

  • 「:」の位置で左寄せ、中央寄せ、右寄せを指定できる。
|指定無し |左寄せ |中央寄せ |右寄せ |
|--------|:-----|:------:|-----:|
|1     |2   |3     |4   |

(省略形)

指定無し|左寄せ|中央寄せ|右寄せ
-|:-|:-:|-:
1|2|3|4
指定無し 左寄せ 中央寄せ 右寄せ
1 2 3 4
2列×3行(中央寄せ×中央寄せ)
中央|中央
:-:|:-:
1|2
1|2
1|2
3列×3行(左寄せ×中央寄せ×中央寄せ)
左|中央寄せ|中央寄せ
:-|:-:|:-:
1|2|3
1|2|3
1|2|3
4列×3行(中央寄せ×右寄せ×右寄せ×右寄せ)
中央|右|右|右
:-:|-:|-:|-:
1|2|3|4
1|2|3|4
1|2|3|4

箇条書き

  • 頭に「*」をつけると箇条書きになる。
  • 「*」の直後に半角スペースかタブが必要。
  • 前後に空行が必要
  • 階層は半角スペース4つかタブ1つで表現
(空行)

* 階層1
    * 階層1-1
    * 階層1-2
* 階層2
* 階層3
    * 階層3-1

(空行)

番号付きリスト

  • 数字は全部1でいい。
  • 「*」の直後に半角スペースかタブが必要。
  • 前後に空行が必要
  • 階層は半角スペース4つかタブ1つで表現
1. 番号付きリスト1
    1. 番号付きリスト1_1
    1. 番号付きリスト1_2
1. 番号付きリスト2
1. 番号付きリスト3

引用

>引用文
>> 入れ子

引用文

入れ子

水平線

---------------------------------------------------
***************************************************
___________________________________________________



強調

  • *が多いほど強調が強い
*強調*
**強調**
***強調***

強調
強調
強調

リンクの挿入

リンクの挿入は

[テキスト](URL)

はてなブログ

または

[テキスト](URL  "タイトル")

はてなブログ

画像の挿入

![テキスト](画像URL)

はてなブログ

または

![テキスト](画像URL "タイトル")

はてなブログ

画像サイズの指定は
画像URL =横ピクセルx縦ピクセル //=の前に半角スペースが必要

![テキスト](画像URL =200x100)  //横200px, 縦100px
![テキスト](画像URL =200x)  //横のみ指定
![テキスト](画像URL =x100)  //縦のみ指定

cloud9でAngularの学習を進めるまで(環境構築等)

環境構築

まずはcloud9を開いてプロジェクトの作成。 https://console.aws.amazon.com/cloud9/home 無料でプロジェクトが作成できるが、初回はクレジットカードの登録が必要。

以下のQiitaが参考になる。おおよそはこれに沿ってやっていけばOK。 https://qiita.com/siro33950/items/3e4ab29deef8d97ef00a https://qiita.com/siro33950/items/005790021823bc2afef0

nodeとnpmのバージョンを確認。

ec2-user:~/environment $ node --version
v6.14.3
ec2-user:~/environment $ npm --version
3.10.10

その後

// Angular-CLIをインストール
npm install -g @angular/cli

// Angular-CLIを利用してプロジェクトを作成
ng new アプリ名

Angular-CLIをインストールし、プロジェクトを作成しようとしたのですが、

You are running version v6.14.3 of Node.js, which is not supported by Angular CLI v6.
The official Node.js version that is supported is 8.9 and greater.

Please visit https://nodejs.org/en/ to find instructions on how to update Node.js.

とエラーが出たので、7/30現在のnode.js推奨版の8.11.3をインストール。 https://nodejs.org/ja/

$ nvm install v8.11.3

ec2-user:~/environment $ node --version
v8.11.3

再度プロジェクトの作成。 しかし、

ec2-user:~/environment $ ng new アプリ名
bash: ng: command not found

ということなので、再度Angular-CLIをインストール

// Angular-CLIをインストール
ec2-user:~/environment $ npm install -g @angular/cli
ec2-user:~/environment $ ng new アプリ名

プロジェクトが作成完了し、cd アプリ名で移動。

アプリの実行

アプリの実行も以下の記事を参考にしていった https://qiita.com/siro33950/items/005790021823bc2afef0 しかし、以下のようにオプションが使えないと表示されてしまいアクセスできない。

 $ ng serve --public https://xxxxxxxx.vfs.cloud9.ap-southeast-1.amazonaws.com
Unknown option: '--public'

https://www.youtube.com/watch?v=n0y0JX0S2Go このYouTubeに習って以下のようにしてもアクセスできた。

ng serve --host 0.0.0.0 --port 8080 --disableHostCheck

しかし、あまりよくない感じはするが特に何もするなく立ち上げまでできたので、あまり気にならなければこれでいい気がする。

package.jsonで指定しておくと楽でいい。

{
  "name": "angular-cal",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --host 0.0.0.0 --port 8080 --disableHostCheck", // 追記
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  // 以下略

すると以下だけで実行できる。

npm run start

しっかりホスト名を指定してアクセスする方法

https://tyablog.net/2017/05/13/cloud9-angular2/

コンストラクタについて

コンストラクタとは

コンストラクタとはWeblioによると以下のようである。

クラスにおいて、オブジェクトの生成時に呼び出される特殊な関数。これにより、オブジェクトを使用する前に必要な初期化を行うことができる。

マンガPGのマンガで分かる Java入門講座がわかりやすかった。 https://manga.crocro.com/?cat=java&pg=constructor

以下のブログも参考にした。 https://nobuo-create.net/java-beginner-20/

コンストラクタを使うことでインスタンスの生成と値の設定を一度に行なえる。 コンストラクタの条件は以下のようになる。 * クラス名と同じ名前のメソッドである * 引数を渡せる(初期化などに使う) * 戻り値を定義できない

public class Man{
  String name;
  int length;

  void printMan(){
    System.out.println("名前は"+ this.name + "、身長は" + this.length);
  }
}

// インスタンス呼び出し
Man m = new Man();
m.name = "Bob";
m.length = 175;

コンストラクタを使うとインスタンスの生成と値の設定を一度に行なえる。

public class Man{
  String name;
  int length;

  // 追加(コンストラクタ-クラス名と同じ)
  Man(){
    this.name = "Bob";
    this.length = 175;
  }

  void printMan(){
    System.out.println("名前は"+ this.name + "、身長は" + this.length);
  }
}

Man m = new Man();
m.printMan();    // 名前はBob、身長は175
public class Man{
  String name;
  int length;

  // 変更(引数をとるようにする)
  Man(String name, int length){
    this.name = name;
    this.length = length;
  }

  void printMan(){
    System.out.println("名前は"+ this.name + "、身長は" + this.length);
  }
}

Man m = new Man("Bob", 175);    // 名前はBob、身長は175

オーバーロード オーバーロードを使うことでさまざまな初期化方法を定義できる。

オーバーロードとは同一クラス内でメソッド名が同一で引数の型、数、並び順が異なるメソッドを複数定義することを言います。 http://www.javaroad.jp/java_class8.htm

ただし、引数(型)の個数、順番が全く同じものはダメ。 あと、コンストラクタを自分で定義したら引数なしのコンストラクタは用意されないので注意! 自分で引数なしのものも書かないといけない。

public class Man{
  String name;
  int length;
    
  // 変更(引数をとるようにする)
  Man(String name, int length){
    this.name = name;
    this.length = length;
  }

  void printMan(){
    System.out.println("名前は"+ this.name + "、身長は" + this.length);
  }
}

Man m = new Man("Bob", 175);    // 名前はBob、身長は175

ポリモーフィズムについて少しだけメモ

スーパークラスの型の変数に、サブクラスのインスタンスを代入できる。

逆のサブクラスの型にスーパークラスインスタンスは代入できない。

大は小を兼ねるみたいなこと。

同じ名前のメソッドを呼び出しても、インスタンスの種類(クラス)によって異なる処理が実行されます。

オブジェクト指向プログラミングの構成要件はWikipediaによると以下のようになります。 * カプセル化 * ポリモーフィズム

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91

その中でポリもーフィズムは

あるオブジェクトへの操作が呼び出し側ではなく、受け手のオブジェクトによって定まる特性。クラスベースのオブジェクト指向の場合には、派生クラスの複数分岐として多態性を実現する。 プロトタイプベースのオブジェクト指向の場合では関係がない概念とされる。

以下のブログに簡単にカプセル化ポリモーフィズムが説明してあった。

http://brbranch.jp/blog/201511/%E9%9B%91%E8%A8%98/oop/

カプセル化とは、簡単に言えば「オブジェクトの内部データはそのオブジェクトにしか扱わせない」というひとつの宣誓です。 そしてポリモーフィズムとは、「オブジェクトがどんな振る舞いをするかそのオブジェクトにまかせる」原則になります。

class Person{
  // Personクラス
}
class Man extends Person{
  // Manクラス
}
class Woman extends Person{
  // Womanクラス
}

// インスタンス代入できる
Person m = new Man();

// 逆はダメ(コンパイルエラー)
Man m = new Person();

ポリモーフィズムのメリット

class Person{
  void walk(){
    System.out.println("人が歩く");
  }
}
class Man extends Person{
  // オーバーライド
  void walk(){
    System.out.println("男が歩く");
  }
}
class Woman extends Person{
  // オーバーライド
  void walk(){
    System.out.println("女が歩く");
  }
 void talk(){
    System.out.println("井戸端会議");
  }
}
Person w = new Woman();

// コンパイルエラー
// あたかもPerson クラスのインスタンスであるかのように扱われるため
w.talk();
w.walk();  // 女が歩く

Person m = new Man();
m.walk();  // 男が歩く

ちなみにw.talk();コンパイルエラーはキャストを使って((Woman)w).talk();でエラーなく通る。

Person 型の変数が参照するインスタンスに対してwalk メソッドを呼び出 すと、そのインスタンスのクラスに応じて実行結果が変わってきます。このよう な性質がポリモーフィズムなのです。

class PersonWalk{
  public static void main(String[] args){
    Person[] persons = new Person[3];
    person[0] = new Person();
    person[1] = new Man();
    person[2] = new Woman();

    for(int i = 0; i < persons.length; i++){
      persons[i].walk();
    }
  }
}

実行結果は

人が歩く
男が歩く
女が歩く

以下のブログ記事も参考になった。 http://noiselessworld.hatenablog.jp/entry/2017/01/30/002252

プログラマー1年生がポリモーフィズムについて学んだのでRPGで説明する。 - Qiita

最後

正しい内容を理解しているかは怪しいので、もっと深めていく必要があると感じる。