Anything New

developping any time

Windowsから送られてきたzipファイルを解凍する(日本語ファイル名が含まれている場合)

概要


Windowsで作成したzipファイルをlinux上で解凍する際、日本語ファイル名やフォルダ名が文字化けする問題が発生。
Windowsサーバでzip圧縮したファイルをLinuxサーバで解凍することが何度かあったので備忘録として記しておきます。

原因


Windowsで作成したzip圧縮のファイル名エンコードはCP932(Shift_JIS)となっているため。
CP932とは: Microsoftコードページ932
Mac,Linuxでのzip圧縮のエンコードUTF-8Macでのunzipコマンドでの解凍では文字コードを自動判別してくれるので、問題ないが、linuxでのunzipコマンドでは文字化けしてしまうので、パッチをあてて修正版unzipつくる必要がある。ディストリビューションによって対処方法がまちまちなので、ここではその対処法はとりません。


対処法


use with Gist Search 引数に与えたzipファイルを解凍する際にエンコードを変更するのみ



使用方法

上記perlスクリプトをファイル名unzip-cp932にてパスのあたっている/usr/bin以下に作成
そして実行モードに変更 chmod +x unzip-cp932
unzip-cp932 hoge.zip


注意

CP932(Shift_JIS)以外のエンコードは化けるので注意。
Mac,Linuxで作成したzip圧縮のフォルダやファイル名のエンコードUTF-8なので、unzip-cp932は使えません。
あくまでWindowsで作成されたzipファイルを解凍する際に使用。


他の例

windowsから送られてきたzipファイルを解凍するとファイル名が大変なことになっている時
上記のunzip -Ocp932のOcp932オプションを使用できず、解凍できない場合があった。
WinからLinuxへzipファイルなど持ってきた時の文字化け対処方法
上記、convmvを使用する場合

【WatchKit】How to make an animated background Interface in Apple WatchKit


Watchkitで背景画像をアニメーションさせる方法
まずWatchKitではSubview的にinterfaceを重ねられません。
どうするかというと、WKInterfaceGroupを利用します。

WKInterfaceGroupのsetBackgroundImageメソッドにて画像を割り当てて、
その画像でUIImage型の配列を指定(animatedImageWithImages)にてアニメーションが可能となります。

use with Gist Search

Watchkit Splashアニメーション実装方法

Watchkitにて、アプリケーション起動時のスプラッシュ画面を設定する方法が見当たらないので、 Initial Controllerに設定したクラス内のwillActivateメソッド内でanimatedImageを設定することによって、擬似的に毎回スプラッシュアニメーションさせます。
これで毎回起動時(画面表示時)にアニメーションさせることが可能です。


use with Gist Search

SwiftでNSUserDefaults の内容を全削除する方法

保存データを初期化したい際に、 NSUserDefaultsを全削除する方法です。
ひとつのキーの値を削除するコードも念の為に追記。


use with Gist Search

Objective-Cの場合 use with Gist Search

AngularJs ✕ Firebaseで爆速リアルタイムアプリケーションの作成

AngularJs ✕ Firebaseで爆速リアルタイムアプリケーションの作成


Firebaseとは

いわゆるモバイルBassでWebアプリケーション、モバイル・アプリケーションの開発者向けにリアルタイムにスケーラブルなバックエンドサービスを提供しています。
つい最近(今年10月)、Googleに買収されています。
一定の転送量、接続数、容量は無料で、クレジットなしで使用できます。
Baasとして有名なParseは、Facebookに買収されていますし、
FirebaseもGoogleがつい先日買収と、もはやBaasの2大巨塔ですね、この2つは。


AngularFire

そして、AngularJsからFirebaseを利用できる、
AngularFireというAPIも公開されていますので、
バックエンドのコードを書く必要も、サーバも必要なく、
必要な作業に集中できます。
AngularFireのAPIを利用することで、
Angularjsのモデルが自動的に同期され、Firebase上でリアルタイムにデータバインディングされます。
これでhtml側でのview, Angularjsでのmodel, firebaseでストアされたjsonのデータの3wayデータバインディングが可能となります。


サンプル:チャットアプリ

100行以内で簡単チャットアプリが作成できます。 
var ref = new Firebase("https://.firebaseio.com/");

上記の箇所をfirebaseにサインアップして、URLを書き換えてください。


Firebaseにストアされたデータにindexをはる方法

設定で、json形式でkey,rulesの中に.indexOnを記述するだけ
詳細はこちら
https://www.firebase.com/docs/security/guide/indexing-data.html


Firebaseにストアされたデータのセキュリティに関して

jsonでのセキュリティルールの設定が可能。
認証されたユーザがどのようにデータを変更できるかを決める。
データの転送はSSL経由。
さらなる詳細はこちら
https://www.firebase.com/docs/security/


AngularFireの使用アプリ

好きなアーティストの音楽をランキング順の聴くことができるサービスです。
Recentの箇所をfirebaseでストアしています。
Lamusica
http://manchan.github.io/lamusica/
githubはこちら
https://github.com/manchan/lamusica


AngularFireのドキュメントはこちら

https://www.firebase.com/docs/web/libraries/angular/index.html

iOS 8 todays widgetの作成

iOS 8 今日のウィジェットの作成



今回はiPhoneで今日のウィジェットを表示させるアプリのサンプルを作ります。


iOS8 からの新機能、 Today ウィジェット、通知センターの左側に表示されます。

はじめにウィジェットの概念について。
既存のアプリに付属する拡張のようなものです。
ウィジェット単体では申請できません。既存のアプリに追加する形となります。
既存のアプリにエクステンションを追加するイメージ
あくまで、アプリに内包されて配布するものです。

以下、簡素化したステップ
1. 新規アプリ開発、Single View Applicationで言語はObjective-cを選択。
2. File > New > Target にて Application ExtensionにてToday Extensionを選択
3. Product NameをWidgetと入力、finishを選択したあと、Scheme追加ダイアログが出て、activateを選択。
4. TargetのWidgetを確認すると、Link Binary With LibrariesにNotificationCenter.frameworkが入っていることを確認。
5. デフォルトでビルド実行すると、ノティフィケーションセンター左の今日のウィジェットを確認すると、アプリ名の中に"Hello World”を確認。
6. ウィジェットで表示されるアプリ名の変更はinfo.plistのBundle display nameを変更
7. MainInterface.storyboardにて、label, progress viewを追加
8. Constraintsを追加。それぞれの制約を設定、詳細は以下github
9. ビルドして実行、確認。※ビルドターゲットはエクステンションの方を選択
10. リアルなデータを結びつける。
11. labelとprogress viewをアウトレット接続する,propertyの追加
12. システムサイズとフリー、ユーズドのサイズを測定するメソッドを定義
13. それらをnsuserdefaultでキャッシュする。
14. そしてそれらをUIに表示、更新する
15. 値に更新があった場合のメソッドを定義 ビルド実行で確認。値の再計算メソッド
16. もっと情報を表示させる。まずUIの変更、それぞれの高さを設定。
17. 詳細ラベルの更新。
18. タッチの検出と値の更新。
19. アニメーションの追加。
20. ビルド実行で確認


ソースはこちら

参考: iOS 8: Creating a Today Widget

AppleWatch Tutorial

AppleWatch
https://www.apple.com/jp/watch/features/

ついに最近、デベロッパー向けにwatchkitが発表されました。
AppleWatchアプリのチュートリアルで、
今回は絵文字を拡大表示させるサンプルをやります。




以下、簡素化した20のステップ。
ソースはこちらです。
https://gist.github.com/manchan/1e9cfae322f87583a2f7

  1. 新規プロジェクトのシングルページアプリケーションで作成。言語はswift
  2. プロジェクトパネル、General > Targets > Add Targetにより、iOS > Apple Watch > Watch Appを選択
  3. Watchkit extensionとWatch appが追加される
  4. watchのデフォルトの画面をシミュレーターで確認する際は、「~Watch App」にターゲットを変更。デバイスはなんでもよい。
  5. ビルド実行でシミュレータが立ち上がるが、無視。
  6. シミュレータメニューのHardware > External Displays > Apple Watch - 38mm またはApple Watch - 42mmを選択し、再度ビルド実行、watch画面が立ち上がり確認可能。
  7. はじめにInterface.storyboardのInterface Controller Sceneにて, tableを追加、table内にlabelを追加
  8. tableをInterfaceController.swiftにnameをtableとしてoutlet接続
  9. 新規ファイルを追加より、EmojiRow.swiftを追加
  10. Interface.storyboard, Interface Controller SceneにてtableのクラスをEmojiRowに設定
  11. table内のlabelをEmojiRow.swiftにemojiRowLabelとしてoutlet接続
  12. ここまででtableのラベルの内容を定義してforループを回せば同じ内容が表示される。
    詳細はInterfaceController.swiftを確認
  13. tableの要素をひとつ押した際に、詳細の画面に遷移させたいので、
    新規ファイル,ZoomEmojiController.swiftを追加する。
  14. Storyboardにて、新規画面の追加をする、右サイドパネルよりInterface Controllerを追加する
  15. ClassをZoomEmojiControllerとし、ModuleはEmojiWatch_WatchKit_Extensionとする
  16. IdentifierをZoomEmojiControllerとする, これによりtableのひとつの要素を押した際に遷移するcontrollerの識別が可能となる。
  17. labelをふたつ追加し、それぞれ、zoomEmojiLabel、definitionLabelをZoomEmojiController.swiftにoutlet接続する
  18. tableの一要素押下の処理をdidSelectRowAtIndexより指定、
    詳細はInterfaceController.swiftを確認
  19. ZoomEmojiController.swiftコンストラクターメソッド内にて、
    contextを受け取り、fontサイズなどを指定後、それぞれのlabelに代入する。
  20. ビルドして実行、シミュレーターにて、配列に定義した絵文字が拡大表示、テキストが表示されていればOK

Finish!

Apple Watch Tutorial - Learn How to Make a Simple Apple Watch App
http://vimeo.com/112249657

上記動画を参考にしています。

以下ソースです。






次回はglanceやnotificationのサンプルを作りたいと思います。
AppleWatchのお仕事お待ちしております!