午後から→オーバークロック

駆け出しハッカー()によるプログラミング・サービス開発備忘録。

イヤホンが断線したので半田こて買って修理してみた

f:id:nemupm:20150211172334j:plain

イヤホンが聴こえなくなり、修理に出そうかと思ったのですが、
3000円くらい掛かるのと、半田こてに興味があったので、
半田こてセットを買ってD.I.Y.してみました。

準備

  • 半田こてセット
    • 最悪こてと半田があれば問題無いです

goot 電子工作用はんだこてセット X-2000E

goot 電子工作用はんだこてセット X-2000E

  • はさみ
  • ライター
  • イヤホン
  • 交換用ミニプラグ

作業

半田付けまで

  1. イヤホンの先をはさみで切り、さらに数cm分ケーブルのみをはさみで上手く取り除きます。
  2. ミニプラグのカバーを先にケーブルに通します。
  3. 赤・青・金の3本の線があるので、先をこねて解きます。
  4. 線の先をライターで炙って被覆を取り除きます。
  5. ミニプラグを音楽プレーヤーに挿して、音楽を流した状態にします。
  6. 3本の線をミニプラグに当ててみて、イヤホンが聴こえるかどうかを試します。
    • 3本の線がミニプラグのどの場所に対応するかは場合によって異なるらしいですが、自分は左(青)、右(赤)、中央(金)でした。
    • この時、線を当てる場所や角度が多少ずれても聴こえる状態でないと、完成した時ちょっとの衝撃で聴こえなくなる可能性があります。

f:id:nemupm:20150211173536j:plain

半田付け

  1. 線をミニプラグの穴に内側から通し、すぐ溶接できる状態まで安定させます。
    • ここはめちゃくちゃ苦労しました。中央を最後に通すと比較的やりやすかったです。
  2. 半田こてを温めます。台に置いておきましょう。
  3. (上の半田こてセットであれば)バネ状になっている半田の先5cmくらいを解きます。
  4. いよいよ溶接です。順番としては
    1. 半田こてを溶接箇所に先に当て
    2. 半田を当てて溶かし
    3. 十分溶かしたら半田を離し
    4. 半田こてを最後に離します。
  5. 3つ全部溶接し終わったらカバーを付けて完成です。

f:id:nemupm:20150211175532j:plain

感想

  • 面白い
  • 十分聴こえる状態まで回復
  • 机拭こう

参考

シェルスクリプトでファイル名を正規表現比較で分岐して一括リネーム

.jpgをつけずに保存してしまった画像ファイルに一括で.jpgをつけたい。
ただし同じフォルダに.jpgファイルなどもあるのでそれらはリネームしたくない。
そんな状況になったのでshellで正規表現を使って一括リネームした話。

for f in * ;do
        if  [[ ! $f =~ .*(jpg|png|sh) ]];then
                mv $f $f.jpg
        fi
done

絶対「えっ?そんなのmv *.jpg ./tmpとかで避ければ良い話じゃん!」とか言ってはいけない。

参考

シェルの基本

シェル制御構造と正規表現の基礎・UNIXテクニック集

シェルスクリプト入門 書き方のまとめ | Memo on the Web

記号について

シェルの初歩の初歩

記憶力悪いしシェルを頻繁に使わないのですぐ忘れるのです。

Pythonで競技プログラミング(プロコン)

今更ではあるが今後AtCoderの問題を解く上で使ったライブラリとか手法とかを
ここにまとめていこうと思う。python限定。

入出力

基本

i = input()
x,y = map(int,raw_input().split())

応用

複数行を一気に読んで、入出力のオーバーヘッドを無くせる。
(行数が多い時、稀にこれをしないとTLEになる。)

lines = sys.stdin.readlines()

因みにローカルで実行するときは<ctrl-d>とかでEOFを検知させる必要が有る。

ローカルでの実行

クリップボードにテストデータ(テキスト)コピーしたあと、
以下で簡単に実行できる。

pbpaste| python test.py

問題が難しくて、テストデータを何回も使いそうだと思った場合は、
ファイルに書き出しておく。

pbpaste > dataset1
pbpaste > dataset2
python test.py < dataset1
python test.py < dataset2

ライブラリ

heapq

優先順位付きキューを実現するモジュール。 Donutsコン2015C問題などで使用したが、すごく使う機会が多い。 基本的に「要素を追加・最小値を削除」が継続的に必要な時に使う。

from heapq import heappush, heappop, heapify
heap = [2,3,7,1]
heapify(heap)

以下の3つの機能に対応する操作がある。

キューに対して要素を優先度つきで追加

heappush(heap,element)

最も高い優先度を持つ要素をキューから取り除き、それを返す

heappop(heap)

最も高い優先度を持つ要素を取り除くことなく参照

heap[0]

itertools

組み合わせや順列を使うときは、素直にライブラリを使うのが良さげ。 Donutsコン2015のB問題で使用(実際には216は64*1024=105程度のオーダーしか無いので十分扱えたが…)

Python で組み合わせや順列を得るときは itertools を使う | CUBE SUGAR STORAGE

  • 5C2だとitertools.combinations([1,3,4,6,7],2)

Union-Find

Makoto Hiroiのページを参考にしました。
ARC#032のB問題で使用。

class UnionFind3:
    def __init__(self, size):
        # 負の値はルート (集合の代表) で集合の個数
        # 正の値は次の要素を表す
        self.table = [-1 for _ in xrange(size)]

    # 集合の代表を求める
    def find(self, x):
        if self.table[x] < 0:
            return x
        else:
            # 経路の圧縮
            self.table[x] = self.find(self.table[x])
            return self.table[x]

    # 併合
    def union(self, x, y):
        s1 = self.find(x)
        s2 = self.find(y)
        if s1 != s2:
            if self.table[s1] <= self.table[s2]:
                # 小さいほうが個数が多い
                self.table[s1] += self.table[s2]
                self.table[s2] = s1
            else:
                self.table[s2] += self.table[s1]
                self.table[s1] = s2
            return True
        return False

def main():
    lines = sys.stdin.readlines()
    n,m = map(int,lines[0].split())
    uf = UnionFind3(n)
    for line in lines[1:]:
        a,b = map(int,line.split())
        uf.union(a-1,b-1)
    size = 0
    for v in uf.table:
        if v < 0:
            size += 1
    print(size-1)
main()

最初self.tableにはsize個の-1が入っている。
これは、要素数1の集合がsize個あるということ。
負の値を持つのはルートだけなので、負の個数を調べれば素集合の数がわかる。

nCr mod m(コンビネーションのmodulo計算)

プロコンでは組み合わせnCrの計算結果を出力させる際に、数が大きくなっても大丈夫なようにmodulo計算させる場合が多い。
(ARC#039のB問題など)

def modc(a,b,m):
    c = 1
    for i in xrange(b):
        c = c * (a - i) % m
        c = c * modinv(i + 1,m) % m
    return c
 
def egcd(a, b):
    (x, lastx) = (0, 1)
    (y, lasty) = (1, 0)
    while b != 0:
        q = a // b
        (a, b) = (b, a % b)
        (x, lastx) = (lastx - q * x, x)
        (y, lasty) = (lasty - q * y, y)
    return (lastx, lasty, a)
 
def modinv(a, m):
    (inv, q, gcd_val) = egcd(a, m)
    return inv % m

nCr mod mmodc(n,r,m)で得られる。

modulo(合同式)の四則演算

  • 加算:(a + b) mod m = (a mod m) + (b mod m)
  • 減算:(a - b) mod m = (a mod m) - (b mod m)
  • 乗算:(a * b) mod m = (a mod m) * (b mod m)
  • 除算:(a / b) mod m = (a mod m) * b'
    • b'はb mod mの逆元(逆数)で、上記のmodinv(参考)で求められる。

Pylearn2でディープラーニングまとめ

Pylearn2のインストール

今ナウいディープラーニングのライブラリ「Pylearn2」のインストールとチュートリアル - Qiitaを参考にしました。

virtualenv --no-site-packages pylearn2env
source pylearn2env/bin/activate
pip install numpy
pip install scipy
pip install setuptools
pip install matplotlib
pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
pip install -e git+https://github.com/lisa-lab/pylearn2.git#egg=Pylearn2

bin/activate環境変数の設定

There's no magic: virtualenv edition - Blog - Hacker Schoolとか見たりして
activate時に自動的に変数を設定。
もちろんこれらはその都度入力するのでも問題無い。

export PYLEARN2_VIEWER_COMMAND="eog --new-instance" # 適当などこかに書く。GNOMEの場合
export PYLEARN2_VIEWER_COMMAND="open -Wn" # Macの場合
unset PYLEARN2_VIEWER_COMMAND # deactivate()内

また、データパスをexport PYLEARN2_DATA_PATHで設定。

準備知識から実践まで

これらの資料を順に読んだら一通り理解できました。

準備知識(Auto Encoderなど)

Auto Encoderについての詳細

Pylearn2の詳しい使い方

サンプルデータを使って文字認識

思ったこと

確かに特徴抽出は自動になったけど、結局チューニングが難しいので扱うのは容易くなさそう。

Git超入門チートシート

いつやるの?Git入門 v1.1.0が個人的にすごく分かりやすかったので、
覚える意味も込めて簡単にまとめました。(といっても羅列しただけだけど…)

用語

  • HEAD
  • branch
    • コミットツリーの内の、どれかのコミットを指す単なるフラグ
    • 参考のところのスライドの図(127~ of 211)が分かりやすかった。
  • ワークツリー
    • 作業ディレクトリ。
  • ステージングエリア
    • 次回コミット時に扱うファイル群を管理するインデックス。

コマンド一覧

基本

  • git status
    • branchの状態や変更されたファイルを教えてくれる
  • git add .
    • 変更されたファイルをすべて加える
  • git commit -m “first commit"
    • aオプションですべてのファイルをaddしてからコミット
  • git rm
    • 削除&削除情報のaddを同時にやったのと同じ?
  • git mv
    • 移動以下略
  • git reset HEAD <file>
    • ステージングエリアをgitのHEAD状態に戻す
    • 参考URL
  • git checkout -- <file>
    • 作業ディレクトリをステージングエリアの状態に戻す
  • git log --graph --color
    • コミットログを見る
  • gitk

ブランチ

  • git branch -a
  • git branch <new_branch>
  • git checkout <branch>
    • 作業中のブランチを切り替える
  • git checkout -b <new_branch> [<start_point>]
    • Gitのブランチを作成して切り替える
  • git merge <branch>
    • 現在のブランチに指定ブランチをマージ
  • git rebase <branch>
    • 現在のブランチを指定ブランチからリベース

リモート

  • git clone <url>
  • git remote add <repo> <url>
    • repo:リモートリポジトリの名前。大抵origin
  • git remote
    • リモートリポジトリ一覧を表示
    • -vでurlも合わせて表示
  • git push <remote> <refspec>
    • 例:git push origin master
    • originはリモートのurlの名前、masterはリモートのブランチ名
  • git fetch <remote> <refspec>
    • 例:git fetch origin master
    • originのmasterをローカルのgitに適用する
  • git pull <remote> <refspec>
    • mergeも一緒にする

その他

  • git rm -r --cached .
    • .gitignoreの設定を反映させる。

リモートリポジトリとの接続に鍵を使う

Bitbucketアカウント作成〜ローカルのGit既存プロジェクトをインポート(push) | EasyRambleが分かりやすいです。

MySQLからSQLite3へデータベースを移行する

ツールが無いかと探してみたらあったのでストック。

MySQL to Sqlite converter

使い方は以下を実行してパスワードを入力するだけ。

./mysql2sqlite -u <ユーザ名> -p <MySQLのDB名> | sqlite3 <SQLite3のDB名>

MacにMEAN.IOを入れてTwitterのOAuthログインできるWEBアプリの作成まで

Dockerで開発するわけにもいかないので、ローカルで開発できるようにします。
MEANに必要な全てをインストールしていきます。

インストール

MongoDB

brew update
brew install mongodb

初期状態でdbpathは/usr/local/var/mongodb
logディレクトリは/usr/local/var/log/mongodbになってて、
文句は無いのでこのままにしておきます。

起動自動化

Linuxにはchkconfigがありますが、Macにはlaunchctlがある模様。

MacでMongoDBをDaemon化して自動起動させる - Meltdown Countdown rev.

ここのサイトさんを参考に以下のコマンドを実行して、
org.mongo.mongod.plistファイルを作成。

sudo curl https://gist.githubusercontent.com/marutanm/976445/raw/org.mongo.mongod.plist | sudo tee /Library/LaunchDaemons/org.mongo.mongod.plist > /dev/null

ラベルはmongodとかに変えてもいいかもしれません。
そしてとりあえず起動。

launchctl load /Library/LaunchDaemons/org.mongo.mongod.plist

Node.js

普通に公式でダウンロードしたパッケージを実行すれば良いです。

パーミッションの設定

このままだとNode.jsのパッケージマネージャであるnpmを使う際に、
毎回sudoを付けなくてはいけないので、以下を実行。

sudo chown -R `whoami` ~/.npm
sudo chown -R `whoami` /usr/local/lib/node_modules

Homebrewとかもsudo付けないのでこちらの方が落ち着きます。

Express

npm install -g express

gオプションを付けると全てのプロジェクトでパッケージを使えるように
グローバルインストールしてくれる。

Bower

Twitter社が作ったフロントエンド用のパッケージマネージャらしいです。
これも後で使うのでインストール。

npm install -g bower

Grunt

ビルドツールです。JavaでいうAntです。

npm install -g grunt-cli

MEAN

いよいよ本体です。素直にトップページに書かれているコマンドを打ちます。(sudoは除いて)

npm install -g mean-cli

これで必要なものは全てインストールされました。

アプリの用意

雛形アプリの作成

アプリは以下のコマンドで簡単にディレクトリ配下に作成できます。

mean init yourNewApp

依存モジュールのインストール

先ほど作ったアプリのルートディレクトリに潜り込んで、
依存モジュールをインストールします。

cd ./yourNewApp
npm install

BowerによるCSSパッケージ等のダウンロード

同じディレクトリで以下を実行。

bower install --allow -root

起動

アプリのルートディレクトリで単純に以下。

grunt -f

自分の場合fオプションが無いと実行できませんでした。
これで、晴れてhttp://localhost:3000でアクセスできます。

f:id:nemupm:20141121025210p:plain

起動オプション

起動するポート番号なんかはどこで設定するのだろうと調べたら、
config/env/all.jsprocess.env.PORTという変数を発見。

Node.js の起動オプション、環境変数、npm start の話 - Block Rockin’ Codes

このサイトさんに以下のように書かれていました。

環境変数

オプションとは違いますが、起動時にあわせて使います。 基本は、 xxx=yyy という変数をつけて実行すると、ランタイムからはprocess.env.xxx で yyy の値を文字列値として受け取れることを利用しています。 慣習的に NODE_XXX という変数が使われます。例えば独自変数 NODE_MY_FLG を指定したい場合。

$ NODE_MY_FLG=true node server.js

このように指定できます。

よって、ポート番号や起動する環境を指定したいときは以下のように書きます。

NODE_ENV=test PORT=8080 grunt -f

Twitter-OAuthの設定

CONSUMER KEY・SECRETの取得

Application Managementでアプリを作成しましょう。

  • Callback URLにはhttp://127.0.0.1:3000/auth/twitter/callbackと書いてください。
    • localhostじゃない理由は、それだと登録できないからです。
  • Consumer KeyとConsumer Secretはメモしましょう。

設定ファイルに書き込み

config/env/development.jsを書き換えましょう。

  twitter: {
    clientID: 'YOUR_CONSUMER_KEY',
    clientSecret: 'YOUR_CONSUMER_SECRET',
    callbackURL: 'http://127.0.0.1:3000/auth/twitter/callback'
  },

これで後はhttp://127.0.0.1:3000にアクセスするだけです。以上で終了です。