Himadeus's diary

古典電子、多面体の研究

A Hard day's night, The Beatlesのイントロを、Pythonでフーリエ解析する

The Beatles, A Hard day's nightのイントロを解析する。

元曲のイントロはこちら

 

どのコードを使っているか、議論になっているイントロの音です。

これを、Python3 の scipyモジュールで解析する。X軸が周波数、Y軸が出力

f:id:Himadeus:20211003083946p:plain

Intro Frequency

150Hz付近を拡大するように、プログラムを変更してみる。y=0の線があるのは、ステレオの片側が常に0のため。

f:id:Himadeus:20211003084017p:plain

Intro frequency detail

出力の高い周波数(x座標)をピックアップしてみる。

  • 150 Hz D2(147 Hz) or D#2(156 Hz)
  • 2380 Hz D6(2349 Hz)
  • 1320 Hz E5(1318 Hz)
  • 264 Hz  C3(261 Hz)
  • 3153 Hz G6(3136 Hz)

Baseが鳴らしている低いD2の音が、ずれてD#2との間になっている。これが不協和音の原因なのではないかと考えています。D6の音も高い方にズレています。

プログラムはこちら、

import sys

import scipy.io.wavfile

import numpy as np

import matplotlib.pyplot as plt

 

rate, data = scipy.io.wavfile.read('a.wav')

data = data / 32768

 

fft_data = np.abs(np.fft.fft(data))

freqList = np.fft.fftfreq(data.shape[0], d=1.0/rate)

 

plt.plot(freqList, fft_data)

plt.xlim(0, 3500)

#plt.xlim(140, 160)

plt.show()

 

体育会系とIT企業

以前に、日本のIT企業で仕事していた時に聞いた言葉「もっと体育会系を入れろ」について考えた。

体育会系の特徴としては、

・上下関係、ルール違反、に厳しい

・残業多いほど、努力していると評価される

・経験年数が多いほど、実力がある事が多い

・スポーツ自体が明確なルールで、可視化されている

などの特徴があるが、どれも、IT企業には向いていない。実際に、シリコンバレーで体育会系とほぼ同類の元軍人を多く採用している企業はあるが、半導体の工場系に限られている。実際にソフト開発で体育会系組織が優れていれば、それを採用した会社が業績を上げ、他の会社も追随していくはずである。実際は体育会系システムとは逆のシステムを採用している会社が多い。

上下関係は無いほうが良い。グーグルなどは、マネージャーを少なくし、エンジニアを横一列に配置するフラットな組織にしている。日本は、社長ー部長ー課長ー平社員ー派遣社員というピラミッド型組織だ。この場合、できる平社員や派遣社員がいた場合に、上にいる課長、部長が邪魔をして、実力を発揮できないケースが多々発生する。課長、部長は、組織の上下関係が崩れるのを恐れているからだ。

ソフト開発は、可視化できない面が多い。ソフト開発後半で発生するデッドロックなどは、「訳わからん問題が発生してる」となるからだ。このような問題が発生すると、残業で頑張っても解決できない。外部から入った、デッドロック問題に詳しいエンジニアがいると解決できる。ただ、上下関係が厳しい組織では、外部からの転職者は受け入れにくくなってしまうのだ。

結論としては、「体育会系が多いIT組織は、成功しないじゃない」です。

 

日本のソフト会社の組織とシリコンバレーの会社の組織

「日本企業がシリコンバレーのスピードを身につける方法」を読んだ。いくつか共感できる点があった。

日本の組織は上下関係重視で、ソフト開発には向いていない点だ。日本企業で働くと組織の上下関係が明確である。社長>部長>課長>平社員のピラミッド。正社員>派遣の上下関係。年功序列。同じ会社での経験年数。など。これらは、工場生産では役に立つと思われる。工場での仕事は危険が伴う。危険防止の命令を社長が下し、部長、課長経由で社員全員に早く伝える事ができる。同じ工場での経験が長いほど、適格な指示ができるであろう。平社員がミスをした場合も、ミスのレベルによって、課長から注意、部長から注意、社長から注意などのレベル分けができる。

ただ、ソフト会社では状況が異なる。まず、仕事中での危険が、物理的危険がほぼない。ウィルスが入り込むなどの危険があるが、把握しにくい。細かなミスは多発する。ビルドエラーを起こす。バグが入ったコードを入れるなど。ただ、ミスをいちいち注意しているとエンジニアの生産性が、恐ろしく落ちる。コードにミスがあった場合は1日前のコードに戻すなどの解決方法が幾つかあるから、神経質になる必要はない。ここで、社長が「ゼロバグ命令」などを出すと、永遠に完成できなくなる。

ソフト会社では、原因不明のエラーなどが多々ある。年齢が上だからといって解決できない事が多い。同じ会社の長い経験年数は逆に作用する。別会社の経験がある人の方が、解決策を知っている事が多い。平社員でもセンスがあれば解決策を見つけられるし、正社員よりは派遣の方が経験値が上の事が多い。細かいミスは許していかないと、ソフト開発はできない。

グーグルなどのシリコンバレーの会社はフラットな組織にして、マネージャの数を減らしている。このほうが、ソフト開発に有利になるからだ。古い組織の会社は淘汰されてきた。部下のミスを突くような、おじさん社員もいない。天才的エンジニアもフラットな組織な方が、転職しやすし、業績も上げやすい。

日本の上下関係の組織で、一番問題なのは、上の立場の人間が威張る事である。自分の立場を確認するかのように、下の立場の人間のミスを見つけると、大げさに注意したりする。平社員の時代に上の人が威張っていたので、自分が上になれば威張りたくなる理由はわかる。威張る事でストレス発散しているように見える。注意する内容も、ソフト開発の知識がないために、的外れな事が多い。ソフト開発のように、原因不明の事態が多発するような環境では、上下関係を使った威張りは効率を下げる。

私は日米10社以上の会社で仕事経験、日本での正社員と派遣の経験、日本企業、外資系での仕事の経験があるが、上下関係重視の日本の組織は害ばかりが目立つ。

アメリカ旅行でH2O wireless simを使う

2017年12月、アメリカのカリフォルニア州サンノゼ周辺で、旅行中に安くスマホを使う方法を探しました。WiFiなどをレンタルすると $9/dayが相場のようです。スマホにsimを入れ替える方法だと、$30-$45/monthが相場になるようです。

 

私はauiPhone6を使用しており、simロックされているまま、アメリカで使用できれば最適でした。ネットで調べると、KDDI系列のH2O wireless が販売しているsimは、日本のauiPhoneではロックされたままでも使用できるという情報があり、これを信じることにします。さらに、H2O wirelessのページでは、simを入手できる店として、Seven-Eleven, Target, Best Buy などがリストされており、都市部だと5マイル以内に店がある様子でした。ですので、出発前に、simを購入せずに、アメリカで購入する予定で出発しました。

 

サンフランシスコ空港到着後、空港内でsimが買えるか調べます。到着ロビーで、小さなモバイル店がありましたが、店員が一人しかおらず、別の客のスマホのsim交換で忙しかったため、H2O simを売っているかの確認はできませんでした。

 

レンタカーをして、Campbellのホテルにチェックインした後、H2O wirelessのStore locaterに載っていたTargetに行きますが、H2O simは取り扱っていませんでした。別のTargetと、Best Buy, Seven Eleven の計4件に行きますが、入手できません。H2O wireless store locater は当てにならないのが判明。翌日、電話確認すると、Marukai Cupertino横のCell Foneで入手可能だと判明。早速、行きました。

 

そこの店員さんは、丁寧に対応してくれで、sim交換と電話のActivate、通話可能かの確認までしてくれました。店員さんは、日本のau iPhoneはsimアンロック不要とは知りませんでしたの、教えてあげました。

H2O sim代$15 一か月の一番安いプラン$30 の計$45で一台使用可能になりました。au iPhone6をActivateする際に、APNをwww.boltconfig.comからダウンロードする必要がありました。

 

子供3人分のiPhone用のsimを買って帰り、子供らのau iPhone6とiPhone7をActivateしました。ですが、1台のiPhone6はActivateできず失敗。リブートなどを繰り返しても失敗。H2O wirelessに電話しますが、「Unlockされたスマホでないと使えない」と繰り返すのみで解決できず。結局、1台のiPhoneはH2O wirelessのsimは使えませんでした。

H2O wireless sim、au iPhone6/7 lockedの成功率は3/4となりました。

Three.jsのアニメーションを直接HatenaBlogに埋め込みできるか確認

Three.jsのアニメーションを直接HatenaBlogに埋め込みできるか確認

コードはこれ↓

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js"></script>
<script type="text/javascript">
var ThreeCanvas = document.getElementById("ThreeCanvas");
var Width = ThreeCanvas.clientWidth;
var Height = ThreeCanvas.clientHeight;
var ThreeCamera = new THREE.PerspectiveCamera( 45 , Width / Height , 1 , 10000 );
var ThreeRenderer = new THREE.WebGLRenderer({antialias: true});
var ThreeScene = new THREE.Scene();
var Theta = 0;
function onLoad() {
ThreeRenderer.setSize(Width, Height );
ThreeCanvas.appendChild(ThreeRenderer.domElement);
ThreeRenderer.setClearColor(0xFFFFFF);

var light = new THREE.PointLight(0xFFFFFF, 1.0, 0);
light.position.set( -100, -100, 200 );
ThreeScene.add(light);
var light = new THREE.PointLight(0xFFFFFF, 1.0, 0);
light.position.set( 100, 100, 200 );
ThreeScene.add(light);
var ambientLight = new THREE.AmbientLight(0x888888);
ThreeScene.add(ambientLight);

ThreeScene.add(ThreeCamera);
ThreeCamera.position.z = 100;
ThreeCamera.up.x = 0;
ThreeCamera.up.y = 0;
ThreeCamera.up.z = 1;

var col = 0xff0000;
var mat = new THREE.MeshLambertMaterial({ color:col, ambient:col, opacity:1.0 });
var box = new THREE.Mesh(new THREE.CubeGeometry(20,20,20), mat);
ThreeScene.add(box);
box.position.set(0,0,0);
var tri2 = createTriangle(-20,40,-20, 100,40,0, 0,40,100, 0xFF00FF);
var tri3 = createTriangle(-20,60,-20, 100,60,0, 0,60,100, 0xFFFF00);
var tri1 = createTriangle(-20,25,-20, 100,25,0, 0,25,100, 0x00FFFF);
ThreeScene.add(tri3);
ThreeScene.add(tri2);
ThreeScene.add(tri1);

window.requestAnimationFrame(loop);
}
function createTriangle(x0,y0,z0, x1,y1,z1, x2,y2,z2, col) {
var geometry = new THREE.Geometry();
var vect0 = new THREE.Vector3(x0, y0, z0);
var vect1 = new THREE.Vector3(x1, y1, z1);
var vect2 = new THREE.Vector3(x2, y2, z2);
var face = new THREE.Face3(
geometry.vertices.push(vect0)-1,
geometry.vertices.push(vect1)-1,
geometry.vertices.push(vect2)-1);

geometry.faces.push(face);
geometry.computeFaceNormals();
var mat = new THREE.MeshLambertMaterial({color:col, ambient:col,
opacity:0.5,
side:THREE.DoubleSide, transparent:true });
var tri = new THREE.Mesh( geometry, mat );
return tri;
}
function loop() {
Theta += 0.02;
ThreeCamera.position.x = 300*Math.sin(Theta);
ThreeCamera.position.y = 300*Math.cos(Theta);
ThreeCamera.lookAt( {x:0, y:0, z:0 } );

ThreeRenderer.clear();
ThreeRenderer.render(ThreeScene, ThreeCamera);
window.requestAnimationFrame(loop);
}
onLoad();
</script>

 

Simplest Three.js sample

I try to write simplest Three.js sample.

 

f:id:Himadeus:20130503145157p:plain

You can visit at http://www.nariuchi.com/3d/simple.html

This page has only 40 lines of html and JavaScript code.

<head>Simplest Three.js sample</head>
<body onload="onLoad()">
  <div id="ThreeCanvas" style="height:400px;width:400px"></div>
</body>
<script type="text/javascript" src="Three.js"></script>
<script type="text/javascript">
function onLoad() {
    var ThreeCanvas = document.getElementById("ThreeCanvas");
    var width = ThreeCanvas.clientWidth;
	var height = ThreeCanvas.clientHeight;  
	var ThreeRenderer = new THREE.WebGLRenderer({antialias: true});
	ThreeRenderer.setSize(width, height );
	ThreeCanvas.appendChild(ThreeRenderer.domElement);
	ThreeRenderer.setClearColorHex(0xFFFFFF, 1.0);
	var ThreeScene = new THREE.Scene();

	var light = new THREE.PointLight(0xFFFFFF, 1.0, 0);
	light.position.set( 100, 100, 200 );
	ThreeScene.add(light);
	var ambientLight = new THREE.AmbientLight(0x888888);
	ThreeScene.add(ambientLight);

	var ThreeCamera = new THREE.PerspectiveCamera( 45 , width / height , 1 , 10000 );
	ThreeScene.add(ThreeCamera);
	ThreeCamera.position.x = 100;
	ThreeCamera.position.y = 150;
	ThreeCamera.position.z = 500;

	var col = 0xff0000;
  	var mat = new THREE.MeshLambertMaterial({ color:col, ambient:col, opacity:1.0 });
	var box = new THREE.Mesh(new THREE.CubeGeometry(100,100,100), mat);
	ThreeScene.add(box);
	box.position.set(0,0,0);	
	
	ThreeRenderer.clear();
	ThreeRenderer.render(ThreeScene, ThreeCamera);
}
</script>
</html>

Three.js, drawing cylinder with begin and end points

I could not find function to draw cilinder with begin and end points.

I wrote a function with 3d matrics calculation.

 

function createCylinder(x0,y0,z0,r0, x1,y1,z1,r1, col, open)
{
    var v = new THREE.Vector3(x0-x1, y0-y1, z0-z1);
    var len = v.length();
	var material = new THREE.MeshLambertMaterial({ color:col, ambient:col, opacity:1.0 });
	var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(r0, r1, len, 0, 0, open), material);
	cylinder.overdraw = true;

	if (len > 0.001) {
		cylinder.rotation.z = Math.acos(v.y/len);
		cylinder.rotation.y = 0.5*Math.PI + Math.atan2(v.x, v.z);
		cylinder.eulerOrder = 'YZX';
	}
    
	cylinder.position.x = (x1+x0)/2;
	cylinder.position.y = (y1+y0)/2;
	cylinder.position.z = (z1+z0)/2;
    
	return cylinder;
}