読者です 読者をやめる 読者になる 読者になる

Code Log

プログラミングの勉強メモを残していきます。

TypeScriptの関数の使い方

TypeScriptのインストール方法

TypeScriptをインストールするには以下のコマンドを実行します。

npm install -g typescript

-gオプションは、TypeScriptコンパイラをグローバルにインストールするということです。

TypeScriptコンパイラのバージョンを確認するには以下のコマンドを実行します。

$ tsc --version
Version 2.2.1

TypeScriptで書かれたコードをJavaScriptに変換するには、以下のコマンドを実行します。

tsc main.ts

生成されたJavaScriptとTypeScriptをマッピングするには、以下のコマンドを実行します。

tsc --sourcemap main.ts

TypeScriptコンパイラに-wオプションを渡せば、ソースコードが変更されるたびに自動的にJavaScriptファイルに変換します。

tsc -w *.ts

関数の書き方

TypeScriptでは関数に型を指定することができます。

function calcTax(state: string, income: number, dependents: number): number {
    if (state == 'NY') {
        return income * 0.06 - dependents * 500;
    } else if (state == 'NJ') {
        return income * 0.05 - dependents * 300;
    }   
}

var tax: number = calcTax('NJ', 50000, 2);
console.log(tax);

無名関数の使い方

無名関数を使うときはfunctionキーワードは必要ありません。

function StockQuoteGeneratorArrow(symbol: string) {
    this.symbol = symbol;
    setInterval(() => {
        console.log("StockQuoteGeneratorArrow the price quote for is " + Math.random());
    }, 1000);
}

var stockQuoteGeneratorArrow = new StockQuoteGeneratorArrow("IBM");

Spring Bootで簡単なRESTアプリを作成する


Spring Bootを使ってREST Serviceを作るのは非常に簡単です。


まず、Beanクラスを作成します。

package com.example;

import java.io.Serializable;

public class Message implements Serializable {
	private String text;

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}
	
}

次に、RESTコントローラーを作ります。

package com.example;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/messages")
public class MessageController {
	final List<Message> messages = new CopyOnWriteArrayList<>();
	
	@RequestMapping(method = RequestMethod.GET)
	public List<Message> getMessages() {
		if (messages.size() == 0) {
			Message msg = new Message();
			msg.setText("this is example");
			messages.add(msg);
		}
		return messages;
	}
	
	@RequestMapping(method = RequestMethod.POST)
	public Message postMessages(@RequestBody Message message) {
		messages.add(message);
		return message;
	}
}

これだけ。
で、

http://localhost:8080/messages

にリクエストを投げると、

[{"text":"this is example"}]

というJSONが返ってきます。

C#でシャットダウンのイベントを受け取って処理を実行する

シャットダウンする直前に処理を走らせる作業を実行したいと考えています。

ProエディションならGroup Policyに記述を追加すればシャットダウンに引っかけてスクリプトを実行することができるのですが、Home Editionだとうまくいきません。
なので、自作スクリプトでなんとかするしかなさそうです。

こんな感じで.NETのプログラムを作ります。
これで出力したexeを走らせておけば大丈夫です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;

namespace folder_backup
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Hide();
        }
        private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
        {
            string s = "";
            if (e.Reason == SessionEndReasons.Logoff)
            {
                s = "ログオフしようとしています。";
            }
            else if (e.Reason == SessionEndReasons.SystemShutdown)
            {
                s = "シャットダウンしようとしています。";
            }
            if (MessageBox.Show(s + "\n\nキャンセルしますか?",
                "質問", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                //キャンセルする
                e.Cancel = true;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SystemEvents.SessionEnding +=
            new SessionEndingEventHandler(SystemEvents_SessionEnding);
        }
    }

}

MacにTomcatをインストールしてEclipseから動かしてみる。


Homebrewでインストールできます。

``
$ brew install tomcat

==> Using the sandbox
==> Downloading https://www.apache.org/dyn/closer.cgi?path=tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
==> Best Mirror http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
######################################################################## 100.0%
🍺 /usr/local/Cellar/tomcat/8.5.9: 634 files, 12.5M, built in 6 seconds
``

以下のコマンドでTomcatを起動させることができます。

``
/usr/local/Cellar/tomcat/8.5.9/bin/catalina start
``

localhost:8080

でTomcatのホーム画面を見ることができます。


CATALINA_HOMEですが、以下にあります。

``
$ pwd
/usr/local/Cellar/tomcat/8.5.9/libexec
```

Eclipseの「環境設定」でTomcat > で、Tomcatホームに設定するのも上記のディレクトリです。
Macの場合、左上の「Eclipse」というところをクリックすると、環境設定画面に飛ぶことができます。

環境設定でTomcatを設定したあとに、パッケージエクスプローラーのプロジェクト名を右クリックします。
そこで、Properties > ServerでTomcatを選択し、

「Run As」 > 「Run on Server」

でEclipseのTomcatアプリをTomcatで起動させることができます。

f:id:sho322:20161210181138p:plain

SCSSで変数を定義したり、@mixinを使ってみる

変数を定義する

変数を定義するのは簡単です。 [$変数名]を[:]で区切って、値を入れます。

後は、変数名をプロパティに指定すれば、その値が反映されます。

@charset 'utf-8';

$mainColor : #2576E5;

header {
  background-color: $mainColor;
}

.main {
  p {
    color : $mainColor;
  }
}

CSSには以下のように出力されます

header {
  background-color: #2576E5; }

.main p {
  color: #2576E5; }

mixin

mixinを使えば、定義の塊を作ることができます。

@charset 'utf-8';

@mixin blueText {
  color:blue;
  font-size:20px;
}

@mixin redText {
  color:red;
  font-size:30px;
}

.textBlue {
  @include blueText;
}


.textRed {
  @include redText;
}

.textRed2 {
  @include redText;
}

@mixinと書いて、そこにそこにCSSのかたまりを定義します。 それを、@includeとすることで、取り込むことができます。

XCodeがUpdateされたときは、Swiftのバージョンを確認する方法

以下のコマンドで確認できる。

$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -v

Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)
Target: x86_64-apple-macosx10.9
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb "--repl=-target x86_64-apple-macosx10.9 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -color-diagnostics"

Swift3にアップデートしたらCGRectMakeが使えず、'CGRectMake' is unavailable in Swiftとエラーが出るようになった。

XCodeをUpdateしてから、本に書いてあるサンプルのほとんどが陳腐化してしまった。
CGRectMakeという、座標を指定する関数が使えなくなっていた。

「'CGRectMake' is unavailable in Swift」というエラーが出るようになってしまったのだ。
このエラーに対応するには、CGRectをWrapする関数を作ればよい。


http://stackoverflow.com/questions/30692096/using-variables-in-cgrectmake-swift-uikit

func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

これを使って、Labelを移動させたりLabelを作る処理を買いてみる。

//関数名は変になったすまん。clickMoveが適切
@IBAction func clickMake(_ sender: AnyObject) {

    let rect = CGRectMake(
        labelMove.frame.origin.x,
        labelMove.frame.origin.y + 30,
        labelMove.frame.width + 50,
        labelMove.frame.height + 30)
    labelMove.frame = rect
    labelMove.text = "move label"
    
}

@IBAction func clickCreate(_ sender: AnyObject) {
    let label = UILabel()
    let rect = CGRectMake(
        100,
        100,
        150,
        30)
    label.frame = rect
    label.text = "create label"
    self.view.addSubview(label)
}

func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}
    

Xcodeではじめる 簡単iPhoneアプリ開発[Xcode 8 & Swift 3対応]

Xcodeではじめる 簡単iPhoneアプリ開発[Xcode 8 & Swift 3対応]

Node.jsでWebページをダウンロードする


Node.jsでWebページをダウンロードするサンプルを写経してみました。

download(
  "http://www.google.co.jp",
  "google.html",
  function(){console.log("ok, google");});

download(
  "http://www.yahoo.co.jp",
  "yahoo.html",
  function(){console.log("ok, yahoo");});

function download(url, savepath, callback) {
	var http = require('http');
	var fs = require('fs');
	var outfile = fs.createWriteStream(savepath);
	var req = http.get(url, function(res) {
		res.pipe(outfile);
		res.on('end', function() {
			outfile.close();
			callback();
		});
	});
}

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

npm -g でグローバルインストールしたときに、モジュールがインストールされるパスを調べる


npmとは、Node.jsのモジュールを管理するためのパッケージマネージャーです。
モジュールがインストールされる場所ですが、「npm install」を実行すると、このコマンドを実行したカレントディレクトリにモジュールがダウンロードされます。

つまり、そのモジュールは別のプロジェクトからは利用できないということです。

そこで、よく使うモジュールで、毎回インストールするのは面倒だという場合、グローバルインストールという手法を使います。
グローバルインストールすると、全てのプロジェクトから利用することができます。

npm install -g (モジュール名)

とコマンドを打てば、グローバルインストールすることができます。

グローバルインストール先、つまりどこにモジュールがインストールされているのか調べたい場合は、

$ npm root -g
/usr/local/lib/node_modules

また、Node.jsがモジュールを探す時に検索するパスを調べてみましょう。

以下のコマンドで、Node.jsがモジュールを探しに行くパスを表示することができます。

$ node -e "console.log(global.module.paths)"
[ '/home/vagrant/node_modules',
  '/home/node_modules',
  '/node_modules' ]

また、これに加えて、NODE_PATHも検索するので、環境変数「NODE_PATH」にグローバルなパスを登録することで、グローバルインストールしたモジュールのパスを正しく検索することができるようになります。

$ export NODE_PATH=/usr/local/lib/node_modules

Swiftでボタンを押したタイミングでキーボードを下げる


入力する時にキーボードは必要ですが、いつまでもキーボードが表示されたままだと格好悪いので、
入力が完了したタイミングでキーボードを隠す処理を実装してみましょう。

ボタンを押したタイミングでキーボードを下げる処理は以下のように実装します。

@IBAction func tapActionButton(sender: AnyObject) {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(textField.text, forKey: "text")
    userDefaults.synchronize()
    view.endEditing(true)
    
}

値をNSUserDefaultに保存して、view.endEditing()でキーボードを下げます。

Swiftポケットリファレンス

Swiftポケットリファレンス