Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2017/01/17(Tue)

VirtualBOXメモ

クリップボードの共有

「設定」>「一般」>「高度」の「クリップボードの共有」を「双方向」に。

ゲストOS(Ubuntu)にGuest Additionsをインストール

sudo apt-get install virtualbox-guest-dkms

そして、再起動

ネットワーク

「設定」>「ネットワーク」での「割り当て」の設定。

ゲストOS→ホストOS→外部 は 「NAT」でOK。

ホストOS→ゲストOS は 「ホストオンリーアダプター」で。

したがって、アダプターを2個使う。

(他にも方法はあるけども、たぶんこれがいちばん簡単)

2017/01/02(Mon)

UARTおじさんのためのチートシート

C,C#,Java,Swiftで数値⇔文字列⇔バイト列の変換処理のチートシート。

マイコンWindowsAndroidiOSのデータのやりとり、ぜんぶシリアル通信でやるんだ。

(自虐ネタ)

C

#include <stdio.h> // sprintf, sscanf
#include <string.h> // memcpy

// (1) 数値→文字列 sprintfを使う
char str[256];
int iVal = 10;
double fVal = 5.5;

sprintf(str, "%d", iVal);
sprintf(str, "%f", fVal);
sprintf(str, "%5d", iVal); // 桁数指定
sprintf(str, "%04X", iVal); // 16進数
sprintf(str, "%5.2f", fVal); // 桁指定(%全桁数.小数点以下桁数であることに注意)

// (2) 文字列→数値 sscanf()を使う
int ret;

ret = sscanf(str, "%d", &iVal);
ret = sscanf(str, "%f", &fVal);
ret = sscanf(str, "%5d", &iVal); // 桁数指定
ret = sscanf(str, "%04X", &iVal); // 16進数
ret = sscanf(str, "%5.2f", &fVal); // 桁指定(%全桁数.小数点以下桁数)

// ret は変換した個数
if(ret!=1){
    // 異常系
}

// (3) 文字列→バイト列
// (4) バイト列→文字列
// C言語ではそもそも文字列はバイト列(char配列)にすぎない

// (5) 文字列の切り出し memcpyを使う
memcpy(substr, &str[3], 2);
substr[2] = '\0';
// が、ポインタ操作だけで済ますことも(上記(2)と関連)
ret = sscanf(&str[3], "%02X", &iVal); // strの4文字目から2文字を変換

C#

using System.Text; // Encoding.ASCII.GetBytes
using System.Globalization; // NumberStyles.HexNumber

// (1) 数値→文字列 ToStringを使う
string str;
int iVal = 10;
double fVal = 5.5;

str = iVal.ToString();
str = fVal.ToString();
str = iVal.ToString("X4"); // 16進数
str = fVal.ToString("F2"); // 桁指定(小数点以下桁数)

// (string.Formatならより複雑な指定ができる)
str = string.Format("{0, 8:D4}", iVal) // → "    0001"


// (2) 文字列→数値 Parseを使う
try{
    iVal = int.Parse(str);
    iVal = int.Parse(str, NumberStyles.HexNumber); // 16進数
    fVal = double.Parse(str);

    // Convertクラスでも同様
    iVal = Convert.ToInt32(str);
    iVal = Convert.ToInt32(str, 16); // 16進数
    fVal = Convert.ToDouble(str);
}
catch (FormatException ex){
    // 異常系
}
catch (OverflowException ex){
    // 異常系
}

// (3) 文字列→バイト列 GetBytesを使う
byte[] data = Encoding.ASCII.GetBytes(str);

// (4) バイト列→文字列 GetStringを使う
string str = Encoding.ASCII.GetString(data);

// (5) 文字列の切り出し Substringを使う
// ※ Javaのsubstringとは2番目の引数の意味が違うことに注意
string sub = str.Substring(4,2); // 5文字目から2文字

Java

// (1) 数値→文字列 valueOfやformatを使う
String str;
int iVal = 10;
double fVal = 5.5;

str = String.valueOf(iVal);
str = String.valueOf(fVal);
str = String.format("%04X",iVal); // C言語と同様の書式指定
str = String.format("%5.2f",fVal); // C言語と同様の書式指定

// (2) 文字列→数値 parseInt,parseDoubleを使う
try{
    iVal = Integer.parseInt(str);
    iVal = Integer.parseInt(str, 16); // 16進数
    fVal = Double.parseDouble(str);
}
catch (NumberFormatException ex) {
    // 異常系
}

// (3) 文字列→バイト列 getBytesを使う
byte[] data = str.getBytes();

// (4) バイト列→文字列 Stringをnewする
String str = new String(data);

// (5) 文字列の切り出し substringを使う
// ※ C#のSubstringとは2番目の引数の意味が違うことに注意
String sub = str.substring(4,6); // 5文字目から2文字

Swift

SwiftはUARTおじさんにはツラい言語。

というかよく分かりません。いちおうメモしておきます。

//1) 数値→文字列 StringやNSStringを生成
let iVal = 10 // Int
let fVal = 5.5 // Double

let str = String(iVal)
let str = String(fVal)
let str = NSString(format:"%04X", iVal) // C言語と同様の書式指定
let str = NSString(format:"%5.2f", fVal) // C言語と同様の書式指定

// (2) 文字列→数値 IntやDoubleを生成
guard let iVal2 = Int(str) else{
    // 異常系
    return;
}

// 異常なら0 のようにしたい場合は ?? を使う
let iVal = Int(str) ?? 0
let iVal = Int(str, radix: 16) ?? 0 // 16進数
let fVal = Double(str) ?? 0

// (3) 文字列→バイト列
if let data: Data = str.data(using: String.Encoding.utf8)
{
    var bytes = [UInt8](repeating: 0, count: data.count)
    data.copyBytes(to: &bytes, count: data.count)
}

// (4) バイト列→文字列
let ns = NSData(bytes: &bytes, length: bytes.count)
let str = NSString(bytes: bytes, length: bytes.count, encoding: String.Encoding.ascii.rawValue)

// (5) 文字列の切り出し substringWithRangeを使う
let sub = str.substring(to: str.characters.index(str.startIndex, offsetBy: 6))

まとめ

数値→文字列文字列→数値文字列→バイト列バイト列→文字列部分文字列
Csprintfsscanf---
C#ToStringParseGetBytesGetStringSubstring
JavavalueOf/formatparseInt/parseDoublegetBytesnew Stringsubstring
SwiftString/NSStringInt/Doubledata/copyBytesNSData/NSStringsubstring

2016/12/30(Fri)

支離滅裂2016

恒例の作業用BGMリスト作成。

2016/12/21(Wed)

CocoaPodsの導入

CocoaPodsとは?

XcodeでのiOS/Macアプリ開発をアシストしてくれるライブラリ管理ツール

コマンドラインで使用する。

インストール

OS X El Capitan以降ではroot権限でもシステム領域へのアクセスが制限されるのでインストール先を指定してインストールする。

sudo gem update --system
sudo gem install -n /usr/local/bin cocoapods
pod setup

使い方

Podfileの生成

Xcodeが開いていれば閉じておく。

プロジェクトのディレクトリ(*.xcodeprojファイルのあるディレクトリ)で下記コマンドを実行する。

pod init
Podfileの編集

Podfileという名前のファイルが生成されるのでテキストエディタで開いて編集する。

下記はCocoaAsyncSocketをインストールする場合の追記例。

use_frameworks! # Add this if you are targeting iOS 8+ or using Swift
pod 'CocoaAsyncSocket' 
ライブラリをインストール

初回は下記コマンドを実行する。

pod install

2回目以降(ライブラリの追加/削除)は下記コマンドを実行する。

pod update

ワークスペースを開く

プロジェクトのディレクトリに、ワークスペースファイル(*.xcworkspace)ファイルができるので、以後はプロジェクトファイル(*.xcodeproj)ではなく、そちらをXcodeで開く

  • xcodeproj(青っぽいアイコン) = ユーザアプリのプロジェクト
  • xcworkspace(白っぽいアイコン) = ユーザアプリとライブラリのプロジェクトを含むワークスペース

コードを書く

あとは、コード上でライブラリをimportすれば使用できる。

下記はCocoaAsyncSocketの例。

// Objective-C
// When using iOS 8+ frameworks
@import CocoaAsyncSocket; 
// OR when not using frameworks, targeting iOS 7 or below
#import "GCDAsyncSocket.h" // for TCP
#import "GCDAsyncUdpSocket.h" // for UDP
// Swift
import CocoaAsyncSocket

参考URL

2016/12/17(Sat)

PSoCのAPI関数を関数ポインタでエレガントに

PSoCのライブラリはクラスじゃないのがつくづくイラっとするけど、関数ポインタを使ってテーブル化したりクラスもどき構造体を作る手はあるな。

テーブル化

typedef uint16 (*UART_GetByte)(void);
UART_GetByte uart_GetByte[] = {
    UART_1_GetByte,
    UART_2_GetByte,
    UART_3_GetByte,
    UART_4_GetByte,
};
for(i=0;i<4;i++){
    uint16 data = uart_GetByte[i]();
}

クラスもどき化

typedef struct 
{
    uint16 (*GetByte)(void);
    uint8 (*GetRxBufferSize)(void);
} UART;

UART uart[]={
    {
        UART_1_GetByte,
        UART_1_GetRxBufferSize
    },
    {
        UART_2_GetByte,
        UART_2_GetRxBufferSize
    },
    {
        UART_3_GetByte,
        UART_3_GetRxBufferSize
    },
    {
        UART_4_GetByte,
        UART_4_GetRxBufferSize
    },
};
for(i=0;i<4;i++){
    uint8 size = uart[i].GetRxBufferSize();
    for(j=0;j<size;j++){
        uint16 data = uart[i].GetByte();
    }
}