気まぐれな備忘録(仮)

いちようSEしてるので、プログラミングの備忘録的なものを書いてます

Maven依存ライブラリの「ソースコード」を指定ディレクトリに出力する

ほんとーに備忘録。
pom.xmlで指定したライブラリを指定ディレクトリに出力するには下記コマンドを実行すれば良い。

mvn dependency:copy-dependencies -DoutputDirectory=path-to-output

同様にソースコード(を固めたjar)も出力したい!と思ってぐぐってみても、なかなかヒットしない。
最終的にmavenの本家サイトにたどり着く。
Apache Maven Dependency Plugin – dependency:copy-dependencies

mvn dependency:copy-dependencies -Dclassifier=sources -DoutputDirectory=path-to-output

classiferオプションを指定すれば良いみたい。

VagrantとDockerを使ってRedis, Elasticsearch, MySQLをセットアップする

前回に引き続きVagrantネタを。

Redis + Elasticsearchを利用した開発環境をローカルマシンに構築しようと思い、ググっていたところ以下の記事を見つけた。postd.cc

Redis + Elasticsearchでまさに求めていた内容!ということで試してみたが、docker imageのpullが失敗してうまくできない。。ということで、ちょっと修正してみた。
また、元記事ではUbuntuにてVMを起動しDBにPostgreSQLを利用してるが、CentOSで動かしたいのとDBはMySQLを使いたかったので、こちらも合わせて変更した。

ちなみに動作確認マシンはMacBookProです。

事前準備

まずは、Homebrew, VirtualBox, Vagrantは元記事と同様にインストール。

プロキシVMのVagrantfile

プロキシVMのVagrantfile(ファイル名はVagrantfile.proxy)は以下のように修正

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hfm4/centos-with-docker"
  config.vm.provision "docker"
  config.vm.provision "shell", inline:
    "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"

  config.vm.network :forwarded_port, guest: 6379, host: 6379
  config.vm.network :forwarded_port, guest: 3306, host: 3306
  config.vm.network :forwarded_port, guest: 9200, host: 9200
end

プロキシVM用のイメージはhfm4/centos-with-dockerのCentOS6.5を使用している。このBoxを選んだ理由は、Discover Vagrant Boxes | Atlas by HashiCorpにて
CentOS+dockerのキーワードでヒットしたから。他のBoxでもいいのかも。
なお、Port ForwardingはPostgreSQLの5432をMySQLの3306に変更。

DockerコンテナのVagrantfile

次に、DockerコンテナのVagrantfile(ファイル名はVagrantfile)はコチラ。

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define "redis" do |v|
    v.vm.provider "docker" do |d|
      d.image = "redis"
      d.volumes = ["/var/docker/redis:/data"]
      d.ports = ["6379:6379"]
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end

  config.vm.define "elasticsearch" do |v|
    v.vm.provider "docker" do |d|
      d.image = "elasticsearch"
      d.ports = ["9200:9200"]
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end

  config.vm.define "mysql" do |v|
    v.vm.provider "docker" do |d|
      d.image = "mysql"
      d.volumes = ["/var/docker/mysql:/data"]
      d.ports = ["3306:3306"]
      d.env = {
        MYSQL_DATABASE: "test_db",
        MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      }
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end
end

元記事からの変更点としては、各コンテナのimageの値を変更。あとはPostgreSQLMySQLに変更。MySQL環境変数(MYSQL_DATABASEなど)はここmysql Repository | Docker Hub Registry - Repositories of Docker ImagesのEnvironment Variablesを参考に設定。上記の設定はパスワード未指定でログイン可能にしているので、流用時はよしなに設定を変更してください。

起動&停止

あとは、元記事と同じくvagrantを起動。

$ vagrant up --provider=docker

vagrant up」だけではプロキシVMが起動しないようなので、providerオプションは必要みたい。
初回実行時はプロキシVMとDockerコンテナのDLに時間がかかるのでしばし待つ。エラーが発生しなければ、下記コマンドで状態を確認できる。

$ vagrant status
Current machine states:

redis                     running (docker)
elasticsearch             running (docker)
mysql                     running (docker)

global-statusを指定するとプロキシVMも確認できる。

$ vagrant global-status

id       name          provider   state    directory
------------------------------------------------------------------------------------------------
29d4e38  default       virtualbox running  /Users/kajitiluna/_Work/vagrant
5c659c2  mysql         docker     running  /Users/kajitiluna/_Work/vagrant
7d841ac  redis         docker     running  /Users/kajitiluna/_Work/vagrant
4f5cab0  elasticsearch docker     running  /Users/kajitiluna/_Work/vagrant

なお、「vagrant halt」で停止するとプロキシVMだけは止まらないので、プロキシVMを止める場合は追加で「vagrant halt <id>」を実行する必要あり。

Vagrant環境でredis3.0を構築

Redis3.0がStableになったとのことで、Vagrant環境にredisを入れてみた。
ちなみに私はvagrantに詳しくないので、どこかから拾ってきたVagrantfileを流用している。
もっといい、ちゃんとしたやり方がありましたら、どなたか教えてください。

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "centos6.5.3"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/" +
    "releases/download/v6.5.3/centos65-x86_64-20140116.box"
# (途中の設定は中略)
  config.vm.provision :shell, path: "provision/redis-server.sh"
end

ここでは、

config.vm.provision :shell, path: "provision/redis-server.sh"

を追加しただけ。config.vm.provisionにて、redisをインストールするスクリプトを読み込んでいる。


そしてこちらが、メインのスクリプト
redisをDLした後、/opt/配下でmake実行、ついでにサービス設定も行っている。

provision/redis-server.sh

#!/bin/bash

redis="redis-3.0.0"
redis_home="/opt/${redis}"

if [[ ! -d ${redis_home} ]]; then
  wget http://download.redis.io/releases/${redis}.tar.gz
  tar xzvf ${redis}.tar.gz
  mv ${redis} /opt/
  pushd ${redis_home}
  make

  mkdir -p /etc/redis
  mkdir -p /var/log/redis
  cp -p ${redis_home}/utils/redis_init_script /etc/init.d/redis
  cp -p ${redis_home}/redis.conf /etc/redis/6379.conf

  sed -i -e "s/daemonize no/daemonize yes/g" /etc/redis/6379.conf
  sed -i -e "s/pidfile \/var\/run\/redis.pid/pidfile \/var\/run\/redis_6379.pid/g" /etc/redis/6379.conf
  sed -i -e "s/logfile \"\"/logfile \/var\/log\/redis\/redis.log/g" /etc/redis/6379.conf
  sed -i -e "s/dir .\//dir \/var\/log\/redis\//g" /etc/redis/6379.conf

  sed -i -e "3i # chkconfig:   - 85 15" /etc/init.d/redis
  sed -i -e "4i # description:  redis-server" /etc/init.d/redis
  sed -i -e "5i # processname: redis" /etc/init.d/redis

  ln -s ${redis_home}/src/redis-server /usr/local/bin/redis-server
  ln -s ${redis_home}/src/redis-cli /usr/local/bin/redis-cli

  /etc/init.d/redis start
  chkconfig --add redis
  chkconfig redis on

  popd
fi

redis3.0のrpmが見つからなかったので、redisの公式サイトからtar.gzをダウンロードする。

wget http://download.redis.io/releases/${redis}.tar.gz

${redis}は適宜インストールしたいバージョンに書き換えてください。

そして/opt配下にインストール。

  tar xzvf ${redis}.tar.gz
  mv ${redis} /opt/
  pushd ${redis_home}
  make

ホントはmake testすべきなんだけど、tclを入れる必要があったり、ちょっと手間だったので飛ばした。

redisのインストール自体はここまで。とってもカンタン。
以降はredisをサービス起動するための設定。ここからが一手間。
vagrantにログインして直接設定すれば苦労しないけど、そしたらvagrant使っている意味ないからね。

ちなみにここからの設定はhttp://blog.livedoor.jp/tattyamm/archives/4147335.htmlを参考にしました。

  mkdir -p /etc/redis
  mkdir -p /var/log/redis
  cp -p ${redis_home}/utils/redis_init_script /etc/init.d/redis
  cp -p ${redis_home}/redis.conf /etc/redis/6379.conf

まずは、必要なディレクトリを作成して、サービス起動用のスクリプトと設定ファイルをコピー。

  sed -i -e "s/daemonize no/daemonize yes/g" /etc/redis/6379.conf
  sed -i -e "s/pidfile \/var\/run\/redis.pid/pidfile \/var\/run\/redis_6379.pid/g" /etc/redis/6379.conf
  sed -i -e "s/logfile \"\"/logfile \/var\/log\/redis\/redis.log/g" /etc/redis/6379.conf
  sed -i -e "s/dir .\//dir \/var\/log\/redis\//g" /etc/redis/6379.conf

設定ファイルを気合で書き換え。書き換え後の設定は以下のようになります。

daemonize yes # デーモン化の設定を有効化
pidfile /var/run/redis_6379.pid # pidファイル名を変更
logfile /var/log/redis/redis.log # 出力先を標準出力からファイルに変更
dir /var/log/redis/ # dumpファイルを出力するディレクトリを変更

次に起動スクリプトを書き換え。

  sed -i -e "3i # chkconfig:   - 85 15" /etc/init.d/redis
  sed -i -e "4i # description:  redis-server" /etc/init.d/redis
  sed -i -e "5i # processname: redis" /etc/init.d/redis

  ln -s ${redis_home}/src/redis-server /usr/local/bin/redis-server
  ln -s ${redis_home}/src/redis-cli /usr/local/bin/redis-cli

chkconfigに必要な設定を追加しているのと、あとは起動スクリプト内に記載されているパスにシンボリックリンクを追加。

ここまでで、vagrant upしてログインすると、既にredis-serverが起動している状態になっていた。

ホントはredis-clusterを構築したいなぁと思いつつ、今日はここまで。

テキストファイルを指定文字数ごとに読み込む

ぐぐってもすぐにはヒットしなかったので、備忘録的にメモる。

テキストファイルを1行ごとに読み込むのはBufferedReader#readLine()が有名。
今回やりたいのは、指定文字数ごと、たとえば100文字ごとにファイルを読み込むこと。

Reader#read()が1文字だけ読み込むので、
これを100回ループさせればいいのだが、性能悪そう。

ということで、標準APIを調べてみたら、Reader#read(char[])が見つかった。
引数のchar
の配列長を100にすれば100文字ごとに読み込むみたい。

試しに1GBのテキスト1ファイルを
read()とread(char[])でそれぞれ読み込んだら、
前者が70秒近くかかったが、後者は5秒程度で済んだ。

確かにread()は性能わるぽとOracleのページにも紹介されていたので、
read(char[])を使う方がよさそう。

ちなみに動作確認で実装したコードはGitHubに公開済み。
さすがに1GBのテキストは上げてないが。
https://github.com/kajitiluna/ReadTextSample

CountDownLatchを改造して、別スレッドの複数並列処理の結果に応じて処理する

Javaのconcurrentパッケージには同期処理を行うための便利な機能が用意されている。

今回注目したのはCountDownLatch.

CountDownLatchを使うと、他の複数スレッドの処理の完了を待ってからメインのスレッドで処理を継続できる。
こんなカンジで。

public void execute() {
    CountDownLatch latch = new CountDownLatch(3);
    Runnable otherThreadTask1 = this.doTask(task1, latch);
    Runnable otherThreadTask2 = this.doTask(task2, latch);
    Runnable otherThreadTask3 = this.doTask(task3, latch);

    // 別スレッドでの処理を登録
    ExecutorService service = Executors.newFixedThreadPool(3);
    service.submit(otherThreadTask1);
    service.submit(otherThreadTask2);
    service.submit(otherThreadTask3);

    try {
        // task1〜3の処理が完了するまで待つ
        latch.await();

        // 以降の処理を行う
        doSomething();
    } catch (InterruptedException iEx) {
        // 中断処理
    }
}

// 別スレッドで行うタスクを生成する。
public Runnable doTask(Runnable runnable, CountDownLatch latch) {
    final Runnable mainTask = runnable;
    final CountDownLatch targetLatch = latch;
    Runnable task = new Runnable() {
        public void run() {
            mainTask.run();
            // 処理完了を通知
            targetLatch.countDown();
        }
    };

    return task;
}

CountDownLatchそのもの使い方について触れたい訳ではないので、
この辺の話はこちらにお任せして。


単純に複数スレッドの処理完了を待つのであればこれで問題ないが、実際にはもうちょっと複雑な状況が発生する。

  • 別スレッドの処理のうち、どれか1つが完了すれば、await()の待ち処理を解除したい
  • でも、別スレッドの処理が全て異常終了することもあるから、このときは全て異常終了するのを待ちたい

こういった状況では、単にCountDownLatchを使用するのでは対応できない。
他スレッドの異常終了を検知するための同期機構が必要になる。
また、正常終了/異常終了の結果をもとに何かしら処理することになるので、
await()を呼び出したスレッドで、これらの結果を取得する同期機構も必要になったり。。


もう少し、具体的にすると、以下のような状況になる。

レプリケートしている複数のサーバに同時に接続して、どこかのサーバに接続成功したら、その接続先に対して処理を行う。全てのサーバに接続できなかった場合は数回リトライして、だめなら処理中断。
並列処理にせずに順番にサーバに接続を試みると、タイムアウトで時間がかかるし、しかも接続先が多くなるので、異常時はそのタイムアウトがサーバ台数発生する、そんなの運用にたえられないよ。
どうせ、どこかは活きているはずだから、そこにすぐ繋げるようにしてよ。。

といった、ちょっと面倒くさい要望。


要は、CountDownLatchのawait()実行後、正常/異常で処理を分岐させたい。
正常処理は1つのcountDown()でawait()ロックを解放させたいが、
異常処理は3つのcountDown()でawait()ロックを解放させたい。
そして、ロック解放後は、正常/異常をCountDownLatchが保持しているはずだから、
そこから正常/異常を判断したい。


標準APIを調べてみても、このようなことができるクラスが見つからなかった(あるいは単なる知識不足か)ので、CountDownLatchで上手いことすれば出来るか確認するために、実装を覗いてみた。

詳細は省略するが、CountDownLatchの同期機構は内部で利用しているAbstractQueuedSynchronizerが担っている。
そしてAbstractQueuedSynchronizerは、保持しているstateパラメータで同期をとっている。
このstateパラメータはint型で、外部から利用できるのはこのパラメータ1つのみ。
なお、具体的な同期メカニズムはjava内部に隠ぺいされていた。

つまり、CountDownLatchの同期機構は1パラメータでロック取得/解放をしている。
ここで目的としている、正常/異常といった複数パラメータの管理はできないことがわかった。


ということで、こういった処理ができるクラスConditionLatchを作ってみた。
方針としては、AbstractQueuedSynchronizerの同期機構を利用して、
1つのstateパラメータで複数の状態を無理やり管理させる。
どうせ、int型の最大値からcountDownさせることは殆どないのだから、その余りそうな箇所を有効活用してみた。

ConditionLatchのコードはGitHubに公開したので、詳細はそちらをみてもらいたい。
https://github.com/kajitiluna/ConditionLatch


このクラスを使用することで、上記の状況は以下のような実装で対応できる。

public void execute() {
    // 正常処理のcountを1で、異常処理のcountを3でlatchを作成
    ConditionLatch<SomeConnection, SomeException> latch = new ConditionLatch<>(1, 3);
    Runnable task1 = this.connectTask(server1, latch);
    Runnable task2 = this.connectTask(server2, latch);
    Runnable task3 = this.connectTask(server3, latch);

    // 別スレッドでの処理を登録
    ExecutorService service = Executors.newFixedThreadPool(3);
    service.submit(task1);
    service.submit(task2);
    service.submit(task3);

    try {
        List<SomeConnection> resultList = latch.await();
        SomeConnection connection = resultList.get(0);
        // 接続情報をもとに以降の処理を行う
        doSomething(connection);
    } catch (SubmittedFailureResultException sfEx) {
        // 処理失敗時の処理
    } catch (InterruptedException iEx) {
        // Interrupt時の処理
    }
}

public Runnable connectTask(Server server, ConditionLatch<?, ?> latch) {
    final Server targetServer = server;
    final ConditionLatch<?, ?> targetLatch = latch;
    Runnable task = new Runnable() {
        @Override
        public void run() {
            try {
                SomeConnection connection = connectServer(targetServer);
                // 接続できたときに接続情報をlatchに渡す
                targetLatch.submit(connection); // submit()で正常処理をcountDown
            } catch (SomeException ex) {
                // 接続に失敗したとき
                targetLatch.submitForFail(ex); // submitForFail()で異常処理をcountDown
            }
        }
    };

    return task;
}

これで、正常/異常で処理を分けるCountDownLatchを簡単に実装できる。

ちなみに、今回は同期パラメータがintであるAbstractQueuedSynchronizerを使用したが、
実装は同じでパラメータ型をlongに変えただけのAbstractQueuedLongSynchronizerというのもある。
広い範囲が必要なら、こちらのクラスを使用するほうがいいかも。

まずはコーディング規約を学ぶ

こんにちは。kajitilunaです。

新人/若手向け、これだけは知っとけTips25 Advent Calendar 2012
の14日目の小ネタを。


チームでのシステム開発に関わると、
コーディング規約について聞いたことや、
あるいはいやいや従わされたことがあると思います。

または、ある程度しっかりしたチームや組織だったら、
研修などで叩き込まれることと思います。


今回は、
システムのちょっとしたツールを作って、とか言われて、
それをシステムのメインとは別の言語で作るんだけど、
自分その言語に詳しくないぞ、、、といったケースを考えます。

前提

  • インデントを揃えて見やすくする。
  • その処理を端的に言い表す単語を用いる。
  • 名詞、動詞、形容詞を使い分ける。
  • ローマ字表記な名前付けを避ける。

、、、など、後々見る人にとって分かり易いものを心がける気持ちが必要です。

要は他人への思いやり、いや、むしろ明日の自分への思いやりです。

それがないとコーディング規約を守る、というレールに乗らないので。


チーム、組織にその言語のコーディング規約が存在しないか確認

ええ。いわずもがなでございます。
そして大半の場合、チームの誰も知らないのが世の常でございます。

ググる

言語名と「コーディング規約」という単語合わせでググってみましょう。
チームが頼りにならないのならグーグル先生に頼りましょう。

チームの規約がないのであれば、世間一般的なしきたりに従ってください。

JavaC++, C#などはエンタープライズ開発で頻繁に扱われるので、たくさんヒットします。
JavaScriptVBScriptなどは言語のクセが強いので、特有のルールがあります。

これらに従えば、たいてい失敗はしません。

規約の遵守率=プログラムの品質

経験上、こう言っちゃってもいいくらいです。

一般的な規約に従っていないコードは、
その言語に疎い人が作った可能性が高く、不具合も多い傾向にあります。
少なくても、規約を守っていないけど設計がちゃんとしている、ようなコードには
一度も出会ったことはありません

そもそも、コーディング規約そのものが不具合を回避するための指針なので。


ちなみに私自身、そういったコードに出会ったときは、
品質を疑って中身をチェックするようにしています。

逆に、言語にあまり慣れていなくても、
その言語の規約に従えば、その言語の扱い方が(なんとなくですが)身に付きます。

ということで

初めて扱う言語は、文法と一緒に規約を学んでみましょう。

作業効率化の時短ショートカットを厳選紹介

みなさん、こんにちは。kajitilunaです。

久々の投稿は「新人/若手向け、これだけは知っとけTips25 Advent Calendar 2012」の3日目を書きます。
ちなみに2日目はTsukanoさんの「新人向け、Eclipse便利機能(入門)」でした。



先日、友人(非IT系企業に就職)との会話の中で、ショートカットキーの話題があがりました。

話を聞くと、
「Ctrl+c(コピー)」と「Ctrl+v(ペースト)」は使っているけど、
それ以外は知らないとのこと。

ファイルの保存は、
メニューのファイルからか、保存アイコンを選択している、とのことで、
保存面倒くさい。億劫になってると、
PCの電源が突然落ちて数時間の作業をやり直したことあるとか。。。


ショートカットがあるんだから、それくらい使えよ!
と言っても、こういう地味な操作って、先輩が親切に教えてくれなければ意外と知らないもの。

ということで、新人向け、というか
IT業界に限らず、PC慣れてないけどこれから頻繁に使うよって人向けに、
作業の効率化Windowsショートカットを厳選して紹介します。

ちなみに、Windowsのショートカットの情報はググると色々とヒットします。
とは言っても、ショートカットの一覧がいーっぱい載っていて、
どれから覚えたらいいのやら、、、と初心者は戸惑いがちなので、
ここでは、みんなが使えて作業の効率化につながるものに絞ります。

Macのショートカットは?だって!?
仕事ではWindowsしか使わないからねぇ。どうしても知りたければググりな!

万能編

まずは、みんな知っていて当たり前なものたち。
ココに知らないものがあれば、作業効率化のために今すぐ覚えた方がいいですよレベルを集めてみました。

メモ帳やワード、エクセル、エクスプローラなど、ほぼ全てのアプリで通用するショートカットです。

ショートカットキー 処理
Ctrl + c 選択したところをコピーするだけ。キーの「c」はCopyの頭から。
Ctrl + v コピーしたモノを張り付ける。キーの「v」の由来は、、、ググってみな!
Ctrl + s 保存する。保存しなかったばっかりに数時間の作業をやり直さないように、頻繁にこれで保存するんだ!
ちなみに、自分はこの文章を1文入力するたびに保存しています。
Ctrl + z やり直し。ギョーカイ用語的にはアンドゥという。直前の操作を取り消すことができる。
Ctrl + f 検索。あの文字列どこにあったけ〜という時にコレで探す。

エクスプローラ

意外と知られていないのが、エクスプローラのショートカット。
ちなみに自分は3年目くらいの頃に知りました。

ショートカットキー 処理
Alt + ← 前のフォルダに戻る
Alt + → 次のフォルダに進む
Alt + ↑ 一つ上の階層のフォルダに移動する(WindowsXPは対象外)

そう、これらはエクスプローラの左上の方にあるアイコンと同じ動きです。
キーも矢印の方向が直観とあっているので、すぐに覚えられるはず。
これを覚えちゃうと、マウスいらずになります。
マウスをずっと動かしていると腕がこるので、これらは非常に便利です。

あと、意外と地味なものとして、、

ショートカットキー 処理
(ファイル、フォルダ選択時に)Alt + Enter プロパティ画面を開く

頻繁にプロパティ画面を開いている人にはうってつけ!

タブ編 ただしInternetExploler除く

エクスプローラのプロパティ画面のタブや、エクセルのシートもショートカットで簡単に移動できます。
これら以外にもタブを備えているものは、同じショートカットが効くことが多いです。
しかし、なぜかInternetExploler(以後IEと記載)のタブには効かず。。。

ショートカットキー 処理
Ctrl + PageDown 右側のタブに移動する
Ctrl + PageUp 左側のタブに移動する

Downが次だから右側、Upが前だから意味で左側、と結びつけると覚えやすいはず。
これを覚えると、エクセルの作業が楽しくなりますぜ。

IEのタブ編

IEは8からタブブラウザになりました。上記のタブ編のついでに紹介します。

ショートカットキー 処理
Ctrl + Tab 右側のタブに移動する
Ctrl + Shilf + Tab 左側のタブに移動する

ちょうどWindowsのアプリをAlt + TabとAlt + Shift + Tabで切り替えられるのと似ています。

以下はおまけ。

ショートカットキー 処理
Ctrl + Q サムネイルの表示(IE8のみ。IE9では削除されている)

普段はIE使わなくても、職場ではセキュリティの関係上、IEを使わざるを得ないことも多いはず。

ランチャー編

フリーのソフトを入れれば、自由にカスタマイズできますが、
ここでは、Windowsのデフォルトで簡単に使用できるものを紹介します。

ランチャーとは?
それは簡単な文字列を入力することで、アプリケーションを起動できる。

Windowsキー+R で「ファイル名を指定して実行」というダイアログが開きます。

ここに以下の文字列を入力してEnterすると様々なアプリを起動できます。

入力する文字列 処理
notepad メモ帳を開く。他のエディタを使用している場合はあまり利用価値はないが、ちょっとした一時メモを書くときにでも。
calc 電卓を開く。ちょっとした計算をしたいときに意外と便利
cmd コマンドプロンプトを開く。ITギョーカイ人には必須。そうじゃない人はきっと一生お目にかからない
mspaint ペイントを開く。ドット絵を描くときに重宝する

仕事柄、画面イメージを描くときにちょっとした修正でmspaintを活用するのですが、
同僚からは誰もそんなコマンド知らん、と言われましたw

ちなみに、MSオフィスもランチャーから起動できますよ。
ここまでくると、覚えても利用する機会が多いかはビミョーですが。

入力する文字列 処理
excel 名前の通り、エクセルを起動する
powerpnt パワーポイントを起動する。ちなみに「pnt」はギョーカイ的な「point」の略語。
winword ワードを起動する。

最後に

さて、ここまで、作業効率化のためのショートカットを紹介しました。
もし知らないものがあったら、是非活用してください。

ちなみに一部のショートカットについては、
説明を簡略化するために、あえて紹介していないものもあります。
(たとえば、万能編で「Ctrl+x」や「Ctrl+a」、「Ctrl+Alt+Del」など)

これらは、ここで紹介したショートカットに慣れたら調べて使ってみてください。


いずれにしても、ショートカットの目的は作業を効率化するためのもの。
普段の作業で困っていない操作のショートカットキーは覚えられないと思います。

日々の操作で面倒くさいなぁ、、、って思うことがあれば、
その時にショートカットキーが存在するかググってみてください。

「面倒くさいと思う作業を楽にしよう」と思うことが効率化の第一歩です。


それでは。