サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「かわいい」
glassonion.hatenablog.com
Time 型のフィールドを含む構造体を JSON にエンコード、JSON からデコードすると特定条件下で Time 型オブジェクトの time.Location の情報が失われることがあります。 以下のプログラムを見てください。 package main import ( "fmt" "time" "encoding/json" ) type Hoge struct { Name string CreatedAt time.Time } func main() { time.Local = time.UTC // Hoge構造体を生成する h1 := Hoge{ Name: "aaa", CreatedAt: time.Unix(1593077427, 0), } // Jsonsに変換 j, _ := json.Marshal(h1) // Jsonから復元する h2 := Hoge{}
Prometheus で収集した GKE アプリケーションのメトリクスを GCP の Cloud Monitoring(旧Stackdriver Monitoring) にエクスポートして Cloud Monitoring のダッシュボードを作成する方法を紹介します。Prometheus といえば Grafana を使ってダッシュボードを作成することが多いですが GCP 環境では Cloud Monitoring に一元化して監視できたほうが何かと便利です。あえて Grafana を使わず Cloud Monitoring でメトリクスを可視化します。 以下の記事で GKE 上に構築した Redis のメトリクスを Prometheus を使って収集しました。この環境を利用して Prometheus から Cloud Monitoring にメトリクスをエクスポートする方法を紹介します。
普段 Golang でサーバコードを書くときはもっぱら Emacs を使っています。Go Modules に移行してから gocode が動作しなくなったので最近はやりの LSP(Language Server Protocol) を導入することにしました。Go の Language Server は gopls 、Emacs のLSPクライアントは eglot を使います 動作確認バージョン Emacs 26系 Golang 1.12.x Emacsは25以上、Golangは1.11以上なら問題なく動作するはずです。 gopls のインストール Go の Language Server は3種類あります。一番下の gopls が Golang の公式 Language Server です。 go-langserver bingo gopls 一長一短あるようですが公式が安心そうなので g
MarshalJSONを使ってJSONに表示用のフィールドを追加する 無限ループしないように元の構造体を拡張する // UTCな時間をJsonに変換するタイミングでJSTに変換する例 import "time" type Hoge struct { ID uint CreatedAt time.Time } func (h Hoge) MarshalJSON() ([]byte, error) { type Alias Hoge return json.Marshal(&struct { Alias CreatedAtJST time.Time }{ Alias: (Alias)(h), CreatedAtJST: h.CreatedAt.In(time.LoadLocation("Asia/Tokyo")), } } 参考 Custom JSON Marshalling in Go ·
StoreKit の SKProductsRequest と SKPaymentQueue を Rx化して課金処理を簡単に書けるライブラリを GitHub にて公開しました。 github.com RxStoreKit を使うと課金処理を以下のような感じで書けます。 let productRequest = SKProductsRequest(productIdentifiers: Set(["xxx.xxx.xxx"])) productRequest.rx.productsRequest .flatMap { response -> Observable<SKProduct> in return Observable.from(response.products) } .flatMap { product -> Observable<SKPaymentTransaction> in r
普段から RxSwift(Reactive ExtensionsのSwift実装)と ReSwift(ReduxのSwift実装)を使っています。RxSwift を通信系の処理だったりデリゲートの処理(例えば StoreKit とか CoreBluetooth)だったりに使って、ReSwiftをアプリ全体で管理しなきゃいけないデータの監視なんかに使ってます。ReSwift をそのまま使ってもあまり困らないのですが、ReSwift のステートを Observable に変換してUI部品とバインドするといろいろと捗るなぁというわけで ReSwift の Rx 用ラッパークラスを作成しました。 ReduxのステートをRx化するクラス Redux のステートを Rx の Variable に格納して、Redux からステート変更の通知が来たら Variable(エラーの発生しないBehaviorS
いろんなところで Realm が良いと聞くようになり最近やっと Realm を使い始めました。実際 Realm を使ってみると予想していたよりも使い勝手がよく Core Data には戻れそうにないです…。ソースコードは Swift3 に対応しています。 リポジトリパターンの実装 Core Data に比べてお作法的なものが少ないとはいえ、いくつかのお決まりのパターンがあるので DDD のリポジトリパターンを適用してみました。クリーンアーキテクチャをまったく意識してないお気軽実装です。 import Foundation import RealmSwift class Repository<DomainType: Object> { var realm: Realm init() { self.realm = try! Realm() } // PK検索 func find(primary
Swift3 から Data 構造体が追加され Objective-C 時代の NSData クラスはお役御免になりました。この Data 構造体は NSData の置き換えなので、できることに違いはほとんどありません。ただしメソッドに互換性がないため NSData を使ったコードを Data に置き換えるのが大変です。というわけで Data 構造体の使い方をまとめてみました。 文字列を Data オブジェクトに変換する 文字列を Data オブジェクトに変換するには以下のように String 構造体の data メソッドを使います。 let str = "abcdefghijk" let data = str.data(using: .utf8)! Data型のオブジェクトを文字列に変換する 反対に Data オブジェクトを文字列に変換するには String 構造体のイニシャライザを使っ
NSUserDefaults あらため UserDefaults のキーを enum で管理する方法(Swift3対応)です。UserDefaults のキーを enum で管理する方法はいくつか見つけたのですが Swift3 に対応しているものが見つからなかったので書きました。 キーに文字列リテラルを直接指定したくない UserDefaults のキーを文字列リテラルでやり取りするのはタイプミスなどのリスクが高く enum で管理したほうがコンパイルエラーでミスを検知できるのでオススメです。 import Foundation enum UserSettings: String { case autoPlay = "autoPlay" case purchasedItems = "purchasedItems" : : キーをこちらに宣言する : func set(value: Int)
Xcode 7.3 から Swiftのバージョンが 2.2 になりました。このバージョンから Swift 3 に向けた deprecated(非推奨)警告が出るようになったのでその対策です。 '++' is deprecated: it will be removed in Swift 3 結構話題になったインクリメント(デクリメントも)演算子の廃止の対策です。+=使えってことらしいです。Python もインクリメント演算子ないので、案外無くても困らないのかもしれませんね。 修正前 var i = 0 i++ 修正後 var i = 0 i += 1 「--」も同じで「-=」を使いましょう。 C-style for statement is deprecated and will be removed in a future version of Swift C言語風の for 文が廃止に
OpenGL ES入門 その1 -描画の仕組みとバッファ-の続きです。今回は OpenGL ES を使って三角形を描画してみます。三角形を描くだけなら簡単そうな気もしますが、三角形を描くにはシェーダーを用意しきゃいけないという少し面倒くさい作業があるのでその辺の説明になります。 OpenGL は三角形以上の多角形を描画することができない 前回も説明しましたが、OpenGL が描画できるのは点、線、三角形だけです。多角形は三角形の集合で構成されます。三角形以上のN角形は以下のように N-2 個の三角形によって構成されます。 三角形の描画手順 OpenGL は頂点間を塗りつぶして描画を行います。頂点は 3D 空間上に配置することができます。 もう少し詳しく説明すると、プログラム上で描画したい三角形の頂点を決めます。決まった頂点データを頂点シェーダーに渡して表示するデバイスの位置を計算します。デ
SpriteKit でゲームやアプリを開発していると UI 系の部品がなくて困ることがあります。SpriteKit にはラベルしかなくボタンすらないです。ましてやスクロールビューなんて贅沢なものは当然ありません。現在開発しているアプリでどうしても必要になったので自作してみました(プログラムが複雑になるので横スクロールのみ実装しています)。 慣性処理のないスクロールノード まずはじめに一番単純な実装からいきます。指で動かした分だけラベルが横にスクロールします。慣性の処理がないので touchesBegan: withEvent: と touchesMoved: withEvent: の処理だけで実現できます。 import SpriteKit class ScrollNode: SKSpriteNode { // スクロールさせるコンテンツを配置するためのノード private var co
最近、デスクトップアプリ開発界隈で流行ってる Electron の環境を React と Redux を組み合わせて作成してみました。Redux は Swift にも移植されたたりしているので前から気になってました。せっかくなんでオリジナル Redux 触ってみようと思った次第です。 最終成果物的なソースコードはこちら Electron + React + Redux の最小構成 Boilerplate を作成しました。Boilerplate ってのは「再利用を意図した標準的な文例集」という意味で、必要最低限これだけあれば Electron + React + Redux 開発ができるよってことを意識してあります。ソースコードはこちらに置きました。 github.com インストールと Electron の実行 以下の手順だけで Electron アプリが起動します。babel-core/
約6年前に LinkedWord という英英辞書アプリを開発しました。リリースからしばらく(2年ぐらい、時期的には iOS4とか5の時代)は機能アップデートやバグ修正をしていたのですが、本の執筆やら他のアプリの開発やらで忙しくなりしばらく放置してました。その間に iPhoneは5系や6系が発売され画面サイズが増えたり、iOS7で UI が刷新されたり、とわりと大きな変化がありました。本の執筆も落ち着いたし Swift を使ってアプリを1本ちゃんと開発したいと思ったので過去に開発した LinkedWord を作り直してみることにしました。以下やったことをつらつらと上げていきます。 LinkedWord の概要 LinkedWord は単語の意味と単語にまつわるイメージを同時に検索できる英英辞書アプリです。他の辞書と違って、単語の意味とイメージが同時に検索できるので理解がしやすいのが特徴です。
最近 Cocos2d-x を触っているとどうしても細かいところで OpenGL の知識がないと理解できないみたいなことが多いです。いままで避けてきた感がある OpenGL の勉強をそろそろ始めてみようかなと思い少しづつ日記的にまとめていこうと思います。OpenGL と言っても自分はモバイルゲームの開発に興味があるので OpenGL ES について勉強していくことにしました。参考図書として購入した本はこちらです。 わりと新しく出た本ってのと解説がものすごくわかりやすかったので選びました。第1回は OpenGL ES の基本的なところから画面を色で塗りつぶすまで解説します。 OpenGL ES って何? OpenGL は三角形以下(三角形、線、点)の図形を3D空間に高速に描画するための API です。Ope GL ES(OpenGL for Embedded Systems) は主にモバイル端
Cocos2d-xでゲームの開発を始めてそろそろ5ヶ月たちます。とにかく作ってみるといった感じで基礎知識があるかもも怪しいまま(Scene と Layer の違いがわからんとか)開発を続けていました。最近になってiOS/Androidとのネイティブ連携ではまったり、iOSだと問題なく動くのにAndroidだとクラッシュしたり、BGMの制御うまくいかなかったり、まあいろいろと問題が出てきました。というわけでここらで一度Cocos2d-xとちゃんと向き合ってみるかというわけで過去に書いたこちらの記事「iOS アプリの構造がどのようになっているか紐解いてみる」と同じノリでCocos2d-xで作ったゲームの構造を紐解いてみたいと思います。 前提とする Cocos2d-x のバージョンとかもろもろ Cocos2d-xはiOS/Androidはもちろんのこと、その他多数のプラットフォームに対応したゲー
先日こちらの記事にも書きましたが「Hedgehog Drive」というゲームをリリースしました。このアプリのゲーム部分は SpriteKit を使って実装しました。初めて SpriteKit を使ったので備忘録的にこのフレームワークの使い方をまとめてみました。 2D ゲームで使用される基本用語 SpriteKit の説明の前に 2D ゲーム開発でよく使われる用語とその説明をします。SpriteKit でも以下で説明する用語が使われていますので覚えておくと良いと思います。 ゲームループ ゲームではキャラクタや背景などが常に動いています。このような常に変化する状態を実現するために、ゲームの状態をプログラムで処理する必要があります。これを処理するための仕組みがゲームループ(またはメインループ)です。ゲームループの処理は常に一定時間ごとに呼び出されます FPS Frames Per Second
こちらの記事にも書きましたが先日「Hedgehog Drive」という2Dのゲームをリリースしました。 ハリネズミと遊ぼう!指でなぞるだけのシンプルな2Dゲームをリリースしました アプリと違ってゲーム開発は初めてということもあり、苦労したところが多かったのでその辺りをまとめてみました。 どんなゲームをつくったか 指でハリネズミを操作して画面上のセルを消していくゲームです。 ハリネズミが消したセルの数を競います。 セルをすべて消すとアイテムが出現します。最後に消したセルの色によって以下のアイテムが出現します。 最後に消したセルの色が紫だったら「ブドウ」 最後に消したセルの色が黄だったら「チーズ」 最後に消したセルの色が赤だったら「ニンジン」 これらのアイテムを使ってゲームを有利に進めることが出来ます。 動画を見るとどんなゲームかわかりやすいと思うのでプレイ動画を貼付けておきます。 価格は無料
iOS 6から導入された Autolayout(オートレイアウト)を最近になって本格的に使うようになりました。 4-inch の iPhone が主流になりつつある中、アプリを Autolayout に対応させるのはほぼ必須といっても良いと思います。Storyboard と格闘してなんとかコツはつかめたものの UIScrollView だけは一筋縄ではいかず苦労しました。 というわけで Autolayout に対応した画面で UIScrollView を使う時のコツをまとめてみました。 なおこの記事で説明する内容は Storyboard 上で Autolayout がオンになっていることが前提になっています。 Autolayout 対応画面で UIScrollView を使うための2種類の方法 Autolayout に対応した画面で UIScrollView を使うには以下の2つの方法があ
久しぶりに Processing でコード書いてます。なんでかと言うと、たまたま本屋さんで見つけた「ジェネラティブ・アート」という本がめちゃくちゃ面白くてそれがきっかけです。 個人的にはChapter 6の「創発」、Chapter 7の「自律性」、Chapter 8の「フラクタル」が特に面白かったです。創発とか自律性の考え方は AI っぽくてゲーム開発にも活かせそうでした。 「ジェネラティブ・アート」は拙著「プロの力を身につける iPhone/iPadアプリケーション開発の教科書」の序章でもプログラミング初心者に最適な本として紹介しています。 プログラミングの楽しさやプロラムが動いたときの感動がダイレクトにわかる良書です。本に掲載されているサンプルプログラムを入力して動かした時に「おお〜」「なるほど!」みたいなわくわくする感じ、ここ最近なかった感覚でした。やっぱり Processing は
最近読んだアラン・クーパー氏の著書『About Face 3』ではソフトウェアを「使われ方」と「見た目」の2つの視点で分類していました。拙著『プロの力を身につける iPhone/iPadアプリケーション開発の教科書』の第3章では iOS アプリを実装面から分類しました。実装面からの分類は UI 設計時には役に立ちますがアプリの方向性やターゲットユーザを決めるような UX 設計時にはあまり役に立ちません。UX 設計のようにアプリをマクロの視点から考えて設計するときには『About Face 3』で紹介されている分類のように実装に依存しないユーザ目線から分析したものの方が使えます。というわけでこの記事では『About Face 3』のソフトエェアのパターンを iOS アプリにあてはめて最近のアプリの傾向を分析してみます。 About Face 3におけるソフトウェアのパターン 『About F
最近デザイン系の本を読んでいて「アフォーダンス」という言葉の使われ方が変わってきたなと感じています。 アフォーダンスはD・A・ノーマン氏の著書「誰のためのデザイン」がきっかけに広まった言葉で、もとはアメリカの知覚心理学者のJ・J・ギブソン氏が提唱した概念です。Wikiによると環境が動物に与える意味のことをアフォーダンスと呼ぶようです。私自身はユーザをとある操作に誘導するための重要な概念だなぐらいの認識でした。 最近ではデザイン系、なかでもユーザインターフェースについて書かれたの本やブログで当たり前のように出てきていうように感じます。 私がアフォーダンスという言葉の使われ方が変わったなと感じたのは先の「誰のためのデザイン」を書いたD・A・ノーマン氏の別の著書「複雑さと共に暮らす」を読んだ時です。その中でノーマン氏はアフォーダンスという言葉が一人歩きして本来の意味から離れて使われていることに言
ページ送り機能の実装でワークテーブルを使って実現する予定でした。 しかしOracleのROWNUM擬似列を使って実現することになりました。 このROWNUM少々厄介です。 Order byを使うと思ったデータを取得してくれないのです。 たとえば select id,name from user where rownum <= 10 というSQL文だと10件目までのデータを正しく取ってきてくれます。 しかしこれを select id,name from user where rownum <= 10 order by name とすると正しくデータを取ってきてくれません。 ROWNUMの採番がORDER BYする以前に行われることが原因のようです。 この例だと、まず抽出したデータからrownum <= 10のデータをとってきてそれをORDER BYしちゃうみたいです(-_-#) select
Core Data の NSManagedObject クラスで以下のように To-Many(One-To-Many) 関連を使ったときにコードの自動生成をすると実装コードが生成されない場合があります。 通常の To-Many 関連では問題が起こらないのですが以下のように Ordered(順序) を指定してから NSManagedObject クラスのサブクラスの自動生成をすると実装コード(.m ファイルのコード)の一部が生成されません。 これは Xcode のバグみたいです。最新の Xcode 4.6.1 でも発生しています。 自動生成されないコードはプログラマ自身が実装する必要があります。以下は Transaction(取引) クラスと Journal(仕訳明細) クラスに Ordered の To-Many 関連を設定する場合のコードの実装例です。 #import "Transact
ご無沙汰しております。約半年ぶりの記事です。 この間、ずっと iOS アプリ開発の本を書いていました。タイトルは「プロの力を身につける iPhone/iPadアプリケーション開発の教科書」です。 出版社様から書籍執筆のお話を頂いたのが約1年半前でした。やっと発売にこぎつけることができました。2月26日発売です。早ければ22日から書店に並ぶと思います。 本の内容のいくつかは当ブログの記事が元になっています。iOS アプリ開発をはじめられたばかりの方からバリバリ開発している方まで幅広く読める内容になっています。魂込めて書いた自信作ですのでよろしくお願いします。 発売に先駆けて「プロの力を身につける iPhone/iPadアプリケーション開発の教科書」の目次を紹介させていただきます(ついでに元になったブログ記事へのリンクをはっておきます。中身検索的な感じでお使いください)。 iPhone/iPa
「iOS データ設計入門」でデータはメモリ、フラッシュドライブ、iCloud に保存することができると説明しました。今回は iCloud にデータを保存して複数端末でデータを共有する方法について説明していきます。 iCloud って何? クラウドと聞くとなにやら難しい感じがしますが、iCloud を簡単にいうとインターネット上にあるデータの置き場です。実体はものすごい数のサーバです。 iCloud のデータは Apple ID ごとに管理されていて同じ ID であれば iPhone iPad iMac など端末を問わずデータを共有することが出来ます。 この記事は iCloud のプログラミングについて説明するので「iCloud って何って?」ところには深入りしません。iCloud に関する詳しい説明は下記書籍を参照してください。 iCloud パーフェクトガイド iCloud を使うと何が
「iOS アプリの画面開発の基礎を理解する」でアプリの画面と画面遷移について説明しました。アプリの見た目はとても大切ですが同じぐらい大切なこととして、データの活用方法があります。 ユーザに必要なデータは何か、そのデータに価値を持たせて情報にするにはどうすればよいか、データをどこに記憶すればよいかについて説明していきます。 そもそもデータって何? データとはコンピュータが記憶することのできる文字や符号、数値などの集まりです。データはコンピュータ上で0と1の固まり(バイナリ)としてあつかわれます。バイナリが集まって意味を持ったものがデータであり、そのデータがさらに集まって意味を持ったものが情報です。図にすると以下のような感じになります。 バイナリは CPU、データはプログラム(アプリ)、情報はユーザがあつかいます。それぞれ解釈できる単位が違います。 データと情報の違い データそのものはユーザに
今年の2月ごろから iOS 用の HTTP 通信ライブラリの開発をしていています。 シンプルで簡単に HTTP 通信が出来るライブラリを公開しました 非同期で HTTP 通信をするだけの簡単なライブラリなんですが、ユニットテスト(Unit Test)をする時に少しコツが必要だったのでその紹介です。ここで紹介する方法は非同期(Async)処理のテスト全般で使える技だと思います。 iOS でユニットテストを実施するときは iOS に標準で付属している SenTestingKit というフレームワークを使います。 ユニットテストの書き方 SenTestingKit の使い方は Java の JUnit とほとんど同じで簡単です。SenTestingKit では SenTestCase というユニットテストのための基底クラスが提供されています。まず SenTestCase クラスを継承したテスト用
前回の記事「iOS アプリの構造がどのようになっているか紐解いてみる」で iOS アプリの構造について説明しました。深いところの説明ばかりだったのでもう少し浅いところ、画面の見た目や画面遷移を実装する方法について説明します。 ユーザの要望がどのようにアプリに反映されるのか アプリができる背景には「アプリでこんなことしたい」というユーザの要望とか、開発者自身の「アプリを通してXXのような素晴らしい体験をユーザに提供したい」という思いが出発点になっています。 ユーザの要望だったり開発者の思いは「UX設計」「ユースケース抽出」「UI設計」という3つの段階に分けてアプリに反映していきます。図にすると以下のような感じです。 UX(ユーザエクスペリエンス)設計 ユーザの要望や開発者のこんなもの作りたいという思いを元に、いつ、どこで、誰が使うのか?アプリが使われる状況を洗い出す。その上でユーザがアプリを
次のページ
このページを最初にブックマークしてみませんか?
『A Day In The Life』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く