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

GraffitiNote

Pythonistaの情報系大学生がプログラミングやらDTMやらデザインやら

このブログと筆者について

プログラミングに関するメモやその他情報発信をしていきます。

扱えるプログラミング言語
Python2&3, C/C++, Java, Perl, JavaScript, PHP

使用しているソフトウェア
SublimeText, LogicProX, Photoshop, Illustrator, InDesign, Premiere Pro

Twitter
Shun Tnni (@1ntegrale9) | Twitter

Soundcloud
sweetsoundstory | Free Listening on SoundCloud

執筆記事
TechnoTUT — たのしいフーリエ解析
豊橋技術科学大学 総合文化部 — エンジニアのためのデザイン入門

Amazonほしいものリスト

githubの複数アカウントを使い分けるためにsshからhttpsに切り替えた話

プログラミング用と制作用にgithubアカウントを複数使い分けるようにした。
そこで問題になるのがssh-keyをどう切り替えるか。
結論としては、ssh-keyを切り替えるのは面倒なのでhttps方式を採用した。

https方式にするのは簡単で、git clone時に
Use SSH(Clone with SSH)の"git@github.com:~"ではなく
Use HTTPS(Clone with HTTPS)の"https://github.com/~"を指定する。

git push時の設定は
Caching your GitHub password in Git - User Documentation
を参考に認証情報(キャッシュ)を保存するようにする。
~/.ssh/configのHostを弄ったりする必要はない。

……という単純な話だと思ったのだが、git push時に
"remote: Permission to 制作用ユーザ/repository.git denied to PG用ユーザ."
というエラーに悩まされた。
調べても"Permission denied (publickey)"の対処法ばかり出るし、
.sshを爆破したりgit configのglobalもlocalも弄ったりしてもダメだった。

結局、git cloneするときにユーザ名を指定するやり方
"https://ユーザ名@github.com/username/repository.git"
で解決した。

原因が未だに不明なので教えていただけるとありがたいです。



参考にした記事はこちら

qiita.com

yutainoue008.hatenablog.com

te2u.hatenablog.jp

技科大生活の振り返り

この記事はTUT Advent Calendar 2016 - Adventarの11日目の記事です。


こんにちは。TUT3系B4の丹内です。

昨年と一昨年のTUT Advent Calendarでは以下の記事を執筆しました。
豊橋技科大音楽技術部, たのしいフーリエ解析
豊橋技術科学大学 総合文化部 • エンジニアのためのデザイン入門

今年度は卒業して就職する予定なので、
自身の技科大生活の振り返りと、得られた教訓について書こうかなと思います。
36時間寝続けた話と女装せずに女装コンテストに出た話は諸事情で割愛します。


入学してから先生になるまで

自身が技科大内で何者であったか、ということに関するエピソード。

入学早々にクラス代表に立候補したり、サークルを立ち上げたり、
講義を全履修していたり、8つのサークル掛け持ちしていたり、
その他色々と目立つような行動を重ねていった結果、
名前が独り歩きして知らない人まで自分のことを知っていたり、
「学校で一番有名」ということを言われるようになっていたり。

最終的に何故か周りから「先生」と呼ばれるようになっていました。
先生呼びが定着し、名前で呼ばれることが少なくなった頃、
某氏の陰謀で昨年度の学祭の女装コンテストに出ることになったのですが、
その時送られてきたメールが以下の通り。


どうやら自分はいつの間にか先生になっていたようです。
(本当に先生だと思ってこの文章を送ってきたとのこと。)

因みに今では諸事情で滅多に「先生」と呼ぶ人はいませんが、
過去に呼ばれていた形跡はこちらから確認することができます。
tnni 先生 - Twitter Search


人生初のリーダー経験

ここからが本題。

本学に入るまでリーダーの経験は一切なかったのですが、
気が付けばクラス代表と2つのサークル代表と
合わせて3つのリーダーを並行していました。
自分のことは凡人だと思っていますし、
周りには優れた人や変わった人が多かったので、不思議です。

「音楽技術部」というサークルを立ち上げて、今年度で3年目になります。
(正確には総合文化部の下に音楽技術部門として作りました)
当時を振り返ってみると、入学5日目にして既に着想があり、
2ヶ月経たずに行動に移していて、なかなかの行動力だなぁと思います。
ここ数年衰えが激しいので、今ではもうこういうことできないなぁと。


その辺りの原動力やモチベーションとして、
高専時代にもサークルを立ち上げて活動してた経緯があり、
ある程度ノウハウがあって敷居が低かったというのがあります。
あとは上でも述べたように自分には幸いにも人望には恵まれていたようで、
あらゆる場所で声を掛ける苦労はありましたが、
すぐに人は集まってくれました。
ここ3年で立ち上げに失敗したり消滅していったサークルがいくつかあったので、
このサークルは珍しく上手く存続している運が良い例だと思います。
仲間には感謝しています。

リーダーを務めて得られた知見がいくつかあるので書き出してみます。

・リーダーには独裁者気質が必要
メンバーは勝手に都合よく動いてくれたりはしません。
故にリーダーは指示を出しメンバーを動かし続けなければなりません。
「これでいいのかな」などと優柔不断になっている暇はありません。
リーダーがアクションを起こさなければ活動は停滞し、
メンバーは離れていきます。
企画はリーダーが少なくとも叩き台を出す必要があります。
メンバーが企画を持ってくるという幻想は捨てましょう。
募集も無駄なのでやめましょう。
企画を持ってきてくれる人は募集してなくても持ってきます。
しばらく活動していれば自ずと動いてくれるメンバーは出てきます。
しかし、それまではずっとリーダーは正しく判断し正しい指示を出す
独裁者である必要があります。

・リーダーは傲慢になる
上の独裁者云々とは別の話です。
リーダーの仕事は指示を出すことよりも書類手続きや事務連絡が主になります。地味です。
ある程度メンバーに任せられるものもありますが、
リーダーにしかできない仕事が多いです。
活動よりも仕事をすることが多くなることもあります。
何のためにやってるのか分からなくなることもしばしば。
そんな状況が続くと心が荒んでいきます。
よほど聖人でなければ、
「仕事量が不公平だ」「メンバーは自分勝手」「自分は偉い」
などという思考が渦巻いたりします。
そういう気持ちを抑えて折り合いをつける必要があります。
そういう時はメンバーの何気ない一言が心に沁みるものです。



(途中で力尽きたので後で補完します)




明日はtenntennさんが何か書くそうです。

OSのアップデートと環境設定の見直し

iMacとMBPが未だにYosemiteのままだったので、
双方ともSierraにアップデートしました。

それに伴って環境設定の見直しをした際の備忘録として。
Xcodeの更新があったので見直さざるを得なかった)

Xcode/Command Line Toolsのアップデートの影響で、
gcc/g++のバージョンが不安定で挙動がおかしくなったので、
以下を参考にシンボリックリンクを設定。
nonbiri-tereka.hatenablog.com

ついでにパッケージの更新も以下を参考に。
qiita.com
iganari.hatenablog.com

各種ライブラリのアンインストール(削除)手順と/usr/localについて

プログラミング

MeCabやらCabochaやらの挙動が少しおかしくなったので、
入れ直すためにアンインストールしようと思ったのだが、
アンインストール手順を調べたところ、

1.落としたファイルを解凍したディレクトリでsudo make uninstallしてね!
2.アンインストール方法なんて用意してないよ!

のどちらかだった(しかも落としたファイルはインストール後に削除している)
ので、仕方なく各ファイルを探し当てて消していくことにした。

で、どうやら/usr/local/あたりに色々とあるらしいということが分かった。

dqn.sakusakutto.jp
hateda.hatenadiary.jp
/usr/local ‐ 通信用語の基礎知識

UNIXPOSIX準拠OS(Linux等)で、利用者がインストールしたソフトウェア等を置くディレクトリ。
オペレーティングシステム(OS)によって考え方は異なっているが、Linuxの標準FHSでは、自分でコンパイルしたバイナリは/usr/local以下に置くことになっている。のため、/usr/local以下の使用はホスト管理者に任せられており、一般にOSインストール直後は空になっている。

なるほど。そして以下を実行。

cd /usr/local/lib
rm libcabocha.*
rm libcrfpp.*
rm libmecab.*
rm -dr mecab
cd /usr/local/libexec/
rm -dr mecab

これで完了かな?とりあえずmecabコマンド打ってみよう。

mecab
dyld: Library not loaded: /usr/local/lib/libmecab.2.dylib
  Referenced from: /usr/local/bin/mecab
  Reason: image not found
Trace/BPT trap: 5

なんかまだ生きてるっぽい。PATHあたりに何かヒントあるかも?

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

/usr/local/binにまだファイル残ってるっぽい。というわけで以下も実行。

cd /usr/local/bin/
rm mecab
rm mecab-config
rm cabocha
rm crf_*

んでもっかいmecabコマンド打って確認。

mecab
-sh: mecab: command not found

無事にアンインストールできた様子。

この辺参考に入れ直し。utf-8指定しないとダメ。ゼッタイ。
m0t0k1ch1st0ry.com
係り受け解析機「CaboCha」をFreeBSD 10.1にインストールする - Symfoware
github.com

paiza Online Hackathon Vol.8 (POH8) with Python3

ショートヘア

RepeatNum = int(input())
OutputString = input()

for C in range(RepeatNum):
    print(OutputString)

ロングヘア

Integer = int(input())

Answer = "lucky" if Integer % 7 == 0 else "unlucky"
print(Answer)

ポニーテール

CorrectAnserQuant = 0
for n in range(5):
    dn,en = input().split()
    if dn == en:
        CorrectAnserQuant += 1

Answer = "OK" if CorrectAnserQuant >= 3 else "NG"
print(Answer)

ツインテール

TotalLength = int(input())
CurrentStatusNum = int(input())

CharList = ["-" for C in range(TotalLength)]
CurrentIndex = CurrentStatusNum - 1
CharList[CurrentIndex] = "+"
Answer = "".join(CharList)
print(Answer)

おさげ

def Check(MaxLength,MaxSongQuant):
    SongQuant,TotalLength = 0,0
    for n in range(MaxSongQuant):
        SongLength = int(input())
        TotalLength += SongLength
        if TotalLength > MaxLength:
            return(SongQuant)
        SongQuant += 1
    return("OK")

MaxLength = int(input())*60
MaxSongQuant = int(input())

Answer = Check(MaxLength,MaxSongQuant)
print(Answer)

たれ目

RemainSeatsQuant,PeopleQuant = map(int,input().split())

Answer = "OK" if RemainSeatQuant >= PeopleQuant else "NG"
print(Answer)

つり目

p = int(input()) #買物額

Answer = p//100 if p < 1000 else p//100 + 10
print(Answer)

めがね

N = int(input()) #数字の個数
NumSequence = [i for i in map(int,input().split())].sort(reverse=True)

CenterIndex = (N+1)//2 -1
Answer = NumSequence[CenterIndex]
print(Answer)

Cute衣装

#スタッフの人数、パックに入っているアメ玉の数
n,m = map(int,input().split())

Answer = "ok" if m % n == 0 else "ng"
print(Answer)

Sexy衣装

#元の位置から進んだ歩数, 進んだ先から下がった歩数
M,N = map(int,input().split())

CP = M - N #CurrentPosition
Answer = CP if CP > 0 else 0
print(Answer)

制服

CardSequence = ["3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"]
OrderSequence = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
PlayerRankList = [0 for C in range(52)]
PlayerHandList = [OrderSequence[CardSequence.index(Card)] for Card in input().split()]

HighestCardNum,LastPlayerIndex = 0,52
while PlayerHandList.count(0) != 52:
    for Index,CardNum in enumerate(PlayerHandList):
        if LastPlayerIndex == Index:
            HighestCardNum = 0
        elif CardNum > HighestCardNum:
            HighestCardNum = CardNum
            LastPlayerIndex = Index
            PlayerHandList[Index] = 0
            PlayerRankList[Index] = max(PlayerRankList) + 1

for i in rank:
    print(i)

浴衣

N = int(input()) #冷蔵庫からの出し入れの回数

eue2 = 0 #electric utility expense
temp = 0 #temperature
lasttime = 0
for i in range(N):
    ti,si = input().split()
    up = 5 if si == "in" else 3
    tdiff = int(ti) - lasttime
    eue2 += up
    temp += up - tdiff if temp - tdiff >= 0 else up - temp
    lasttime = int(ti)
temp -= 24 - lasttime

answer = 24-eue2 + 2*eue2 if temp <= 0 else 24-eue2 + 2*eue2 - temp
print(answer)

水着

#変更前の文字列の長さ、変更後の文字列の長さ
n,m = map(int,input().split())

s = input() #変更前の文字列
t = input() #変更後の文字列

counter = {}
for c in s:
    if not c in counter:
        counter[c] = 1
    else:
        counter[c] += 1
for c in t:
    if not c in counter:
        counter[c] = -1
    else:
        counter[c] -= 1

answer = sum(-1*i for i in counter.values() if i < 0)
print(answer)

マイク

import math

n = int(input()) #1日にこなせるイベント回数
m = int(input()) #計画されているイベント総回数

answer = math.ceil(m/(n*2))
print(answer)

カチューシャ

import math

#ファンの人数(人) 、色紙1枚の費用(円)
n,p = map(int,input().split())
#ペン1本でサインの書ける色紙枚数(枚)、ペン1本の費用(円)
m,q = map(int,input().split())

answer = math.ceil(n/m)*q + n*p
print(answer)

pythonで家計簿 その2

jsonで保存,表示させるところまで。
色々とオプションも動くようにしたけどまだ中途半端。
保存フォーマットの仕様を変更したので、
以前のファイルを新フォーマットに更新するhadbrf.pyも用意。

hadb.py

#Household Accounts Database
import json
import datetime
import locale

#データ格納ファイル
datafile = 'sample.json'

#初期辞書
initialdic = {'0': {'date':{'year':"0",'month':"0",'day':"0"},'item':{'kind':"0",'place':"0",'amount':"0"},'record':{'year':"0",'month':"0",'day':"0"}}}

#日付データ
thisdate = datetime.date.today()
thisyear,thismonth,thisday = str(thisdate).split('-')

#データ読み込み
def fileinput(filename,encoding):
    with open(filename,'r',encoding=encoding) as file:
        return(json.load(file))

#データ上書き
def fileoutput(filename,encoding,data):
    with open(filename,'w',encoding=encoding) as file:
        json.dump(data,file,sort_keys = True, indent = 4)

#年月日補完
def DatetimeCompletion(data):
    revdata = data[::-1]
    if len(revdata) == 3:
        revdata.append(thisday)
    if len(revdata) == 4:
        revdata.append(thismonth)
    if len(revdata) == 5:
        revdata.append(thisyear)
    completedata = revdata[::-1]
    return(completedata)

#総計
def TotalAmount():
    HADB = fileinput(datafile,'utf-8')
    index = [str(itr) for itr in range(len(HADB))]
    AllAmount = [int(HADB[itr]['item']['amount']) for itr in index]
    return(sum(AllAmount))

#データ抽出表示
def SearchDictionary():
    print("\nEnter: query\n")
    query = input()
    LineBreak()
    HADB = fileinput(datafile,'utf-8')
    index = [str(itr) for itr in range(len(HADB))]
    for itr in index:
        print(HADB[itr]['item'][query])

#データ変更
def ChangeDictionary():
    print("\nEnter: query origin replace")
    query,origin,replace = input().split()
    HADB = fileinput(datafile,'utf-8')
    index = [str(itr) for itr in range(len(HADB))]
    for itr in index:
        if HADB[itr]['item'][query] == origin:
            HADB[itr]['item'][query] = replace

    fileoutput(datafile,'utf-8',HADB)
    print("\ndata changed.")

#データ追加
def UpdateDictionary():
    #データ振り分け(年,月,日,種別,店名,金額)
    year,month,day,kind,place,amount = DatetimeCompletion(input().split())
    #日付,項目,記録日
    date = {'year':year,'month':month,'day':day}
    item = {'kind':kind,'place':place,'amount':amount}
    record = {'year':thisyear,'month':thismonth,'day':thisday}
    #追加する辞書
    newdata = {'date':date,'item':item,'record':record}
    #家計簿データベースに新しいデータを追加
    HADB = fileinput(datafile,'utf-8')
    numbering = str(len(HADB))
    HADB[numbering] = newdata
    #json形式で保存
    fileoutput(datafile,'utf-8',HADB)
    print("\ndata appended.")

#改行
def LineBreak():
    print("")

#実行文
while True:
    print("\nEnter: year month day kind place amount")
    print("Option: exit clear view search change\n")
    stdin = input() #標準入力
    if stdin == "exit": #終了
        LineBreak()
        break
    elif stdin == "clear": #データ初期化
        fileoutput(datafile,'utf-8',initialdic)
    elif stdin == "view": #データ一覧表示
        print(json.dumps(fileinput(datafile,'utf-8'),sort_keys = True, indent = 4))
        LineBreak()
        print("total amount =",TotalAmount())
    elif stdin == "search": #データ抽出表示
        SearchDictionary()
    elif stdin == "change": #データ変更
        ChangeDictionary()
    elif stdin == "sum": #総和を求める
        LineBreak()
        print(TotalAmount())
    else: #データ追加
        UpdateDictionary(stdin)
続きを読む

mecab-pythonがどうしても入らない話

研究で使用しなきゃいけないんだけど、どうしても入らない
gcc-4.2がエラー吐いてるからgcc入れ直したりしたけど無意味
MacがダメならUbuntuでと試してもダメ
ということで困っている。解決策模索中。

(2016-06-16追記)
macでpip install時にgccエラーが表示される場合 | かねしろぐ - 兼城駿一郎(@pinkroot )のライフログ
上の記事に辿り着いて解決しました。
command line toolsがインストールされていないのが原因でした。
「恐るべきことに、以前インストールしたはずなのにインストーラーが立ち上がりました。」
がそのまんま当てはまったパターン。

以下長文のエラーコード

続きを読む

pythonで家計簿を付ける その1

家計簿を付ける習慣がない、でもpythonを書く習慣はある。
だからpythonで家計簿を付けよう。

とりあえず記録するところまで書き終えた。

hab.py

import json
import datetime
import locale

#データ格納先ファイル
datafile = "sample.json"

#日付情報
thisdate = datetime.date.today()
thisyear,thismonth,thisday = str(thisdate).split('-')

# データ読み込み
def fileinput(filename,encoding):
    with open(filename,'r',encoding=encoding) as file:
        return(json.load(file))

#データ上書き
def fileoutput(filename,encoding,data):
    with open(filename,'w',encoding=encoding) as file:
        json.dump(data,file)

#データ書き込み
def filewrite(filename,encoding,data):
    with open(filename,'a',encoding=encoding) as file:
        json.dump(data,file)

#年月日補完
def DatetimeCompletion(data):
    revdata = data[::-1]
    if len(revdata) == 3:
        revdata.append(thisday)
    if len(revdata) == 4:
        revdata.append(thismonth)
    if len(revdata) == 5:
        revdata.append(thisyear)
    completedata = revdata[::-1]
    return(completedata)

print("Enter: year month day kind place amount")
while True:
    inputdata = input()
    if inputdata == "exit": #終了
        break
    elif inputdata == "clear": #データ全削除
        fileoutput(datafile,'utf-8',{})
    elif inputdata == "view": #情報一覧表示
        data = fileinput(datafile,'utf-8')
        print(data)
    else:
        newdata = inputdata.split() #標準入力
        completedata = DatetimeCompletion(newdata) #年月日補完
        year,month,day,kind,place,amount = completedata #データ振り分け
        dicdata = {'year':year,'month':day,'day':day,'kind':kind,'place':place,'amount':amount} #辞書にする
        appenddata = {'year':thisyear,'month':thismonth,'day':thisday,'data':dicdata} #記録年月日を付ける
        data = fileinput(datafile,'utf-8') #元データ(辞書)を読み込む
        data[str(len(data)+1)] = appenddata #元データ(辞書)に新しいデータを追加
        fileoutput(datafile,'utf-8',data) #json形式で保存

以下のように、"年 月 日 店名 種別 金額" と入力すると
{ナンバリング{記録年月日{入力データ}}}の辞書の形で追加されていく方式。
年月日はそれぞれ省略すると記録した日の情報が適用される。
"view"を入力で一覧を出力、"clear"でデータ全削除、"exit"で終了。

$ python3 hab.py
Enter: year month day kind place amount
5 food すき家 610
view
{'1': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '610', 'place': 'すき家', 'day': '5', 'month': '5'}}}
6 food ローソン 916
2 14 food ローソン 1790
view
{'1': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '610', 'place': 'すき家', 'day': '5', 'month': '5'}}, '2': {'day': '07', 'month': '06', 'year': '2016', 'data': {'year': '2016', 'kind': 'food', 'amount': '916', 'place': 'ローソン', 'day': '6', 'month': '6'}}, '3': {'day': '07', 'year': '2016', 'month': '06', 'data': {'year': '2016', 'kind': 'food', 'amount': '1790', 'place': 'ローソン', 'day': '14', 'month': '14'}}}
exit
$ 

表示や演算の部分の実装はまだこれから。
pandas使って綺麗に表示できると良さげかな。

SublimeText 2 to 3

なんとなく使いやすいなって理由で使っていたSublime Text 2ですが、
使いこなそうと思ってまずは3にバージョンを上げました。

そして以下の記事を参考にカスタマイズをするなど。
テーマはFlatlandにしました。

Sublime Text 3 の初期設定 - Qiita
[tips][Sublime Text] Sublime Text 3をインストールしたらまずやること
より見やすく、使いやすくなるsublime textテーマ8つ | 株式会社LIG

SublimeText内でコンソール開いてpythonインタプリタを使えることも知る。