koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

タイタニックのデータを使って xfeat で特徴量作成 + lightGBM で学習をしてみた

f:id:kj_man666:20200622221032j:plain

(9/23 修正)制度評価指標をf1値に、lightGBMの学習モデルをLGBMClassifier()に修正

mathmatical22.xyz

特徴量エンジニアリングのライブラリ xfeat が公開されていたのでチュートリアルを参考にkaggleのタイタニックのデータを使って特徴量を作り、lightGBMを回してみました。

使用するkaggleのタイタニックのデータはこちらからダウンロードしてください。

なお、xfeat ライブラリは、git をインストールしたうえで、下記コマンドをターミナルに入力すればインストールできます。

pip install git+https://github.com/pfnet-research/xfeat.git

qiita.com

なお、ブログで使ったコードはこちらになります。

では内容を見てみましょう。

import pandas as pd
import numpy as np
import os

from IPython.display import display

import xfeat

# xfeatのチュートリアルで紹介されているラベルエンコーダー
from xfeat import SelectCategorical, LabelEncoder, Pipeline, ConcatCombination, SelectNumerical, ArithmeticCombinations,  LambdaEncoder

# ホールドアウト法
from sklearn.model_selection import train_test_split

# lightGBM
import lightgbm as lgb

# 二乗平均平方根誤差 (RMSE)
from sklearn.metrics import mean_squared_error

csvを読み込んでfeather形式に変換します。

feather形式は、C++で実装されており、読み込みが非常に高速とのことです。

pandasのデータフレームに対してdf.to_feather(filepath)とすることによってFeather形式でのシリアライズが可能。

amalog.hateblo.jp

path = os.getcwd() + "/"
d_name = ["train", "test"]

# feather形式に変換。
for i in d_name:
    xfeat.utils.compress_df(pd.read_csv(path + i + ".csv")).to_feather(path + i + ".ftr")

# feather形式のデータを読込
dtrain = pd.read_feather("./train.ftr")
dtest = pd.read_feather("./test.ftr")

display(dtrain.head(3))
display(dtrain.tail(3))
display(dtrain.dtypes)
display(dtest.head(3))
display(dtest.tail(3))
display(dtest.dtypes)

f:id:kj_man666:20200622221855p:plain

f:id:kj_man666:20200622221911p:plain

xfeat のラベルエンコーディング

特にカラムを指定しなくても、カテゴリカルデータ(object)なのか、数値データ(int、float等)なのかを勝手に認識してラベルエンコーディング可能なのは便利ですね。

#  SelectCategorical() カテゴリカルデータ(object)のみをラベルエンコーディング
# 除外するカラムをexclude_colsに指定
encoder1 = Pipeline([
    SelectCategorical(exclude_cols=["Name"]),
    LabelEncoder(output_suffix=""),
])

display(encoder1.fit_transform(dtrain).head())
display(encoder1.fit_transform(dtest).head())

f:id:kj_man666:20200622222307p:plain

カテゴリカルデータのみのラベルエンコーディングと、複数のカテゴリカルデータを組み合わせてラベルエンコーディングを合わせて実行

#  SelectCategorical() カテゴリカルデータ(object)のみをラベルエンコーディング
#  ConcatCombination() 複数のカテゴリカルデータを組み合わせてラベルエンコーディング
# r=2 は結合するカラムの数 

encoder2 = Pipeline([
    SelectCategorical(exclude_cols=["Name"]),
    ConcatCombination(drop_origin=True, output_suffix="", r=2),
    LabelEncoder(output_suffix=""),
])

display(encoder2.fit_transform(dtrain).head())
display(encoder2.fit_transform(dtest).head())

4つの項目から2つを選ぶ組み合わせ 4C2 = 6 6通りが出力される

f:id:kj_man666:20200622222827p:plain

数値データのみのラベルエンコーディング

# SelectNumerical() 数値データのみをラベルエンコーディング
# train.csv のみに含まれる目的変数 Survived は数値データなので、SelectNumerical() の対象となる
# train.csv はSurvivedカラムを含み、test.csvは Survivedを含まないので、SelectNumericalのexclude_cols(除外するカラム)でSurvivedを指定したい場合は、
# train.csvとtest.csvそれぞれ分けてラベルエンコーディングする必要がある

encoder3_1 = Pipeline([
    # 除外するカラムをexclude_colsに指定
    SelectNumerical(exclude_cols=["PassengerId", "Survived"]),
    LabelEncoder(output_suffix=""),
])

display(encoder3_1.fit_transform(dtrain).head())

encoder3_2 = Pipeline([
    SelectNumerical(exclude_cols=["PassengerId"]),
    LabelEncoder(output_suffix=""),
])

display(encoder3_2.fit_transform(dtest).head())

f:id:kj_man666:20200622223318p:plain

f:id:kj_man666:20200622223329p:plain

数値データのみのラベルエンコーディングと、複数の数値データを加算して新しい項目を作る処理を合わせて実行

# SelectNumerical() 数値データのみをラベルエンコーディング
# ArithmeticCombinations() 複数の数値データを加算して新しい項目を作る
# encode3_x と同様にtrain.csv と test.csv で分ける

encoder4_1 = Pipeline([
    SelectNumerical(exclude_cols=["PassengerId", "Survived"]),
    ArithmeticCombinations(
        drop_origin=True,
        operator="+",
        r=2,
        output_suffix="",
    ),
])

display(encoder4_1.fit_transform(dtrain).head())

encoder4_2 = Pipeline([
    SelectNumerical(exclude_cols=["PassengerId"]),
    ArithmeticCombinations(
        drop_origin=True,
        operator="+",
        r=2,
        output_suffix="",
    ),
])

display(encoder4_2.fit_transform(dtest).head())

f:id:kj_man666:20200622224119p:plain

f:id:kj_man666:20200622224134p:plain

本ブログでは省略しますが、lambdaを使った処理を組み合わせたり、処理をpickleデータに保存する方法もチュートリアルでは紹介されています。

では、学習データとして使用するデータをチョイスします。

# SelectCategorical
dtrain_en1 = encoder1.fit_transform(dtrain)
dtest_en1 = encoder1.fit_transform(dtest)

display(dtrain_en1.head())
display(dtest_en1.head())

# SelectCategorical + ConcatCombination
dtrain_en2 = encoder2.fit_transform(dtrain)
dtest_en2 = encoder2.fit_transform(dtest)

display(dtrain_en2.head())
display(dtest_en2.head())

# SelectNumerical
dtrain_en3_1 = encoder3_1.fit_transform(dtrain)
dtest_en3_2 = encoder3_2.fit_transform(dtest)

display(dtrain_en3_1.head())
display(dtest_en3_2.head())

# SelectNumerical + ArithmeticCombinations
dtrain_en4_1 = encoder4_1.fit_transform(dtrain)
dtest_en4_2 = encoder4_2.fit_transform(dtest)

display(dtrain_en4_1.head())
display(dtest_en4_2.head())

f:id:kj_man666:20200622225016p:plain

f:id:kj_man666:20200622225029p:plain

選択したデータをtrainデータ、testデータにそれぞれマージします。

# データ結合
train = pd.concat([dtrain_en1, dtrain_en2], axis=1)
train = pd.concat([train, dtrain_en3_1], axis=1)
train = pd.concat([train, dtrain_en4_1], axis=1)
train = pd.concat([train, dtrain["Survived"]], axis=1)

test = pd.concat([dtest_en1, dtest_en2], axis=1)
test = pd.concat([test, dtest_en3_2], axis=1)
test = pd.concat([test, dtest_en4_2], axis=1)

display(train.head())
display(train.shape)

display(test.head())
display(test.shape)

f:id:kj_man666:20200622225202p:plain

学習のための特徴量、およびパラメーターを設定します。

# 特徴量とするカラムのリスト
features = [
    "Sex",
    "Ticket",
    "Cabin",
    "Embarked",
    "SexTicket",
    "SexCabin",
    "SexEmbarked",
    "TicketCabin",
    "TicketEmbarked",
    "CabinEmbarked",
    "PclassSibSp",
    "PclassParch",
    "PclassFare",
    "AgeSibSp",
    "AgeParch",
    "AgeFare",
    "SibSpParch",
    "SibSpFare",
    "ParchFare"
]

lightGBMで学習を行っていきます。

# ホールドアウト法
X_train, X_test, y_train, y_test = train_test_split(train[features], train["Survived"], random_state=42)

# 学習モデルの作成
model_lgb = lgb.LGBMClassifier() # モデルのインスタンスの作成
model_lgb.fit(X_train, y_train)

バリデーションデータについて、予測値と実績値を比較して誤差率を算定してみます。

# validationデータで誤差率を算定
val_pred = model_lgb.predict(X_test)

val_score = f1_score(y_test, val_pred)
print(f'f1 score は {val_score}')

出力:f1 score は 0.7314285714285713

気を取り直してテストデータで予測値を作成します。

pred = model_lgb.predict(test[features])

# gender_submission の Survived カラムを予測値に入れ替える
gs["Survived"] = pred

display(gs.head())
display(gs.tail())

f:id:kj_man666:20200622230005p:plain

Survived の値が小数点になってしまっているので、0、1に置き換えます

# 0.6以上の場合は 1、0.6未満の場合は 0 に置換
gs["Survived"].mask(gs["Survived"] >= 0.6, 1, inplace=True)
gs["Survived"].mask(gs["Survived"] < 0.6, 0, inplace=True)

display(gs.head())
display(gs.tail())

f:id:kj_man666:20200923131548p:plain

# csvへの出力
gs.to_csv(path + "submission.csv", index=False)

バリデーションデータでの結果は芳しくなかったですが、とりあえずxfeat のラベルエンコーダーを使ってlightGBMの学習ができました。

今回はタイタニックのデータを使った分類ですが、回帰でやるとどうなるか、そのうち試してみようと思います。

以上になります、最後までお読みいただきありがとうございました。

参考サイト

amalog.hateblo.jp

qiita.com

通勤時の学習用にChromebookを買ってみたので使用感をまとめた

f:id:kj_man666:20200617224855j:plain

(後記)LINEとサブディスプレイ使用について追記     Linuxでマウスなしでもコピペできるように設定で変更できることを追記     Linuxへのjupyter lab のインストールを追記     LinuxへのVS Code、Dockerのインストールを追記

緊急事態宣言も明け、テレワークから通勤に変わったため、通勤中もプログラミングの学習ができるよう、Asus製のChromeブック C223 を買ったので、レビューしたいと思います。

www.asus.com

スペック

 詳細は公式HP参照。

 重量は約1kgと非常に軽く、片手で持つとさすがにちょっと気になりますが、カバンに入れている分には気になりません。

 ディスプレイは11.6Wでちょっと小さいですが、プログラミングする分には今の所困っていません。

 なお、タッチパネルはなく、セパレートやコンバーチブルではないのでタブレット使用はできませんが、その分安くて軽いです。

 あまりタッチパネルやタブレットとしての併用は考えていないので、全く困っていません。

 キーボードはキータッチが軽めでちょっとおもちゃっぽい気がします。

 充電はUSB TypeCで行います。

 ノーマルのUSBコネクタが1つ、TypeCが2つしかないので、充電でコネクタが1つ塞がるのは気になるのですが、TypeCのコネクタは左右両方についているので、充電ケーブルを左右どちらからでもさせるのは地味にいいなと思いました。

アプリ

 ChromeブックなのでWindowsやMacのソフトウェアはインストールできませんが、Google Play ストア経由でAndoroidのアプリが使用できます。

 試してみたアプリの個人的な感想を書いておきます。

 Pydroid

  全画面表示は問題なくできるのですが、データ分析やらで愛用しているjupyter notebook、jupyter labをインストールはできるのですが、立ち上げるとエラーになってしまい、色々試したのですがうまく行かなかったのでアンインストールしました・・・。

 Linux

 なんとLinuxを使う事ができます。

 古い機種だとLinuxを使うことができないこともあるようなので、ChromebookでLinuxを使いたい場合は、キチンと調べた方がよさそうです。

 300MBほどありますので、通信環境が良い場所でダウンロードしましょう。

 マウスがあればコピペができるのですが(なぜか右クリックでコピペされます)、キーボード+タッチパネルだとコピペができないのが不便です。

 Ctrl + Shift + pでLinuxの設定画面を開き、Ctrl + C behavior と、 Ctrl + V behavior にチェックを入れればコピペできるようになります。

 Google Chrome

  問題なく使えます。

  ChromeストアでChromeのアプリをインストールすることも可能です。

 Slack

  概ね問題なく使えますが、普段使いしているWindowsやiPhoneのアプリに比べ、アイコンつけたり、ワークスペースを切り替えたりするのにひと手間余計にかかるので、若干使いづらいです。

  こころなしか、ちょっと重い気もします。

 Netflix

  全画面表示も可能で問題なく使えますが、Netflixのプランによってダウンロードができるデバイスの数や同時に再生できるデバイスの数が決まっているので注意しましょう。

  私は一番安いプランだったので、ストリーミング再生はできたのですがiPhoneですでにダウンロードしており、ChromeBookに動画をダウンロードすることができませんでした。。

 DMM

  残念ながらスマホと同様の縦型表示しかできず、なぜか動画のダウンロードもできないので使用するのは厳しそうです。

 YouTube

  ChromeブラウザでYouTubeが立ち上がるだけなので、ブックマークと同じです。。

  使用自体は問題なくできました。

 メール

  まだ他のメールアプリを試していないのですが、標準搭載されているのがGmailアプリなので、Gmail以外のアカウントをメインで使用していると面倒そうだな・・・と感じました。

  私はGmailをメインで使用しているので問題ないのですが、他のメールアプリもおいおい試したいと思います。

 GitHub

  ブラウザ使ったほうが便利ですw

Python環境

 先述の通りPydroidはJupyter Notebookがうまく立ち上がらないのでお役御免に。

 普段使っているAnacondaの導入はうまく行きませんでした。。。

 仮想環境は構築できていませんが、Linux+CLIでなんとかPython、Jupyter Notebookのインストールができました。

 メモリが4GBと心もとないので、kaggleの重いデータを回すとすぐメモリーエラーを起こします。。。

 コードするだけと割り切って、読み込むデータを一部だけにする等の工夫をしないと厳しいですが、通勤時間専用機と割り切れば問題なさそうです。

参考にしたサイト

qiita.com

turtlechan.hatenablog.com

qiita.com

(追記)下記サイトを参考に、

sudo pip3 install jupyter lab

と入力したらjupyter lab もインストールできました。

qiita.com

(追記)下記サイトを参考に、VS CodeとDockerをインストールできた

qiita.com

フォルダ操作

 フォルダ用のアプリを使います。

 ダウンロード用フォルダ、Google Play用のフォルダ、Linux用のフォルダに分かれており、ダウンロードしたプログラミング用のデータ等は、ダウンロード用のフォルダから、Linux用のフォルダにコピペしてやれば問題なく使えます。

Git

 上述のLinuxアプリ+CLIでGitを使えます。

 GUIベースのものですと、Source TreeはLinux及びAndroidアプリに対応していないので不可、KrakenがLinuxに対応しているとのことですが、インストールエラーが出たので私は早々に諦めました。。

 commit、push、cloneはできました。その他のコマンドはそもそも私がGitに慣れていないのでおいおい。。

参考にしたサイト

qiita.com

qiita.com

www.atmarkit.co.jp

ブログ更新

 このブログは、Google Chrome ブラウザを使って更新していますが、問題な更新できております。

スクリーンショット

 Shift+Ctrl+ウィンドウを表示ボタンでできます。

support.google.com

 スクリーンショット用のよいアプリがありましたら、教えていただけると喜びます!

電車内での使用・バッテリー

 電車内で座れれば十分使用できます。

 ちょっと肘が窮屈かな・・・とは思います、隣の人に迷惑にならないように使用しましょう。

 覗かれて困るようなものを表示する予定はないのですが、見られているかな?と思うと気になるので覗き見防止フィルムを買いました。

 家電量販店にサイズが合うものがコチラしかなかったので購入しました。

www.nakabayashi.co.jp

 画面に両面テープで貼り付ける必要があるのがちょっと気になりますが、覗き見防止の機能はバッチリ果たされています。

 片道1時間程度の電車内で使用していますが、今の所バッテリー切れにはなっていません。

 カタログによると11時間ほど持つことになっていますが、バッテリーフル充電の状態で使用開始すると、あと7時間くらい持つ、と表示されます。

 動画みたり、重い処理をしているともう少し短いかもしれませんね。

その他試したいこと

 ディスプレイへの投影 USB TypeC ⇔ HDMI 変換コネクタを使えばできるようです。Amazonでポチったのでおいおい使用感を書きたいと思います。

 VS Code の導入 Jupyter Notebook だとWebアプリ等の開発には不向きなので、VS Code等のツールが導入できるか試していきたいと思います。

 Pipenv等の仮想環境の導入 たくさんあってどれにしたらいいのか悩みますが・・・、導入したいと思います。

 Web会議での使用 マイク・スピーカーは標準装備されており、zoomやGoogle Meetのアプリはあるので問題なく使えると思いますが、いまのところ使用する機会がないので、おいおい試してみたいと思います。

追記

 ディスプレイへの投影 HDMI-TypeCコネクタを購入。問題なくサブディスプレイを使用できた。携帯使用がメインなので使い所は帰ってきてからデータをGitにアップしたりするときに限られそうだが、大きな画面でできるのは便利。

 外出先でのディスプレイ使用等が見込めるなら十分アリ。

www.elecom.co.jp

 LINE 認証コードを打てばスマホと併用できるPC版LINEと違い、スマホの乗換え扱いとなり、今使っているスマホ版のLINEが使えなくなってしまうようで、お役御免。

 以上になります、最後までお読みいただきありがとうございました。

groupby と .agg() で DataFrameの集約を便利にするテクニック

f:id:kj_man666:20200614074750j:plain

DataFrame型をgroupbyで集約する時、agg() を使って、平均値や個数のカウントをまとめて行うテクニックです。

今回のコードはこちら

今回は、外部データ、UCIの学生の成績のデータセットを使います。

データの内容を詳しく知りたい場合は、こちらをご覧ください。

import pandas as pd
import os

# DataFrameの表示数を変更
pd.set_option('display.max_columns', 100)
pd.set_option('display.max_rows', 500)

# カレントディレクトリの参照
path = os.getcwd()

外部データをURLから読み込みます。

外部に保存されているのが zipファイルのため、zipファイルの展開も併せて行います。

# 外部データのzipファイルの読み込みに必要
import zipfile
import requests
import io

# データがあるurlを指定
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip'

# データをurlから取得
r = requests.get(url, stream=True)

# zipファイル内のstudent-mat.csvをカレントディレクトリ内に展開
with zipfile.ZipFile(io.BytesIO(r.content)) as existing_zip:
    existing_zip.extract('student-mat.csv', './')
# データの読込
df = pd.read_csv(path + "\student-mat.csv", sep = ';')

必須ではありませんが、displayを使うと、まとめて1つのセルで .head()や .tail() を実行できるようになるので便利です。

# まとめて表示できるようにする
from IPython.display import display

# まとめて df を表示
display(df.head())
display(df.tail())
display(df.dtypes)

f:id:kj_man666:20200614080159p:plain

手前ミソですが、詳しくは下記サイトご参照ください。

megane-man666.hatenablog.com

このデータの性別(sex)ごとに、年齢はどうなのか、成績(G1~G3)はどうなのか、という集計をするとき、下記のようにgroupbyと.agg()を組み合わせると非常に便利です。

# 集計
df.groupby('sex').agg(
    count=('sex', 'count'),     # sex の個数をカウント
    age_mean=('age', 'mean'),   # age の平均値
    G1_mean=('G1', 'mean'),     # G1  の平均値
    G1_median=('G1', 'median'), # G1  の中央値
    G2_mean=('G2', 'sum'),      # G2  の合計
    G2_median=('G2', 'max'),    # G2  の最大値
    G3_mean=('G3', 'min'),      # G3  の最小値
    G3_median=('G3', 'std')     # G3  の標準偏差
)

f:id:kj_man666:20200614080653p:plain

以上になります、最後までお読みいただきありがとうございました。

参考サイト

medium.com

pycarnival.com

ポートフォリオを作りたい

f:id:kj_man666:20200604184158j:plain

データサイエンティストを目指して転職したものの、今のキャリアのままでいいのか…と悩んでいたところ、ポートフォリオを作ったらいいよ!とアドバイスをいただきました。

しかし、IT企業に勤めているわけでも、エンジニアでもないので、意図的に作りにいかないとポートフォリオを作ることはなさそう・・・。

ということで、作りたいポートフォリオを考えてみました。

とその前にポートフォリオってどんなものがあるんだろう

ググってみました。

データサイエンティストや機械学習エンジニアのポートフォリオが見つからなかったので、Web系ではありますが、参考になりました。

  • Naoto Suzuki 's Portfolio

スキルセットと連絡先、WebサイトとスクリプトのGitHubが公開されています。

nsuzuki7713.github.io

  • HodaLab!

スキルセットがフロント、バック、デブオプスと分けられていてわかりやすいですし、職歴まで書いてありますし、何よりポートフォリオサイト自体がステキ・・・。

hodalab.com

つくりたいポートフォリオ

自分が関心があって、企業等に関心をもってもらえそう?なモノをリストアップしてみました。

・AWS等によるデータ分析基盤の構築

やはり基礎となるのはデータ分析。

インフラの構築から機械学習までできればベストだなあ、と思っております。

参考記事

【レポート】AWSで構築するデータレイク基盤概要とアーキテクチャ例のご紹介 #AWSSummit | Developers.IO

[CTO Night & Day 2019] AWS で構築するデータレイク基盤と amazon.com での導入事例 #ctonight

【脳筋Tech】ダイエットの進捗を楽しくするための仕組みを作ってみた💪! - 継続は力なり

・ラズパイ+カメラを使った画像認識

IoT系と画像解析の学習のために。

画像だけでなく、センサー系一通りできるようにもなりたい。

参考記事

Raspberry PiとOpenCVによる画像認識で人の顔を判別する | パソコン工房 NEXMAG

ラズパイとAWS IoT連携 (Pythonで温度情報をクラウド送信) - Qiita

・kaggleコンペ

人様のNotebook参考に作ったもの+コンペ中につき更新中ではあるものの、コチラは対応済み。

コンペ終わったら感想ブログ書こう・・・!

www.kaggle.com

・自然言語処理+Webアプリ

すごく大変そうだけど、やってみたい・・・!

参考記事

Pythonで検索エンジンを自作する方法 Part.1 - ログミーTech

以上になります、最後までお読みいただきありがとうございました。

jupyter notebook (jupyter labも可)の表示を便利にするテクニック

f:id:kj_man666:20200530140420j:plain

(追記)一番最後に、行数の多いデータの情報をざっくりつかむために便利なテクニックを追加しました。

jupyter notebook を使うと、DataFrameの中身や型、構成などを逐次確認できるので便利です。

import pandas as pd

# DataFrame の作成
df = pd.DataFrame(data=[('a',1,2,3,4,5,6,7),('b',8,9,10,11,12,13,14),
                        ('c',15,16,17,18,19,20,21),('d',22,23,24,25,26,27,28),
                        ('e',29,30,31,32,33,34,35),('f',36,37,38,39,40,41,42),
                        ('g',43,44,45,46,47,48,49)])

df.columns = ['category', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']

ですが、セル1行に一度に入力しても、一番最後しか実行されません。

df.dtypes
df.shape
df.head()
df.plot()

f:id:kj_man666:20200530142012p:plain

1個1個セルに入力すればよいのですが、ちょっと面倒です。

また、print関数をつかってもいいのですが、DataFrameの表示が見づらくなってしまいます。

print(df.dtypes)
print(df.shape)
print(df)
df.plot()

f:id:kj_man666:20200530142619p:plain

こんな時は、IPython.display を使うとDataFrameもキレイに表示できるので便利です。

from IPython.display import display

display(df.dtypes)
display(df.shape)
display(df.head())
display(df.plot())

f:id:kj_man666:20200530142759p:plain

(追記) また、今回は違いますが、行数の多いデータの場合、下記を使えば、情報をざっくりつかみやすいです。

display(df.head()) #最初の5行を表示
display(df.tail()) #最後の5行を表示
display(df.dtypes) #型を表示
display(df.shape) #構成を表示

f:id:kj_man666:20200530160801p:plain

なお、コードはこちらになります。

以上になります、最後までお読みいただきありがとうございました。

参考サイト

kujira16.hateblo.jp

写経ですが、自分の好きなモノを投稿するアプリを作りました

f:id:kj_man666:20200524083128j:plain

追記:ログイン機能カットした誰でも投稿できる版のアプリを追加

   アプリの名前を、Favo-Write(Favorite + Write)に決定

   コード、アプリのURLをログイン機能カット版に修正

追記2:2022/1/22 にアプリの公開を停止しました。

だらさん主催の一週間でwebサービスを作るハッカソンに参加しました。

今回のテーマは、「Like」でした。

どんなアプリか

マンガでも食べ物でも何でもいいので、好きなモノを投稿するアプリです。

(追記)アプリの名前を、Favorite(好きな) + Write(書く)で、Favo-Write(フェーバライト)にしました。

(会員登録機能がないので、見る事すらできないクソアプリですが、、)

f:id:kj_man666:20200524081207p:plain

http://favowrite.herokuapp.com/favowrite.herokuapp.com

コードはこちら

環境
制作について

オリジナルアプリでもなんでもなく、、、こちらの書籍のブログアプリを写経させていただきました。。

会員登録機能がないので、自分用のメモアプリでしかないのですが。。。

デプロイについてはコチラの記事を参考にさせていただきました。

qiita.com

反省点

デプロイされたWebサービスを作るのが全くの初めてでしたため、どういう機能はどのくらい手間やサーバーへの負荷がかかるかや、Herokuの容量制限等の知識がなく、紆余曲折しまくり、今の写経も6日目のスタートでした。

おまけに会員登録機能もないし、非会員の閲覧機能もないので、自分しか見れない・・・

(追記)ログイン機能をカットして、誰でも投稿・閲覧できるようにしました。

ですが、デプロイ自体を期間内にやりおえたので謎の充実感はあります笑

以上になります、最後までお読みいただきありがとうございました。

全4巻以内、Kindleで読めるマンガをまとめてみた(ネタバレなし)

f:id:kj_man666:20200517173945j:plain

やや落ち着いて来た感もありますが、自粛自粛で室内にこもりがちな今日、マンガなどはいかがでしょうか。

ですが、某海賊マンガや某少年探偵マンガ、某不良警察官マンガのように、全数十巻、全百何巻と言われるとなかなか手が出ないですよね。

某鬼と戦うマンガぐらいの巻数(2020/5/17時点だと20巻)でも、一からキャッチアップするのは辛いかなと個人的には思います。

そこで、何十番煎じかわかりませんが、全4巻くらい、Kindleで読めるマンガで、思い出深いものをまとめてみました。

なお、一応全部読んだことありますが、うろ覚えなところはご容赦ください。

七夕の国 全4巻

因習に縛られた超常的異能を受け継ぐ村の一族と、その異能をめぐる謎を描いた作品。

と言っても世界を巻き込むような大事件になるわけでもなく、現実の中で起こりそうな感じで(それがなおエグい)進んでいきます。

寄生獣の岩明均先生が書いているだけあって、人間の黒い部分の描き方がエグかった記憶があります。

この作品が気にいっていただけた方で、まだ読んでいない方は、寄生獣(全10巻)も読んじゃいましょう。

アニメでもいいかもしれません、実写映画は見てないので知らない・・・。

蜜の島 全4巻

世間から隔絶された島に訪れた男二人組が、違和感ありありな島の風習に戸惑いながら、島の風習(というより考え方?)の謎を解き明かす話です。

ネタバレ厳禁で謎を一緒に解きながら読むと〇。

読後感は・・・読まれたことのある方はわかっていただけると思いますが、割とよくなかったと思います。 (注:作品のクオリティが、ではないです)

こいつ・・・、と思うこと必死。

地底旅行 全4巻

原作の方は読んだことないのですが、ジュールベルヌの小説、地底旅行をマンガ化した作品。

なんと初版は1864年と150年以上前!

タイトルどおり、地底に広がる世界を旅行(というより探検)する話です。

主人公の1人、リーデンブロック教授のいっちゃってる感豪快さが記憶に残っています。

ドラえもんのび太の創生日記とか、竜の騎士とか、地底に国があるかも系の作品に影響を与えているんじゃないでしょうか。

伝説の勇者の婚活 全4巻

世界を救った勇者が婚活を始めたら・・・、という内容。

主人公のユーリ(勇者)が史上最強、かつ超いいヤツでありながら、超朴念仁なので、婚活中の対応を見る度、やきもきしてしまいます笑

個人的に一番好きなキャラは武器屋のブゥキンさんです。

プラネテス 全4巻

発売された当時(雑誌掲載は1999年から2004年)は宇宙+日常(と言ってもギャグではなく、リアルな生活)を描くマンガって珍しかったと思います。

なので読んだとき、スゲー、未来はこんな感じなのか・・・と思った記憶。

主人公のハチマキ含め、それ相応の代償や葛藤もありつつ、夢に向かって突き進んでいく感じがまたリアルでイイ。

なお、ゆるーい感じのアニメ版とは別物です。

ザ・ムーン 全4巻

浮浪雲、銭ゲバのジョージ秋山先生が描く、ロボット漫画。

少年少女の心が1つになることで、無敵のロボ、ザ・ムーンが悪を倒すため動き出す・・・とだけ聞くと一見冒険活劇風でありますが、黒い方のジョージ秋山先生が描いているので、一筋縄ではいきません。

特にラスト・・・。

なお、ぼくらの(全11巻)に出てくるロボット、ジ・アースの元ネタだったりします。

ぼくらの作品中でも、「少年少女があつまってロボットを動かす話があって~」みたいな下りがあります。

(参考)『ぼくらの』の解説を始める前の | 胙豆

その作品、最後どうなるの?と聞かれて最後まで読んでない、と答えてますが、最後まで読んでなくてよかったね・・・。

以上になります、最後までお読みいただきありがとうございました。