すごいHaskell本のイントロダクションで躓くの巻

haskell勉強しようと思ってすごいH本、m1 mac + vscode + remote container で環境作ろうと思って .devcontainer.jsonをこうして

{
  "name": "HaskellDevContainer",
  // DockerhubのHaskell公式イメージ
  "image": "amd64/haskell",
  "extensions": [
      // HaskellのVSCode拡張をインストール
      // https://marketplace.visualstudio.com/items?itemName=haskell.haskell
      "haskell.haskell",
      "esbenp.prettier-vscode",
      "mhutchie.git-graph",
      "eamodio.gitlens",
      "codezombiech.gitignore",
      "xyz.local-history",
      "donjayamanne.githistory"
  ]
}

おもむろにghciするとshellが

killed

ようわからんけどdocker desktop -> resources からCPU、Memory、 Swapを全部Maxまで上げたらghciが起動するようになった。

$ ghci
GHCi, version 9.0.1: https://www.haskell.org/ghc/  :? for help
ghci> 

M1 mac docker pullできない問題

問題

❯ docker pull ubuntu
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解決

インストールし直す

docs.docker.com

Using default tag: latest
latest: Pulling from library/ubuntu
80bc30679ac1: Pull complete
c937c19c2d76: Pull complete
ba4ad2754376: Pull complete
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

M1 mac miniを買ったので設定していく2

alfred

  • clipboard historyを使うためpowerpackを購入する。
  • Alt Altでclipboard historyが起動するように設定する。
  • spotlightはdisableにする。
  • cmd escでalfredが起動するように設定する。

    BetterTouchTool

  • とりあえずインストールしてライセンスを購入する。

    karabiner

    他のマシンでも使えるように~/.config/karabiner配下をgithubにpushしておく。

    starship文字化け対応

brew tap homebrew/cask-fonts
brew  install font-hack-nerd-font 

iTerm2, vscodeでそれぞれターミナルのフォントを指定する。

M1 mac miniを買ったので設定していく

Homebrew

/optにインストールする。

cd /opt
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
# パスは手動で通す
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile

rictyフォントをインストール

brew install font-ricty-diminished --cask

vscodeでバッククオートの表示がおかしくなるのを直すためfix_ricty.peを作る

#!/usr/bin/env fontforge
Open($1)
Select(0u0060)
SetGlyphClass("base")
Generate($1)

実行する

  ./fix_ricty.pe ~/Library/Fonts/Ricty-Bold.ttf
  ./fix_ricty.pe ~/Library/Fonts/Ricty-Regular.ttf
  ./fix_ricty.pe ~/Library/Fonts/RictyDiminished-Bold.ttf
  ./fix_ricty.pe ~/Library/Fonts/Ricty-Regular.ttf
  ./fix_ricty.pe ~/Library/Fonts/RictyDiminished-Regular.ttf

starship

# プロンプトをカスタマイズする
brew install starship
mkdir ~/.config
cd .config
touch starship.toml
echo 'eval "$(starship init zsh)"' >> ~/.zshrc

~/.config/starship.toml

add_newline = false

[character]
# Prompt format

[username]
style_user = "fg:#00c200"
style_root = "white"
format = " [$user]($style)[@](bold yellow)"
disabled = false
show_always = true

[hostname]
ssh_only = false
format =  "[$hostname](bold fg:#00c200): "
disabled = false

[directory]
read_only = "🔒"
read_only_style= "bold white"
style = "fg:#A7F3E4"

[docker_context]
format = "via [🐋 $context](blue bold)"

[cmd_duration]
disabled = true

[aws]
format = "on [$symbol$profile]($style) "
style = "bold cyan"
symbol = "🅰 "

[aws.region_aliases]
us-east-1 = "est-1"

# Git
[git_branch]
style = "fg:white bg:black"

[git_status]
style = "fg:#E29191"

# Language Environments
[package]
style = "bold fg:#5E5E5E"

[python]
style = "bold fg:#5E5E5E"
symbol = "[](bold yellow) "

[nodejs]
style = "bold fg:#5E5E5E"
symbol = "[⬢](bold green) "

exa

# lsの代わり
brew install exa
echo "alias ls='exa'" >> ~/.zshrc
echo "alias ll='exa -Fla'" >> ~/.zshrc
echo "alias tree='exa --tree -F'" >> ~/.zshrc

emacsキーバインドにしていく。少しずつやる。

wget https://www.number1cruncher.com/repository/karabiner.json

参考

oku.edu.mie-u.ac.jp

antisyllogism.medium.com

zenn.dev

memo.koumei2.com

qiita.com

number1cruncher.com

karabiner-elements.pqrs.org

github.com

XREAサーバーに自動デプロイ

gitHubにpushしたら自動でサーバーにデプロイされるようにする

  • サーバー:XREA(無料プラン)

ローカル環境

  • apacheインストール済
$ which apachectl
/usr/local/bin/apachectl
$ vim /usr/local/etc/apache2/2.4/httpd.conf

# ドキュメントルートの設定
DocumentRoot "/usr/local/var/www/htdocs"
#  index.phpを利用できるように設定
DirectoryIndex index.php index.html
  • ブラウザからアクセスできることを確認する

XREAにsshできるようにして公開鍵を置いてくる

管理メニュー→ホスト情報登録→SSH登録
これでローカルPCからsshできるようになる。

# 公開鍵をXREAサーバーに配置する
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@[XREAサーバー名]:.
# 配置されていることを確認
$ ssh [ユーザー名]@[XREAサーバー名]
$ ls -la
id_rsa.pub
# authorized_keysに追加する
-bash-4.2$ mkdir .ssh
-bash-4.2$ chmod 700 .ssh
-bash-4.2$ mv id_rsa.pub ./.ssh/.
-bash-4.2$ cd .ssh/
-bash-4.2$ cat ./id_rsa.pub >> authorized_keys
-bash-4.2$ chmod 600 authorized_keys
-bash-4.2$ exit
# 接続確認
$ ssh [ユーザー名]@[XREAサーバー名]
# サーバー名、ユーザー名、パスワードはXREAの管理メニュー→FTP設定に書いてある

デプロイスクリプト

deploy.php
XREAサーバーに置く

<?php
require_once(dirname ( __FILE__ ).'/../cfg.php');

$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = $MY_SECRET_KEY;
$POST_DATA = file_get_contents("php://input");
$hmac = hash_hmac('sha1', $POST_DATA, $SECRET_KEY);
$signature = substr($_SERVER['HTTP_X_HUB_SIGNATURE'], 5);
if ( $signature == $hmac  ) {
    $payload = json_decode($POST_DATA, true);
    exec('cd htdocs ; git pull 2>&1');
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['after']." ".$payload['commits'][0]['message']."\n", FILE_APPEND|LOCK_EX);
} else {
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}

XREAサーバー側であらかじめ対象のリポジトリをgit clone しておく…

gitHubのWebhooksを使う

リポジトリ→Settings→WebhooksからPayload URLとSecretを設定する。

残り作業

ローカルで開発を行っているhtdocsディレクトリをそのままgitHubリポジトリにしていたが、
これをpullするとやはりhtdocsのまま。
XREAはpublic_htmlというディレクトリにアップロードしたものが公開される仕様のため、
XREAサーバーのhtdocs配下にpull してきてからpublic_htmlにmvかcpするスクリプト作る。

大量データ作成SQL

1000万レコードをテーブルにinsertする。

create table ITEM_INFO
(NO varchar(10),
YM varchar(6),
ID varchar(8),
PRDCT varchar(30),
PRICE varchar(32),
OTHER1 varchar(30),
OTHER2 varchar(30),
OTHER3 varchar(30),
OTHER4 varchar(30),
OTHER5 varchar(30),
OTHER6 varchar(30),
OTHER7 varchar(30),
OTHER8 varchar(30),
OTHER9 varchar(30),
OTHER10 varchar(30),
OTHER11 varchar(30),
OTHER12 varchar(30),
OTHER13 varchar(30),
OTHER14 varchar(30),
OTHER15 varchar(30),
OTHER16 varchar(30),
OTHER17 varchar(30),
OTHER18 varchar(30),
OTHER19 varchar(30),
OTHER20 varchar(30),
OTHER21 varchar(30),
OTHER22 varchar(30),
OTHER23 varchar(30),
OTHER24 varchar(30),
OTHER25 varchar(30),
OTHER26 varchar(30),
OTHER27 varchar(30),
OTHER28 varchar(30),
OTHER29 varchar(30),
OTHER30 varchar(30),
OTHER31 varchar(30),
OTHER32 varchar(30),
OTHER33 varchar(30),
OTHER34 varchar(30),
OTHER35 varchar(30),
OTHER36 varchar(30),
OTHER37 varchar(30),
OTHER38 varchar(30),
OTHER39 varchar(30),
OTHER40 varchar(30),
OTHER41 varchar(30),
OTHER42 varchar(30),
OTHER43 varchar(30),
OTHER44 varchar(30),
OTHER45 varchar(30),
OTHER46 varchar(30),
OTHER47 varchar(30),
OTHER48 varchar(30),
OTHER49 varchar(30)
);

--実行時間計測
set timing on

--1000万件登録
insert into ITEM_INFO
--最初のselectにはinsertしたい項目を羅列する
select
    --1000万までの連番
    i + j
    
    --ランダム日付
    ,to_char(
        -- 2016/01から2018/09のランダム月を取得(YYYYMM形式)
        TO_DATE('20160101','YYYYMMDD') + MOD(ABS(DBMS_RANDOM.RANDOM()), TO_DATE('20181001', 'YYYYMMDD') - TO_DATE('20160101', 'YYYYMMDD')) , 'YYYYMM')

    --連番を8桁で右X埋め
    ,rpad(to_char(i + j),8,'X')

    --以降は固定値を入れている
    ,'りんご'
    ,'138'
    ,'OTHER1'
    ,'OTHER2'
    ,'OTHER3'
    ,'OTHER4'
    ,'OTHER5'
    ,'OTHER6'
    ,'OTHER7'
    ,'OTHER8'
    ,'OTHER9'
    ,'OTHER10'
    ,'OTHER11'
    ,'OTHER12'
    ,'OTHER13'
    ,'OTHER14'
    ,'OTHER15'
    ,'OTHER16'
    ,'OTHER17'
    ,'OTHER18'
    ,'OTHER19'
    ,'OTHER20'
    ,'OTHER21'
    ,'OTHER22'
    ,'OTHER23'
    ,'OTHER24'
    ,'OTHER25'
    ,'OTHER26'
    ,'OTHER27'
    ,'OTHER28'
    ,'OTHER29'
    ,'OTHER30'
    ,'OTHER31'
    ,'OTHER32'
    ,'OTHER33'
    ,'OTHER34'
    ,'OTHER35'
    ,'OTHER36'
    ,'OTHER37'
    ,'OTHER38'
    ,'OTHER39'
    ,'OTHER40'
    ,'OTHER41'
    ,'OTHER42'
    ,'OTHER43'
    ,'OTHER44'
    ,'OTHER45'
    ,'OTHER46'
    ,'OTHER47'
    ,'OTHER48'
    ,'OTHER49'
from
  (
    with data2(j) as
    (
      select 0 from dual
      union all
      select j+10000 from data2 where j < 9990000
    )
    select j from data2
  ),
  (
    with data1(i) as
    (
      select 1 from dual
      union all
      select i+1 from data1 where i < 10000
    )
    select i from data1
);
commit;

結果

10,000,000 rows inserted.
Elapsed: 00:03:27.323

3分程。

ボットを作る(hubot + slack + heroku)

開発環境

vmware上のubuntu
macからemacsでファイルを編集する。

  • vmwareのubuntuを起動しておく
  • macのコンソールからの接続:
~ $ ssh  ユーザー名@サーバー名
  • macのemacsからの接続:
C-x C-f /ssh:ユーザー名@サーバー名:/home/ubuntu/workspace/

node.jsのインストール

  • まずはnode.jsのバージョン管理ツールnodebrew を導入する

ubuntuに接続しコンソールから

curl -L git.io/nodebrew | perl - setup
  • パスを通す
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.profile
  • .profileを読み込む
source ~/.profile
  • 確認
nodebrew
  • バージョンや使い方が表示されること。
  • nodebrewでnode.jsをインストールする
nodebrew install-binary v6.11.1
nodebrew use v6.11.1
  • コンソールからnpmをアップデート
npm update -g npm

必要なモジュールのグローバルインストールとボットの作成

  • モジュールのインストール
npm install -g yo@1.8.5 --ひな形作成ツール (ジェネレーター) 
npm install -g generator-hubot --Yeoman を利用した Hubot のジェネレーター。Hubotはボットを作成するためのフレームワーク
npm install -g coffee-script@1.12.4 
  • ボットを作成するコマンドを実行する
cd ~/workspace
mkdir myownhubot
cd myownhubot
yo hubot

基本的にYでOK。アダプターだけslackにしてEnter。

? Bot adapter (campfire) slack

ボットでの処理をJavascriptで書くためにコンソールからファイル作成

touch scripts/hello.js
  • hello.jsを書く
'use strict';
//robotという引数を持つ無名関数をモジュールとしている。 
module.exports = (robot) => {
    //HubotのAPIの利用方法が以下。
    ///hello>/iは正規表現。マッチしたら次に渡す無名関数を実行するという形式。
    //msgオブジェクトからユーザーの名前を受け取り、「hello,ユーザー名」と発言する。
    robot.hear(/hello>/i, (msg) => {
    const username = msg.message.user.name;
    msg.send('hello, ' + username);
    });
};
  • 書いたらボットをslackのアダプターなしで動かしてみる

コンソールから

cd ../
chmod a+x bin/hubot
bin/hubot

とりあえず以下のような感じになる。ユーザーがShellになっている。

npm WARN hubot-help@0.2.2 requires a peer of coffee-script@^1.12.6 but none was installed.
npm WARN hubot-slack@4.5.3 requires a peer of hubot@^2.0.0 but none was installed.
body-parser deprecated undefined extended: provide extended option node_modules/hubot/src/robot.js:445:21
No history available
myownhubot> [Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] INFO /home/ubuntu/workspace/myownhubot/scripts/hello.js is using deprecated documentation syntax
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.

Your hubot-scripts.json is empty, so you just need to remove it.
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] ERROR hubot-heroku-keepalive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web.url | cut -d= -f2)`
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
hello>
myownhubot> hello, Shell
  • 次にslack でhubotを動かす
  • slackで開発用のworkspaceを作成する
  • https://slack.com/からメールアドレスを入力しGetStarted、新しいworkspaceを作成する
  • 諸々入力する
  • メールが来たらslackにログインする
  • チャンネルの横のマーククリックしてチャンネルを作成する

slackの設定を行う

https://slack.com/services/new
  • 上記から検索欄にhubotと入力する。出てきたhubotをクリックすると設定ページが表示されるのでinstallをクリックする。
  • ユーザー名を適当に入力。
  • APIトークンを控えておく(パスワードみたいなものなので公開しないように注意)
HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • インテグレーションの保存をクリックする。
  • 次にこのボットを反応させたいチャンネルに参加させる。
  • 先程のチャンネルに参加させる。作成したslackのチャンネルに入る。歯車ボタンから「新しいユーザーを招待する。」を選択。

先ほど作成したボットの名前を入力しinvite.設定は以上。

ボットを起動する

コンソールから

env HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bin/hubot --adapter slack

これで起動した状態になる。
slackのbotチャンネルでhello>と入力して動作確認。

ボットを常時起動させておくことができるようにHerokuを使う

https://www.heroku.com/
  • アカウントを作成する。
  • コンソールからHeroku CLIをインストールする(herokuコマンドが使えるようになる)
wget -O- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  • 確認
heroku --version
heroku-cli/6.15.13-3dce47c (linux-x64) node-v9.3.0
  • Heroku CLI から Heroku にログインする。
  • コンソールから
heroku login
  • 下記のように表示されればログイン完了
Logged in as メールアドレス

githubに新しくリポジトリを作成する。

https://github.com/new

必要な項目を入力して「Create repository」ボタンをクリック
…or create a new repository on the command lineをコンソールにコピペして実行

  • 他のファイルもpushする
  • herokuで動かすための設定ファイルProcfileを作成する。
  • Procfile
web: bin/hubot --adapter slack
  • ProcfileはHeroku がアプリケーションを動作させる際に「どのようなコマンドを実行するか」を認識するための設定ファイル。
  • サーバーの用意をする。これをやるのは一回だけ。
$ heroku create

デプロイ

git push heroku master
  • トークンはherokuのコマンドで登録する。ダブルクォートで囲う。
heroku config:set HUBOT_SLACK_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  • 確認
heroku config:get HUBOT_SLACK_TOKEN

動作確認

slackのチャンネルからhello>と発言してみる

  • なにか変更したらgit push heroku masterする
  • herokuの再起動はコンソールからheroku restart アプリ名

SeleniumとPhantomJSの環境構築

Docker上にUbuntuの構築

$ docker pull ubuntu:16.04
$ docker run -it ubuntu:16.04

Python3とSeleniumのインストール

 apt-get update
 apt-get install -y python3 python3-pip
 pip3 install selenium
 pip3 install beautifulsoup4

PhantomJSのインストール

apt-get install -y wget libfontconfig
mkdir -p /home/root/src && cd $_
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin/

日本語フォントが表示されるようにする

apt-get install -y fonts-migmix
cat <<EOF > /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
	<match target="pattern">
		<test qual="any" name="family">
			<string>serif</string>
		</test>
		<edit name="family" mode="assign" binding="strong">
			<string>MigMix 2P</string>
		</edit>
	</match>
</fontconfig>
EOF

Dockerをコミットしておく

exit
docker ps -a
docker commit (コンテナID) ubuntu-phantomjs

コンテナ起動

$ docker run -it -v $HOME(ホストのパス):$HOME(コンテナのパス) \
> -e LANG=ja_JP.UTF-8 \
> -e PYTHONIOENCODING=utf_8 \
> ubuntu-phantomjs /bin/bash

動作確認

seleniumu-capture.py

from selenium import webdriver

url = "http://www.aozora.gr.jp/cards/000081/files/46268_23911.html"

#PhantomJSのドライバを得る
browser = webdriver.PhantomJS()
#暗黙的な待機を最大3秒行う
browser.implicitly_wait(3)
#URLを読み込む
browser.get(url)
#画面をキャプチャしてファイルに保存
browser.save_screenshot("Website.png")
#ブラウザを終了
browser.quit()
cd $HOME(コンテナのパス)
python3 selenium-capture.py 

実行結果

Website.pngが出来上がる

pythonとかdocker

作業の覚書

python

  • emacsでpythonが自動補完できるように設定
$ sudo easy_install pip
$ sudo pip install virtualenv
    • init.el追記
(require 'python-mode)
(setq auto-mode-alist (cons '("\\.py\\'" . python-mode) auto-mode-alist))

(require 'jedi)
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
  • macにdockerをインストール
  • dockerにPython3とanacondaの環境を整備
$ docker pull continuumio/miniconda3
$ docker run -i -t continuumio/miniconda3 /bin/bash
$ docker ps -a
$ docker commit ef08836ef1b2 mlearn:init
$ docker images
$ docker run -i -t mlearn:init /bin/bash
$ docker run -i -t -v {ホストOSのカレントディレクトリ}:/home mlearn:init /bin/bash

サーバーサイド(node.js)

  • Expressのhelmetモジュールの動作確認

Expressのセキュリティ設定

helmetモジュールでHTTPに於ける脆弱性となるヘッダを取り除く

対応前の確認

  • プロジェクトの生成とExpressに必要なnpmパッケージのインストール
$ express express-helmet
$ cd express-helmet/
$ npm install
  • サーバーの起動
$ DEBUG=express-hlmet:* PORT=8000 npm start

デベロッパーツール→Network→再読込み→localhost選択→Headersタブを見ると、
X-Powered-By:Expressと書かれており、このWebサービスがExpressで開発されていることが分かってしまう。
もしExpressに脆弱性があるとわかったときに攻撃対象にされる危険性がある。
このためX-Powered-Byというヘッダは送信しないほうが安全。

helmetのインストール

$ npm install helmet --save

app.jsの修正

  • モジュールの読み込みとappオブジェクトのuse関数でhelmetを使うようにする
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
+var helmet = require('helmet');

var index = require('./routes/index');
+var users = require('./routes/users');

対応後の確認

  • サーバー起動
$ DEBUG=express-hlmet:* PORT=8000 npm start

デベロッパーツール→Network→再読込み→localhost選択→Headersタブ
X-Powered-By:Expressが消える

まとめ

フレームワークによって自分で実装しなくて済む

node.jsのフレームワークを導入する

ジェネレーターのインストール&必要なファイルの作成

$ npm install -g express-generator
/home/ubuntu/.nodebrew/node/v4.7.0/bin/express -> /home/ubuntu/.nodebrew/node/v4.7.0/lib/node_modules/express-generator/bin/express-cli.js
+ express-generator@4.15.5
added 6 packages in 0.99s
$ cd workspace/$ express express-study

  warning: the default view engine will not be jade in future releases
  warning: use `--view=jade' or `--help' for additional options


   create : express-study
   create : express-study/package.json
   create : express-study/app.js
   create : express-study/public
   create : express-study/routes
   create : express-study/routes/index.js
   create : express-study/routes/users.js
   create : express-study/views
   create : express-study/views/index.jade
   create : express-study/views/layout.jade
   create : express-study/views/error.jade
   create : express-study/bin
   create : express-study/bin/www
   create : express-study/public/javascripts
   create : express-study/public/images
   create : express-study/public/stylesheets
   create : express-study/public/stylesheets/style.css

   install dependencies:
     $ cd express-study && npm install

   run the app:
     $ DEBUG=express-study:* npm start

npmモジュールのインストール

cd express-study
npm install

起動

$ DEBUG=express-study:* PORT=8000 npm start

> express-study@0.0.0 start /home/ubuntu/workspace/express-study
> node ./bin/www

  express-study:server Listening on port 8000 +0ms
  • 「npm スクリプト名」 というコマンドでpackage.jsonで設定されたコマンドが実行される。package.jsonにはこんな箇所がある。
"scripts": {
    "start": "node ./bin/www"
  },

アクセスしてみると雛形ページが表示される

http://localhost:8000/

f:id:sattamassagana:20180204201655p:plain

試しにExpressのdebugモジュールの機能を使ってみる

  • app.jsの先頭に追加する
'use strict';

const debug = require('debug');//debugモジュールを読み込む
const debugInfo = debug('app:info');//module:infoという設定のロガーdebugInfoを用意
setInterval(() => {//1000msごとに関数を実行する
    debugInfo('some information');
}, 1000);

const debugError = debug('app:error');//別の設定のロガーdebugErrorを用意
setInterval(() => {
    debugError('error!');
}, 2000);
  • 実行(複数ログ出力するにはカンマで繋げてコマンドを実行する)
$ DEBUG=express-study:*,app:* PORT=8000 npm start

> express-study@0.0.0 start /home/ubuntu/workspace/express-study
> node ./bin/www

  express-study:server Listening on port 8000 +0ms
  app:info some information +907ms
  app:error error! +997ms
  app:info some information +9ms
  app:info some information +1s
  app:error error! +990ms
  app:info some information +13ms
  app:info some information +1s
  app:error error! +987ms
  app:info some information +14ms
  app:info some information +1s
  app:error error! +985ms
  app:info some information +17ms
  app:info some information +1s
  app:error error! +982ms
  app:info some information +23ms
  app:info some information +1s
  app:error error! +978ms
  app:info some information +25ms

Emacsでタグジャンプできるようにする

インストールなど

  • GLOBALというのが必要
  • GLOBALの対応言語を増やすのにPygmentsというのが必要
  • macなら以下で済む
$ brew install global --with-exuberant-ctags --with-pygments
$ export GTAGSLABEL=pygments

任意の場所でgtag実行

/usr/local/var/www/htdocs $ gtags

確認

  • 例えばcreateDatの定義箇所
/usr/local/var/www/htdocs $ global -ax -t createDat
createDat	/usr/local/var/www/htdocs/typing.js	43
  • 例えばcreateDatを使っている箇所
/usr/local/var/www/htdocs $ global -ax -r createDat
createDat         104 /usr/local/var/www/htdocs/typing.js     createDat();

できてるようだ

Emacs側

  • helm-gtagsパッケージ のインストール
  • init.elに追記
;;Emacsからgtagsを使えるようにする
;; customize
(custom-set-variables
 '(helm-gtags-path-style 'relative)
 '(helm-gtags-ignore-case t)
 '(helm-gtags-auto-update t))
;; key bindings
(eval-after-load "helm-gtags"
  '(progn
     (define-key helm-gtags-mode-map (kbd "M-t") 'helm-gtags-find-tag)
     (define-key helm-gtags-mode-map (kbd "M-r") 'helm-gtags-find-rtag)
     (define-key helm-gtags-mode-map (kbd "M-s") 'helm-gtags-find-symbol)
     (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
     (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history)
     (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)))

使う時

  • ファイルを開く
  • M-x helm-gtags-modeする
  • 関数などにカーソルを合わせる
  • M-tやM-rで
Find Reference: (default "なんとかかんとか")

と聞かれるのでEnterするとジャンプする

iTuenes 12.7にアップグレードしたら起動しなくなったのでiTunes12.6にダウングレードして起動できるようにする

環境

  • MacBook Pro(13-inch, 2017)
  • iTunesライブラリはNAS(I-O DATA HDL2-AAシリーズ)で管理

現象

アップデートの表示が出ていたのでアップデートしたところ、iTunesがフリーズして一向に起動しない。
iTunes再起動やOS再起動しても解決しないのでiTunes12.6にダウングレードする。

iTunes12.6にダウングレードする方法

現在のiTunes(12.7)を一旦削除してiTunes12.6をインストールしたいところだが、iTunesはゴミ箱に入れようとしても「“iTunes.app”はmacOSで必要なため、変更または削除できません。」とメッセージが表示される。
f:id:sattamassagana:20170923113100p:plain
このため、ターミナルからiTunesを削除する必要がある。

  • ターミナルを起動する。
  • Aplicationsフォルダに移動するため、ターミナルに次のように入力し、return
cd /Applications/
  • 次のコマンドを入力し、iTunesを削除する。
sudo rm -rf iTunes.app/


残りはFinderからの作業になる。

  • Finderから ~/Music/iTunes/ フォルダに移動し、“iTunes Library.itl”というファイルをデスクトップか、わかり易い場所にコピーしておく(バックアップのため)。
  • “Previous iTunes Libraries”フォルダの中から最も最近の日付が書かれたiTunesライブラリファイルを見つける。iTunesを12.7にアップグレードする前なので例えば“iTunes Library 2017-09-12.itl”などという名前になっているはず。
  • 見つけた“iTunes Library 2017-09-12.itl”を~/Music/iTunes/ フォルダにコピーする。
  • 次に“iTunes Library 2017-09-12.itl”を“iTunes Library.itl”に「名前を変更」する。
  • アップルサポートにアクセスし、“iTunes 12.6.2”をダウンロード、インストールする。

アップル - サポート - ダウンロード

  • これでiTunes12.6にダウングレードし起動できるようになった。

windows10 + emacs + oracleでの文字化け

環境

emacsインストール済み
windows10インストール済み
oracle12cインストール済み

問題

emacsからM-x sql-oracleしてsql-plusをバッファに表示させると文字化けしている

対策

oracleのキャラクタセットを確認
sql-plusから
select * from NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET を確認するとJA16SJISTILDEとなっていた。これはoracleのインストール時に決めるもので後から変えられないらしい。
この場合は環境変数NLS_LANGにJAPANESE_JAPAN.JA16SJISTILDEを設定する必要がある。
システム環境変数の編集→詳細設定タブ→環境変数→システム環境変数で新規→変数名にNLS_LANG、変数値にJAPANESE_JAPAN.JA16SJISTILDE
を設定しOK→OK→OK→windows再起動

結果

emacsからM-x sql-oracle、文字化けしていない。しかし、今度はコマンドプロンプトの方が文字化けしている。

断念

・コマンドプロンプトからsqlplus使わない