rabbit-dev

現役スマフォプログラマーが適当にプログラム関係の記事を放り込むブログ

さくらVPS Ubuntu14.04をVNCで制御する

なかなか構築できなかったのでメモしておく

準備

カスタムOSでUbuntu14.04をインストール。標準OSだとうまく動かなかった。 ここがかなりハマった。標準OSで何度もトライするがうまく行かず、、、

インストー

# パッケージ更新
sudo apt-get update

# apt-add-repositoryをインストール
sudo apt-get install software-properties-common

# mateをインストール
sudo apt-add-repository ppa:ubuntu-mate-dev/ppa
sudo apt-add-repository ppa:ubuntu-mate-dev/trusty-mate
sudo apt-get update
sudo apt-get install mate-desktop-environment

# ウィンドウマネージャーインストール
sudo apt-get install xserver-xorg slim 

# 再起動
sudo reboot

# vncインストール
sudo apt-get install vnc4server

# vncの設定
vncserver :1
パスワード入力

vncserver -kill :1

# 起動後のデスクトップ環境
echo "mate-session &" >> .vnc/xstartup 

その他

全部インストール後のディスク使用量は3G程度。

参考

http://server-setting.info/ubuntu/vnc-remote-desktop.html

Xamarin Formsでアプリリリースして思ったこと。

本記事は更新していきます。
XamarinFormsを使ってアプリを出してみたのでリリースまでしてみて実際どうだったの?という感想を書いてみようと思う。検討されている方の参考に、、、

過去に出したアプリ

メリット

  • UIの共有化
  • コアロジックの共有化
  • 言語が一つのため学習コストが低い
  • .netの資産が使える

この辺は本当に効率的に開発できる。iOSで開発後にAndroidのハードよりのコード書くだけで動いたのは感動的だった。
共有化といってもレイアウト崩れたりするんだろ?と思っていたが、崩れずにキレイに表示。おったまげー。
.netの資産が使えるのも良い。スクラッチ開発するより既に使われてるものを使うほうが時間的にも品質的にも良い。

デメリット

  • ログからの不具合解析が難航する
  • xamlビューワーが不安定
  • 既存ライブラリのインポートが手間

ログ解析が難航するのはデメリットとして大きい。SwiftやJavaで開発する場合はログ上でおおよその原因がつかめたがXamarinでは掴みづらい。
外部ライブラリを使っているが一度C#から扱える方にする必要がある。これに2日かかった。結局全部のAPIを使うことはできなかった。やり方が悪かったのかな?

結局どうなの?

使うべきだろう。速度は若干遅くなるが気になるレベルではない。開発コストを考えると使う以外手はない。

その他

Visual Studio for macとXamarin Studioどっちで開発するのがベストなの?未だに分からない。最近はVisuaStudio for mac使ってる。先日のイベントでもVisual Studio for mac限定の機能(Xamarin Live Player)が公開されたから、こっちが主流になると勝手に思ってる。

VoiceカメラがApplivで紹介されました!

ApplivさんでVoiceカメラが紹介されました!!うれしい!
http://app-liv.jp/1230541554/

Voiceカメラ
http://itunes.apple.com/jp/app/voice%E3%82%AB%E3%83%A1%E3%83%A9-%E5%A3%B0%E3%81%A7%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%A2%E3/id1230541554?mt=8&uo=4&at=11l7ea&ct=pc

Voiceカメラってなに?

「シャッター」、「はい、ちーず」、「とって」で自動で写真を取ってくれるアプリです。 スノボーしていたときに操作が難しく音声で操作できるアプリあったらいいなと思い作りました!

なぜ写真加工機能がないの?

レビューにある通り写真加工の機能はありません。これは既に様々なアプリが存在するためです。 ただ、友人からも要望があったため簡単なエフェクト機能くらいは載せる可能性があります。 まずは多言語化から行います。

Android版はでないの?

ほぼ開発はできておりますが音声認識APIが微妙にあっていない+音声認識開始時と終了時にピコ音がなります。 コレが微妙で、、、解決できないか現在検討中です。解決し次第出させていただきます。

機械学習を使って株価予測をしてみた

tensorflowやchainerなど最近何かと話題の人工知能機械学習。 今回はscikit-learnを使って株価予測をしてみた。以下の条件で予測してみると53%の確率になった。これは微妙。。。

条件

  • 学習期間は2016年の1年間
  • 予測期間は2017年の一部
  • 上がる下がるのみ判断する
  • 過去5日分の終値のデータを利用する

結果

予測結果
正解  : 47回
不正解 : 42回

コード

気になってる方の参考になればと思いソースコードを公開します。適当につかってください。問題起きても責任はとれませんのであしからず。

処理フロー
1. 学習用データから過去5日分のデータと、翌日株価が上がったか下がったかのデータを作成する。 2. scikit-learnの決定木を利用して1のデータを学習させる。
3. 予測用データから過去5日分のデータを作成し、決定木にデータを入力して予測を行う。
4. 予測が正しかったか判定する。

https://github.com/yuzoh/SampleStockPredict

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import csv
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier

res_ok = 0
res_ng = 0

#
# 学習データ作成
#
train_data = []
train_result = []

f = open('train.csv')
reader = csv.reader(f)
tmp_data = []
prev_data = 0.0
cur_data = 0.0

for item in reader:
    cur_data = float(item[0])

    # 過去5日分のデータを元に学習データを作成する
    if 5 <= len(tmp_data):
        # 過去5日分のデータ
        train_data.append(tmp_data[:])

        # 翌日上がったか、下がったかのデータ
        if prev_data < cur_data:
            train_result.append(1)
        else:
            train_result.append(0)

        tmp_data.pop(0)

    # データの更新
    tmp_data.append(cur_data)
    prev_data = cur_data

#
# 学習
#  
clf = tree.DecisionTreeClassifier()
#clf = RandomForestClassifier()
clf.fit(train_data, train_result)

#
# 予測
#
f = open('predict.csv')
reader = csv.reader(f)
tmp_data = []
prev_data = 0.0
cur_data = 0.0

for item in reader:
    cur_data = float(item[0])

    # 過去5日分のデータを元に翌日の予測を行う
    if 5 <= len(tmp_data):
        # 予測するためのデータ作成
        predict_data = np.array(tmp_data)
        predict_data = predict_data.reshape(1, -1)

        # 予測
        result = clf.predict(predict_data)

        # 実際に上がったのか下がったのか判定
        if prev_data < cur_data:
            res = 1
        else:
            res = 0

        # 予測の比較
        if result == res:
            res_ok = res_ok + 1
        else:
            res_ng = res_ng + 1

        tmp_data.pop(0)

    tmp_data.append(cur_data)
    prev_data = cur_data

print "予測結果"
print "正解  : %d回" % res_ok
print "不正解 : %d回" % res_ng

もっと予測結果良くしたい!

  • 翌日を予測するのではなく1ヶ月後などを予測してみる
  • 前日との変動率を学習させる
  • 日経平均以外のデータも学習させる

感想

tensorflowを使いたかったんだけど、シグモイド関数?とかがわからなかったので簡単そうなscikit-learn使いました。 かなりお手軽に機械学習できるんで、興味持ってる方は是非やってみてください。

排他制御を行う方法

Xamarin.iOS等で排他制御したい場合はMutexを使えばいい。WaitOneでロックしてReleaseMutexで開放。かんたんなコードだが添付しておく。

コード

https://gist.github.com/4d075d411183bacabcb46fab670591e7

using System;
using System.Threading;

namespace Sample
{
    public class SampleClass
    {
        private Mutex mMutex = new Mutex();
        
        void methodA(){
            mMutex.WaitOne();
            
            Console.WriteLine("methodA 1");
            Thread.Sleep(10);
            Console.WriteLine("methodA 2");
            
            mMutex.ReleaseMutex();
        }

        void methodB(){
            mMutex.WaitOne();
            
            Console.WriteLine("methodB 1");
            Thread.Sleep(5);
            Console.WriteLine("methodB 2");
            
            mMutex.ReleaseMutex();
        }
    }
}

結果

mMutex.WaitOneとReleaseMutexがない状態でmethodA→methodBの順に実行されると

methodA 1
methodB 1
methodB 2
methodA 2

の順にログが出ることがある。これをMutexがある状態だと、methodAが終わった後にmethodBが実行される。

methodA 1
methodA 2
methodB 1
methodB 2

startとstopが同時実行されたら困るときとかに利用する。

Xamlで縦のSliderを置く方法

ググっても出てこなかったのでメモ残しておきます。参考までに、、

コード

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:sample”
    x:Class=“sample.samplePage">
    <ContentPage.Content>
        <StackLayout Orientation="Vertical">
            <Slider x:Name="sliderZoom"
                Rotation="90"
            />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

こんな感じ。 Rotateに90を設定すると回転して縦置きになる。

実行時

f:id:rabbittan:20170507122723p:plain 右側にあるスライダーみたいなやつが実現できる。

UIImageをXamarin.Forms.ImageSourceに変換する方法

カメラで取った写真をXamarinFormsのUIに表示するためにはUIImageをXamarin.Forms.ImageSourceに変換する必要がある。そのためのコード

コード

var source = ImageSource.FromStream(() => img.AsPNG().AsStream());