TVTestのソースコードをちまちまと読み進めた
visual studio C++をあまり使ったことがないので、この機に調べてみようと思った。
そもそもエントリーポイントはどこなのだろうという話だが、普通にmainで検索してたら、AppMainクラスと_tWinMainが見つかった。
WinMainについてはgoogleで最上位にきたやつを読んだ。
気になった点はここ
#define WINAPI __stdcall #define WINENTRY WINAPI
なるほど。これは単なる呼び出し規約の宣言だったのか。また知見が増えた。
呼び出し規約について知らない人は、アセンブラの関数呼び出しを調べてみるといいと思う。いろいろな種類があるので。
ところで、エントリーポイントはint _tWinMainっていうのがわかった。
そんで、
CMainAppクラスのmainを呼び出してる感じ。
g_appはシングルトンかと思ったんだけど、ちょっと違う臭い。
Cのシングルトンって
ファイル内にstatic化したクラスを置いてnon-staticなその型の変数置けばシングルトンになんないのかなと思った。
C++のシングルトンはクラスあるんだしシングルトンパターンでできそうな気もするけど、試す時間はないかなぁ。
ビルドスクリプトがどこなのかわからないんだけども。
やっとwindowsにgvimを入れた
os x、linux系ではもっぱらvimを使っているのですが、windowsでは入れてませんでした。前にやった時、windowsでは、知識不足等でカラースキームすら入れることができなくてずっとIDEやsublimeを使っていました。それにネットに転がってる情報がだいたいlinux系ですし。
追記
あとでサンプルのgvimrc参考にしながら直します。
neobundleとカラースキーマ: molokaiをいれるまで、やりました。
そんなわけで、入れます。
香り屋さんからコンパイル済み64bitバイナリをダウンロードしてきます。
現バージョンは 8.1? です。
vim81-kaoriya-win64-8.1.0005-20180520
なので。えぇ、僕は新しい物好きです。
zipを解凍したあと、
先に、vim81を
にvim74にリネームして入れます。ほかのファイルも一緒にいれた方がいいみたいですね。
molokaiを持ってきます。
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 が出て失敗したら処理がここで止まるんだなっていうことでコードが見やすくなる。