サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
nantekottai.com
動画内に一定時間無音が続くシーンがあったら自動でカットするプログラムをPython(Google Colab)でプロトタイピングしてみることにした。 方針 下記のステップで、無音シーンの自動カットを試してみることにした。 動画ファイルの音声トラックを抜き出す音声トラックを分析して、「カットしても良さそうな箇所」を探す元の動画ファイルから、「カットしても良さそうな箇所」以外の箇所を抜き出してつなげる なお、検証にはじんぼくんがTwitter / TikTokにアップロードしているこちらの動画の編集前の素材を使わせてもらった。 【30秒でペラッペラ英会話 道案内編】 日本語でも難しいんだから英語でなんかムリよ。そんな時は文明の利器。 pic.twitter.com/CfwsrALIUK — じんぼぼんじ(ジョージP)@DJ新橋のお友だち (@jimbobonji) May 30, 2020 動
久しぶりに新しいアプリを開発することになった。ちょうどCatalinaが正式リリースされたタイミングでもあったので、Mac Catalystを使ってiPad / Macの両対応を目指すことにした。また、コードベースでUIを記述することができるSwiftUIを使用して、iPad / Macで必要に応じて効率的にUIの分岐を行えるようにした。 先に言いたいことをまとめると下記のようになる。 SwiftUIは、便利だが多少難易度が高いMac Catalyst + SwiftUIの組み合わせではさらに難易度が上がるただし、乗り越えれば超効率的なiOS / macOSの両対応が実現できてすごい 実際にリリースしたアプリの紹介 字幕スタジオ将軍(macOS)字幕スタジオ将軍(iOS) アプリの詳細についてはこの投稿の本題とはあまり関係がないので省略するとして、このアプリはMac Catalyst +
Visual Studio CodeでGo言語のソースコードを書く時間が増え、Postfix Code Completionの機能が欲しいなと思った。残念ながら現在そのようなExtensionは存在していないようなので、自分でExtensionを書こうと思い参考になりそうなものを調べていたところ、TypeScript / JavaScript用のPostfix Code CompletionのExtensionであるTS/JS postfix completion Extension が見つかった。 Issuesを見てみると、ちょうど「他の言語もサポートしてよ」というIssueが上がっていた。それに対する作者の返答が「今のところTS/JSしか書かないので、興味はないけどこのExtensionはオープンソースだから自分でやってみたら?」となっていたので、僕も自分でやってみようかと思ってソース
経緯や詳細は下記の記事に書いたのだが、けものフレンズというアニメに出てくるボス(ラッキービースト)というロボットみたいな何かをiPhoneで作ってみた。 至極簡易的ではあるものの、はじめてロボット/AI的なものを自分で作ってみて色々と技術的にも学んだことが多かったので、ここに書き記しておこうと思う。 今回のシステムの全体像 アニメに出てくるラッキービーストは、いわゆる汎用人工知能(強いAI)なのだが、さすがにそれを実現するのは難しいので、今回は「モノを見せると、それについて教えてくれる」人工無脳的な実装をすることにした。 大まかなシステムの流れはこんな感じ。 音声認識で「これなんだかわかりますか?」的な質問をされたことを検知する カメラを使って、目の前の様子を撮影する 撮影した画像から物体を検出する 検出した物体について、Wikipediaで情報を調べる 適当に文章にして音声合成で喋る 一
gulp + BrowserSync + rsyncで、快適にWordPressのテーマを開発 + デプロイする仕組みを作った。便宜上、Mac上での設定手順を書いたが、Mac固有のものはあまり使っていないのでUnix系のシステムなら同じ仕組みが使えると思う。 前提 MySQLがインストールされていて、起動していること。なければHomeBrewとかで入れる。 Apache, PHPが動作する状態になっていること。そしてPHPからMySQLにアクセスできるようになっていること。 BrowserSyncがインストールされていること。なければnpmからグローバルにインストール。(最初からgulp使う場合はグローバルにインストールされていなくてもよいのだけど) WordPressのインストール WordPress.orgから最新のWordPressをダウンロードしてきて、~/Sites以下に解凍・設
長いこと、Ruby on Railsを使って様々なサービスやアプリのバックエンドを作ってきたが、今年に入ってからRailsの代わりにParseを使う場面が増えてきた。機能面や拡張性の問題など何かと不安があったのだが、半年以上実際に稼働しているサービスで使用してみた結果、期待以上の好印象を持っている。 Parseとは Parseはスマホアプリ用に最適化されたBaaS(Backend as a Service)の一つ。多くのスマホアプリで使われるような、ユーザ認証、プッシュ通知、アクセス解析、そして独自データの保存・管理をするためのAPIがあらかじめ用意されており、自分でサーバー側のコードを書いたり、それを稼働させるためのサーバーの設定をしなくても、SDKを入れるだけでこれらの機能を使えるようなサービスだ。 長い間、自分でアプリを作る時は、これらの機能を提供するためにRuby on Rails
カスタムビューを作っていると、コンテンツに応じてサイズが自動的に変わってほしいことがある。そういう時は、intrinsicContentSizeメソッドをオーバライドする。 例えば、UILabelを拡張してPaddingを設定できるラベルを作る場合を考える。 標準のUILabelは、AutoLayoutが有効な状態では自動的に内部の文字列に応じて大きさが変わる。UILabelには内側余白を指定する機能はないので、これを実現したい場合はカスタムビューを作る必要がある。 class CustomLabel: UILabel { var padding: CGFloat = 0 override func drawTextInRect(rect: CGRect) { let newRect = CGRectInset(rect, padding, padding) super.drawTextI
数カ月以内にiOS 9が登場するのではないかと噂されている。アプリを開発・運用していく上で、どの世代のOS/端末までサポートするべきかというのは悩ましい問題だが、判断材料の一つとして、iOS 9リリース後、2世代前のiOS 7のサポートを切った場合(つまり、iOS 8以降のみを対象とした場合)に、どういうメリット・デメリットがあるかをまとめた。 [デメリット]サポート外になる端末 iPhone 4 iPhone 4はiOS 8にアップデートできないため、サポート外となる。Unityが発表しているMobile Hardware Stats 2015-04では、iPhone 4のシェアはモバイル全体(Androidなども含む)で1.9%なので、実際には3-5%前後ユーザがいると考えたほうがよい。iPhone 4S, iPad 2以降はすべてiOS 8/9にアップデートできる。 ただし、iOS
長らく、HTML/CSSコーディングをする時にはGrunt + LiveReloadを使ってファイル更新時のブラウザ自動リロードを実現してきたが、BrowserSyncに乗り換えるのも悪くないかもしれない。 LiveReloadもBrowserSyncも 動作確認用のブラウザと作業用のエディタを並べて作業し エディタでファイルを編集・保存したら 自動的にブラウザ側でリロードをする という基本的な機能・目的は同じ。 Gruntと組み合わせて使う場合はLiveReloadでもなんの不便はないのだが、Gruntを使わないような場合(PHPやRuby on Railsのプロジェクトとか)だと、使えるようにするための設定が面倒臭い(ブラウザにエクステンションいれるか、HTML側に手を入れる必要がある)という問題があり、どうしたものかと思って調べていたところBrowserSyncの噂を聞いた。 Liv
Lionより前までは、システム設定画面から「ウェブ共有」をオンにするだけでApacheを有効にすることができていたが、Lion以降はターミナルを使って手動でApacheを設定/起動しなければいけなくなった。Yosemiteにおける設定方法をまとめておく。 Apacheの起動 ターミナルからapachectlコマンドを使って起動する。 sudo apachectl start Apacheを起動すると、http://localhost/をブラウザで開けるようになる。 http://localhost/の中身は/Library/WebServer/Documents/に配置されている(システムルート)。ただし、このディレクトリのownerはrootになっているので、なにかと使い勝手が悪い。同時に複数ユーザがマシンを使っているような場合にconfの影響が他のユーザに及ぶのも好ましくない。 そこで
新しく買ったiPad Air 2はとても快適で素晴らしい。�今この記事もiPadから書いている。それくらいユーザとしてはiOS製品が気に入っている。だけど、アプリ開発者としては今はiOSアプリ開発よりもAndroidアプリ開発の方に魅力を感じている。この魅力を、とくにAndroidアプリ開発を敬遠してきたエンジニアの人にも伝えたい。 これから書くのはネイティブアプリ(VM上で動くので厳密には「ネイティブ」ではないが)を開発する場合についての話となる。作るアプリの内容によっては、各OS用のアプリを個別に作るより、UnityとかXamarinを使ったほうがいい場合もあると思うし、それらを否定するつもりは無い。一方で、各OSを個別に開発したほうが良いケースもまだまだあると思っているが、そこについては本題から離れてしまうので省略する。 正直に言うと、Androidアプリ開発が面白いと感じられるよう
3年前にHomebrew + Xcode 4でOpenCV環境を作る記事を書いたけど、その後Xcodeも5になりHomebrew側もかわったりしてたので、最新の状況にあわせて作り直しました。 Homebrewを使ってOpenCVをインストールする OpenCVはMacPortsとかソースコードからのビルドでもインストールできるけど、やっぱりHomebrewでインストールするのが手軽。 brew tap homebrew/science brew install opencv 2014年4月現在、opencvのformulaはhomebrew/science以下に移動されたらしいので、installする前にhomebrew/scienceをtapする必要がある。 Homebrewを使ってopencvをインストールすると、ヘッダファイル等は /usr/local/Cellar/opencv デ
先日書いた投稿の内容をふまえて、Objective-CでNSX-39(ポケットミク)を操作するためのライブラリのベータ版をCocoaPodsで公開しました。三行で音が鳴ります。 使い方はGitHubの方に書いてあるけど、 インストールはCocoaPodsで #import <ObjCPokeMiku/PMMiku.h>をヘッダーに アプリ初期化時に PMMiku *miku = [[PMMiku alloc] init] でPMMikuオブジェクトを作成 [miku noteOnWithKey:音程 velocity:強さ pronunciation:発音する文字] で発音 な感じ。(noteOffメソッドで音を消せる) 注意点としては、 PMMikuオブジェクトは基本的にアプリ内で使い回すこと(NSX-39を操作する度にインスタンスを作るのはNG) エラーハンドリングをまだしっかりやって
iOS 7でSpriteKitという新しいゲーム作成用のフレームワークがでました。早速コレを使ってゲームを作って一攫千金を狙いたいと思います。 勢いだけで書いてしまったので、大分雑な感じになっていますが悪しからず。細かい部分はそのうち直していきます。。編集社って偉大。 SpriteKitとは iOS 7 / Mac OS 10.9から追加された、2Dゲーム用のフレームワーク 物理エンジンもついてる あれ、なんかCocos2Dに似てね iOS / Mac用の2Dゲームエンジンとしては、Cocos 2Dが有名ですが、実際のところSpriteKitはCocos 2Dとかなり似てます。 Cocos 2Dと比較した場合のSpriteKitのメリットとしては、 Apple純正だから多分今後のOS対応も安心? インストールの必要がないので手軽 UIKitの延長的な感覚で使える 物理エンジン使った時のコー
Hubotを導入して半年たったのでレビューします。 Hubotとはなにか いわゆるボットです。サーバー上で待機していて、こちらからコマンドを与えたりイベントが発生するとそれに応じて処理をしてくれるプログラムです。 module.exports = (robot) -> robot.respond /PING$/i, (msg) -> msg.send "PONG" 下記のような特徴を持っています。 CoffeeScriptで「どういうメッセージがきたら なにをする」というパターンをサクサク追加できる。 機能拡張のスクリプトを簡単に使い回せる。(hubot-scriptsレポジトリで公開されている) Campfire, IRC, Skype, Yammerの様々なコミュニケーションツール、HTTP等をインターフェイスとして使える。 特に重要なのは3つ目で、デプロイのコマンドはIRC経由で受け
クライアントサーバーアプリ開発では、開発・デバッグ中に問題が発生した時に原因がクライアント側にあるのかサーバー側にあるのか両方の視点から特定していかなければいけない場面に遭遇します。OHHTTPStubsを使うと、手軽に(通信部分のコードに手を入れることなく!)HTTP通信のスタブを実現できて大変便利です。 OHHTTPStubsの基本 [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { return (リクエストに対して偽のレスポンスを返すかどうか); } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { return (返すレスポンスの内容); }]; 基本的にはスタブしたいHTTP通信が行われる前の適当なタイミングでstub
iOS 4からNSNotificationCenterに追加されたaddObserverForName:object:queue:usingBlock:メソッドを使うと、コールバックをブロックで指定することができるのでとても便利です。しかし、従来のセレクタ指定型のaddObserver:selector:name:object:のブロック版、という認識で使ってはいけません。 addObserver:とremoveObserver:のペア 例えば、ビューコントローラが全面に出ているときは通知を受け取りたいが、popされたり他のビューコントローラが上にきた時は通知を受け取りたくない、というようなパターンはNSNotificationCenterを使うとスマートに実装できます。 ビューコントローラのviewDidAppearでaddObserver:…を使って自身をオブザーバーとして登録して、v
iOSアプリで、ファイルのパスを扱う時になかなか気がつかない落とし穴がありました。 iOSアプリは、 /var/***/foo.app/ というようなディレクトリでデバイス上に配置されていますが、この***の部分はアプリケーションがアップデートされた時など、変化することがあります。 例えば、Documentsディレクトリにbar.txtのようなファイルを保存するとその絶対パスは /var/abcdef.../foo.app/Documents/bar.txt のような形なります。この時、このパスをNSUserDefaultsかなにかに保存しておき、アプリをアップデートした後に、NSUserDefaultsに書かれたパスを読みにいこうとすると、アプリケーションのインストールディレクトリのパスが変更されており、先ほどのファイルも /var/012345.../foo.app/Documents
URL Schemeの仕様を確認していて、ふと「アプリケーション内から自分自身のURL Schemeを叩くとどうなるのか」という実験をしてみました。 画面上にボタンを設置し、ボタンが押されたタイミングで自分のアプリのURL SchemeからはじまるURLを開くように設定。 - (IBAction)openURL:(id)sender { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"urltest://foo"]]; } アプリケーション側のplistにURL Scheme urltestを登録。 最後に、アプリケーションデリゲートにURL Scheme経由で呼ばれたときのコールバックを実装。 - (BOOL)application:(UIApplication *)application openURL
iOS 4でのFast App Switchingの導入により、iOSアプリのライフサイクルは若干複雑になりました。今更ではありますが、アプリケーションの終了のフックについて調べたのでまとめておきます。 applicationWillTerminate UIApplicationDelegateには元々applicationWillTerminate:というメソッドがあり、このメソッドはアプリケーションが終了される直前に呼ばれます。 - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackgroun
[catlist name=jenkins order=ASC numberposts=999 excerpt=yes excerpt_size=100 excerpt_class=catlist_excerpt excerpt_tag=p thumb_nail=yes]
vDSPを使ったFFTをより簡単に使うためにラッパークラスを作っています。前回の記事の続きで、実際に作ったクラスの内容は下記のようになります。 MyFFT.h // // MyFFT(revision 1) // MyFFT.h // http://nantekottai.com/ // #import #import @interface MyFFT : NSObject { DSPSplitComplex splitComplex; FFTSetup fftSetup; unsigned int capacity; unsigned int capacityN; //capacityが2の何乗であるかを保持 float* window; float* windowedInput; } @property (assign) unsigned int capacity; @property
加減乗除ができたところで、早速ですが高速フーリエ変換に挑戦してみます。高速フーリエ変換では複素数を扱う事もあって、加減乗除に比べて若干手間がかかりますがそこまで難しくはありません。 フーリエ変換ってなんだっけ? 実際にフーリエ変換を行う前にフーリエ変換について簡単に確認しておきます。サウンドにおけるフーリエ変換は、 入力された信号に、どれくらいの高さの音がどれくらい含まれているか、位相はどうなっているか、を調べたり 逆にどれくらいの高さの音をどういう位相でどれくらい含ませるかを指定して信号を生成する ときに使うものです。少し難しく説明すると 音声信号(グラフにしたとき横軸が時間)⇔周波数特性(グラフにしたとき横軸が周波数)の変換 です。 抽象的でわかりにくいですが、音関係で一番わかりやすいのはスペクトラムアナライザだと思うので、とりあえずそれを作るときに使う技術だと考えておけばいいと思いま
シンプルなウェブサービスや業務用システムを作る際に、僕は基本的にRuby on Railsを使っています。RoRを使ったアプリ開発では用途に応じて数万のgemを使うことができますが、個人的なここ一年の経験から汎用的で導入の価値が高いと感じているgemとサービスを紹介します。 Heroku gitレポジトリのホスティング+Railsアプリのホスティングをやってくれるサービス。gitレポジトリにソースコードをpushするだけで自動的にアプリの最新版をサーバーにデプロイしてくれるので、非常に便利です。PostgreSQLも無料で使うことができます。サーバーの契約・構築・デプロイなど、コーディング以外の作業を大幅に省略できます。必要になったら有料プランでサーバーの増強なども可能。(ちなみにRails以外にも対応) Heroku | Cloud Application Platform Haml(h
トランザクションの中断と再開について、さらにケースを見ていきます。未完状態のトランザクションが既にある状態で、新しいペイメントをリクエストした場合の挙動について。厄介です。 同一プロダクトに対する複数のトランザクション 前述した複数デバイスを使っているときを除いて、StoreKitでは同じプロダクトに対する購入トランザクションを複数同時に進める事はできないようになっているようです。既に進行中/中断状態のトランザクションがある状態で新しい支払いリクエストをキューに積むと、そのトランザクションはfailすることになります。勿論この挙動自体はそうあるべきものですが、この時の処理の流れには注意をしなければいけません。 発生するパターン 同一のデバイス上で一つのプロダクトに対する複数のトランザクションが発生してしまうパターンは二つ考えられます。 パターン1. 前回のトランザクションがfinishして
仕事やプライベートでもUDP関連のプログラムを書くときにAsyncUdpSocketを使っています。自分でソケット関連のコードを書かなくてよいので圧倒的にラクなのですが、このライブラリはドキュメント類があまり充実しておらず、いつも使うときに調べ直すのが面倒なので、ここに備忘録的にまとめておきます。 AsyncUdpSocketの入手 AsyncUdpSocketはcocoaasyncsocketというプロジェクト名の一部として開発されています。ダウンロード用のファイル等は用意されていないので、sourceページの案内に従ってソースコードごと落としてきます。最近はGoogle Codeもgitに対応したようで、gitレポジトリをcloneするように書いてあります。 git clone https://code.google.com/p/cocoaasyncsocket/ cloneしてできた
UnityアプリケーションをJenkinsでビルドする際、いちいちスクリプトを記述するのが面倒で、管理の面でも不便なので諸々を自動化するgemを作りました。 UnityプロジェクトからiOSプロジェクトを作る方法 コマンドラインからiOSプロジェクト出力を行う方法については、こちらの記事が参考になります。Assets/Editor以下にスクリプトを書くことになるのですが、毎回このスクリプトを書いて管理するのが面倒なので、gemを作ってみました。 echinoideaのインストール rubygemsからインストールできます。 gem install echinoidea rvmなどの場合はそのまま、root権限が必要な場合はsudoした上でインストール。インストールするとechinoideaコマンドが使えるようになります。 echinoidea.ymlの設置 ビルドに必要な設定をymlに書い
StoreKitを使ってアプリ内でアイテムの購入が行われると、レシートが発行されます。Appleは不正防止のため、レシートの内容が正しいかどうかverifyする機構を用意していますが、この機構を使うには若干注意が必要です。 レシートの認証の基礎 まず、StoreKitを使ったアプリ内課金を実装する上で、レシートの認証はすべてのアプリで必須の要件というわけではありません。しかし、とくに購入内容がサーバーと連動するような場合において、レシートの認証は効果の高い不正対策方法の一つです。 ユーザがアプリ内で決済を行う(状態がSKPaymentTransactionStatePurchasedになる)と、そのtransactionのtransactionReceiptプロパティからレシートデータを取得できるようになります。ここで取得したレシートデータをAppleが用意している認証サーバー(buy.i
毎回、ハマって調べて直しては忘れて…を繰り返す、日本語を含むパスの問題。 どういうことかというと、ユーザが指定したファイルを開くようなプログラムを作って、 /Users/foo/あいうえお.wav のような日本語を含むファイルを開こうとするとなぜか開けない現象。 理由は、+[NSURL URLWithString:]を使ってファイルパスからURLを生成する際、RFC2396を満たさない文字が含まれているとインスタンスが生成されないためです。 NSString* path = @"/Users/foo/あいうえお.wav"; NSURL* badPattern = [NSURL URLWithString:path]; //nilになる 対策方法は簡単で、-[NSString stringByAddingPercentEscapesUsingEncoding:]を使ってエスケープしてやるだけ
次のページ
このページを最初にブックマークしてみませんか?
『なんてこったい – スマホアプリとmacアプリ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く