TVTestのソースコードをちまちまと読み進めた

visual studio C++をあまり使ったことがないので、この機に調べてみようと思った。

そもそもエントリーポイントはどこなのだろうという話だが、普通にmainで検索してたら、AppMainクラスと_tWinMainが見つかった。

WinMain関数 - インコのWindowsSDK

WinMainについてはgoogleで最上位にきたやつを読んだ。

気になった点はここ

#define WINAPI __stdcall
#define WINENTRY WINAPI

なるほど。これは単なる呼び出し規約の宣言だったのか。また知見が増えた。
呼び出し規約について知らない人は、アセンブラの関数呼び出しを調べてみるといいと思う。いろいろな種類があるので。

ところで、エントリーポイントはint _tWinMainっていうのがわかった。
そんで、
CMainAppクラスのmainを呼び出してる感じ。
g_appはシングルトンかと思ったんだけど、ちょっと違う臭い。

Cのシングルトンって
ファイル内にstatic化したクラスを置いてnon-staticなその型の変数置けばシングルトンになんないのかなと思った。
C++のシングルトンはクラスあるんだしシングルトンパターンでできそうな気もするけど、試す時間はないかなぁ。


ビルドスクリプトがどこなのかわからないんだけども。

やっとwindowsにgvimを入れた

os xlinux系ではもっぱらvimを使っているのですが、windowsでは入れてませんでした。前にやった時、windowsでは、知識不足等でカラースキームすら入れることができなくてずっとIDEsublimeを使っていました。それにネットに転がってる情報がだいたいlinux系ですし。

追記
あとでサンプルのgvimrc参考にしながら直します。

neobundleとカラースキーマ: molokaiをいれるまで、やりました。

そんなわけで、入れます。

www.kaoriya.net

香り屋さんからコンパイル済み64bitバイナリをダウンロードしてきます。
現バージョンは 8.1? です。

vim81-kaoriya-win64-8.1.0005-20180520

なので。えぇ、僕は新しい物好きです。

zipを解凍したあと、

先に、vim81を

C:\Program Files (x86)\Vim

にvim74にリネームして入れます。ほかのファイルも一緒にいれた方がいいみたいですね。

molokaiを持ってきます。

github.com

cloneしてください。

molokai.vimを入れる場所は~\.vim\colorsではありませんでした。
さきほどリネームしてVimディレクトリにぶち込んだvim74の中のcolorsのようです。
あとはneobundleも指示通り~\.vim入れるような感じでした。

これでwindowsでも楽しいvim lifeが送れるといいなぁと思いました。
READMEにちょっと書いてほしいなと思いました。syntax on でエラーが出たおかげですんなり(?)入りました。

修正が入るまではたぶんこれで行くと思います。あきらかにvim74はおかしいので。vim74と書いてある部分を修正する手もあったんですけど、簡単に試せる方にしちゃいましたね。申し訳🍆です。

python 3.7 kivy libpng16-16.png Error on windows8

Environment

  • pipenv
  • python 3.7
  • kivy.deps.sdl2 0.1.18

When I installed kivy through official pip instruction in my windows 8, error happened.
https://kivy.org/docs/installation/installation-windows.html

The procedure entry point inflateValidate could not be located in the dynamic link library C:\Program Files\GIMP2\bin\libpng16-16.dll.

It depends on kivy.deps.sdl2 packages. I tried to change that dll. It worked.

Download link:
www.dllme.com

If does'n work, please commented.

iosのアニメーション(拡大・縮小)

アニメーションつけたくて色々調べた。
スケーリングのアニメーションの仕方はキータに載ってなかったので。

結果的に、動いたコードは

//
//  ViewController.swift
//  PhaseProgress
//
//  Created by b1u3 on 2018/09/17.
//  Copyright © 2018年 b1u3. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    lazy private var innerCircle = InnerCircle(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
    lazy private var outerCircle = OuterCircle(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
    var reverse = false
    var isAnimating = false

    @IBAction func Tap(_ sender: UITapGestureRecognizer) {
        if isAnimating == false {
            isAnimating = true
            UIView.animate(withDuration: 1.0, delay: 0.0, options: [], animations: {
                if !self.reverse {
                    self.innerCircle.transform = self.innerCircle.transform.scaledBy(x: 0.01, y: 0.01)
                }else {
                    self.innerCircle.transform = self.innerCircle.transform.scaledBy(x: 100.0, y: 100.0)
                }
            }, completion: {
                [] arg in
                self.reverse = !self.reverse
                self.isAnimating = false
            })
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.innerCircle)
        self.view.addSubview(self.outerCircle)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.layoutRects()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    private func createBlueRect()->UIView{
        let rect = UIView(frame: CGRect.zero)
        rect.backgroundColor = UIColor.blue
        return rect
    }
    
    private func createRedCircle()->UIView{
        let rect = UIView(frame: CGRect(x: 10, y: 20, width: 100, height: 100))
        rect.alpha = 0.5
        rect.layer.cornerRadius = 50
        rect.backgroundColor = UIColor.red
        return rect
    }

    private func layoutRects(){
        self.innerCircle.center.x = self.view.center.x
        self.innerCircle.center.y = self.view.center.y
        self.outerCircle.center.x = self.view.center.x
        self.outerCircle.center.y = self.view.center.y
    }

}

class InnerCircle: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.isOpaque = false
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func draw(_ rect: CGRect) {
        let arc = UIBezierPath(arcCenter: CGPoint(x: rect.width/2, y: rect.height/2), radius: rect.width>rect.height ?rect.height/2*0.8 : rect.width/2*0.8, startAngle: 0, endAngle: 360, clockwise: true)
        UIColor.red.setFill()
        arc.fill()
    }
}

class OuterCircle: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.isOpaque = false
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func draw(_ rect: CGRect) {
        let arc = UIBezierPath(arcCenter: CGPoint(x: rect.width/2, y: rect.height/2), radius: rect.width > rect.height ? rect.height/2*0.8 : rect.width/2*0.8, startAngle: 0, endAngle: 360, clockwise: true)
        UIColor.red.setStroke()
        arc.lineWidth = 1
        arc.stroke()
    }

}

こんな感じになった。InnerCircleが拡大、縮小するアニメーション。調べたのはUIBezierPathとAffinTransform。
scaledByで0を指定するとバグる。durationが効かなくなるので注意する。

今日明日中に、InnerCircleとOuterCircleをまとめてViewにする予定。

CoreDataと画像(UIImage)

iphoneアプリを試すがてらバリバリ作っているので、CoreDataの話です。

画像をUIImageで取ってきた後、UIImageJPEGRepresentationとかでバイナリにすれば、CoreDataに保存できることは検索すると出てくる。


んで、こっからは自分で試したことなんだけど、UIImageJPEGRepresentationはNSDataなので、UIImage(data: Data)で復元する際に合わない。

でも、どうやら、NSDataとDataは互換性があるみたい。
なので、CoreDataへの保存は

let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "Book", in: context)
        self.book = NSManagedObject(entity: entity!, insertInto: context)
        book!.setValue(UUID().uuidString, forKey: "uuid")
        book!.setValue(self.textField.text, forKey: "name")
        book!.setValue(UIImageJPEGRepresentation(self.photoImageView.image!, 1), forKey: "image")
        do {
            try context.save()
        }catch{
            fatalError("Managed Object Saving Error.")
        }

こうで、復元は

let books:[NSManagedObject] = []
...
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell", for: indexPath) as! BookTableViewCell
        cell.bookLabel.text = self.books[indexPath.row].value(forKey: "name") as? String
        let imageData = self.books[indexPath.row].value(forKey: "image") as? Data
        if let data = imageData, let img = UIImage(data: data) {
            cell.bookimageView.image = img
        }else{
            fatalError("Can't convert to UIImage.")
        }

        return cell
    }

こんな風にDataでキャストして大丈夫みたい。
テンプレート的には、UIImageを取ってくる、UIImage◯◯◯Representationで変換、CoreDataにぶち込む、CoreDataからDataで持ってきて、これをUIImageのdataイニシャライザでUIImageに戻すという感じかな。

guard letとif letの違い

アイホンホホアプリとかでswift書いてて思ったので。

swiftしてると言わずと知れたguard let if letが出てくる。

func guardFunc() {
		guard let hoge = Int("2020") else {
				print("hoge is nil")
				return
		}
		print("\(hoge)")
}

guardFunc()

if let hoge = Int("2020") {
		print("\(hoge)")
}else{
		print("hoge is nil")
}

if let でアンラップするのに比べて、guardは単純にオプショナルをアンラップするのに使う。
if let はその後のブロックでしか使えない。単純なアンラップだけでif letを使うと無駄にネストしてしまうのでよくない。
そもそもguard 文の中では、returnとかしないといけないので、guard が出て失敗したら処理がここで止まるんだなっていうことでコードが見やすくなる。