Entertainer Engineering

人を楽しませられる技術者を目指すあおかびんのブログ

SwiftのUIViewController間でデータを受け渡す話

おはようございます、かびさん@あおかびんです。

iPhoneアプリSwiftを使って開発しているのですが
UIViewController間でデータを渡したいときに
AppDelegate.swiftに変数を追加すると渡せるということだったので
その方法を記述したいと思います。

1.AppDelegate.swift

AppDelegate.swiftファイルの中に、値を保持する領域を宣言します。
具体的には、

class AppDelegate: UIResponder, UIApplicationDelegate {
    var message: String?
    ・・・
}

こんな感じですかね。

2.SendViewController.swif (受け渡しView)

値に書き込むためにはAppDelegateクラスの変数を用意して、
その変数のクラス変数(?)を経由して書き込む形になります。

class SendViewController: UIViewController {
    var delegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    ・・・

    // ボタンを押したときの処理
    func touchButton(sender: UIButton){
        // AppDelegateのmessageに押されたボタンのtagを代入
        self.delegate.message = String(sender.tag)
        // NavigationControllerを使ったページの遷移
        let receiveViewController: ReceiveViewController = ReceiveViewController()
        self.navigationController?.pushViewController(receiveViewController, animated: true)
    }
}

こんな感じで記述しました。
(今回NavigationControllerを使っているので、ちょっとややこしいかもしれない)

3.ReceiveViewController.swift (値の受け取りView)

class ReceiveViewController: UIViewController {
    var delegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    override func viewDidLoad() {
        super.viewDidLoad()
        println(self.delegate.message)

    }
    ・・・
}

2と同じように呼び出しを行って、値を吐き出しています。
多分うまくいくんじゃないかな

ダメだったら連絡ください、修正します。。。

これを知らなかったからViewのinitをoverrideしようと苦戦してた。。。
スキル無さすぎダメダメのダメ。

すみません、以上あおかびんでした。

学校の課題を解くためにHaskellを使った話

こんにちは、かびさん@あおかびんです。

学校の課題で、ちょっとした計算問題を解くときに
普通に解くのが面倒くさいなーと思って
前まではPythonの対話を使って計算をしていたのですが、
この間確率統計のときに
先生「100万の中から1万個取り出す組み合わせはやろうと思ってもできない」
という発言があり(実際にはマクローリン展開かなんか使えばできるみたいな解説のため)
「できそう」と思ってしまったが故にPythonで書こうとしたら案の定計算できない。

また、3の20乗を計算する問題が出て、
計算するのにわざわざコード書くのも面倒だなと。

そこでHaskellを導入してやりました。その手順を書きます。

1. Haskell PlatformのDLとインストール

Download Haskell

こちら、Haskell Platformの公式DLサイトよりHaskell PlatformをDLします。
ちなみに、brewを使わないのは
Haskell関係のパッケージ(?)をインストールするcabalが
brewだとうまく動いてくれないので、こちらのHaskell Platformを使います。

あとはDLしたpkgを開いてインストールしてください。

2.ターミナルでhaskellの対話シェルを起動する。

インストールが終わったら対話形式でhaskellを実行してみましょう。
コマンドライン

ghci

と入力すると、最初の激重initの後haskellインタラクティブシェルが起動します。

閉じるときは

:q

コマンドを入力すれば大丈夫。

(発展)3.100万から1万個を取り出す組み合わせ問題を解かせる。

適当なエディタを使って、test.hsに次のソースコードを書き込んで保存しましょう。

手元にファイルがなかったので、後で追記します。

(発展)4.分数の累乗とかを求めてみる。

haskell先輩は分数も扱うことができます。ありがたいですね!

ghciを起動したら、次のコードを入力してください。

import Data.Ratio

すると、%区切りで分数を扱うことができます。

1 % 3 * 1 % 4 -- 3分の1 × 4分の1
1 % 12 -- 12分の1

また、このまま累乗も計算できる。

((1 % 3) * (1 % 4)) ^ 20 -- (3分の1 × 4分の1)の20乗
1 % 3833759992447475122176 -- おおきなかず分の1

簡単な数式を入れるときはhaskellを使うようになりました。

すごく便利なghciでしたね。
以上、あおかびんでした。

Swiftで画面遷移の時に値を渡したい話

こんばんは、かびさん@あおかびんです。

今回はうまくいったわけではないので、今後の課題としてメモ書き。

qiita.com

こちらのサイトを参考に、ページ遷移の時に文字を送ろうとしているのですが
ソースコードを移植してもちょっとうまくいかないですね・・・。

何がダメなんだろう・・・?

SwiftのUIButtonで画面遷移をする話

こんばんは、かびんさん@あおかびんです。

今日はSwiftのUIButtonで画面遷移を行ったので
それをメモ書きします。

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = backgroundColor
    
    for i in 0...2 {
        let task: UIButton = UIButton()
        let icast:CGFloat = CGFloat(i - 1)
        let action: Selector = Selector("touchButton" + String(i) + ":")
        task.backgroundColor = UIColor.whiteColor()
        task.layer.masksToBounds = true
        task.setTitle("task" + String(i), forState: UIControlState.Normal)
        task.setTitleColor(UIColor.blackColor(), forState: .Normal)
        task.addTarget(self, action: action, forControlEvents: .TouchUpInside)
        task.layer.masksToBounds = true
        task.frame = CGRectMake(width / 2 - fieldWidth / 2, height / 2 - fieldHeight + (40.0 * icast), fieldWidth, fieldHeight)
        self.view.addSubview(task)
    }
}

internal func touchButton0(sender: UIButton){
    // 遷移するViewを定義する.
    let editViewController: TaskEditViewController = TaskEditViewController(i: 0)
    editViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
    self.presentViewController(editViewController, animated: true, completion: nil)
}

タッチイベントを取得したらその名前のセレクタが実行されるという形式。

UITextfieldのデザインを調整したいんだよな・・・。

以上あおかびんでした。

Slackにてhubotで会話監視を導入した話

こんにちは、かびさん@あおかびんです。

今回はSlackすごく便利ですよね、よく使っています。
Slackのgeneralチャンネルを全体報告の連絡のみに絞るため
@channelが付いていない発言には小言を言うbotを作りました。

ソースコードはこんな感じ。

attention.coffee

module.exports = (robot) ->
    robot.hear /(.*)/i, (msg) ->
        if ///^@channel: ///i.test(msg.match[1])
            return
        else
            msg.send "<君ぃ・・・連絡事項は文頭に@channel: をつけないとダメじゃないか。それ以外の話は #random でやりたまえ。"

ちょっとウザみのあるbotに仕上げました。

ただ、先頭からしか@channelを検知しないのと、
ファイルのアップロードとかには対応できていないのが現状です。

誰かいい方法を教えてください。

以上、あおかびんでした。

画像処理ライブラリRCairoをインストールした話

こんにちは、かびさん@あおかびんです。

PCをお引越ししたので、まえのPCに入っていた設定が使えなくなりました。
学校の課題(?)で画像を自動生成するためにRCairoというツールを使っていたのですが
引越しで使えなくなったので、再インストールすることにしました。

以下が手順です。

まず、xquartzをインストールする必要があるので、brewでインストールします。

brew install Caskroom/cask/xquartz

その後、brewでcairoをインストールします。

brew install cairo

そして最後にGemでcairoをインストールします。

sudo gem install cairo

これでRCairoが使えると思うので、
rcairoサイトで提供しているhinomaru.rbをコピーして使ってみましょう。

require 'cairo'

format = Cairo::FORMAT_ARGB32
width = 300
height = 200
radius = height / 3 # 半径

surface = Cairo::ImageSurface.new(format, width, height)
context = Cairo::Context.new(surface)

 # 背景
context.set_source_rgb(1, 1, 1) # 白
context.rectangle(0, 0, width, height)
context.fill

# 赤丸
context.set_source_rgb(1, 0, 0) # 赤
context.arc(width / 2, height / 2, radius, 0, 2 * Math::PI)
context.fill

surface.write_to_png("hinomaru.png")

ファイルを保存したら、

ruby hinomaru.rb | open hinomaru.png

で実行後に日の丸画像が開いたらOK!

rcairoは気軽に画像扱えるからいいですよね、僕のPCだと重かったけど。

以上、あおかびんでした。

C言語で探索用のランダムな数列を作った話

こんばんは、かびさん@あおかびんです。

学校の課題で並列分散処理を行うために、
数列の探索をしようという話になりました。

そのために、100万のランダムな数列を作り出す必要があったので
その数列を最初にNode.jsで書こうと思ったらすごく遅い・・・。

アルゴリズムが良くないのかもしれませんが、5時間かかっても終わりませんでした。

そこでC言語で100万のランダムな数列を作ったらすぐ終わったので
その方法を書いておきたいと思います。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000

void shuffle(int ary[], int size);

int main(void)
{
	int i = 0;
	int j = 0;
	int arr[N];
	int shf[N];
	int index;
	int length = 0;
	srand((unsigned)time(NULL));
	
	for(i = 0; i < N; i++) {
		arr[i] = i;	
	}

	shuffle(arr, N);

	for(i = 0; i < N; i++) {
		printf("%d\n", arr[i]);
	}

	return (0);
}

void shuffle(int ary[], int size) {
	int i;
	for(i = 0; i < size; i++) {
		int j = rand()%size;
		int t = ary[i];
		ary[i] = ary[j];
		ary[j] = t;
	}
}

shuffle関数の中で、
先頭から順にランダムな位置にある数字とスワップしている感じですね。

400万でやろうとしたら、スタック領域が足りず、実行できませんでした。。。
何かいい解決方法があるといいんですが。。。

ちなみに標準出力をcsvファイルに書き込むと、改行でわかれたデータを書き込めます。
svファイルかな?(知らんが)

以上、あおかびんでした。