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

macoril's diary

へたれプログラマーのリハビリな日々

JapaneseIM(ことえり)で変換候補リストが出なくなった

本記事はQiitaで簡潔にまとめなおしました。
Macの標準日本語入力(ことえり、JapaneseIM)がバグったら - Qiita

症状

Mavericks (OS X v10.9) まで「ことえり」と呼ばれていた*1
Macの標準日本語入力。

ある時から、その変換候補リストが出なくなった。

f:id:macoril:20160508172845p:plain

解決方法

ことえり時代の情報だけど、
漢字の変換候補が出ません | Apple サポートコミュニティを参考にして
以下の2ファイルを削除して再起動して無事復活。

$HOME/Library/Preferences/com.apple.JapaneseAnalysis
$HOME/Library/Preferences/com.apple.inputmethod.Kotoeri.plist

追記

Mac OSX El Capitanで日本語入力が出来なくなった件 | Apple サポートコミュニティ
の方が参考になるかも

*1:Yosemite (OS X v10.10) 以降は「JapaneseIM」というらしいのだけど、呼びにくいから今でも「ことえり」って呼んでる

MacでNTFSを使う

はじめに

自分用のメモです。 結論から言えば、うまく出来なくて結局exFATでフォーマットしたしorz

exFATとは

  • FAT32でデータを扱う上で制限があり、この問題を解消するために開発された形式
  • 容量制限なく保存可能(最大4GB以上でも保存でける)
  • WindowでもMacでも読み込み・書き込める
  • FAT32と互換性がない

*1

ここから先は色々インストールしてみたけどNTFSを使えなかった記録(´・ω・`)

ちなみにOSはLion(10.7.5 (11G63))。

FUSE for OSXのインストール

  • Home - FUSE for OS X からStableをダウンロード
  • インストール途中で必ず「MacFUSE compatibility layer 」項目をチェック チェックしておくと、システム環境設定にショートカットが作成されて後で楽

NTFS用のドライバ(NTFS-3G)のインストール

今はインストーラはなくなってソースコードだけ?

早速./configureしてみるもエラー

./configure
...(中略)...
checking fuse compatibility... external
checking for pkg-config... no
configure: error: pkg-config wasn't found! Please install from your vendor, or see http://pkg-config.freedesktop.org/wiki/

pkg-configのインストール

またしても./configureでエラー

./configure
...(中略)...
checking for GLIB... no
configure: error: Either a previously installed pkg-config or "glib-2.0 >= 2.16" could not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass --with-internal-glib to configure to use the bundled copy.

エラー内容で調べたところ、osx - Unable to make pkg-config - Stack Overflow が近そう。

アドバイスを参考に --with-internal-glib オプションを付けてやりなおしたら一応通った?その後make

./configure --with-internal-glib
make
Undefined symbols for architecture x86_64:
  "_FSFindFolder", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_kCFAllocatorSystemDefault", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFURLCreateFromFSRef", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFURLCopyFileSystemPath", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFStringGetCStringPtr", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFStringGetLength", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFStringGetCString", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
  "_CFRelease", referenced from:
      _find_folder in libglib-2.0.a(libglib_2_0_la-gutils.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [pkg-config] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

再度NTFS用のドライバのインストール

./configure
****************************************************************************
* WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING   *
* The FUSE user space binaries were NOT installed with root directory      *
* executable prefix. This means that automounting NTFS volumes during boot *
* could fail. This can be fixed the below way by reinstalling FUSE using   *
* the right 'configure' option during FUSE compilation:                    *
*   ./configure --exec-prefix=/                                        *
*   make && sudo make install                                          *
* WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING   *
****************************************************************************
./configure --exec-prefix=/
make
sudo make install

結局マウントできず...

sudo make uninstall 済み 要インストール状況確認

configureとかmakeの意味

http://www.itmedia.co.jp/help/tips/linux/l0302.html

*1:http://tweeeety.hateblo.jp/entry/2014/11/30/161825

*2:"The current release of pkg-config is version 0.29"のあたりから

N進数からM進数への変換 〜いろんな言語で〜

本記事はQiitaに移しました。
N進数からM進数への変換 〜いろんな言語で〜 - Qiita

はてブロとQiitaの住み分けは↓みたいにしていく予定。 * はてブロ:備忘録 経緯や経過を正解もハズレもゴチャゴチャとメモする感じ。 * Qiita:まとめ ゴチャゴチャを整理、内容を精査したチートシート的な内容。


N進数からM進数への変換方法をまとめてみた。

number_str: 変換元の数値
from_base : 変換元の基数
to_base   : 変換先の基数

コマンドライン

echo "obase=to_base; ibase=from_base; number_str" | bc

ibaseを先に書くと、obaseで指定する値がibaseで指定した進数で解釈されるので、obaseを先に指定したほうが良い 例えば、

echo "ibase=16; obase=10; number_str" | bc

とした場合、obaseで指定した10は16進数の'10'と解釈されるので、アウトプットは16進数となる。 あと、16進数のアルファベットは大文字じゃないとNGなので注意。

10進数⇔16進数、10進数⇔8進数ならprintfも簡単。

printf '%x' 15
printf '%d' 0xF
printf '%o' 15
printf '%d' 017

こっちの場合は小文字でもOK。

JavaScript

parseInt(number_str, from_base).toString(to_base);

parseInt()で一度10進数にしてから、toStringで変換する。

Perl

デフォでは2,8,10,16以外の基数の変換を簡単に行う方法はなさそう。 Math::BaseCalcモジュールを使うとそれ以外の基数への変換が容易にできて、使用する英数字の指定などもできるよう。

$calc7  = new Math::BaseCalc(digits=>[0..6]);
$calc36 = new Math::BaseCalc(digits=>[0..9,'a'..'z']);

$calc36->to_base( $calc7->from_base(number_str) );

PHP

base_convert($number_str, $from_base, $to_base);

decbin(), bindec(), decoct(), octdec(), dechex(), hexdec()とあるけど、base_convert()だけ覚えておけば十分。 わざわざ他を使うメリットってあるのかな?

Python

2,8,10,16進数以外の基数の変換を簡単に行う方法はなさそう。

10進数に戻すのは下記の方法でできる。

int(number_str, from_base)

10進数からの変換は、bin(), oct(), hex()、あるいは、8進数、16進数なら文字列フォーマット操作を使うのが簡単。

'%o' % number_str #8進数へ
'%x' % number_str #16進数へ

Ruby

number_str.to_i(from_base).to_s(to_base)

JavaScriptと同じで、to_i()で一度10進数に戻してからto_s()で変換する。

おまけ

エラー処理とか特にしてないけどideoneで少しサンプル書いた

JavaScript(Node.js)

PHP

CodeIQではreadlineが使えない?→公式からバグがあると返答がありました

追記(2016/03/10 07:10)

CodeIQの運営から返答ありました。(2016/03/02 10:21) 要約すると * 企業版ideoneのjavascript(spidermonkey)のreadlineにバグがある * 企業版ideoneのバージョンアップが必要になるが、その目処はたっていない

ということなので、当面はEOFを判定する必要があるような出題にJavaScript(SpiderMonkey)で解答するのは無理そうです。


最近コーディングのリハビリを兼ねてCodeIQの問題をいろんな言語で解いてみてる。

んで今日は、JavaScript(SpiderMonkey)で書いてたんだけど、ideoneで問題なく実行できる(実行時間0.01s)コードが、CodeIQで試すと標準入力を受け取ってるところでタイムアウトするんだよね。ちなみにideoneではCodeIQと同じ入力内容で試してる。

↓のようなシンプルな作りなんだけど、どうもreadlineの部分がダメみたい。

while ((line = readline()) !== null) {
    // 各行に応じた処理
}

whileが止まらないということなんだろうから、大方nullが返っていないということなんだろう。
代わりを探してみたんだけど、 Introduction to the JavaScript shell - Mozilla | MDN でstdin関連調べてみても readline() しか載ってない…

readlineについて調べてみたところでは、もともとこの関数はEOFを判定できなかったらしい。
ただ、この問題は2006年時点でBugzillaに報告されていて*1、Status は RESOLVED FIXED になっているし、やりとりの中身を見ても、EOFをちゃんと判定してnullを返すように修正する方向で進んでいるように見える。

CodeIQの標準入出力サンプル集 を見ても、SpiderMonkey載ってないしで、CodeIQのSpiderMonkeyでEOFまで標準入力を読む方法はわからずじまい。

じゃあNode.jsで、と思って、今度はideoneで書く前にCodeIQのサンプル参照したんだけど、CodeIQの標準入出力サンプル集 にサンプルはあるもののゴチャゴチャしてていまいちわかりにくいw

結局 各種言語における標準入力からのEOFまでの入力サンプル - koturnの日記 のサンプルがシンプルで凄く参考になった。

readlineの件は原因がわかったら追記する。

JavaScriptエンジン、SpiderMonkeyとRhinoについて

はじめに

ideoneJavaScriptを書いてみようと思ったら、 JavaScript (rhino) と JavaScript (spidermonkey) という2つがあったので違いを調べた。

共通すること

SpiderMonkeyの特徴

Rhinoの特徴

  • 作者は Netscape のノリス・ボイド (Norris Boyd)
  • Javaで実装
  • 他のアプリケーションに組み込んで用いる目的で作成されている
  • browserオブジェクトはサポートされていない

SpiderMonkeyRhino以外のJavaScriptエンジン

参考

SpiderMonkey - Wikipedia
Rhino - Wikipedia
What is the difference between Rhino and Spidermonkey JavaScript engines? - Stack Overflow
JavaScript について - JavaScript | MDN

iPhoneのバックアップやiTunesのデータを外付けHDDに保存する@Mac

手順概要

どっちのケースもやることは一緒

  1. 元のフォルダをこれから使いたいところにコピー
  2. 元のフォルダをリネームして念のためとっておく
  3. 元のフォルダの代わりにこれから使いたいところのシンボリックリンクを置く
  4. 問題なく使えるのを確認したらリネームしておいた元のフォルダを削除

iPhoneのバックアップ先の変更の実行例

旧バックアップフォルダ:

/Users/[username]/Library/Application Support/MobileSync/Backup

新バックアップフォルダ:

/Volumes/iTunes/Backup

cd /Users/[username]/Library/Application\ Support/MobileSync/
cp -r Backup /Volumes/iTunes/Backup
mv Backup _Backup 
ln -s /Volumes/iTunes/Backup Backup

iTunesの保存先の変更の実行例

旧バックアップフォルダ:

/Users/[username]/Music/iTunes/iTunes Media

新バックアップフォルダ:

/Volumes/iTunes/iTunes Media

cd /Users/[username]/Music/iTunes/
cp -r iTunes\ Media /Volumes/iTunes/iTunes\ Media
mv iTunes\ Media _iTunes\ Media
ln -s /Volumes/iTunes/iTunes\ Media iTunes\ Media

jQueryを使うことになったからjQueryについて調べた

どうでもいい話 〜きっかけになったこと〜

先日HTML5+JavaScriptなフロントサイドお願いしたい、と言うお仕事いただいて、おいおい経験ないよ、と思いながらも、モックが必要な期日が迫っているとかで猫の手も借りたいみたいな感じのようだったので、モックの一部の画面の作成を勉強を兼ねて引き受けた。

まず作業着手初日。
引き受けた時点ではAugularJSを使うかも、ということだったのでその調査。あとそもそもこれまではサーバサイドをPHPPerlでいじるばかりで、フロントサイドもHTML5JavaScriptもちょっとした修正くらいの経験しかないので、それら全般の調査に充てた。 あと既存コードの確認もしたけど、これは中身が全然なかったので本当にちょっとだけ。

そして二日目。
最新のファイルが送られてきて、確認したら、ディレクトリやファイル名が事前に共有されていたものからまるっと変わっていて面食らったのだけど開いてみて更にビックリ。

「なにこれ、モック出来上がってんじゃん」

これは一体どうしたことか。私の仕事はどこへ行ってしまったのか。根本的に担当内容の認識が違っていたとでもいうのか?だとしたら凄いヤバい事態もありうるじゃん…
頭の中を飛び交いまくるはてなマークと鳴り響くアラート。

先方に確認したら、CSSを依頼した会社が作ってくれたとのことで、共有してなかったけど足りない機能があるからそこをやって欲しいとのことだった。足りない機能と言っても、大した内容ではなくて、ここまでやった人にちょろっと変更して貰えば済むようなこと。ここで私に引き継いだら、既存コードの調査から入ることになるし凄い非効率なのになぁ…

なにはともあれ、その会社が用意してくれたコードがjQuery使いまくりなので、jQueryの概要を急遽かけあしでさらうことになったのです。

jQueryとは

  • 2006年1月生まれ
  • JavaScriptを便利に使うための軽量なライブラリ

1系と2系

  • 基本的な機能は同じだが、2系はIE6,7,8をサポートしない*1

使い方

  • ダウンロードして使う または ホストされているスクリプトをscriptタグで読み込んで使う
  • スクリプトを書く場合にはjQueryを読んだあと
  • 「$(document).ready( function() {...} );」は省略記法で「$(function() {...} );」と書ける
  • 処理の対象となるDOM要素をしているする「セレクタ」と、行いたい処理「メソッド
  • メソッド複数繋げることができて、メソッドチェーンという

以下はホストされているスクリプトを読み込んで使う例

<!DOCTYPE html>
<html lang="ja">
<head>
  <title>はじめてのjQuery</title>
</head>
<body>
  <p>とりあえず使ってみよう</p>
  <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
  <script>
    //この部分は次のように省略記法でシンプルに書ける
    //$(document).ready( function() {
    $(function() {
      // p がセレクタ、処理は .css('color', 'blue')
      // 「p要素の文字色を青色に」ということ
      // .hide('slow') 「ゆっくり消す」など別の処理を繋げて書くことができる
      $('p').css('color', 'blue');
      $('p').css('color', 'blue').hide('slow');
      // cssメソッドで色を指定すると変更する処理になるが、
      // 指定しないと現在の文字色の取得になる
      console.log($('p').css('color'));
    });
  </script>
</body>
</html>

要素の指定

セレクタによる指定
  • html要素: そのまま
  • id: #hoge
  • class: .piyo
  • 直下の子要素: >
  • それ以下の要素: 半角スペース
  • 複数の要素: ,
  • 隣接する要素: +
$(function() {
  // id='hoge' の要素直下の class='piyo' の要素
  $('#hoge > .piyo').css('color', 'green');
  // id='hoge' の要素以下(直下に限らない)の class='piyo' の要素
  $('#hoge .piyo').css('color', 'yellow');
  // li 要素と id='foo' の要素 と class='bar' の要素全部
  $('li, #foo, .bar').css('color', 'red');
  // id='foo' の要素の次の class='piyo'
  $('#foo + .piyo').css('color', 'blue');
});
フィルタによる指定
  • フィルタの指定で使う数字は0スタートなので、見た目の表示と1つズレることに注意
$(function() {
  // id='hoge' の要素直下の4番目の class='piyo' の要素
  $('#hoge > .piyo:eq(3)').css('color', 'green');
  // id='hoge' の要素直下の4番目より大きい(5番目以降の) class='piyo' の要素
  $('#hoge > .piyo:eq(3)').css('color', 'green');
  // id='hoge' の要素直下の奇数番目の class='piyo' の要素( :odd は偶数)
  $('#hoge > .piyo:even').css('color', 'green');
  // id='hoge' の要素直下の「test」と言う内容を含む class='piyo' の要素( :odd は偶数)
  $("#hoge > .piyo:contains('test')").css('color', 'green');
});
メソッドによる指定
  • 親要素: .parent()
  • 子要素: .children()
  • 兄弟(並列)の要素: .siblings()
  • 次の要素: .next()
  • 前の要素: .prev()
$(function() {
  // id='hoge' の要素直下の4番目の class='piyo' の要素の次の要素
  $('#hoge > .piyo:eq(3)').next().css('color', 'green');
});
属性セレクタによる指定

大括弧('[' と ']')を使って指定する 例: $('a[href="http://jquery.com"']').css('color', 'blue');

  • a要素のhoge属性がpiyoと等しい: a[hoge="piyo"]
  • a要素のhoge属性がpiyoと等しくない: a[hoge!="piyo"]
  • a要素のhoge属性がpiyoを含む: a[hoge*="piyo"]
  • a要素のhoge属性がpiyoから始まる(前方一致): a[hoge^="piyo"]
  • a要素のhoge属性がpiyoで終わる(後方一致): a[hoge$="piyo"]

HTML属性やカスタム属性の値の操作

HTML属性の場合
  • 取得: .attr('attribute_name')
  • 設定: .attr('attribute_name', 'new_value')
カスタム属性の場合

HTML5では data-custom_attr_name='value' の形でカスタム属性が設定できる

  • 取得: .data('custom_attr_name')
  • 設定: .data('custom_attr_name', 'new_value')

ただし、dataメソッドの取得と設定はjQuery内のキャッシュが対象であり、attrメソッドと挙動が違うので注意が必要*2

<!DOCTYPE html>
<html lang="ja">
<head>
  <title>はじめてのjQuery</title>
</head>
<body>
  <a href="http://jquery.com" >とりあえずjQuery使ってみよう</a>
  <a href="http://google.com" data-test='hoge'>とりあえずググってみよう</a>
  <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
  <script>
    $(function() {
      // コンソールに「http://jquery.com」と表示される
      console.log($('a').attr('href'));
      // コンソールに「http://google.com」と表示される
      console.log($('a').next().attr('href'));
      console.log($('a:eq(1)').attr('href'));

      // 「とりあえずググってみよう」のhrefがyahooに変わる
      $('a:eq(1)').attr('href', 'http://yahoo.co.jp');

      // コンソールに「undefined」と表示される
      console.log($('a').data('test'));
      // コンソールに「hoge」と表示される
      console.log($('a').next().data('test'));


      console.log($('a').next().data('test', 'piyo'));
    });
  </script>
</body>
</html>

タグの中身の操作

  • テキストを設定: .text('new text')
  • HTMLタグを含むテキストを設定: .html('<a href="http://jquery.com">jQuery</a>')
  • inputタグのvalue属性を取得: .val()
  • inputタグのvalue属性を設定: .val('new value')
  • タグの中身の消去: .empty()
  • タグ自体の消去: .remove()

スタイルの適用と外し方

  • 適用: $('#hoge > .piyo').addClass('css_class_name');
  • 外す: $('#hoge > .piyo').removeClass('css_class_name');

要素の追加

不等号記号( '<' と '>' )で囲うと新しい要素を作成できる

  • 特定の要素の前に追加: .before(newElement) newElement.insertBefore(targetElement) とも書ける
  • 特定の要素の後ろに追加: .after(newElement) newElement.insertAfter(targetElement) とも書ける
  • 要素の先頭に追加: .prepend(newElement) newElement.prependTo(targetElement) とも書ける
  • 要素の最後尾に追加: .append(newElement) newElement.appendTo(targetElement) とも書ける

insertHoge や piyoTo のほうが英文ライクに読みやすい並びになって好みかも

<!DOCTYPE html>
<html lang="ja">
<head>
  <title>はじめてのjQuery</title>
</head>
<body>
  <!-- ここに追加される <a href="test">新しいリンク</a> -->
  <a href="http://jquery.com">とりあえずjQuery使ってみよう</a>
  <!-- ここに追加される <a href="test">新しいリンク</a> -->
  <a href="http://google.com" data-test='hoge'>とりあえずググってみよう</a>
  <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
  <script>
    $(function() {
      var new_a = $('<a>').text('新しいリンク').attr('href', 'test');
      $('a').before(new_a);
    });
  </script>
</body>
</html>

要素を隠したり表示したりするエフェクトメソッド

  • 隠す: .hide()
  • 表示する: .show()
  • 徐々に隠す: .fadeOut()
  • 徐々に表示する: .fadeIn()
  • 表示⇔隠す: .toggle()

.hide(slow) や .show(500) (ミリ秒で指定)などが可能

クリックやマウスオーバーといったイベント

TODO: ドットインストール #13再確認してサンプル作成

フォームに関するイベント

TODO: ドットインストール #14再確認してサンプル作成

onメソッドの使い方(動的に操作する手段)

TODO: ドットインストール #15再確認してサンプル作成

ajax

ajaxとは
  • Asynchronous JavaScript + XML の略 TODO: ドットインストール #16,17,18再確認してサンプル作成

コールバック関数により、処理の順序を規定する(aのあとbを実行したいときに同時に処理されてaの完了より先にbが実行されないようにする)

TODO: getJSONについて調べる

20 JSONの扱い

*1:jQuery 2.x has the same API as jQuery 1.x, but does not support Internet Explorer 6, 7, or 8. All the notes in the jQuery 1.9 Upgrade Guide apply here as well. Since IE 8 is still relatively common, we recommend using the 1.x version unless you are certain no IE 6/7/8 users are visiting the site. Please read the 2.0 release notes carefully” - Download jQuery | jQuery

*2:jQueryのカスタムデータ属性(data-*)の設定/取得の挙動が思ったのと違った件 - Qiitaがわかりやすい