ひよっこSEの備忘録

20卒の未経験エンジニアの日々の備忘録です。

SourceTreeにログインができなかった

SourceTreeとBitBucketを連携して社内研修で使用していました。
BitBucketでPassword変更後、あっているはずなのにSourceTreeにログインができず少しハマった話

※Qiitaに同記事あり

SourceTreeバージョン 4.0.1
Macバージョン 10.15.7

<やったけど意味がなさそうなこと>

・再起動(PC,SourceTree両方)

・Passwordがあっているかの確認

・キーチェーンからBitBucketのログイン情報の削除

・Users/Library/Application Support/SourceTree内のUser@bitbucketのファイルの削除

<おそらく解決した原因>

・SourceTree内の設定を開き、アカウントの項目で自分のアカウントを選び編集を押す
 アカウントを接続を押す


参考にしたページ
https://freesworder.net/sourcetree-no-push/
https://reasonable-code.com/sourcetree-invalid-error/

ITパスポート受験記

11月にITパスポートを受けたので、ざっくりと残します。

***

受けるきっかけ

弊社で資格取得者に報奨金等が支給されるようになったようです。
何か受験しようと思うも、基本情報技術者試験は申込期限が過ぎてたので毎月開催されてるITパスポートに申し込みました。
お金もらえるし

基礎的な部分をあまり学んでなかったのでちょうど良いかなとも。
9月くらいに申し込んだ気がします。勉強期間は約2ヶ月ほど。

勉強法

勉強本

【令和2年度】 いちばんやさしいITパスポート 絶対合格の教科書+出る順問題集
www.amazon.co.jp

本屋に見に行きました。
適当に数冊見て、合いそうなこちらを購入。

全部で3周くらいしました。
2回目までは熟読、3周目は苦手な単元に集中して取り組みました。
重くて出社時は持ち歩かなかったのですが、幸い在宅が多かったので手に取る時間は多かったです。
後述するアプリで解けなかった箇所の復習にも使いました。

アプリ

全問解説付 itパスポート 一問一答問題集

apps.apple.com

本を買う前にアプリで先に勉強を始めていました。

私は風呂でもスマホ持ち込んでるタイプなんですけど、SNS見る代わりにぽちぽちしてました。
他にも電車とかのちょっとの時間でできるので重宝してました。

本を開くほどのやる気はないけど、ちょっとやるか...ってなれます。
事前にある程度やってたためか、上の勉強本見たときに「あ、この問題アプリで見たやつー!」って
進研ゼミ状態になりました。

過去問

www3.jitec.ipa.go.jp

公式から過去問が公開されてるみたいですね。
私は試験一週間前に知りました。
解説はないので、答え合わせ時は勉強本見るとかぐぐるとかで間違った問題は潰していく感じです。

試験一週間前からはひたすら過去問取り組んでました。
結構似た問題が毎回ある印象ですね。

当日

今はコロナ禍のせいか、受付で結構並びました。
もう少しゆとりもって行けばよかったなあと思ったり。

試験は過去問・勉強本で全く見覚えのない物が大量にあって焦りましたが、無事基準点越えで合格でした。
試験後すぐに結果が出るの、一瞬すぎて不思議な感じ...。

感想

過去問を直前に知ったり、もうちょっと事前に調べといた方がよかったことは多々ありました。反省。
勉強が楽しいなーと思えたので、ここで終わらず他の資格も受けていきたい所存。
(基本情報も受けるつもりだったけど、コロナあるので勉強のみ続けて秋に受けるか迷い中...。)

他にはAWSも気になってるので、年内に一度受けられると良いな。

ディベロッパーツールに出てくるエラーいろいろ

研修中に遭遇した、console上に現れるエラー・警告についてまとめました(増えるたび適宜更新)

***

・Missing radix parameter
parseIntを使ったときに何進数でパースするかを引数で指定してない際に出る
引数で渡せば解決

ex)parseInt(’10’,10)
第二引数で10を渡しているので、10進数でパースする


・The key ‘hoge’ is not sorted alphabetically

アルファベット順に並んでないときにでる
対象のものをアルファベット順に変えてあげたら解決

・Declaration of public instance field not allowed after declaration of public instance method. Instead, this should come at the beginning of the class/interface.

変数の宣言はメソッドより手前にしなければいけない

・Shadowed name: ‘hoge
同じ名前の変数が複数宣言されているため、どちらかを変更したら解決

・Use an interface instead of a type literal.
typeリテラルよりinterfaceを使えば解決

・Identifier 'hoge’ is never reassigned; use 'const' instead of 'let'.
Letで宣言したhogeが再度代入されることがないため、constを使うように言われている
再代入することがないならconstにするべき

・An empty interface is equivalent to `{}`.
空オブジェクトのinterfaceを許可していないときに出る
許可するなりで解決

・[mobx] @action fields are not reassignable
@action.boundしているメソッドがあるクラスの子クラスでも@action.boundしている同じ名前のメソッドを作った場合に遭遇
子クラスのメソッド名を変えれば解消?

・validateDOMNesting(...): cannot appear as a child of

.
タグ直下でタグは使えない tr,tsタグを配置してその下で使用することで解消 ・'message' is declared but its value is never read. Message変数がまだ呼ばれていない、使用していない

Reactを使ってモーダルを作る

TypeScriptを使って、メイン画面でボタンを押しモーダルウィンドウを呼び出しました。
自分の備忘録として…。

※import文等簡略化している部分あり

致命的に足りない点等あればご指摘お願いします。

***

メイン画面を作る

既にある場合はそれを使ってください。
ない場合、webのメインの画面となるものを作成しましょう。

メイン画面にモーダルを表示させるためのボタンを設置します。

<Button content="モーダルを呼ぶボタン" onClick={HogeStore.open} />

HogeStoreは後述

Modalの雛形を作る

ReactのModalタグを使い、表示したいModalのページを作ります。
react.semantic-ui.com


Modalを開くには、でtrueになる必要があります。
ボタンを押して開く/閉じると切り替えたいので、true/falseを入れるのではなく、boolean型の変数を置いてstoreのメソッドで切り替えます。
(もしtrue/falseを入れていた場合、いくらボタン等を押してもopenの中の値を変えることはできないので、一生開きっぱなし/閉じっぱなしになると思います。(あやふや))

例:

@observer
export class FooModal extends Component<IFoo>{ // ①

public render(){
const { hoge } = this.props
if(!hoge){
return null
}

return(
<Modal open={hoge.key}> //hoge
<Modal.Header>モーダルのヘッダーだよ</Modal.Header>
<Modal.Content>ねこかわいい</Modal.Content>
<Modal.Actions></Button onclick={hoge.close} content=“閉じるボタン”></Modal.Actions> //onClickで{}内のメソッドが呼ばれ実行される
</Modal>
)
}

①IFooはinterface.ts的なもの
 HogeStoreをFooでも使えるように、propsを経由して中身を渡しています。

Storeで変数の切り替えをする

Modalの開く/閉じるを切り替えるstoreの作成をします

export default class HogeStore {

@observable
public key = false

@action.bound
public open(){ this.key = true }

@action.bound
public close(){ this.key = false }
}

openメソッドでModal表示、closeメソッドでModalを閉じます。

メインに置く

メインページのindexにを置きます。
デフォルトでfalseになっているので、ボタンを押して作動させないかぎり表示はされません。




ざっくりとですが、ここ数日で行っていたモーダルの作成についてでした。

TypeScriptの基本

仕事でTypeScriptを触り始めました。

***

TypeScriptとは

www.typescriptlang.org

マイクロソフト社によって開発された、フリーでオープンソースの言語です。
2012年に登場した、また出来て間もない言語です。
JavaScriptのスーパーセット(上位集合)にあたり、
大規模なアプリケーション開発で用いられることが多いようです。
(JavaScriptは一定以上の規模になると保守性が悪くなるため)

特徴

メリット
  • 型の定義ができる

 JavaScriptだと、文字列・数字が混在することができますが、それを制御できます。
 バグに気づきやすくできます。

  • JavaScriptで書いたもの全てTypeScriptでも有効

 JavaScriptを拡張したのがTypeScriptなので、
 TypeScriptで新たに制約をかけない場合、そのまま流用することができます。

 汎用的な関数・クラス定義に使われます。
 仮の型の名前を入れておいて、使う際に型を宣言します。(numberの数値型など)
 ジェネリックを使ったクラス内では、使用した型にする必要があります。
 (と宣言した場合はT型として使う)

  • エディタの入力補完がすごい

 TypeScriptの入力支援機能がある場合、候補を表示してくれます。
 私はVisual Studio Codeを使っています。見やすいです。

デメリット
  • 型定義に時間がかかる

 JavaScriptにはない型が存在します。
 そちらをよく使っていた方は慣れるまでは型定義に時間がかかるように思います。

  • 日本語のページが少ない

 エラーについて等調べてみても日本語のページが少なく、情報を集めるのに時間がかかります。

TypeScriptのDL

上記リンクからや、Node.jsのインストール後にnpmコマンドを使って用意することもできます。

Node.jsとその周辺について

自社に戻ってまた別の研修が始まりました。
以下、研修で行った環境構築で学んだ一部です。
ご指摘大歓迎です。

PC:MacBookPro(2019)
OS:10.15.3

***

Node.js

「Node.jsとは」と調べると、サーバサイドで動くJavaScriptだと出てくることが多いと思います。

Node.jsは「ブラウザでもサーバサイドでも同じ言語で書いたら楽じゃないか」という考えのもと、
ブラウザ上で使われることが多かったJavaScriptをサーバサイド上でも使えるようにしたものです。
サーバサイド上でも使えるようにするための土台にあたるものがNode.jsです。
(現在は本来の目的であったサーバサイド上より、クライアントサイドで使われることが多いそうです。)

Node.jsは後述するHomebrewからインストールが可能です。
インストールにはターミナルで下記コマンドを実行します。

nodebrew install-binary stable
Node.jsの使用場面
  • webアプリ
  • 多数のアクセスがある場所
  • webサーバ
  • スマホアプリ
メリット
デメリット
  • サーバサイド・フロントエンドで互換性はない

npmとyarn

npm(Node Package Manager)とyarnはNode.jsのパッケージを管理するツールです。
これらによってコンピュータにインストールされたソフトウェアを記録し、更新や削除を用意に行うことができます。

npmとyarnは互換性があり、事前に使用していたファイルをそのまま引き継いで使うことが可能です。
後発のyarnはnpmに比べてインストールが速く、セキュリティ面に優れています。
今後はyarnの方が使われるのではないでしょうか。

npmはNode.jsと同時にインストールされ、yarnは以下コマンドでインストールできます。

sudo npm install -g yarn

JavaScript

JavaScript(以下JS)とは、ウェブページ作成に用いられる言語の一つです。
HTMLでウェブページの土台を作り、CSSで装飾をし、JSで動的な機能を追加することができます。

JSにはApplication Programming Interface(API)があります。
これは、自力で作成・使用することが難しいコードを簡単に使うことができるものです。
APIには2種類あります。

ブラウザAPI

ウェブブラウザに組み込まれています。
ポップアップウィンドウ等はこれに該当するようです。

サードパーティAPI

ブラウザに組み込まれていないものです。
ウェブ上から情報を探して実装します。
Twitter APIを利用して最新ツイートの表示が該当するようです。


nodebrew

nodebrewとは、Node.jsのバージョン管理ができるシステムです。
Node.jsは、システムに応じたバージョンを使うためにその都度インストール/アンインストールする必要がありました。
nodebrewがあると、複数バージョンを入れておいて、必要な時に使用することができるため、手間が省けます。
以下コマンドでインストールができます。

brew install nodebrew

Homebrew(ホームブルー)

brew.sh

MacOS用のパッケージ管理システムです。
似たものとしてMacPortsFinkがあります。

Homebrewは管理するのにビルドを基本としていて、自身のMacを最適化しやすいことが特徴です。
パッケージの依存関係も管理することができます。
名前の通りですね。

使用するためには下記コードをターミナルで入力しインストールします。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

コマンド等は後日改めてまとめたいと思います。

パッケージ管理システム

様々なファイル(実行・設定ファイル、ドキュメント等)をまとめた一つのファイルをパッケージと言います。
パッケージ管理システムとは、このパッケージを一元管理できるものです。
インストール・アンインストールやアップデート作業をする際に、
何のパッケージがどこにあるか・作業されているかの管理や、競合(既存ファイルのせいで問題が生じること)の回避をしています。
身近な例で言うと、Appleストアもパッケージ管理システムと言えるそうです。

コマンドライン引数を使ってデータベースからデータを抽出する

研修の復習です。自分用の備忘録です。

指摘等大歓迎

 

データベースについてはこちら

nekomurasan.hatenablog.com

コマンドライン引数についてはこちら

nekomurasan.hatenablog.com

Javaをデータベースに接続する基本的事項はこちら
nekomurasan.hatenablog.com

 

***

 

今回の演習問題は下記のようなものです。(数値等改変済)

コマンドラインから社員番号を入力し、testrecordテーブルからデータを抽出して表示する。

・表示はOneEmpクラスのtoString()メソッドを使う

引数の確認

以前記述しているので簡易的に書きます。
社員番号を1つ入れたときのみ作動するプログラムが課題なので、コマンドライン引数が1つのみということを判断するメソッドを作ります。

        //引数の確認
        if(args.length != 1){
            System.out.println("引数に学籍番号を入力してください");
            return;
        } 

プレースホルダの実現

JDBCでは、PreparedStatementオブジェクトを使ってプレースホルダの実現が可能です。

プレースホルダとは

SQL文中の変動する箇所に使われます。
操作画面に自由入力するものがある場合に仮で入れておく数値で、その後変更が可能です。
文字列連結よりSQLインジェクション(開発者の意図しない入力で新しい命令文等を送信されてしまう)を受けることがなく、脆弱性が生じにくい

プレースホルダを用いた変数sqlを作成し、DBにアクセスする際にPreparedStatementとともに使います。

//プレースホルダの記述
String sql = "select * from testrecord where empNo" = ?;
//SQL文実行のための準備
PreparedStatement pstmt = con.prepareStatement(sql);){
//プレースホルダに値をセットする
pstmt.setString(1, args[0]);

プレースホルダに値を設定する際には、setXXX(index,value)を使います。
indexには?の位置を入れます。コード中に1つしかない場合は1です。
同じ位置のものに複数回値を入れ更新することも可能です。
XXXにはデータの型、valueには値を入れます。
今回、社員番号はA01で文字列型だったので、args[0]の型としてStringを使っています。

インスタンス

OneEmpクラス(フィールド宣言、アクセサ、toString()メソッドがあります。コードは割愛します)をインスタンス化します。


出力する際にはデータベースから値を取り込む必要があります。

OneEmp emp1 = new OneEmp(res.getString("empNo"),res.getString("empName"),res.getInt("empale"));

インスタンスの際に実行したSQLのデータが格納されているresから値を.getXXX("フィールド名")で順番に受け取っていきます。

全コード記述

public class Sample1{
    public static void main(String[] args){
        //引数の確認
        if(args.length != 1){
            System.out.println("引数に学籍番号を入力してください");
            return;
        } 
         //フィールド宣言
        String url = "任意のurl名";
        String user = "任意のユーザ名";
        String password = "任意のパスワード";
        String sql = "select * from testrecord where empNo" = ?;

        //データベースへ接続
        try(Connection con = DriverManager.getConnection(url, user,password);
                PreparedStatement pstmt = con.prepareStatement(sql);){
        //プレースホルダへ値をセットする
        pstmt.setString(1, args[0]);
        //SQLステートメントの実行
        ResultSet res = pstmt.execteQuery();
        //結果の取得
        while(res.next()){
            //インスタンス化
            OneEmp emp1 = new OneEmp(res.getString("empNo"),res.getString("empName"),res.getInt("empale"));
            System.out.println(emp1);
            return;
        }
        System.out.println("社員番号" + args[0] + "のレコードを抽出できませんでした");

        } catch (SQLException e) {
            System.out.println("異常が発生しました");
        }
    }
}

toString()メソッドは割愛