Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Parallels Desktop for MacでExcelを快適に使うための設定

Parallels Desktop for Macの紹介

MacにはBootCampというのがあってWindowsを別パーティションにいれて、
起動を切り替えて使うことができますが、
いろいろ問題があります。まず、切り替えるのに再起動が必要なこと。
これだけでも結構不便なのに、さらに問題はツールでも入れない限り、
Windowsでスクロールの挙動が逆になったり、キーボードがとても使いづらくなったり……
というのがあります。
この状況を一挙に解決してくれるソフトがParallels Desktop for Macです。
これはVMware Playerと一緒で仮想環境でWindowsを動かします。
仮想環境といっても通常の使い方をする範囲では遅さを全く感じません。
なにより同時に扱えるところが良いです。
また、デフォルトでCoherenceモードといって、
ほぼMacとWindowsをシームレスに使うことができます。
やや高いソフトですが、どうしてもOffice文章を扱わないといけない
といったことがあれば、Mac版Windowsを買うよりこちらがおすすめです。
もちろん別途Officeのライセンスは必要ではありますが。
また、デフォルト設定で主要なユーザフォルダ以下が透過的に見えます。
そして、一番嬉しいのがWindows上でもトラックパッド、キーボードの操作感が
変わらないことです。

Excelを快適に使うための設定

Excelで作業をしていると、Ctrl+↓系の最後の行まで一気に飛ぶ系のキーボードショートカットが
効かず、かわりにウィンドウが最小化してしまう現象に遭遇しました。
Ctrl+Shift+↓も同様でききません。
ということでキーボードショートカットを設定します。

設定方法

このParallelsのウィンドウが出ている状態で、環境設定を選びます。


環境設定のウィンドウが出たらキーボードのタブを選択します。

そして左側からWindowsの欄を選び、下側の+を押してキーボードショートカットを追加します。
まずはCtrl+↓の例です。

次にCtrl+Shift+↓の例です。

同じ要領で↑、←、→について同様の設定をすると、Excelでよく使う
終端までの移動等が使えるようになります。

その他調べてないこと

一つだけ課題があって、MSのIMEとMacのIMEが衝突して、
うまくキーボードで切り替えられないところでしょうか。
まだ、調べていませんが、
おそらくキーボードショートカットの割り当てでなんとかなる気がしています。
とおもったら、ここにヒントが書いてありました。
http://kb.parallels.com/jp/115294

C言語の不可解なエラー(GCC) - 配列の宣言時にconst変数を指定したとき

f:id:fa11enprince:20200628230957j:plain
stackoverflowで英語の練習を兼ねてダメダメ英語を連投してました。
そのうち迫害されるんじゃないかと思います(*´Д`)
そんなわけで、Cのプログラムを書いていたのですが……
不可解なエラーが……

問題になったコード

#include <stdio.h>
#include <string.h>

const int MAXLINE = 1000;

// Dummy Array
static char fooString[2][MAXLINE] = {
   "abcdefg\n",
   "hijklm\n"
};

// Dummy function
int myGetline(char **line, int maxline) {
    static int i = 0;
    char *tmp = fooString[i++];
    if (strlen(tmp) > maxline) {
        *line = '\0';
        return 0;
    }
    *line = tmp;
    return strlen(tmp);
}

int main(int argc, char *argv[]) {
    char *line = NULL;
    long lineno = 0;
    // ...
    return 0;
}

コンパイル

$ gcc -o foo.exe foo.c
foo.c:9:13: エラー: ファイルスコープの可変 ‘fooString’ です
 static char fooString[2][MAXLINE] = {
             ^
foo.c:10:4: 警告: char の配列にとって初期化子文字列が長すぎます
    "abcdefg\n",
    ^
foo.c:10:4: 警告: (‘fooString[0]’ 用の初期化付近)
foo.c:12:1: 警告: char の配列にとって初期化子文字列が長すぎます
 };
 ^
foo.c:12:1: 警告: (‘fooString[1]’ 用の初期化付近)

ハッ?全く意味が分からないエラーだ……
そういえばCの古いコンパイラって配列の宣言に
const使えないんだっけってことを30分後に気付く。

対策法1

gccで不当ならg++でC++としてコンパイルでエイッ!

$ g++ -o foo.exe foo.c

コンパイル成功。

対策法2(だめでしたー)

いやいやC++じゃなくてCで何とかしろよって場合は

$ gcc -std=c99 -o foo.exe foo.c
foo.c:9:13: エラー: ファイルスコープの可変 ‘fooString’ です
 static char fooString[2][MAXLINE] = {
             ^
foo.c:10:4: 警告: char の配列にとって初期化子文字列が長すぎます
    "abcdefg\n",
    ^
foo.c:10:4: 警告: (‘fooString[0]’ 用の初期化付近)
foo.c:12:1: 警告: char の配列にとって初期化子文字列が長すぎます
 };
 ^
foo.c:12:1: 警告: (‘fooString[1]’ 用の初期化付近)

あれ?C99はOKなんじゃなかったっけ?

対処法3

まぁこれが妥当ですね。諦めて#defineを使う

#include <stdio.h>
#include <string.h>

// const int MAXLINE = 1000;
#define MAXLINE 1000

// Dummy Array
static char fooString[2][MAXLINE] = {
   "abcdefg\n",
   "hijklm\n"
};

// Dummy function
int myGetline(char **line, int maxline) {
    static int i = 0;
    char *tmp = fooString[i++];
    if (strlen(tmp) > maxline) {
        *line = '\0';
        return 0;
    }
    *line = tmp;
    return strlen(tmp);
}

これでコンパイルが通ります。
C言語はこれだから嫌だ……。
妙に古臭いところが残ってるんですよね…。いい言語には違いないのですが。
好きなC++はそれはそれでSTLで長編小説なエラーが出るという……。

Windows 10のスタートメニューの格納場所など

f:id:fa11enprince:20190926123426j:plain
しばらくWindows 8を使っていて、スタートメニューの格納場所を忘れてしまいましたのでメモ。
Windows 10に移行してから
ここにアンインストールしたはずのソフトのゴミが残っているので掃除。
一応レジストリ周りも見直しています。放置してもよいのだけれど。
あれれProgramDataだっけ?AppDataだっけになってしまっていました。
ProgramDataもAppDataもよくよく見るとゴミだらけになっていますね。
まぁ、別にいいんだけれども(;^ω^)

スタートメニューの格納場所

Windows 7と変わらず

C:\ProgramData\Microsoft\Windows\Start Menu\Programs

Explorer上のデフォルト表示では
PC(C:) > ProgramData > Microsoft > Windows > スタートメニュー > プログラム
です。
スタートメニューはユーザ個別ではなく、全ユーザで一緒です。

おまけ

Quick Launchの場所

C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch

なんでInternet Exploererなんだろう……
そういえばいつだかIEとExplorerが合体してた時期がありましたね……。
Exploerer上でshell:quick launchでもOK

参考リンク

http://www.sicnet.co.jp/useful/faq/003.php
Windows 7/8/8.1にクイック起動を表示させる方法 - ぼくんちのTV 別館

Windows 10を使うにあたって絶対使ってはいけない機能があります。
デスクトップのスライドショーです。
奥さんにとがめられても知りません。
Windows 8のメトロUIでもありましたけど。
奥さんがいない上級者の方は私を含め、使っても大丈夫です。

特定のフォルダ以下で拡張子がmp3のファイルだけ残したい

f:id:fa11enprince:20200626231955j:plain
大掃除がてら音楽を整理していたら、
10年くらい前に持っているCDをmp3化したファイルがあって
歌詞が載っているリンクやhtmlのファイルが
ご丁寧に一緒に入っていました(;´・ω・)
htmlファイルとかどうでもいいからmp3ファイルだけ残したい。
しかし、まともに消していたら日が暮れる……
ということで、Windowsの場合Explorerから検索して消すっていう手もあるのですが、
あまり効率のいいやり方ではありません。

コマンドラインでやる方法を紹介します。
cdで対象のmp3以外を消したい一番上のディレクトリに移動しておきます。
その直下を再帰的にmp3以外のファイルを消しに行くコマンドです。

Unix系(Linux, Cygwinなど)、またはMac

消すファイルの確認

find . -not -iname "*.mp3" -type f

これで消そうとする対象のファイルをピックアップできます。
良さそうであれば消しにかかります。

削除実行

find . -not -iname "*.mp3" -type f -delete

これで消えてくれます。LinuxとMacはこれでいいのですが、
問題はWindowsです。Cygwinを入れている酔狂な人はそんなにいないでしょうから。

コマンドプロンプトの場合

無理!
むりやりバッチファイルでも作らない限り……

PowerShellの場合(Windows 7以降なら標準搭載)

消すファイルの確認

Get-ChildItem -Recurse -Exclude "*.mp3" | Where-Object { Test-Path $_ -PathType Leaf } | Remove-Item -WhatIf

削除実行

Get-ChildItem -Recurse -Exclude "*.mp3" | Where-Object { Test-Path $_ -PathType Leaf } | Remove-Item

PowerShellは長ったらしいですね。一応Get-ChildItemはls、Remove-Itemはrmに書き換えられますが……
にしても長い。ちなみにWhere-Object { Test-Path $_ -PathType Leaf }
ファイルだけっていう絞込みをしています。もっとスマートな方法がないものか……

しつこいようですが、ちゃんと目的のディレクトリにcdできたことを確かめて実行してくださいね!
でないと大事故になりますので(;^ω^)