なんとかするから、なんとかなる

エンジニア関係のことを書きます

C# DateTimeにタイムゾーンを考慮するときのまとめ

はじめに

C# においてDateTimeの使い方がわからなかったため調べた際のメモ

kind.unspecifiedの扱い

DateTimeでkindが"unspecfied"のとき

var unspecifiedTime = new ... ; // kind がunspecified

ToLocalTimeをすると、unspecfiedTimeはUTCとして扱われる

unspecifiedTime.ToLocalTime; //  UTC

ToUniversalTimeすると、unspecfiedTimeはシステムのTimeZoneとして扱われる

unspecifiedTime.ToUniversalTime; // システムのタイムゾーン

unspecifiedをUTCに変換する

DBにタイムゾーン情報が無いとき、日時を変換しないでDateTimeKindのみ変換したい場合、DateTime.SpecifyKindメソッドを利用する

var utcTime = DateTime.SPecifyKind(unspecifiedTime, DateTimeKind.Utc); // UTC

TimeZoneInfoの注意点

特定のTimeZoneに変換する場合、TimeZoneInfoが利用できる。 しかし、変換対象のDateTimeのDateTimeKindがunspecifiedの場合、実行時エラーが発生する。 タイムゾーンを指定した上でタイムゾーンを変換する必要がある

TimeZoneInfo jstTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime jstTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, jstTimeZone);

ある特定の時間差のみ考慮すれば良い

DateTimeOffsetを利用する

参考URL

https://stackoverflow.com/questions/16442484/datetime-unspecified-kind

Mac とvscodeでAzure Functionsを作りたかった

はじめに

MacvscodeC#で快適にFunctionsが作れないかを試した時のメモ。

結論

現在のところ、C#でFunctionsを作るなら.csxで作るしかなさそうです。NugetなどのPackage Managerを使って.csでFunctionsを作れなそうです。

MacでFunctionsを作るならJavaScriptが良さそう。 今後のエンハンスに期待します。

Azure Function Toolをインストール

以下のコマンドでhomebrewからツールをインストールできます。

brew tap azure/functions
brew install azure-functions-core-tools

Functionsを作成する

コマンドラインから次のコマンドを実行

func init <YOUR PROJECT NAME>
func new

あとは、言語やTriggerを聞かれるので選択する。

今回はC#を選択するとcsxファイルが追加されました。

Packageを追加する

Packageは次のコマンドで追加できました。

nuget install SOMEPACKAGE

.csxに外部ライブラリを追加してを読み込む

ここがかなり苦戦しました。 これ以外の方法があれば教えて欲しいです。

.csxファイルにDLLファイルへの参照を追加します。

#r “SOMEPACKAGE”

ではダメでした。

.csxからDLLへの相対パスをきちんと指定する必要があります。

#r “../SOMEPACKAGE FOLDER/bin/SOMEPACKAGE.dll”

スクリプトだからちゃんと指定しないといけないということなのだろうか?

あまり洗練されてない気がします。

追加したDLを使うためには

using SOMEPACKAGE ;

おまけ:実行してみる

おまけで実行してみる場合は次のコマンドを使う

func host start

終わりに

本当はAzure Function ToolからDeployまでやりたかったですが、残念ながらここで断念(心が折れた)

まだまだVisual Studio で開発した方が快適そうでした。

参考URL

docs.microsoft.com

Azure Portal上でのFuncion開発にNugetを使いたい

はじめに

Azure Portal上でのAure Function開発において、Nugetの使い方(外部ライブラリの追加)がわからなかったのでメモ

やり方

  1. project.jsonを追加
  2. project.jsonに使いたい外部ライブラリを記入
{
   "frameworks" : {
      "net46" : {
         "dependencies" : {
            "YOUR LIBRARY": "VERSION"
         }
      }
   }
}
  1. [Save] (Saveすると自動でライブラリが追加されます)
  2. usingまたは#rで読み込めば使えます

注意点

  • project.jsonに記述するのは "net46"です。net64ではないです(白目)

おわりに

簡単ですが、備忘録としてまとめました。 Portalではインテリセンスとか効かないので、やっぱりVisualStudio使いたいですね

参考URL

stackoverflow.com

Azure Functions 開発をローカルで完結させてデバッグしたい

はじめに

Visual Studio2017において、Azure Functions開発をローカルで完結させようとして、はまったメモです。

AzureWebJobsStrogeにローカルを設定する

AzureWebJobsStrorageの接続先を設定

TimerやQueueなどHTTPトリガー以外のFunctionsはAzureWebJobsStorageの接続文字列の設定が必要です。

設定しないと次のエラーメッセージが出ました。

f:id:hopita:20180314173106p:plain

Missing value for AzureWebJobsStorage in local.settings.json. This is required for all triggers other than HTTP. You can run 'func azure functionapp fetch-app-settings <functionAppName>' or specify a connect string in local.settings.json

ローカル環境で実行する場合は、

local.settings.json 内のAzureWebJobsStorageに下記を設定するとローカルのエミュレータに接続できます。

"UseDevelopmentStorage=true"

ただし、接続文字列を指定するだけではエミュレータは起動しません。

Azure Storage Emulatorを起動

AzureStorageEmulatorはAzure SDKと共にインストールされています。

  1. Winキー

  2. "Azure Storage Emulator"と入力

  3. 起動

起動が完了するとタスクバーの中にAzureStorageEulatorが表示されます。

デバッグ実行

Functionsのローカル実行ができます。

ローカル環境でAzureFunctionのTimerFunctionを実行する

HTTPトリガーの場合、デバッグ時にURLがAzureFunctionsToolに表示されるので、そのURLブラウザでアクセスすれば実行されます。

タイマートリガーの場合、ToolにURLは表示されません。

ポータル環境であれば、Testから実行できますがローカルではどうするか

Power ShellからAzure Functionを実行する

Power Shell上で"Invoke-RestMethod"を使います。

Invoke-RestMethod -Method Post -Uri "http://localhost:{PORT}/admin/functions/{YOUR FUNCTIONS NAME}" -Body "{}"

注意点

  • 設定環境に依存しますが、何もしないでブラウザから実行するとGETになってしまい失敗しました。
  • -Body "{}" 何も指定しないのでと、省略するとBad Requestで失敗しました

さいごに

備忘録ですが、以上でAzure Functionのデバッグをローカルで完結させることができました。

参考URL

docs.microsoft.com

docs.microsoft.com

Jenkinsを使ってiOSの自動ビルドおよびテストをする(ipa生成、テスト実行編)

はじめに

前回に引き続き、iOSの自動ビルド環境を作っていきたいと思います。

今回はBuild実行後のipaの作成方法と、Build後にテストを実行する方法です。

前回

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編) - なんとかするから、なんとかなる

準備

  • 前回作成したテストが追加された、iOSのProject XcodeでProjectを生成する際に、[Include Unit Tests]にチェックを入れていれば大丈夫です。

    • テストの内容は今回関係ないので、とりあえずテストができるばOKです。
  • 一度、ipaファイルを手動で生成しておく。ipaの詳しい生成方法は、目の前のデバイスで検索してください。

    • [Product]-[Product]-[Archive] で作成できます。今回は[Ad-Hoc]で一度生成してください。

Jenkinsでipaを生成する

Jenkinsの設定

Xcode Pluginの設定を変更します。

General build settings

前回チェックを入れなかった[Pack application, build and sign .ipa?]にチェックを入れます。

f:id:hopita:20170606203853p:plain

そして、各設定項目を入力します。 ここでは、[Export method]に"ad-hoc", [.ipa filename pattern]に"${VERSION}“を入力しました。

設定項目について

[Export method]では、生成するipaの種類を入れます。ここでは準備の段階で生成したipaと同じ種類します。

[.ipa filename pattern]では、.ipaのファイル名を付けられます。Vesion以外にも日付などを設定することができます。

[Output directory]では、ipaを出力するdirectoryを変更できるようです。

ビルド

JenkinsのJobを実行すれば、指定したdirectoryにipaが出力されます。

自動テストを実行する

buildが完了したタイミングで、projectに含まれるテストを実行するようにします。

Jenkinsの設定

Jobの設定で[Build]の項目を追加します。 現在、Xcode Pluginの設定がある枠の一番下にある[Add build step]をクリックし、[Execute shell]を選択します。

f:id:hopita:20170606203913p:plain

そして、下記のCommandを追加します。

xcodebuild test -scheme "MySampleApp" -sdk iphonesimulator -project 'MySampleApp.xcodeproj' -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6,OS=10.3"

f:id:hopita:20170606203926p:plain

項目について

  • xcodebuild test

    • xcodebuild でtestを実行するコマンドです。その後に各パラメータを付けます。
  • -scheme

    • テスト対象
  • -sdk

    • テストを実行する環境
  • -project

    • テストするProject
    • ちなみに、workspaceに対してテストする場合は、-workspaceとしてxcworkspaceを入力する
  • -configuration

    • ReleaseビルドかDebugビルドか
  • -destination

    • テストを実行する端末やOSなど細かな設定
    • 上記以外でもよいが、Simulatorであれば既にインストールされている必要がある。

試しに、JenkinsのJoでテストを実行してみると、テスト実施可能なSimulatorの端末とOSが一覧でConsole上で見られます。

ビルド

JenkinsのJobを実行すればビルド後に、テストが実行されます。

テスト結果について

Jenkinsでそのままテストを実行しても、テスト結果はconsoleに出力され、とても見ずらいです。

別途、iOSテストの結果をわかりやすく表示するプラグインなどを紹介したいと思います。

なんかうまくいかないぞQ&A

実践していくうえで、困りそうなことをまとめておきます。

ipaを生成しようしたらエラーがでる

ipaを生成しようとしたら下記のようなエラーが出る場合

error: exportArchive: The operation couldn’t be completed. (IDEDistributionErrorDomain error 3.)

解決方法

一度手動で、ipaを生成してみる

ios - error: exportArchive: The operation couldn’t be completed. (IDEDistributionErrorDomain error 3.) - Stack Overflow

テストしようとしたら、"Xcode project not found"

テストしようとしたら、Projectが見つからない、workspaceが見つからないと出た。

解決方法

テスト実行用に設定したコマンドを確認する。

テスト対象が、 * プロジェクト単体であれば -project “MySampleApp.xcodeproj”

Simulatorが無いのようなことを言われる。

あるはずのSimulatorを指定してもうまくいかない

解決方法

-destinationを代表する文字列を指定する部分を確認する。

スペースや大文字小文字が違うだけで、失敗します。

おわりに

今回はipaの生成方法から、テスト実行まで行いました。 次回は、テスト結果の整形(見やすくする)やメールやslackへの通知を試してみたいと思います。

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編)

はじめに

前回の続きで、今回はとりあえずサンプルプロジェクトをJenkinsでビルドしてみます。

前回

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkins準備編) - なんとかするから、なんとかなる

必要のもの

  • Apple Developerライセンス(DeveloperとDistributionが必要)
  • ビルドするサンプルアプリ(空Projectで良い)のProvisioning Profile
    • Git Repositoryからビルドするので、サンプルアプリ生成時に[Create Git repository]にチャックを忘れずに。

Pluginをインストー

  1. Jenkinsを起動したら下記を開きます [Jenkins] - [Manage Jenkins] - [Manage Plugins] f:id:hopita:20170530202315p:plain

  2. タブで[Available]を選択し、[Filter]で"Xcode"を入力します。 f:id:hopita:20170530203007p:plain

  3. 上の画像には出ていませんが、"Xcode integration"を選択して[Download now and install after restart]でインストールする

ちなみに、アドレスバーで下記を入力することで、再起動できます。

localhost:8080/safeRestart

これでPluginの準備は完了です。

JenkinsのJobを作成する

Jobの新規作成

New Itemをクリックします。

f:id:hopita:20170530201839p:plain

JobのGitの設定

Source Code Managementの項目を設定します。

f:id:hopita:20170530203426p:plain

[Git]を選択して、[Repository URL]に作成したサンプルアプリの".git"が入っているところを選びます。 まずは、ビルドするだけなのでBranchはそのままにしておきます。

Xcodeのビルドを設定する

[Build]の[Add build step]で"Xcode"を選択します。 [Target]の項目で作成しておいたサンプルアプリのTargetを指定します。

f:id:hopita:20170530204024p:plain

Code signing & OS X keychain options

[Deveper Team]は"None"のままで、Development Team ID はApple Developer Accountで確認できるIDを入力します。

[Keychan path]は何もいじっていなければ以下を入力。あとkeychainにアクセスするためのPasswordを入力しておきます。

$(HOME)/Library/KeyChains/login.keychain

f:id:hopita:20170530204610p:plain

Advanced Xcode build options

ビルドだけなら必要ないかもしれないですが、以下の設定をしました。

[Clean test reports?]にチェック

[Xcode Schema File]にサンプルアプリのFile名を入力。おそらくTargetと同じだと思います。

Saveする

上記の設定がすべて完了したら、下部の[Save]をクリックしてjobを保存します。

ビルド

設定が完了したら、さっそくビルドです。

[Build Now]をクリックします。

f:id:hopita:20170530205558p:plain

Build Historyが青くなればBuild成功です!

失敗すると赤くなります。

Build History(#××)をクリックして、Console Outputへ進むとエラーの詳細がみれるので調べつつ修正しましょう。

f:id:hopita:20170530205722p:plain

なんかうまくいかないぞQ&A

上記の作業をすべて読んでいれば同じことが書いてあるのですが、作業をしていて引っかかったところをまとめておきます。

Provisioning Profile がないとダメ

ビルドするだけならDeveloperだけで良いのではないかと思っていたのですが、DistributionとProvisioning Profileがないとダメみたいです。

解決方法

Apple Developer Accountで発行できます。

Jenkinsでビルドしたら、couldn’t find a Provisioning Profile のエラーが出る。

Jenkinsでビルドしたら、以下のようなエラーが出てくる。今回は下記の方法で解決しました。

Check dependencies
No profiles for '{Bundle Identifier}' were found:  Xcode couldn't find a provisioning profile matching '{Bundle Identifier}'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'

解決方法

JenkinsのJobの設定の中で

[Build]-[Xcode]-[Code signing & OS X keyChain options]-[DevelopmentTeam]

上記の中のDevelopment Team IDをきちんと指定していできていない可能性があります。

Apple Developer Accountの[Membership]-[Team ID]の項目をコピーしてくる。(DistributionのIDですね)

ちなみに

調べている中で、結構Xcode のGeneralで指定している[Automatically manage signing]を外してManualで指定するって記事がありました。

今回の記事を作成する中では、[Automatically manage signing]はチェックありでよさそうです。

進めていく中でダメだったら、そのとき修正します。

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkins準備編)

はじめに

Jenkinsを使ってiOSの自動ビルドとテスト環境を作っていきたいと思います。

はじめはLocalのGitRepogitoryに対して自動ビルドを実行する。

そのあとipa生成とテスト。

最後に結果をslackへ通知を試してみたいと思います。

環境

Jenkinsの準備

Jenkinsのインストー

Jenkins のインストールはHomebrewを使ってインストー

$ brew install jenkins

まだHomebrewを持っていないという場合は以下のHPをみてインストー

Homebrew — macOS 用パッケージマネージャー

Jenkinsを起動

以下のコマンドでJenkinsを起動します。

$ jenkins

起動したらsafariで下記にアクセスすることでJenkinsの起動を確認できる。

http://localhost:8080/

Jenkinsの起動がうまくいかないとき

Jenkinsを起動しようとしたら、下記のようなエラーが発生してすぐには起動できませんでした。

下記の2つの対策を実行して無事起動することができました。

Main deleteWinstoneTempContents
WARNING: Failed to delete the temporary Winstone file /var/folders/l6/_hlf7bj12wg0q79ntn8v1vf00000gp/T/winstone/jenkins.war
Jenkins requires Java7 or later, but you are running 1.7.0_71-b14 from /Library/[f:id:hopita:20170528122726p:plain]Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/jre
java.lang.UnsupportedClassVersionError: winstone/Launcher : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at Main._main(Main.java:224)
at Main.main(Main.java:112)

Java Runtime Enviroment (JRE) を更新する

ここで、Javaのversionが古いと起動できませんでした。

更新方法はMacのSystemPreferencesからJavaのアイコンをクリックして[Update Now]です。

Java Developer Kit (JDK)をインストールする

あとJDKをインストールする必要がありました。JDKは以下からインストールできます。

Java SE Development Kit 8 - Downloads

Jenkinsのセットアップ

Unlock Jenkins

初めてJenkinsを起動すると下記のような画面現れます。

f:id:hopita:20170528122726p:plain

画面に書いてあるPathを実行してPasswordを取得する必要があります。 ただし、そのまま実行すると"Permission Dennied" だったり、sudoで実行しても"Command not found"で実行できません。

コマンドラインから下記でPasswordを見ることができます。そう実行ファイルじゃないんですね。勘違いしました。

$ cat (Path)

Customize Jenkins

f:id:hopita:20170528123251p:plain

次に、初めにインストールするPluginを設定します。

まずは[Install Suggested plugins]でおすすめセットにしました。

Create First Admin User

f:id:hopita:20170528123521p:plain

次に初めのユーザを作成します。

余談ですが、ここでE-mail addressをさぼって入力せずに[Save and Finish]したら、ボタンがDisableになって進まなくなりました。 更新したらまたこのページなります。ちゃんと入力しましょう。

Jenkins起動

ついにJekinsを起動できました! f:id:hopita:20170528123738p:plain

参考URL

以下のサイトを参考にさせてもらいました

続き

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編) - なんとかするから、なんとかなる

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)