Macのログイン画面が英語になってしまった時

Macの更新があると言うので、言われるがまま更新して再起動した。しかし、再起動後のログイン画面は英語になっていた。どうやって日本語に戻すのだろうか。

言語設定する

下記のコマンドで言語設定する。

$ sudo languagesetup

コマンドを実行すると、普段利用する言語の一覧が表示されるので、主に日本語を使用するの番号を入力してEnter。

再度、再起動

無事、日本語のログイン画面が表示された。

まとめ

別に、英語のログイン画面でもパスワード入力欄にInput your passwordと表示されたり、IMEの所にRomajiとか書かれているだけなので、気にする必要はないが、やっぱり気になってしまったので、修正できて良かった。

同じタグの記事
同じカテゴリの記事

Pythonで簡易HTTPサーバー

Pythonで簡易HTTPサーバー

この方法はPython3でのやり方。
今更Python2は無いだろうけど。

HTTPサーバー起動

$ python -m http.server 8000

これでカレントディレクトリが公開されている。
ポート番号を8000にしているのは、80は管理者権限が必要なため。

CGIを動かしたいとき

オプションを指定する。

$ python -m http.server 8000 --cgi

CGIプログラムは./cgi-binに必ず置く。

このHTTPサーバは指定ファイルをそのまま素直に走らせているようなので、
Windowsの場合は.exeや.batなど、ダブルクリックで直接実行できるプログラムにする。
(標準出力を得て、標準出力するような)

WindowsのApacheは、shebangを読んでそのスクリプトエンジンで実行してくれるのに。

おまけ Windowsのexe作成

たとえばC#なら

Test1.cs

using System;
namespace Test1
{
        public class Test1
        {
                static void Main()
                {
                        Console.WriteLine("Context/type: text/html");
                        Console.WriteLine("");
                        Console.WriteLine("Hello, C#!");
                }
        }
}

コンパイルは下記の通り

D:\> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Test1.cs

Test1.exeの出来上がり。

VB.netなら

Test2.vb

Module Test2
        Sub Main()
                Console.WriteLine("Context/type: text/html")
                Console.WriteLine("")
                Console.WriteLine("Hello, VB.net!")
        End Sub
End Module

コンパイルは下記の通り

D:\> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe Test2.vb

Test2.exeの出来上がり。

まとめ

ローカルのHTMLをhttpで表示したいだけで始めたのに、いろいろ試す事ができた。
たまにはC#やVB.netも楽しい。

同じタグの記事
同じカテゴリの記事

Vue Routerを使ったサイトで404が発生

Vue Routerを使ったサイトで404が発生してしまった

Vue Routerを使ったサイトで、いきなり途中のURLにジャンプしたり、$router.push(‘/xxx’)した後の表示でF5(リロード)したりしたら、404になってしまった。
vue-cliで開発中は問題なかったのに、buildしてapacheに配備したら404になった。

Not Found
The requested URL /xxx was not found on this server.

Apache Server at www.yamacoco.com Port 80

解決方法

ちゃんと公式ドキュメントに書かれていた。

https://router.vuejs.org/ja/guide/essentials/history-mode.html#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B

mod_rewriteで対応するなら

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

mod_dirが使えるのであれば

<IfModule mod_dir.c>
  FallbackResource /index.html
</IfModule>

まとめ

動かす前にドキュメントは読まなくてはいけない。

同じタグの記事
同じカテゴリの記事

PythonとBottomでWeb API作成

PythonとBottleでWeb API作成

ちょっとしたWeb APIを作る必要があった。
Web APIといえば、node.jsで簡単に作れそうだけど、
慣れ親しんだPythonならもっと簡単にできてしまう。
PythonとBottleを使って作ってみる。

Bottleのインストール

Bottleはpipでインストールしても良いし、単純にダウンロードしてAPIと同じディレクトリに置くだけでも動作する。

実装

from bottle import run, route, request, response
import json

@route('/echo/<msg1>/<msg2>')
def echo(msg1, msg2):
    # CORS
    if 'Origin' in request.headers:
        origin = request.headers['Origin']
        response.headers['Access-Control-Allow-Origin'] = origin
        response.headers['Access-Control-Allow-Methods'] = (
            'PUT, GET, POST, DELETE, OPTIONS')
        response.headers['Access-Control-Allow-Headers'] = (
            'Origin, Accept, Content-Type, X-Requested-With'
            ', X-CSRF-Token, Authorization')
    # ECHO
    return json.dumps({
        'msg1': msg1,
        'msg2': msg2,
    })

run(host='localhost', port=8080)

とりあえず、ブラウザからアセスしてみる

http://localhost:8080/echo/test11/test22

画面にJSONらしきテキストが表示された。

javascriptでfetchしてみる

fetch('http://localhost:8080/echo/js11/js22', {
    method: 'GET',
    mode: 'cors',
    cache: 'no-cache'
}).then(function(res) {
    res.json().then(function(data) {
        console.log(data);
    });
});

chromeで実行したところ、開発者コンソールにJSONが出力された。

まとめ

Pythonで簡単にWeb APIが作れた。
とりあえず、サーバに応答して欲しくて作ったが、クライアントがjavascriptなので、そのうちサーバー側もnode.jsで作って言語を統一しよう。

同じタグの記事
同じカテゴリの記事

Pythonでマルチスレッド再び

以前、Pythonでマルチスレッド処理を行うプログラムを書いた。そのときはthreading.ThreadとQueue.Queueを使っていた。それはPython2.7を使っていたから。
しかし、今はPython3がメインだ。concurrent.futures.ThreadPoolExecutorを使えばもっとスマートに実装できる。

Python3

from concurrent.futures import ThreadPoolExecutor

def download(name, url):
    pass

target_url_list = []  # URL List
tp = ThreadPoolExecutor(max_workers=4)
for url in target_url_list:
    tp.submit(download, url.name, url.url)
tp.shutdown()
print('End')

とても簡単に書くことができる。max_workersに応じて多重度を調整してくれる。ThreadPoolExecutorのshutdown()メソッドで、すべてのスレッドの終了を待ち合わせてくれる。
これは便利。

Python2(参考)

import threading
import Queue

def download(q):
    while True:
        item = q.get()
        if item is None:
            break
        name = item.name
        url = item.url
        pass

target_url_list = []  # URL List
q = Queue.Queue()

thread_list = []
for i in range(4):
    thread = threading.Thread(target=download, args=(q,))
    thread.start()
    thread_list.append(thread)

for item in target_url_list:
    q.put(item)

for i in range(len(thread_list)):
    q.put(None)

for thread in thread_list):
    thread.join()

print('End')

以前はこれが普通だったけれど、今見るととても冗長だ。

まとめ

もうPython2のことは忘れてPython3でどんどん作ろう。
(はやくJythonがPython3系になってくれると良いのだが・・・)

同じタグの記事
同じカテゴリの記事

Pythonでファイルの更新日時変更

メーカーの分からないフォトフレームがある。SDカードに写真を入れて、それを差し込めば表示されるのだが、並び順が全くわからない。ディレクトリも無視しているようだ。しかしよく見ると、写真を撮った順番に並んでいるようにも見える。どうやら、撮影日ではなく、ファイルの最終更新日時順で表示されているようだ。たまに順番がおかしいのは編集したファイルだ。
ファイルの更新日を希望の順番で更新してしまおう。

os.utimeで更新

import os
import datetime

target_file = 'test.jpg'
utime = datetime.datetime.strptime('20191109_080322', '%Y%m%d_%H%M%S')
os.utime(target_file, (utime.timestamp(), utime.timestamp()))

まとめ

写真のファイル名が連番だったので、その名前で並べ替えてから、先頭のファイルをシステム日時にして、残りを1秒ずつずらしなら設定したらキレイに並びました。

同じタグの記事
同じカテゴリの記事

Catalinaに更新したらgitコマンドが使えなくなった

ソフトウエア更新が更新しろと言うので、更新したらmacOSがCatalinaになった。
特に問題なかったのだが、git pullしたらエラーになってしまった。

$ git pull
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

Xcodeがまた使えなくなっていたようだ。

$ xcode-select --install
xcode-select: note: install requested for command line developer tools

Mojaveにした時もHigh Sierraにした時も、この症状になりこのブログを更新していた。

同じタグの記事
同じカテゴリの記事

Pythonクラスの雛型

Pythonでクラスを作成するとき、コメントの場所、スーパークラスのコンストラクタ呼び出し、デストラクタの名前、withに対応させるメソッド名など、いろいろ忘れてしまう。
雛型を作ろう。

Pythonクラス雛形

class MyClass(object):
    '''私の作るクラス。ここにクラスのコメントを記述する。
       このコメントがクラスの説明として表示される。
       objectを継承しているが、この記述は省略可能。
    '''

    def __init__(self, x, y):
        ''' コンストラクタ。ここにメソッドのコメントを記述する。

            Args:
                x (str): xxxx
                y (str): yyyy
        '''
        self.x = x
        self.y = y
        self.file1 = self.__open('file1.txt', 'a')
        self.file2 = None

    def __del__(self):
        '''デストラクタ。終了処理を書く。
           ただしクラス開放のタイミングはPython任せになる。
        '''
        self.file1.close()

    def __enter__(self):
        '''withブロックが開始した時に呼び出されるメソッド。
           ここでオープン処理を行う。
           selfをreturnする必要がある。
        '''
        self.file2 = self.__open('file2.txt', 'a')
        return self

    def __exit__(self, exc_type, exc_val, exc_th):
        '''withブロックが終了した時に呼び出されるメソッド。
           ここでクローズ処理を行う。
           引数を4つ取る必要がある。
        '''
        self.file2.close()

    def __open(self, filename, open_mode):
        ''' アンダースコア2つのメソッドは、外から呼べなくなる。
            プライベートメソッドを定義したいときはこうする。

            Args:
                filename (str): file nema.
                open_mode (str): file open mode.
            Returns:
                stream: file stream
        '''
        return open(filename, open_mode)

    def write(self, msg):
        ''' 通常の公開メソッド。引数の説明を書くと親切。

            Args:
                msg (str): メッセージ
        '''
        self.file1.write(msg + '\n')
        if self.file2:
            self.file2.write(msg + '\n')

    def __str__(self):
        '''str()したときに呼ばれるメソッド。
           インスタンスを単純にプリントした時に表示されるので、
           デバッグ時に役立つ。
        '''
        return 'X[{}] Y[{}]'.format(self.x, self.y)

    def __repr__(self):
        '''repr()したときや、インタラクティブシェルで書き出した時に
           呼び出されるメソッド。
           eval()でオブジェクトになるように記述する。
           定義しておくとデバッグ時に役立つ。
        '''
        return '''MyClass('{}', '{}')'''.format(self.x, self.y)


class MyClassClass(MyClass):
    '''MyClassを継承したクラス
    '''

    def __init__(self, x, y, z):
        '''コンストラクタ。
        '''
        # スーパークラスのコンストラクタを呼び出す方法
        super(MyClassClass, self).__init__(x, y)
        self.z = z
    
    def __str__(self):
        return 'X[{}] Y[{}] Z[{}]'.format(self.x, self.y, self.z)
    
    def __repr__(self):
        return '''MyClassClass('{}', '{}', '{}')'''.format(
            self.x, self.y, self.z)

まとめ

これで次からクラスを作る度に調べる必要がなくなる。

同じタグの記事
同じカテゴリの記事

Java8で指定回数繰り返し

Java8からStreamAPIが利用できる。
StreamAPIを利用するとC言語の頃から利用されている下記のようなforループは書く必要がない。

for (int i = 0 ; i < 10 ; i++) {
    proc(i);
}

IntStreamを利用する

import java.util.stream.IntStream

IntStream.range(0, 10).forEach(i -> proc(i));

これで同様の処理が行える。
0から9までの10回。見慣れた感じだ。
配列の添え字は基本的に0から使うので、これで全く問題ない。

1〜10の場合は

出力用に1~10が欲しいときもある。従来の書き方であればこうだろうか。

for (int i = 1 ; i <= 10 ; i++) {
    System.out.println(i);
}

これで、1~10が出力される。StreamAPIを使うと

import java.util.stream.IntStream

IntStream.rangeClosed(1, 10).forEach(i -> {
    System.out.println(i);
});

rangeClosedを使うことで「10まで」と言うのがわかりやすく書ける。

まとめ

記述する文字数はStreamAPIを使った方が長くなってしまう気もするけど、やりたい事が伝わりやすいのはStreamAPIのような気がする。
開発標準がJava8以降になったら、順次導入していきたい。
(いまだにJava6が標準のシステムもメンテナンスしている)

同じタグの記事
同じカテゴリの記事

Tera TermでCtrl+sを押してしまったとき

Tera Termでvimを使いファイルを編集し、保存するときについついCtrl+sを押してしまうときがある。
操作は固まってしまい、仕方ないのでvimやbashのプロセスをkillしたりしていた。

しかし、Ctrl+sは危険なショートカットではなく、画面出力が止まっているだけだそうだ。
Ctrl + qで画面出力が再開される。

Ctrl + sを押し、画面が止まり、パニックになり、いろいろタイプする。
Ctrl + qを押すことで、それまでの慌てた対応が一気に出力される。

まとめ

Tera Termを使うときはサーバのメンテを行っている時なので、もう少し慎重に作業するよう心がけよう。

同じタグの記事
同じカテゴリの記事