DISCOVERY

日々の備忘録

blenderのスカルプトで犬作る#1

スカルプト??

粘土みたいに3Dのモデリングができる。 前作成したようなポリゴンを伸ばしてーみたいな作業が感覚的にできるのでめちゃめちゃありがたい!

参考動画

適当に試した時に全然うまくできなかったので、youtubeの初心者講座で良さそうなものをちょいす。

https://www.youtube.com/watch?v=qz85lHjDmrU

スカルプトでのモデル作成の主な流れ

  • スカルプト
  • トポロジー(ポリゴン数を落とす)
  • UV展開(画像として影などを加える)

解像度とブラシ

解像度

デフォルトでは右下のtris12で小さすぎてスカルプト全然できない! f:id:azpiero:20210228002230p:plain

レイアウトに戻り tabで編集モード 右クリックsubdivideを選択 左下にsubdivideウィンドウが出るのでNumber of Cutsの数字を大きくする f:id:azpiero:20210228002240p:plain

このメッシュの細かさが解像度 f:id:azpiero:20210228002259p:plain

途中で解像度変更したい(2パターン)

  • リメッシュ

一括で今あるメッシュのサイズを調整 右にあるスパナマークからremeshを選んでサイズを調整。 一括なので、部分的にみたいな作業には向かない。 f:id:azpiero:20210228002249p:plain

  • DynamicTopology

部分的にメッシュのサイズを変更できる。 DynamicTopologyをonにする。 DetailsBrush Detailsにする。 f:id:azpiero:20210228002309p:plain これでFキーでブラシサイズを変更すればその大きさに合わせて部分的にメッシュサイズが切り替わる。 f:id:azpiero:20210228002247p:plain

ブラシ

ctl + ブラシで「彫る」、「盛る」の反転

shift + ブラシで表面をなめす

最初に大まかな形をとるときはsnake fookブラシが良い。 伸ばす感じ。DynamicToplogyONなら解像度も適度に変わる。

いろいろブラシありますがあとは使ってみてですかね。

目とかはどう作るんだろう。。 f:id:azpiero:20210228002316p:plain

nishikaコンペ

5位でもう一歩だが、ガス欠気味。。 f:id:azpiero:20210228003034p:plain

イラスト

f:id:azpiero:20210228002333j:plain

DSっぽい何か

統計検定勉強

bellcurve.jp

このページを参考に統計検定の勉強はじめました。

とりあえずSTEP1.基礎編第7章まで。

以下3章までめも。

  • 間隔尺度と比例尺度について
    原点が存在するかが見極めポイントだが、テストの点数などが間隔尺度なのはいまいちピンと来ない。 以下の説明で分かったようなわからんような。

    • 0という値が何もない訳ではなく、値の一つでしかない。
    • 差に意味があり、比に意味がない。(20点と40点で2倍賢いという訳ではない。)
  • スタージェスの公式

    階級を作るときは 1 + \log_{2}n こに分割するといい。

    kaggleなどで説明変数作るときに参考になりそう。

  • ローレンツ曲線:

階級の累積と階級に属する値の合計の累積を比較して、データの歪みを視覚化。

完全均等とローレンツ曲線との差を面積として表す。2倍することで[0-1]の範囲にする。

  • 幾何平均 :

\sqrt[n]{\prod_{i=1}^n x_i}

関数電卓ではshiftを押してsqrtを押すとnの部分を指定できる。

  • 調和平均 :

    行きは60kn/h、帰りは80km/hさて平均速度は?みたいな

\frac{2}{ \frac{1}{60} +  \frac{1}{80}  } = 68.57

関数電卓で分数、少数の切り替えは「S<=>D」のようなボタン。

  • 歪度 :グラフの左右対称性を表す。
  • 尖度 : 正規分布と比べての尖り具合を表す。 数式が結構ヤバイけどこれは覚えるのか?

関数電卓使ったり、ここに数式を打ち込むのは大学以来でてこずりますね。


juliaの前処理100本ノック

あと仕事で必要なのでこれも初めて見ました。

qiita.com

pythonみたいですが、ちょいちょい違くてなかなかてこずります。

シェルみたいにパイプでかけるのは楽ですが、先人のソース読みときに若干苦労しました。

こちらは現在P15まで。

DataFrameの前要素に何かするときには pythonと違ってちゃんと展開してってのを"."で明示するところがミソ。

あとカラムを指定する時の":"をスライスと勘違いしたりw

: customer_id.=="CS018205000001"

nishikaの中古マンション価格予想コンペ

www.nishika.com

現状20位

xgboostが今のところ一番良い。

特徴量まだ全然試行錯誤してないので、いろいろ試せそう。

f:id:azpiero:20210202223915p:plain


今日のイラスト

f:id:azpiero:20210202223718j:plain

JRコンペ参加した

JRコンペとは?

SIGNATEで12月から行われていたテーブルデータコンペ。 JRのいくつかの路線の各電車の遅延を予想しましょうという内容でした。

kaggleのMoAに会社のチームで取組んで銅メダルだったのですが、 ほぼ既存ソースのマルパクリとなってしまい、達成感が少なかったのでこちらに挑戦しました。

notebookの共有がないので最初はこちらの方が自力がつくのかなーと。

取組

最初は時系列データということでGPUも持っているしLSTMで取り組みました。

しかしいつまで経ってもただの横置きのベンチマークに勝てない。。

しっかりデータをみると予想区間が4駅しかないデータがいくつも存在していました。

windowサイズ5などで試していてこれでは全然うまく行かなそうだったので、LightGBMに切り替えました。

同じ特徴量で切り替えた途端、スコアが爆あがりして銀メダル圏内に。

しかしそこからKaggle本を元にいくら試してみてもスコアが上がらない。

週情報追加・遅延0判定追加・平均などの情報追加・特殊なtrainデータの除外・optunaの利用・targetEncodingなどなど

どれだけやっても一向に精度が向上しないまま最終日。

ここでLightGBM最初に試した特徴量で再度実験したところ結果が違う!

まさかのseed固定していない & jupyterを落とすことなくいろいろ実験していたので結果に毎度ばらつきがあったのでした。。

今までの取り組みが実際に良かったのか悪かったのかの判断が全部死んでしました。。 悲しい。。

f:id:azpiero:20210122022141j:plain

最終日に気づいて試せることが少ない中で、結局特徴量は元の情報にプラスして駅ごと、 電車ごとに遅延を横置きしたものを追加しただけになってしまいました。

遅延0判定の結果が一定以下のものは遅延0とまず予想するようにしました。 これはほとんどの遅延時間は0で回帰の結果0.1などと出るものは遅延0にして少しでもズレを修正したかったからです。 それ以外は回帰の結果を利用する形になりました。

結果

30位でした! f:id:azpiero:20210122020157p:plain

感想

SIGNATEの初心者コンペ以外で初めて挑戦しましたが、まずまずの結果が出て嬉しいです。 結構pythonでのテーブルデータの分析に慣れてきた気がします。

seedを固定して結果のブレをなくすことができれば、よりいろいろ試せたと思うのが少し残念。 いい教訓になりました。

途中でMoAで活躍したtabnetもpytorch-tabnetを元に試してみましたが奮わずでした。

画像系の魚群検出の方にも手を出してみてるのですが、epochが足りないのか全然いい結果が出ないですね。

余談 )

12月の電気代がGPUガシガシ使ってたら1.5倍になりました。

deepfakeとかでも遊んでたしね。仕方ない。

今日のイラスト

ぽめちゃん f:id:azpiero:20210122022215p:plain

早速1日サボるという。。

簿記

簿記の勉強はひとまず続いている。

「資産」シリーズの現金と預金 f:id:azpiero:20200728212747j:plain f:id:azpiero:20200728212715j:plain

現金過不足のずれが見つからなかった時の決算の処理が気になるところ。 小切手とかもそういう物なのかという感じ。

例題を解いてるけど、勘定科目覚えるのが大変そう。

仕事

eksのcustom metricsの設定がよくわからんを無限に繰り返している。

cpuやメモリだけでなくアクセス数やらで制御したいんだよなあ。

この辺整理できたらまたまとめたい。

本腰入れたいのに雑用があって全然できない。

コロナの時代、PCくらい持って帰っていいでしょうよ。

この辺の調整にも稼働がかかるんよ?

副業やってみる

動画編集の仕事が取れそうな感じ。

Adobe Premiere Proでとりあえず編集してみて、今後も依頼されるように頑張りたい。

日記習慣

4連休もfgoやらyoutubeやら気付いたらかなり怠惰に過ごしてしまった。。。

毎日やったことを日記みたいに付けて振りかえれるようにすれば改善するのではないかと思うので、4連休を手始めに続く限りやってみる。

2020/7/23

彼女と少し遠出した。

GoToキャンペーンは対象外であったり、遠出するのはコロナを広めそうなので、近場で探して猿島というところに行ってみた。

もともとは首都圏防衛のための砲台などがあったところだけど、 主戦場が海上から航空になったことであまり重要性がなくなっていったようだ。

フランス式のレンガの積み方をしている数少ないトンネルなどがあった。

自然に囲まれた島でなかなかよかった。

今度はお肉を持ち込んでBBQをするのもいい。

f:id:azpiero:20200726230003j:plain

2020/7/24

彼女とまたしてもお出かけ。

今度は南町田グランベリーパークというアウトレット。

AFURIでラーメン。

ゆず塩も美味しいが、チャーシューが特に美味しかった。

f:id:azpiero:20200726230448j:plain

ついに指輪もちゃんと買ってしまった。

給料3ヶ月分ともよく聞くけど、いろいろ話をして背伸びしないものを購入。 その分美味しいものを食べるのがいいという価値観も近くていい。

手直し終わるのが8月末。

ゼクシィも買っていよいよという感じ。まだ何も動いてないけど。

ここのカレーパンが好きなんだけど、前きた時より値上げしてた?? 大阪のパンの家と同じくらいの値段とうまさのものようやく見つけたと思ったんだけど、そこは少し残念。

最後は小学校のころやってたベイゴマをルンルン気分でするという謎行動w

f:id:azpiero:20200726231004j:plain

2020/7/25

fgoと黒猫のウィズの魔導杯で1日がおわる。

この辺のゲームがかなりの時間を吸ってるのでうまく付き合う落とし所を探す必要あり。

流しでNetflixでアカギのドラマを一気見。

安岡が職場の人に似てて地味に面白い。

漫画実写化するならこの辺のギャンブル漫画が 日本ではやはり現実的なんだろうなあ。

カイジといいライアーゲームといい、普通に見れた。

アクションしようとするとどうしてもチープに見えてしまう。

最後らへんの死神とかやっぱ笑ってしまったし。

2020/7/26

アホみたいにYouTubeでお金がどうのみたいなものを見てた。

投資のメリットデメリットみたいな。

何でもそうだが営業しにくるようなものは基本そうしないと売れないものなので手を出さない。

税金の話もあって、控除と経費が大事そう。 個人事業主になって実際にやってみるのが理解速いんだろうなあ。

会社ではプログラムとかあんまり絡まないなら申請すれば行けるみたいなので Adobeの動画編集・イラストレータあたりを今までめんどくさくて動けなかったけど、いよいよ動き出すときかもしれない。

この辺なら始めるのにそんなにお金掛からんしスキルも身に付くし。

マネーリテラシー高めるためにYouTubeで簿記でも勉強するかということでとりあえず紙に第一回分をまとめた。 E資格とったとき以来の紙にまとめ書いて勉強。やっぱり高校のころから手でまとめるのが一番覚えられる。

f:id:azpiero:20200726234810j:plain

カレーやら麻婆茄子を作りおき。

Looking glassで遊んでみるがサンプルを動かすときに、holoplayの画面が最初Macの画面側で出てしまって動作確認に手間がかかる。。

ワニさんの動画でBlenderで犬のキャラクターは作成したので こいつをこの画面上で今度動かしてみたいなあ。

f:id:azpiero:20200726232331j:plain f:id:azpiero:20200726232418p:plain

Android勉強し直す Databinding

業務でAndroidを扱っているが教えてくれる人がいないので、デザインパターンを知らない。

調べてみるとViewModelやらLiveDataやらいろいろ出てきてえらいこっちゃ。。。

https://proandroiddev.com/mvvm-architecture-viewmodel-and-livedata-part-1-604f50cda1

こいつらのやりたいことは基本的にFatActivityをなくすこと。

まさに今こんな感じになってるので、これはぜひ学びたい。。。(ついでにkotlinも)

とりあえずとっつきやすそうなDatabindingから見ていく。

今までxmlで表示する値の変更はActivityからfindviewbyidで調べて〜みたいな処理をいちいち書いていた。

これをViewModelとDatabindingを導入すれば楽になる。

1 build.gradleに追加

dataBinding {
        enabled = true
    }

2 ViewModelを作成

class MainViewModel {
    // 表示が変わる
    var name = ObservableField("aaaa")
}

3 xmlを編集

先ほど作成したviewModelをdataとして指定し、 textの値はそのViewModelのnameを表すことを指定する。

<data>
        <variable
            name="viewModel"
            type="com.example.test.MainViewModel" />
</data>

<TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.name}" />

4. mainActivityの編集

最後にviewModelとxmlを繋ぐ処理をする。 通常のsetContentViewではなくDatabindingを利用したContentViewの設定をする。 はbindingの設定をしたxml作成時にxmlの名前を利用したBindingクラスが勝手に作成されているのでそちらを利用する(Activity名ではない)。

android - DataBindingUtil.setContentView - Type parameter T has incompatible upper bounds - Stack Overflow

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding =
            DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.viewModel = MainViewModel()
    }

これでめでたくActivityを経由しないでxmlを上書きする仕組みができた。

次はLiveDataを絡めて学んで、まず簡単なメモアプリを作りたいですね。

RDSのスナップショットをS3に定期的に保存する

RDSのsnapshotを定期的にS3に保存する必要があったので備忘録

およそ下図のようなことがしたい

f:id:azpiero:20200715214303p:plain
構成図イメージ

1. 古いsnapshotを作成 & 新しいsnapshotを作成し、完成まで待機するlambdaの作成

snapshotの削除・作成は他サイトを参考にしつつ、snapshotが完成したらS3に保存したかったので check_snapshot_createdを追加した。[スナップショットに付けたいprefix名]などは適宜変更する。

iimport json
import boto3
import time
from botocore.client import ClientError
from datetime import datetime, timedelta, tzinfo
import threading

rds = boto3.client('rds')
s3 = boto3.resource('s3') 

class JST(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=9)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self, dt):
        return 'JST'

def delete_snapshots(prefix, instanceid, days):
    snapshots = rds.describe_db_snapshots(DBInstanceIdentifier=instanceid)
    now = datetime.utcnow().replace(tzinfo=None)
    for snapshot in snapshots['DBSnapshots']:
        if 'SnapshotCreateTime'not in snapshot:
            continue
        delta = now - snapshot['SnapshotCreateTime'].replace(tzinfo=None)
        if snapshot['DBSnapshotIdentifier'].startswith(prefix) and delta.days >= days:
            rds.delete_db_snapshot(DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier'])


def create_snapshot(prefix, instanceid):
    newsnapshotid = "-".join([prefix, datetime.now().strftime("%Y-%m-%d-%H-%M")])
    rds.create_db_snapshot(
        DBSnapshotIdentifier=newsnapshotid,
        DBInstanceIdentifier=instanceid
    )
        

def check_snapshot_created(prefix, instanceid):
    snapshots = rds.describe_db_snapshots(DBInstanceIdentifier=instanceid)['DBSnapshots']
    for snapshot in snapshots:
        if snapshot['Status'] != "available":
            time.sleep(20)
            check_snapshot_created(prefix, instanceid)
    

def lambda_handler(event, context):
    snapshot_prefix = [スナップショットに付けたいprefix名]
    instance = [DBのインスタンス名]
    delete_days = 50
    create_snapshot(snapshot_prefix, instance)
    delete_snapshots(snapshot_prefix, instance, delete_days)
    check_snapshot_created(snapshot_prefix, instance)

今回のlambdaはスナップショットが完成してないと20秒sleepする。 標準のlambdaのタイムアウトに一発で引っかかるので、lambdaのタイムアウト時間は適宜延長する。

2. lambda発火イベントと完了イベント追加

発火イベントはCloudwatch eventsをcronで実施。日本だと9時間ズレなので時刻を設定するときは気を付ける。完了イベントはいったんここまで完了したらメールを送ってもらうようテストしたかったのでSNSのトピックへ投げるように設定した。

3. S3へスナップショット

boto3のstart_export_taskを利用。 ここで指定するIAMにはS3の操作の権限を付ける。 最新のスナップショットをエクスポートするために取得してきたスナップショット一覧からSnapshotCreateTimeでソートして一つだけエクスポートを実施する。

import json
import boto3
import time
from botocore.client import ClientError
from datetime import datetime, timedelta, tzinfo

rds = boto3.client('rds')
s3 = boto3.resource('s3') 
client = boto3.client('kms')

def export_snapshot(prefix, instanceid):
    snapshots = rds.describe_db_snapshots(DBInstanceIdentifier=instanceid,SnapshotType='manual')['DBSnapshots']
    snapshots= sorted(snapshots , key=lambda x: x['SnapshotCreateTime'],reverse=True)
    snapshot = snapshots[0]  
    newsnapshotid = "-".join([prefix, datetime.now().strftime("%Y-%m-%d-%H-%M")])
    
    response = rds.start_export_task(
        ExportTaskIdentifier= newsnapshotid,
        SourceArn= snapshot['DBSnapshotArn'],
        S3BucketName=[S3のバケット名],
        IamRoleArn=[IAMロール]
        KmsKeyId=[KMSkey],
        S3Prefix=[S3に付けたいプレフィックス名],
        )
    return(response)

def lambda_handler(event, context):
    snapshot_prefix = [スナップショットのprefix名]
    instance = [RDSのインスタンス名]
    export_snapshot(snapshot_prefix, instance)

4. 発火イベントの設定

2で設定したSNSのトピックからの発火を設定して完了 これで今回は朝5時になったらRDSのスナップショットを作成し、 それをS3へエクスポートする仕組みを自動化できた。