2019年9月25日水曜日
ASP.NetとSqlServerでローカル環境を作ってみる。
9月 25, 2019
オフィス狛 技術部のHammarです。
最近ASP.Netを主に触れているのですが、いつもテストサーバー(実際のWindowsServerのIIS上)で動作確認をしていました。が、いまさらながらローカル環境を作ってみようと思い、Dockerとwindows IISを利用して作ってみました。
基本的なプロジェクトの構成としてはローカルIISのwebサーバーとDockerの仮想DBとのデータのやり取りを実現するという内容になります。
ちなみに開発はweb画面からのアクセスではなくAPI開発で、下記のようにJSONでHTTPリクエストを行うという流れで今回やりました。
■環境
webサーバー:windows 10 IISDB:SqlServer(Docker)
■ローカル(winsows10)のIISを有効化する
まずはローカルのIISを有効化されているか確認する必要があります。有効化されていない場合は下記手順で有効化します。
- ①コントロールパネルを開く
- ②プログラムを選択する
- ③「プログラムと機能」のWindowsの機能の有効化または無効化を選択
- ④「Windowsの機能」の一覧のインターネットインフォメーションサービスにチェックを入れてOKを選択
- ⑤デスクトップ左下のWindowsボタンを右クリック⇒コンピュータの管理を選択選択
- ⑥サービスとアプリケーションに「IISマネージャー」があることを確認する
- ⑦ブラウザにhttp://localhost/ とURLを入力し、Enterを押すと以下画面が見れる
■DockerでローカルDB環境を作る
※Dockerが既にインストールされていることが前提となりますまずはdockerを起動しておきます。
$ docker-machine start
次にdocker-compose.ymlファイルを作成し、使うDBの内容を記載します。
今回はSqlServerを使って開発したいので、下記のような記載になります。
・docker-compose.yml
version: '3' services: db: environment: - MSSQL_SA_PASSWORD=password - ACCEPT_EULA=Y - MSSQL_PID=Developer image: microsoft/mssql-server-linux:2017-latest ports: - "1433:1433" volumes: - ./mssql/:/c/var/opt/mssql/
あとは、このdocker-compose.ymlファイルがあるディレクトリで
$ docker-compose up -d
で仮想ローカルDBを作成します。あとはSSMS等のツールを利用し、テーブル作成等細かな設定を行います。
■IISのルートディレクトリにビルドしたファイルを設置する
visual studioでビルドしたファイルを下記IISのルートディレクトリに設置します。C:\inetpub\wwwroot
■IISのサイトを作成する
デスクトップ左下のWindowsボタンを右クリック⇒コンピュータの管理を選択しサービスとアプリケーションの「IISマネージャー」を選択します。
※サイトの作成方法についてはいろいろなサイトで説明があるのでここでは割愛します。
■IISサイトのサービスを開始する
サイトの「Default Web Site」で右クリック→「Webサイトの管理」→「開始」をクリックしてサイトを起動します。あとは、作成したサイトにPOSTMAN等のツールを利用して、HTTPリクエストを投げて、正常にHTTPレスポンスが返ってくればローカル環境完成となります。
細かな部分は省いたのでかなりざっくりとした記載になってしまいましたが、ローカルIISのwebサーバーとDockerの仮想DBでローカル環境作る場合に参考になればと思います。
2019年9月4日水曜日
CSSで「要素が空の時の擬似セレクタ」を使う。
9月 04, 2019
こんにちは、オフィス狛 デザイン部のSatoです。
先日webシステムのコーディングをする際に、「ここの要素の中身が空のときにCSSの内容を変えたいんだよなー」と考えることがありました。
jQueryを書けばいいのですがCSS3だけで出来たらいいなー、CSS3の擬似セレクタってなんでも出来そうだし……(雑なイメージ)と思ったので、できるか調べた所「要素が空の時の擬似セレクタ」が二つも見つかったので「要素が空の時の擬似セレクタ」のあれこれのメモ書き記事です。
※このブログ執筆時(2019/09/02)時点での情報です。
Mozilla Developer Centerなどで調べた所、要素が空の時の時のみ適用されるセレクタには「:empty」「:blank」の二種類があると分かりました。
「:empty」は完全に要素の中が空(スペース、改行もない状態)な時のみ適用される(コメントアウトした文字は要素中に入っていても大丈夫なようです)擬似クラスで、
「:blank」はスペースと改行以外の要素がない場合適用される擬似クラスであるという違いがあるそうです。
「:empty」は改行やスペースがあると使えないのか……。ちょっと不便。
少しエンジニアさんに説明するの面倒だし「:blank」使おうかなと思ったのですが、まだ主要ブラウザで未実装なようです。悔しい……。
つまり現在時点では「:empty」を使わざるをえないわけですね。
試しに「:empty」を使ってみました。(わかりにくいデモですが、最初の<div>のみ「:empty」を適用しています。
コメントアウトしている所に何か要素を入れると「:empty」を適用していない下の<div>で括った部分と背景色が同じになります。)
かなり扱いが難しいのでなかなか使いにくいですが、もしCSS3だけで要素の中身が空の時のみCSSの内容を変えたい時は擬似クラス「:empty」を思い出してください。
先日webシステムのコーディングをする際に、「ここの要素の中身が空のときにCSSの内容を変えたいんだよなー」と考えることがありました。
jQueryを書けばいいのですがCSS3だけで出来たらいいなー、CSS3の擬似セレクタってなんでも出来そうだし……(雑なイメージ)と思ったので、できるか調べた所「要素が空の時の擬似セレクタ」が二つも見つかったので「要素が空の時の擬似セレクタ」のあれこれのメモ書き記事です。
※このブログ執筆時(2019/09/02)時点での情報です。
Mozilla Developer Centerなどで調べた所、要素が空の時の時のみ適用されるセレクタには「:empty」「:blank」の二種類があると分かりました。
「:empty」は完全に要素の中が空(スペース、改行もない状態)な時のみ適用される(コメントアウトした文字は要素中に入っていても大丈夫なようです)擬似クラスで、
「:blank」はスペースと改行以外の要素がない場合適用される擬似クラスであるという違いがあるそうです。
「:empty」は改行やスペースがあると使えないのか……。ちょっと不便。
少しエンジニアさんに説明するの面倒だし「:blank」使おうかなと思ったのですが、まだ主要ブラウザで未実装なようです。悔しい……。
つまり現在時点では「:empty」を使わざるをえないわけですね。
コメントアウトしている所に何か要素を入れると「:empty」を適用していない下の<div>で括った部分と背景色が同じになります。)
かなり扱いが難しいのでなかなか使いにくいですが、もしCSS3だけで要素の中身が空の時のみCSSの内容を変えたい時は擬似クラス「:empty」を思い出してください。
2019年8月29日木曜日
ASP.NETのweb.configで定数設定する
8月 29, 2019
オフィス狛 技術部のHammarです。個人的に最近はASP.NETを使った開発を多くやっているのですが、そこでC#プログラム内の定数を外部から変更したいという要望がありました。
基本的にプログラム内の定数はビルドを行わない限り変更することはできませんが、プロジェクト内のweb.configというファイルに値を設定することにより、いちいちビルドをしなくても値を変更できるということで、その設定をやってみたのでご紹介したいと思います。
■web.configに値を記載する
まずweb.configに設定したい値を下記のようにappSettingsセクションを追記します。keyに変数名、valueに値というように記述します
<appSettings> <add key="name" value="apple" /> <add key="count" value="3" /> </appSettings>設定は上記の記載だけで完了です。形式もkey=valueの記載なのでわかりやすく簡単ですね。
■プログラム内でweb.configの設定値を呼び出す
ConfigurationManagerクラスを使う必要があるので、まずusing設定を行います。using System.Configuration;
※上記追記だけで読込ができない場合があるので、その場合は下記のようにプロジェクトの参照から追加してみてください。
【参照追加方法】
- ①「ソリューションエクスプローラー」→「参照」右クリック→「参照の追加」
- ②アセンブリ:フレームワーク内にある「System.Configuration」にチェックを入れて「OK」
ここまで整ったら後は設定を呼ぶだけです。
string fruitsName = ConfigurationManager.AppSettings["name"]; int count = int.Parse(ConfigurationManager.AppSettings["count"]);ちなみにweb.configの設定値は常にstringなので、数値を使いたい場合は上記のようにint型にParseする必要があります。
上記のようにとても簡単に設定できました。
例えば下記のようにDBの接続先情報等を設定しておいて、接続先情報だけ変更したい場合にはいちいちビルドする必要がないので楽だと思います。
<appSettings> <add key="connectionDB" value="Data Source=XX.XX.XX.XX; Initial Catalog=testdb; User Id=userid; Password=password; "/> </appSettings>
※web.config内の値を変更しても、すぐにプログラム内に適用される訳では無いのでご注意ください。
IIS的には、接続が無くなった時点で、自動でサイト再起動が発生し、値が適用される事になります。
Xcode10.2以降にアップデート後にクラッシュ「This coder requires that replaced objects be returned from initWithCoder」が発生した時の対応方法
8月 29, 2019
こんにちは、オフィス狛 モバイル開発担当 Aika-yuy です。
今回の投稿は、 Xcode10.2以降にアップデートした後にクラッシュする機能があったので、
解決方法を備忘録として残しておこうと思います。
・発生した事象
・Xcode10.1で作られていたアプリがあり、改修を行う事になったのですが、Xcodeのアップデータがあったので、10.2へアップデートした。・ビルドは問題なく通ったが、一部の機能を実行すると、アプリが落ちるようになった。
という事で、修正前のコードです。こちらを実行したところ落ちてしまい下記のエラーが出ました。
public init(_ coder: NSCoder? = nil) {
if let coder = coder {
super.init(coder: coder)!
}
}
public override init(frame:CGRect) {
super.init(frame:frame)
self.initialize()
}
Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder
・前提条件
・Objective-CとSwiftでは、呼び出し時の型が違う。・型を合わせる為に、「@objc」を付ける
・エラーになる理由
Xcode10.2になって、コンパイラーの仕様が変更され、 今まで@objc推論が行われていたが、行われなくなったのでエラーになってしまったようです。・対応方法
「@objc」が自動で付かなくなったので、必要ならば明示的に付けないと、Objective-CからSwiftをCallする時に落ちてしまいます。該当する箇所を修正しました。
@objc public init(_ coder: NSCoder? = nil) {
if let coder = coder {
super.init(coder: coder)!
}
}
@objc public override init(frame:CGRect) {
super.init(frame:frame)
self.initialize()
}
@objcをつけることで、使用することができました。
2019年8月16日金曜日
node.jsでの日付時刻処理(moment.jsを使ってみる)
8月 16, 2019
オフィス狛 技術部のJoeです。
node.js(JavaScript)では日付時刻の扱いが難しく、特に文字列の時刻などを比較や計算するときはいつも調べているので、備忘録を兼ねてブログに書いておこうと思います。
また、日付時刻操作ではmoment.jsという便利なライブラリがあるので、同じ処理をmoment.jsでも書いてみます。
① 時刻(文字列)の比較と差分
【ライブラリを使用しない場合】
// Dateオブジェクトを生成
const dateTime1 = new Date('2019-08-01 09:00');
const dateTime2 = new Date('2019-08-01 14:00');
// 大小確認
if (dateTime1 < dateTime2) {
処理;
}
// 一致確認の場合は「getTime()」でミリ秒形式に変換する
if (dateTime1.getTime() === dateTime2.getTime()) {
処理;
}
// 差分算出の場合も「getTime()」でミリ秒形式に変換して計算、結果のミリ秒を欲しい単位に計算する
const diffTime = dateTime2.getTime() - dateTime1.getTime(); // ミリ秒で差分を算出
const diffSecond = Math.floor(diffTime / 1000 / 60); // 結果のミリ秒を分に変換
console.log(diffSecond); // 300(分)
【moment.jsを使用した場合】
const moment = require('moment');
// momentオブジェクトを生成
const dateTime1 = moment('2019-08-01 09:00');
const dateTime2 = moment('2019-08-01 14:00');
// 比較(<:isBefore >:isAfter <=:isSameOrBefore >=:isSameOrAfter)
if (moment(dateTime1).isBefore(dateTime2)) {
処理;
}
// 一致(第2パラメータで年から比較したい単位までを指定可能)
if (moment(dateTime1).isSame(dateTime2, 'minute')) { // 年~分までの一致確認
処理;
}
// 差分(第2パラメータで取得したい差分の単位を指定可能)
const diffTime = dateTime2.diff(dateTime1, 'minutes'); // 差分を分で取得
console.log(diffTime); // 300(分)
② UTCからJSTに変換
【ライブラリを使用しない場合】文字列の日時はUTCの時間と仮定しています。
// Dateオブジェクトを生成
const dateTime1 = new Date('2019-08-01 09:00'); // UTCの日時と仮定しています
// ミリ秒にして9時間(32,400,000ミリ秒)足す
dateTime1.setTime(dateTime1.getTime() + 1000 * 60 * 60 * 9);
console.log(dateTime1); // Thu Aug 01 2019 18:00:00 GMT+0900 (日本標準時)
タイムゾーンを扱う場合は、「moment-timezone」を使います。
【moment.jsを使用した場合】
const momentTimezone = require('moment-timezone');
// UTCのmomentオブジェクトを生成
const dateTimeUtc = momentTimezone.tz('2019-08-01 09:00:11', 'UTC');
// JSTに変換(フォーマットも併せて変換)
const dateTimeJst = momentTimezone(dateTimeUtc).tz('Asia/Tokyo').format('YYYY/MM/DD HH:mm:ss');
console.log(dateTimeJst); // 2019/08/01 18:00:11
ご紹介したmoment.jsの機能はほんの一部ですので、日付時刻操作で悩んだらぜひ使ってみてください。
2019年8月3日土曜日
テンプレート内のclass属性を動的に変える(Angular)
8月 03, 2019
オフィス狛 技術部のKoma(Twitterアカウントの中の人&CEO)です。
今回はAngularの軽い小ネタを紹介します。
テンプレート(html)内のclass属性を動的に変えたい、という事はよくあると思います。
特に、入力項目にエラーがあった場合のエラーメッセージ、などがそうですね。
(1)ngIfを使った方法
まずは、ngIfを使った方法から。<div *ngIf="loginIdInvalid; else loginIdValidBlock" class="form-label alert alert-danger"> 使用出来ないログインIDです。 </div> <ng-template #loginIdValidBlock> <div class="form-label correct correct-info"> 使用可能なログインIDです。 </div> </ng-template>
「loginIdInvalid」がコンポーネント側(TypeScript側)で定義している変数で、エラーの場合、trueになると思ってください。
これをclass属性を動的に変えているか、と言われると微妙ですが、結果的にclass属性を使い分けている事になります。
困った時の「ngIf」ってやつですね。
(2)[class.xxxxx]を使った場合
次は、[class.xxxxx]を使った場合です。
<div class= "form-label"
[class.alert]="loginIdInvalid"
[class.alert-danger]="loginIdInvalid"
[class.correct]="!loginIdInvalid"
[class.correct-info]="!loginIdInvalid">
{{ message }}
</div>
[class.xxxxx]の「xxxxx」にクラス名を指定し、そのクラスを使用するかどうかが、イコールの後ろの条件式(trueかfalseが返却されるもの)となります。
より簡潔にする為、メッセージは変数にして、コンポーネント側(TypeScript側)で設定するようにしました。
「form-label」は正常でもエラーでも共通して使うので、htmlのclass属性として切り出しました。
ちょっと冗長な気もしますが、良く使用されている手法かと思います。
(3)[ngClass]を使った場合
続いて、[ngClass]を使った場合です。
<div class= "form-label"
[ngClass]="{'alert alert-danger' : loginIdInvalid, 'correct correct-info' : !loginIdInvalid}">
{{ message }}
</div>
[ngClass]は、クラスを複数一気に指定できます。連想配列形式で「{'xxxx' : '1111', 'yyyy' : '2222'}」のように設定します。
個人的には一番良く使うのですが、正直、こうして他と比べると、ちょっと見難いと言うか、テンプレート側が複雑になるのは、あまり良くないなぁ、と感じています。
(4)[class]を使った場合
最後に、[class]を使った場合です。[class]を使う場合、コンポーネント側(TypeScript側)にも少しロジックを書く必要があります。
まずはテンプレート側の設定です。
<div [class]="loginIdClass">
{{ message }}
</div>
続いて、コンポーネント側(TypeScript側)の設定です。
get loginIdClass() {
return this.loginIdInvalid
? 'form-label alert alert-danger'
: 'form-label correct correct-info';
}
テンプレート側はだいぶスッキリしました。実はこの方式は個人的にはあまり使っていなくて、
今回、ブログにする為に使ってみたのですが、割と良いですね。
ただ、htmlのclassタグを同時に使用出来ないので、共通的のクラス(form-label)の記述を敢えて複数回記載することの面倒さと、本来はhtml、つまり画面表示に関わるclass属性内の文字列をコンポーネント側(TypeScript側)に記載している、と言う気持ち悪さは少し残ります。
以上となります。
それでは、良いAngularライフを!
2019年8月2日金曜日
Illustratorのトレース機能で出来るだけ楽にロゴをトレスする。
8月 02, 2019
こんにちは、オフィス狛 デザイン部のSatoです。
今回は、Illustratorを使ってjpgやpngのロゴなどの簡単な画像を簡単にトレースする方法をご紹介したいと思います。(Illustrator使ってる方はみんな知ってる気でいたんですが意外と知らない方も多いようなので)
調節は必要ですが、ペンツールでトレースするよりも早くトレースできるので時短になりますよ!
今回使用する画像です。(架空のサービスのロゴマークです。)

まずこの画像をイラレで読み込みます。
画像を選択した後、コントロールパネルの「画像トレース」をクリックします。

トレース処理が終了後、コントロールパネルの「プリセット」を変えたりしていい感じのプリセットを探します。
一番元画像に近いプリセットを選択後、コントロールパネルの「拡張」ボタンをクリックすればパスにしてくれます!
単純な画像ならそのまま調整せずに綺麗にトレースしてくれます。
複雑な画像で「画像トレース」機能を使う場合は「ウインドウ」>「画像トレース」を選択して画像トレースパネルで調整しましょう!仕上がりを見ながら作業できるため便利です。

昔フォトショップで描いた鶏の絵をトレースしてみました!
絶対ペンツールでトレースしたくないような無駄にテクスチャなど使った絵を細かく再現してくれましたー!ありがたすぎる。


この方法を使うとアナログのラフスケッチを簡単にパス化したり自分で撮影した写真をトレースしたものを元にアイコンを作れたりして便利です!ぜひこの機能を使ってみてください!
登録:
投稿 (Atom)






