ごらくらいふ

プログラミングしたりゲームしたり

UITextFieldの内容をUserDefaultsに自動保存する。(+ 保存用のキーをInterfaceBuilderで設定する)

寄り道を経てカスタムクラスの最適解に降り立った気がする。

This UITextField is save to UserDefaults when edit ...

編集終了のタイミングでUserDefaultsに書き込んでくれる。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: RestorableTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField.restoreByUserDefaults()
    }
}

Interface-Builderで紐づけたら、あとは呼び出すだけ。

リファクタリング「リトル・レディ」 #1 画像ボタンをホバーで差し替える処理

約3年も前の話、「リトル・レディ」という作品をChromeで動くようにしたい! という思いのもと、勝手に復活開発日誌を始めた。

yajamon.hatenablog.com

yajamon.hatenablog.com

この開発は一気に進み、2年弱放置の後に完結宣言が行われた。

この記事は?

この記事はいわば番外編。今風のコードに書き換えていく活動の上で何をしたか記録していく。

目下目的はHTML5に馴染む形に書き換えること。野心はSingle Page Applicationにすること。 自分でアプリケーションを設計して、脚本を読み込むようにする。 そして、リトル・レディの脚本を抽出・変換ツールを用意することで、自分以外の人に体験してもらえる状況に持ち込むのが到達点。

画像の差し替え処理を書き換える

スタート画面では、<a>タグをボタンに見立て、中に画像を配置している。

/index.htm

<script language="JavaScript">
// プリロード
if(document.images) {
    var imgPreload1 = new Image() ; imgPreload1.src = "image/basis/menu1-2.png";
    // ...つづく
}
</script>
<a href="javascript:topS()" onMouseOver="menu1.src='image/basis/menu1-2.png'" onMouseOut="menu1.src='image/basis/menu1-1.png'"><img SRC="image/basis/menu1-1.png" border=0 name="menu1"></a>
<!-- つづく -->

<img>name属性で識別され、ボタンへのマウスオーバー(アウト)、で差し替えている。 スムーズに差し替えられるよう、ホバー用の画像はコード上で食わせて、プリロードとしている。

body以下のツリーに足したりしていないので、現代のブラウザでプリロードが行われるのか不安だったが、問題なくプリロードされているようだった。

修正後

<style>
    .btn-base, .btn-hover {
        border : 0;
    }
    .btn .btn-base {
        display: inline-block;
    }
    .btn:hover .btn-base {
        display: none;
    }
    .btn .btn-hover {
        display: none;
    }
    .btn:hover .btn-hover {
        display: inline-block;
    }
</style>
<a href="javascript:topS()" class="btn" ><img class="btn-base" src="image/basis/menu1-1.png"><img class="btn-hover" src="image/basis/menu1-2.png"></a>
<!-- つづく -->

<a>の中に通常時、ホバー時の画像を指定してしまい、CSS:hover疑似クラスとdisplay:要素で表示制御するようにした。

行数は多少増えてしまった感があるが、HTMLにハードコードされたonMouseOver, onMouseOutを排除することができた。 また、ボタンの数に対する編集箇所が一箇所に集まったのでこの方法が好きかな。(今後増えたりする見込みはないけれど…)

ほかにもCSSでボタンごとにa.btn-start:hover { background-image: url(...) }とかも考えたけれど、気にするところが増えたのでやめた。*1, *2

余談

完結宣言から1年経って手を付け始めたのだけれど、タイトルが予言されてて笑ってしまった。

これから手を加えるのは、より現代ブラウザ向けの修正になるので、"リファクタリング:リトル・レディ"とかのタイトルでやろうかな。

yajamon.hatenablog.com

*1:ボタンの数だけスタイルとHTMLに対処を書き込む必要があったり

*2:widthどうするん…画像サイズに合わせなきゃ…など

Chromeの開発者ツールで選択した要素のHTMLElementを教えてくれるやつ、Ctrl+Shift+C がショートカットキーだった。

Chrome 67 で確認。 MacだとCmd+Shift+Cね。

URLとタイトルをひとまとめにクリップボードへ突っ込んでくれるChrome拡張がお亡くなりになったみたいで、 自作するしかないかー、そういえば空いてるショートカットキーはあるかななどと触ってたら動いて驚いた。

ぱぱっとかき捨てたいけどsyntax highlightとかエディタのサポートほしい…

/tmpに書けばよかったんや

vim /tmp/draft.md

Zaif Apiを叩くツール zacli v0.1.0 をリリースした。

Rust製のZaif API Wrapperを作っているので、これをコマンドラインツールとして使用するCrateを作成した。

yajamon.hatenablog.com

インストール方法

RustとCargoの準備が整っているなら、以下のコマンドでインストールできる。

cargo install zacli

使い方

通貨ペアを確認したり

$ zacli currency_pairs all | grep zaif
currency_pair: zaif_jpy
currency_pair: zaif_btc

板情報を確認したり

$ zacli depth zaif_jpy
type    price   amount
ask     1.01    15000.0
ask     1.02    500.2
...
bid     1.005    12000.0
bid     1.0048   450.5

注文できます。

$ zacli trade zaif_jpy bid 1.0 100

Crateとか

https://crates.io/crates/zacli

要望とかあったらissue, P-r待ってます。

https://github.com/yajamon/zacli/issues

手紙を書くつもりでとんだ夢物語を書いた

ご無沙汰しております。

お元気にお過ごしでしょうか。 この、春にかけての季節は活力を落としがちで、心身の健康を心配しております。 かくいう私もめっきりアニメを嗜むこともできず、衰えを感じる日々でして、身体の方から健康にしていこうと運動を試みております。

つい先日、痩けた獣にわずかばかりの食事をあたえたところ、しきりに訪れては同じところを掘り返すようになりました。 いよいよ気になり一緒になって掘り返したところ温泉が吹き出し、さらには金の粒が次々とあふれ、あれよあれよと億はくだらない資産と相成りました。

いまは湯屋を営んでおります。 大変お世話になりました恩返しというほどではございませんが、往復の代金を同封させていただきました。 ぜひ一度お越しください。


みたいな。

Rustでホームディレクトリのファイルを読み込みたい(ドキュメントに書いてあってうれしかった話)

これ。

use std::env;
use std::path::{Path, PathBuf};
use std::fs::File;
use std::io::prelude::*;

fn open_file() {
    let mut path = env::home_dir().unwrap();
    path.push("config.toml");

    let mut file = File::open(path).unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    println!("body: {}", cotnents);
}

エラー処理は各々おねがい。

以下駄文(経緯ともいう)

ホームディレクトリ知りたいな。環境変数からかな。

お、標準ライブラリにそれっぽいのあるぞ。

std::env - Rust

むしろホームディレクトリ直通の関数があるぞ…素晴らしか。

std::env::home_dir - Rust

なるほどPathBufを返却するのかー。

ファイル名の追加はどうしたら良いんだろう。と思ったらPathBufのトップに書いてある…最高か。

std::path::PathBuf - Rust

じゃああとはファイル読み込みか。fsモジュールっぽいよね。

あ~~トップに答え書いてある~~~すき~~~。

std::fs::File - Rust

標準ドキュメント素晴らしい。これで私はconfigを得ました。(あとtomlをデシリアライズしたりしてる。)