swift3でToDoリストアプリを作ってみた

SQL基礎に受かり気持ち的に余裕ができたのでようやくswiftの勉強を再開しました。(まだDBAがありますが、、、)

今回参考にしたサイトはこちらです↓
http://mosho-developer.blogspot.jp/2015/11/xcode-swifttodo.html
ストーリーボードの実装に関してはこのサイトの通りに進めていきました。
しかし今回はswift3を使用したため変更点などもあり、つまずいた点もいくつかありました。 今回はその辺をまとめていこうと思います。


完成形は今のところこんな感じです。ちょっとずれてますが、、
❶+を押下するとテキストフィールドが現れて、テキストフィールドをクリックするとキーボードが出てきます。
❷キーボード以外のところやreturnを押下するとキーボードが閉じられるようになっています。
❸ADDボタンを押下すると、テーブルリストにテキストが追加されています。


🌟NSUserDefaultsが変更されていた

変更前

NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")

変更後

UserDefaults.standard.set(todoItem, forKey: "todoList")

🌟シュミレーターでキーボードが出ない

Hardware -> Keyboard オプションの Connect Hardware Keyboard を非選択にすることで解決!

🌟改行(return)でキーボードが閉じない!!

resignFirstResponderメソッドを定義しているのにreturnでキーボードが閉じないのは、delegateを指定していないからでした。

❶classにUITextFieldDelegateを追加

class AddToDo: UIViewController,UITextFieldDelegate{

❷viewDidLoadにテキストフィールドのdelegateを自分自身に設定

//viewDidLoadはインスタンス化された直後に一度だけ呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()
        itemText.delegate = self
    }

🌟todoItem配列が保持している文字列をテーブルに表示させる

以下のソースコードで正常に動きました
色々と変更点があったようですが詳しくは調べていません😢

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellValue = UITableViewCell(style:  UITableViewCellStyle.default, reuseIdentifier: "cell")
        cellValue.textLabel?.text = todoItem[indexPath.row]
        return cellValue
    }

🌟リストをスライドして削除機能をする

こちらの記事を参考にしました↓
【Swift3】UITableViewのセルをスワイプで削除する - Qiita

🌟こんにちは、エラー

f:id:mmmnn1257:20170806233157p:plain

このエラーで、シュミレーターに何も表示されなくなりました。
問題はストーリーボードとの接続にあったようです。
ストーリーボードのview controllerを右クリックすると以下のような画面が出てきます。
f:id:mmmnn1257:20170806233514p:plain
黄色いさんかく⚠️印が出てきたらその部分に問題があります!
削除してあげましょう。

こちらの記事を参考にしました↓
【iOS初心者】Xcode8 Swift3 エラー「terminating with uncaught exception of type NSException」「Thread 1: signal SIGABRT」が出たらチェックする2つこと | programming.info


以上が私がつまずいた点です。
delegateなど、まだまだ詳しく調べきれていない箇所が多いので、これからの課題にしていこうと思います。

はじめましてシェルスクリプト

shellとは⁇

f:id:mmmnn1257:20170618201035p:plain

✍️echo $SHELLと入力すると自分が使っているshellが分かる
この画面がまさにシェル

f:id:mmmnn1257:20170618201431p:plain

shell scriptとは??

複数の命令を一気に行うことができるように、たくさんのコマンドで記述されたファイルのこと f:id:mmmnn1257:20170619202335p:plain
ファイルを実行するとシェルクリプトに書かれたコマンドが実行される

SQLローダーとは?

SQLローダー

大量の外部ファイルのデータをデータベースに取り込むときに使うもの f:id:mmmnn1257:20170618180043p:plain

ctlファイル

ctlファイル(制御ファイル)には、csvファイルに書かれたデータをどのようにSQLローダーが読み込むのかを設定する
具体的にはテーブル名とカラム名と型などを書き込む
書き方にはいくつかの注意があり、ハマったのでメモ

  • VARCHAR型はCHAR型と記入
  • NUMBER型はDECIMAL EXTERNAL型と記入
  • 例えば CHAR(1)と指定し、csvファイルでデータを"1"と記入したときはエラーになってしまう
    理由は、ダブルクオーテーションも1文字として換算されているからである
    ダブルクオーテーションを使うときは FIELDS句で囲み文字の設定をする必要がある
    FIELDS [TERMINATED BY (区切り記号)] [OPTIONALLY] [ENCLOSED BY (囲み記号)

csvファイル

カンマで区切られたファイルのこと
ここにテーブルに入れたいレコードのデータを記入していく
shファイルで作られ、ctlファイルで制御される

shファイル

shファイルはコマンドを作るためのファイルでありシェルスクリプトで書かれる
今回は、csvファイルに大量のデータを書き込むように設定する

フォワードとリダイレクト

SpringMVCを書いていておやおや?とぎもんに思ったのでメモ。
forwordとredirectの違いや、redirectとはなんぞやについて書いてます。

今回は、ログイン画面で取得したアカウント名とパスワードというリクエスト情報を元に、IchiranコントローラーでDAOから名前と性別の情報を取得し、 一覧画面に表示させる仕組み。

f:id:mmmnn1257:20170516093809p:plain

<redirectの背景ではこんなことが行われている>

f:id:mmmnn1257:20170516093242p:plain

forwordについて

  • コントローラー間を遷移してくれない
  • リクエスト情報を引き継げる

redirectについて

  • コントローラー間を遷移することができる
  • リクエスト情報が変わるため、情報を引き継ぐことができない

mysqlのパスワードを忘れてしまったとき

パスワードを忘れてしまい、mysqlに入れなかった問題がようやく解決したのでメモ。

⭐️セーフモードでmysqlを起動

» mysqld_safe --skip-grant-tables &

⭐️rootユーザーにパスワード無しで入る

» mysql -u root

⭐️mysqlテーブルのuserテーブルにアクセス

mysql> use mysql;
mysql> select * from user;

この中のauthentication_stringカラムがデフォルトのパスワードなのかも、、??

⭐️新しいパスワードを設定しmysqlに反映

mysql> UPDATE user SET authentication_string=password('新しいパスワード') WHERE user='root';
mysql> flush privileges;  

⭐️mysqlからログアウトしサーバーを停止

mysql> quit;
» mysql.server stop

⭐️サーバーを再起動させ新しいパスワードでログイン

» mysql.server start
» mysql -u root -p
Enter password:

無事mysqlに入れました〜〜〜ホッ。

gradle eclipse を叩いたらどうなる?

今までgradleプロジェクトをeclipseにインポートするときに

apply plugin: 'eclipse' 

とbuild gradleにプラグインを追加したあと、
何の気なしに叩いていた

gradle eclipse  

の背景にある意味をメモ。

🚩eclipseプラグインする意味とは

gradleプロジェクトをターミナルで作る際、
.classpass
.settings
.project

などのeclipseに必要な設定ファイルは作られていない。
そのためbuild gradle上でeclipseプラグインし、gradleプロジェクトをeclipseで読み込む準備を行う。

🚩gradle eclipseを叩く意味とは

gradleプロジェクトをeclipseで読み込む準備ができたので、実際に読み込んでいきたい。そこで必要になるのが

gradle eclipse  

である。これを叩くことで、eclipseでプロジェクトを読み込むのに必要な設定ファイルを作ってくれる。
そのとき、追加したjarファイルなどのクラスパスをeclipseに通してくれているのだ。

Java環境設定用語について

先日パソコンの調子が悪くなり、環境設定を1からし直す機会があった。
その時に分からなかったことが多く、このままではマズイ!!と思ったのでメモ。ついでに色々復習。

🚩JVM (Java Virtual Machine)

javaプログラムはjavaの仮想環境で動いている。イメージとしてはOSの上に乗っかっている感じ。
このJVMjavaプログラムを実行する時にOSにも分かるように変換してくれている。

🚩JRE (Java Runtime Environment)

javaを実行するために必要な環境を整えてくれる。
JREAPIはここに内包されている。ちなみにAPIはクラスライブラリに入っている。

🚩JDK (Java Development Environment)

javaで開発を行うためのツール。JREコンパイラが入っている。
ちなみにEclipseは自身のコンパイラを持っているらしい。

🚩環境変数

環境変数とはOSやログインユーザーごとに設定され、アプリケーションがその値を参照したり設定したり、アプリケーション間で共有するためのものである。

例えば、コマンドプロンプトjavaコンパイルするには以下の方法がある。
> C:/Program Files/Java/jdkのバージョン/bin/javac クラス名.java
しかし毎回毎回このjavac.exeファイルを記述するのは面倒だし、パソコン自身も山ほどあるディレクトリから探し出してくるのは大変そう、、、
そこで環境変数Pathの出番である。

pathに「C:/Program Files/Java/jdkのバージョン/bin/」と設定しておくと、「javac」と打つだけで指定のディレクトリに参照してくれる。
またパソコンもpathに設定してあるパスを優先的に探すため速い動作が望める。

環境変数にはPath以外にも様々な種類があり、その中にClasspathというものがある。
Classpathには、JVMによってコンパイルや実行が行われるとき、対象となるjavaのクラスファイルが入っているディレクトリを指定することができる。

🚩コンパイル

人間が書いたソースコードをコンピュータが理解できる言語に変換すること

🚩リンク

たいていのプログラムは、複数のクラスファイルと関係してできている。
リンクは、コンパイルされたソースファイルの関係を繋げ、一つの実行可能な形態にまとめることを指す。
またこのときライブラリから必要なファイルを取り出し結びつけることもしてくれる。(例えばprintlnなどはクラスライブラリにある)

🚩ビルド

プロジェクト全体のクラスファイルをコンパイルしてリンクを行い実行可能なプログラムを作ること。

🚩ビルドパス

ビルドを行うときに対象となるクラスファイルのクラスパスのこと

🚩Webアプリケーションのディレクトリ構造

Webアプリケーションは以下のようなディレクトリで構成されている。

f:id:mmmnn1257:20170504003406p:plain

このディレクトリ構造をwarファイルとして一つのファイルとして保管しておくことができる。
Tomcatにデプロイする時は、Webappsディレクトリ以下にwarファイルをおく。

🚩Eclipse Javaソースフォルダ

Webプロジェクトに追加されるときにコンパイルされ、自動的にWeb-INFのClassesディレクトリに追加される

🚩Eclipse Javaライブラリフォルダ

Webアプリケーションが参照するサポートライブラリファイル。このフォルダにはlibフォルダの内容が反映されている。しかし物理的には存在しない仮想jarファイルであるため、ここにjarファイルを置くだけではTomcatは反応してくれない。