読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

macOSにSPTKをインストール

macOS 10.12.4 xgrを動かすのに必要なのでconfigure前に入れておきます。 $ brew cask install quartz あとは、 SPTK-3.10.tar.gzをDLし、 $ configure $ make $ make install したら完了です。 参考 SPTKの使い方 (1) インストール・波形描画・音声再生 - …

C++11 unique_ptrとshared_ptr

unique_ptrは所有者が1人以下のポインタとして利用する。 実装にatomic関数は用いられていないためコピーや破棄はスレッドセーフではないが、それによるオーバーヘッドは存在しない。 shared_ptrは所有者が2人以上のポインタとして利用する。 いったん値を設…

C++最適化手法

メモリ使用量が増えてもよいので速度を優先させたい場合の最適化方法を考えます。 計算した値をキャッシュし計算回数を減らす 同じ値の設定処理を何度も行わない 関数の戻り値では、構造体の値を返す代わりに構造体のconst参照を返す クラスの不要な関数を削…

swift 循環参照

swift 循環参照の一例を挙げます。 iOSのソースを例にとります。 ViewController.swift import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let model = Model() model.action() } } Model.swift im…

iOS/MacOSXのvDSP関数、多すぎてなかなか見つけられないのをなんとかする(応答編)

複素数を扱うためにvDSP.hで定義された構造体 typedef struct DSPComplex { float real; float imag; } DSPComplex; typedef struct DSPSplitComplex { float * __nonnull realp; float * __nonnull imagp; } DSPSplitComplex; 1次元高速フーリエ変換 vDSP_c…

Rx メモ

RxSwiftとRxCocoaの区別がわかりづらいのでメモ。 RxCocoaはUIKit,NSFoundationなどに特化したiOS/macOS環境特有の機能。 RxSwift combileLatest 仕様:複数の変数のいずれかが変更された場合にそれぞれの最新の値をまとめて受け取る 使い道:2つのUITextField…

android studio 2.3でideavimを有効にする

Android Studio - 「Preferences」- 「Plugins」 で「IdeaVim」をインストールし、有効にします。

Android Studio2.3 から外部エディタvimを開く(macOS)

Android Studio2.3で開いているファイルを行番号を指定し外部エディタvimで開く方法です。 macOSの場合です。 1) Android Studio - Preferences - Tools - External Tools に gvim を登録します。 内部console画面が開かないように Open console のチェック…

C# Microsoft純正ライブラリでJSONをdeserializeする

C#

C#でJSONをserialize/deserializeする方法として、Microsoftが提供するライブラリを使う場合、2種類の方法がある。 1) DataContractJsonSerializer Namespace: System.Runtime.Serialization.Json AssemblySystem.Runtime.Serialization 2) JavaScriptSeria…

オライリー 英語版原書を読むのに役立つ英単語40

n. 名詞 adj. 形容詞 v.i. 自動詞 v.t. 他動詞 adv. 副詞 variable n. 変数 definition n. 定義 deduction n. 推論 explicit adj. 明示的な implicit adj. 暗黙の distinguish v.t. 区別する prefer v.t. ~の方がよい declare v.t. ~を宣言する exception n.…

RxSwift 超入門その3

class GeolocationViewController: ViewController { @IBOutlet weak private var noGeolocationView: UIView! @IBOutlet weak private var button: UIButton! @IBOutlet weak private var button2: UIButton! @IBOutlet weak var label: UILabel! override …

RxSwift 超入門その2

let minimalUsernameLength = 5 let minimalPasswordLength = 5 class SimpleValidationViewController : ViewController { @IBOutlet weak var usernameOutlet: UITextField! @IBOutlet weak var usernameValidOutlet: UILabel! @IBOutlet weak var passwor…

RxSwift 超入門その1

0)環境: Xcode8.2.1 1) 新規iOSプロジェクトaaaを作成する。 2) aaaフォルダに新規ファイルPackage.swiftを以下の内容で作成する。 import PackageDescription let package = Package( name: "dummy", targets: [], dependencies: [ .Package(url: "https://…

Go POSTによるJSONパラメータをデコードする際の注意

go

まずはソースをみて頂こう。 type User struct { name string } func q(w http.ResponseWriter, r *http.Request){ decoder := json.NewDecoder(r.Body) var user User err := decoder.Decode(&user) if err != nil { panic(err) } fmt.Println(user) } エラ…

go言語 ネストしたJSONをリテラルで初期化する

go

go root := map[string]interface{}{ "alpha": map[string]interface{}{ "beta": []map[string]interface{}{ map[string]interface{}{ "gamma": "val1", "delta": []map[string]interface{}{ map[string]interface{}{ "epsilon": "val2", }, }, }, }, }, } r…

curl コマンドオプション

-i レスポンスヘッダの表示 -s サイレントモード -H カスタムヘッダ指定 -X コマンド指定 -d HTTP POST データ JSONをPOSTするときのサンプル curl -i -H "Content-Type: application/json" -d '{"name":"foo"}' http://localhost:3000/contents

Windowsでgo環境を作る場合の備忘録

go

Windowsにgoをインストールする場合 ここ https://golang.org/dl/ にあるインストーラー go1.8.windows-amd64.msi をダウンロードして実行する GOROOTはC:\go\ となる。 GOPATHは未設定の状態となるので、デフォルトでは %USERPROFILE%\go となる。 goのソー…

Missing Push Notification Entitlement (未解決)

iOSアプリのバイナリをiTunesConnectにUploadしたときたまにAppleから Missing Push Notification Entitlement のメールが来たり来なかったりするんだが、どうしたもんか。 アプリではPushNotificationは使っていないが、FireBaseフレームワーク内で使ってい…

SIMD組み込み関数が多すぎるので一覧にしておく

大量の計算を常に行うような場合、C言語の速度をさらに上げるには、CPUのSIMD命令に置き換えられる組み込み関数を使う方法がある。 ただし、これもvDSPと同じで量が多くまた見やすい一覧がないので作ってみる。 なお、独断と偏見で使いそうもないものは一覧…

swift Arrayでwhereを使う

swiftはモダンな言語なので、C言語風の書き方は極力排除されている。 Arrayでwhereがついているメソッドを使い条件式を表すクロージャを指定して結果を取得するケースは多い。 public struct Array<Element> : RandomAccessCollection, MutableCollection { // 条件を</element>…

make_moonsで生成されるものを見てみる(scikit-learn)

macOSXにpipをインストールする sudo easy_install pip scikit-learnをインストールする sudo pip install scikit-learn make_moonsでデータを生成してみる bash-3.2$ python >>> from sklearn import datasets, linear_model >>> datasets.make_moons(10, n…

swiftでwavファイル書き込みしてみる

以前はAudioToolKitにあるAudioFileCreateWithURLを使っていましたが、 ここでは試しにiOS8,macOS10.10で追加されたAVFoundationにあるAVAudioFileを使ってみます。 まず、AVAudioFileのクラス定義をみてみます。 open class AVAudioFile : NSObject { publi…

swiftでFloat値の比較

swiftでは次のような演算子が定義されているので、FloatどうしやDoubleどうしの比較は 単純に==と!=で行えば良い。 FloatやDoubleはFloatingPointを継承しているため、この機能を持っている。 public func ==<T : FloatingPoint>(lhs: T, rhs: T) -> Bool public func !=<T : Equatable>(lhs: T</t></t>…

swift アクセス制御

open どこからでもサブクラスの作成、上書き定義可能 public このクラスを定義したモジュール内部でのみサブクラスの作成、上書き定義可能 internal (省略時) 定義を含むソースファイルと同じモジュール内部からアクセス可能 private クラスや構造体の定義単…

swift extensionで一回だけ実行されるグローバル定数宣言の仕方

こうすればいいらしい。 extension DateFormatter { public static let standard: DateFormatter = { let obj = DateFormatter() obj.locale = Locale(identifier:"en_US_POSIX") return obj }() }

swiftでsingleton

swiftでSingletonを書く場合、こうすればいいらしい。 class MySingleton { static let shared = MySingleton() private init() {} } The Right Way To Write a Singleton — KrakenDev

詳説 AudioStreamBasicDescription / AVAudioFormat

CoreAudioでよく使われるAudioStreamBasicDescription これはC言語の構造体で使いづらいです。 macOS10.10, iOS8以降ではAVAudioFormatと相互変換できますので、これを経由するとコーディングが簡単になります。 まずは実例を見ていきます。 よく使われる.wa…

iOS10のSpeechToText APIを使って日本語PodCastをテキスト化してみる

iOS10で公開されたSpeechフレームワークを使って日本語PodCastをテキスト化してみました。 結果から言うと、テキスト化は可能でしたが、品質はかなり悪く実用として厳しかったです。 某IT系PodCastのファイルを食わせて見たんですが、 「ジャバスクリプト」…

C言語のsizeofをswiftで書くにはMemoryLayout<T>.size

タイトルそのままです。 struct Hoge { var a: Int32 var b: Int32 } MemoryLayout<Hoge>.size // 8</hoge>

Arrayにおけるmap, flatMapの動作(swift3)

ググると引っかかるのか今だにswift2のドキュメントなので、swift3用のメモ let a = [1, 2, 3] let b = a.map { Array(repeating: $0, count: $0) } print(b) // [[1], [2, 2], [3, 3, 3]] let c = [1, 2, 3] let d = c.flatMap { Array(repeating: $0, coun…

enum Optional<Wrapped> の map, flatMapメソッド

swiftのソースでmapとflatMapというメソッドがよく出てくるのだが、このメソッド名からは想像できない動作をするのでメモしておく。 (メソッド名変えてくんないかな。。) Optionalの定義を見ると次のようになっている。 public enum Optional<Wrapped> : ExpressibleB</wrapped>…

swift 2つの連続する矢印

swiftでこんなソースが出てきた。-> が2つ連続しているが意味がすぐには分からない。 func multi(val:Int) -> (val:Int) -> Int { return { a_val in return a_val * val } } 省略されている()を書くとこうなる。 func multi(val:Int) -> ((val:Int) -> Int)…

swift ComparableIndex

swiftのComparableプロトコルはEquatableプロトコルを継承しているので、Comparableと同じことがしたいがEquatableは実装したくないという時に使えない。 その場合、Comparableに相当するプロトコルだけを自分で実装すれば良い。 public protocol Comparable…

PromiseKit4.0 (swift3)を使ってみた 2016年11月

swift3で作ったiOSアプリでサーバーへHTTPリクエストを複数回投げる場合に、 普通に作ると、正常ケース、異常ケースの処理があちこちにばらけて、ソースが汚くなります。 PromiseKitを使ったところ、ソースが短く、処理も追いやすくて素晴らしかったので、メ…

digital oceanでipv6を追加したらDNS解決できなくなった話[RESOLVED]

digital oceanに作ったCentOS6のVPSにipv6を追加したところDNS解決できなくなりました。 CentOS7の方は手順通りでうまくいったのですが、CentOS6の方は、 ping google.com が効きません。 /etc/resolve.conf にはGoogleのipv6のDNS2つが定義されています。 n…

VisualStudio 2015 VsVimでCtrl+Bが効かない

VisualStudio 2015 に VsVimを入れて使っています。 Ctrl+F(前方スクロール)は動くのですが、Ctrl+Bすると関数のブレークポイント設定機能が動いでしまい、後方スクロールが動きません。 解消するには、「ツール」-「カスタマイズ」-「キーボード」を開き…

CentOS7にNewRelicのnginxプラグインをセットアップする

まずyumでプラグインを入れないといけないですが、そのためにまずリポジトリを追加しないといけません。 以下ファイルを編集します。 /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgc…

IPv6環境のActionMailerでのgmail送信でNet::OpenTimeoutエラー発生

IPV6環境のActionMailerでgmail送信すると Net::OpenTimeout (execution expired): となってしまい送信できない。 telnet smtp.gmail.comを実行すると分かるが、まずIPv6で接続をトライし、60秒くらいでタイムアウトした後、IPv4で接続トライする。 最初から…

apple-touch-icon.png 読み込みエラーの抑制

safariでrailsで作ったサイトにアクセスした時に、railsのログにapple-touch-icon.pngが読み見込めないエラーが出ている。 このエラーを抑制するにはrailsでfaviconファイルがあるフォルダpublicに0バイトのapple-touch-icon.pngを置けば良い。 $ touch appl…

C++11 type_traits の原理

std::iteratorのソースを読んでいたところ、C++11のtype_traitsがよく分からないため、勉強中。 備忘録として解説しておく。 C++11で<type_traits>というヘッダがSTLに追加されている。 type_traits - cpprefjp C++日本語リファレンス 型の特性を判定、操作するための機能</type_traits>…

C++11でのautoを使った関数定義

C++11では関数定義をautoを使って書くことができるようになった。 今まで int get_value(void); と書いていたものが、C++11以降はこのようにも書ける auto get_value(void) -> int; int get_value1(void) { return 1; } auto get_value2(void) -> int { retu…

std::shared_ptr利用法

std::shared_ptrの利用法です。Infoインスタンスは内側のスコープ内で生成されて外側のスコープ内で破棄されていることが分かります。 struct Info { Info(){ printf("Info() %p\n", this); } Info(const Info& obj) = delete; Info(Info&& obj) = delete; I…

std::vectorメモリ管理

std::vectorにはreserveというメソッドがあるがどのように動作するのか調べてみた。 struct Info { uint8_t* dex = nullptr; Info(){ dex = new uint8_t; *dex = 7; printf("%p Info() dex %p %d\n", this, dex, *dex); } Info(const Info& obj){ dex = new …

C/C++ 構造体アライメント最適化

C/C++の構造体の要素はある程度の境界位置にアライメントされる。そのため、要素の定義順序によって、構造体全体のサイズが変わったりする。たかが数バイトと侮るなかれ。要素数が多ければ、それだけメモリ領域が小さくなり、CPUキャッシュミスが起きる確率…

iOS/OSXにおけるスレッド優先順位

iOS

iOS/OSXではスレッドスケジューラーの出来が良く、細かい設定が可能である。 例として、CoreAudioでのコールバックスレッドのスレッドポリシーがどうなっているかみてみる。 OSX 10.11.6 1.6GHz Core i5 standard policy_count 0 get_default 1 importance 3…

macOS環境でrustを学習する

以下の日本語ドキュメントで学習します。 プログラミング言語Rust インストール ~$ curl -sSf https://static.rust-lang.org/rustup.sh | sh rustコンパイラのバージョン確認 ~$ rustc --version rustc 1.11.0 (9b21dcd6a 2016-08-15) vimシンタックスハイラ…

atomic::compare_exchange_weak C++11

bool compare_exchange_weak (T& expected, T val, memory_order sync = memory_order_seq_cst) noexcept; compare_exchange_weakの動作仕様がいつまでも覚えられないので、メモ。 覚える必要があるのは第一引数と第二引数と戻り値。 メモリオーダーはとりあ…

std::atomic における memory_order_relaxed の動作(C++11)

memory_order_relaxedの使い方がいまいち分からなかったのだが、やっと理解できたので、それついて書いておく。 memory_order_relaxedの説明を探すと以下が見つかる。 Each memory location has a total modification order Memory operations performed by …

C++11 std::atomicを使いこなすための情報リスト

C++11 std::atomicは難解です。 しかし、パフォーマンスが出ない時に頼りになるツールでもあります。 情報はなかなか少ないので、適宜まとめておきます。 CPUの動作に関する説明 CPU とキャッシュのはなし - graphics.hatenablog.com プログラミング :: 高速…

C++ 小さいサイズの構造体を引数に渡す時は値渡し、参照渡しどちらが高速か?

調べてみました。 こんなサンプルで時間を計測しました。 struct Hoge { float a; float b; }; Hoge hoge1 = { 25, 26 }; Hoge hoge2; // 値渡し void func1(Hoge hoge){ hoge2 = hoge; } // 参照渡し void func2(const Hoge& hoge){ hoge2 = hoge; } 1) flo…