Translate

2016年5月27日金曜日

【jquery】【javascript】slider同士の値を比較すると挙動がおかしかった

sliderの値を比較しようとしたとき。
<input id="slider1" type="range" min="0" max="100" step="1" value=100 />
<input id="slider2" type="range" min="0" max="100" step="1" value=20 />

slider1value = $("#slider1").val();
slider2value = $("#slider2").val();

if(slider1value >= slider2value)
{
 alert("slider1はslider2以上である");//こちらを期待
}else
{
 alert("slider1はslider2未満である");//こちらが出てくる
}

理由は、val()は文字列で返されるのを忘れていたから。
alert(typeof slider1value);//string

つまり、
alert("20">"100");//true
これと同じことをしてた。

rangeスライダーだからってわけじゃないけど、頭から消えていました。

こうすると、うまくいく
slider1value = $("#slider1").val()-0;
slider2value = $("#slider2").val()-0;

2016年5月25日水曜日

水素水ブームと半導体産業

水素水(水素の気泡が入った水)はシリコンウエハー(基盤)やガラスパネル表面の洗浄に使われる工業用洗浄水である。
参考:http://www.kurita.co.jp/our_business/technology/core_technology/surface_treatment.html

したがって、半導体産業が不況になると、水素水(水素の気泡が入った水)の使い道がなくなる。
これの行き先として、怪しげな効能をうたった健康食品に使用されることになる。
なぜこんな流れになったかというと、昔は半導体には主にゲルマニウムを使っていたのが、
加工が容易なシリコンにシェアを奪われたとき、ゲルマニウムネックレスという、これまた怪しげな効能をうたった商品になって再利用されたから(現在はゲルマニウムとシリコンを組み合わせたものがある)。

この時無理やりブームを作り、そこそこヒットしたフローを、そのまま水素水がたどっている。
そして、ゲルマニウムネックレスを買うような人たちが再びだまされている

ちなみに、水素水と同様に工業用洗浄水として使われるのがオゾンを気泡として含む水だが、
参考(上のリンクと同じ):http://www.kurita.co.jp/our_business/technology/core_technology/surface_treatment.html

オゾンは濃度によっては健康に悪く匂いもあるので、
参考:http://o3.kalmor.jp/technology/page7.html
飲料水としては売り出せなかったのだろう。

以上を踏まえると、工業の隆盛を注目すれば、次に流行りだす(無理やり流行らせられる?)商品の予測がつくかもしれない。

2016年5月24日火曜日

【UNITY】PUN初心者用まとめ

メモ用。
http://blog.photoncloud.jp/getting-started-pun-01/
http://www.slideshare.net/GMOCloudJP/unity-photoncloud


【UNITY】マッドネスセール開催中

https://www.assetstore.unity3d.com/jp/#!/home

PUN+(photon unity network)が半額なので購入してしまった。
今から頑張ってオンラインゲームを作らなくては。

2016年5月13日金曜日

グラフのy軸表示用のキリのいい値を求めたい【javascript】

canvasで自前でグラフを作成するとき、y軸の値を自動で表示するために書いた。
ざっくり分けて表示するだけだが、とりあえず。


グラフの最大値が170→y軸の最大値は200
グラフの最大値が110→y軸の最大値は150
グラフの最大値が101→y軸の最大値は150
(最大値がmaxvalue、整数として判明しているとする)

var graph_y_max,digit;
digit = String(maxvalue).length;

if(Math.round(maxvalue * Math.pow(0.1,digit -1))>maxvalue * Math.pow(0.1,digit-1) )
{

         graph_y_max = Math.round(maxvalue * Math.pow(0.1,digit -1)) * Math.pow(10,digit -1) ;
     
}
else {

         graph_y_max = (Math.round(maxvalue * Math.pow(0.1,digit-1))+0.5) * Math.pow(10,digit - 1);
     
}

2番目の桁を四捨五入して、繰り上がるならその値を使う。
繰り下がるなら、繰り下がった値に5を足す。

2016年5月11日水曜日

Slither.ioのコツ(上級)

前回の記事から色々と経験があったので追加。
囲むだけではなかなか相手を倒せないので、これらを使って積極的に相手を倒したい。

○隘路封じ

大きいプレイヤーと大きいプレイヤーの間を縫うように移動しているプレイヤーは、出口を塞いであげるだけで簡単に倒せる。防ぐには、道が細くなっている部分に、むやみに入らないこと。


○端線を使う。

図の通り。隘路封じと同様。赤いラインを超えると死亡なので、端線側のプレイヤーは脱出不可能になる。
図のように追い詰めなくても、ステージは球形なので、並走して直進するだけで最終的に追い詰める形になる。赤線側に突っ込んで、消滅すると報酬がなくなるのが難点。


○挟み込み

うまく図が取れなかったので、イラストで。



体が小さい時にしか使えないが、タイミングよくやると、2の時点で死亡確定という強力な技。回避する方法は、適度に距離をとるしかない。

1.青は赤を追い越す。
2.青は赤の退路を塞ぐ(この時点で赤の死亡確定)。赤はダッシュすると曲がり切れずに青にぶつかる距離になったので、これ以降はダッシュせずに曲がるしかない。
3.青は引き続き退路を塞ぐ。赤はダッシュせずに右に向かうしかない(上を選んでいても、曲がり切れない)。
4.青は赤の体にぶつからないようにダッシュをやめる。赤は巨体ゆえに曲がり切れず、青にぶつかる。

タイミングがとてもシビアなので、青も事故に合う可能性があるが、回避不可能なハメ技なので、練習してみるといいかも。

○エリアを囲む

長さが3万を超えたあたりから有効。大きなプレイヤーが消滅して、その残骸を小中プレイヤーが漁りに動くときは、残骸を拾いにいくのではなく、その場を囲んでしまおう。3~4プレイヤーを丸のみにする。

○囲まれたときは逆回転

万が一囲まれたときは、相手と逆回転で自分のサークルを維持すること。順回転だと、どうしても相手が攻めやすい瞬間があるが、逆回転だと相手も正面衝突を恐れてなかなか輪を狭められない。


○囲んだときは、たまに輪を広げる

格下相手に囲まれるのを防ぐ。ひたすら輪を狭めるだけだと、周りに小物が並走したときに余裕がなくなるので、適当に輪を広げよう。土星の環のようなイメージで囲むと、自分も動きやすくなるし、格下が囲みづらくなる。



それでは頑張ってください!

2016年5月10日火曜日

数値にカンマをつける色々【javascript】【php】【mysql】

本当はやりたくないんです。
床でジタバタ転げまわっても「やれ」といわれたときに。

//javascript
number.toLocaleString();

//php
number_format($number);

//mysql
select FORMAT(number ,0) from table

2016年4月30日土曜日

ボス ホームエスプレッソ ラテミックスが妙にうまい

ボス ホームエスプレッソ ラテミックス
http://www.s-boss.com/lattemix/

牛乳をたっぷり入れて作るカフェラテが美味しい。
「白のひととき」より、少しだけ甘さ控えめな感じで、個人的にちょうどいい。
とりあえず箱買いしたけど、近所のスーパーでは置かなくなってきた。
レギュラーに定着して廃盤にならないといいな。

2016年4月23日土曜日

【javascript】【jquery】スライダーの値を特定の箇所で吸着したい

例えば2-1024までの値のスライダーで、選べる値は2のn乗のみとしたい。
つまり、選べる値は2,4,8,16,32,64,128,256,512,1024とする。
<div class="ui-field-contain" id = "sliderdiv">
   <label for="slider">値</label>
   <input id="slider"  type="range" min="2" max="1024" step="1" value=2/>
</div>
<script>
    var keys = [2,4,8,16,32,64,128,256,512,1024];
    var keys_length =keys.length;
$(function(){
   $("#sliderdiv").on("change", "#slider", function() {
      var tmpvalue = $("#slider").val();
      for(var n=0;n<keys_length;n++)
      {
         if(tmpvalue<=keys[n])
         {
            break;
         }
      }
      if((keys[n]+keys[n+1])/2<tmpvalue)
      {
         $("#slider").val(keys[n+1]);
      }
      else {
         $("#slider").val(keys[n]);
      }
      if($("#slider").val()!=tmpvalue)//これ書いておかないと無限に処理を繰り返してしまう
      {
         $("#slider").slider('refresh');
      }
   })
})
</script>

2016年4月21日木曜日

【javascript】【jquery】スライダーの値によって、buttonを無効(disable)にする

よし、やる気ボタンを押すと仕事をやる気を出すぞ。
でも、暑かったり寒かったりしたらやる気ボタンが表示されないぞ。しょうがない。
という仕組み。
sliderって単純に$("#slider").on("change",function(){...})
じゃ処理は起動しないのね

<div class="ui-field-contain" id = "sliderdiv">       <label for="slider">気温</label>
    <input id="slider"  type="range" min="0" max="100" step="1" value=0 />
</div>
<button id ="yaruki">
やる気ボタン
</button>

<script>
$(function(){
    $("#sliderdiv").on("change", "#slider", function() {
    //または、$("input#slider").live("change", function() {
        var slider_value = $("#slider").val();
        if(15<=slider_value&&slider_value<=25)
        {
            $('#yaruki').prop('disabled', false);//非表示をオフにする。つまり、表示。
        }else{
            $('#yaruki').prop('disabled', true);
        }
    })
})
</script>

2016年4月7日木曜日

Slither.ioのコツ

※コツの上級編も書きました。
こちら

立派なうんこミミズを目指すゲーム

Slither.io


リーダーボード一位をとれたのでメモ


<攻撃方法色々>

①進路妨害
(自分)→→↓
(敵 )×


②囲み
→(自分)↓
(敵 )
←←←←←←


③押しつけ
(  別 の 敵 の 体 )
(敵 )×
(自分)→→



④特攻(自分のほうが小さい時に)
(自分)→→×←←(敵 )



○囲まれたら我慢比べ。

自力脱出は無理でも、囲んでいるプレイヤーがミスをしたり、もっと大きなプレイヤーがきて囲んでいるプレイヤーが逃げ出したりすることがある。
基本的にぐるぐると回っていれば、敵も攻めることはできない(自分が小さければ、とっととあきらめるのも手)。
相手と逆方向に回り、狭くしづらくしよう。

 

○餌場を回収するために走らない

走っている奴は7割くらい他のプレイヤーと衝突して死ぬので、後をつけて回収するのもよし

 

○モニターの狭い方に走らない

見通しが悪いと事故に繋がる

 

○自分の取り分を安めに見積もる

大きな餌場が出来たとき、まず他のプレイヤーが殺到することを考えて、安全な量を考える。自分ともう一人いたら、35~40パーセントくらい取る気持ちで。

○取り囲んで狩をするときは、周辺を警戒

小物を囲んでいるつもりが、さらに大きいプレイヤーに取り囲まれてやられることがある

○他プレイヤーが併走してきたらすぐに方向を逆に変える

特に小物は特攻覚悟で進路妨害してくるので注意。

○最初は中心地で生き延びて、成長したら少し離れた場所で狩を楽しむ

中心地は慎重にハイエナするだけで、あっという間に成長できる

○美味しいサイズを中心に狩る

自分よりふた周りくらい小さい敵を狩っていきたい。
自分より大きい敵でも、囲んでいる最中なら狩ることが出来る

○10位以内になったら、餌場にいくのではなく、餌場を囲んでプレイヤーごと回収

2016年4月5日火曜日

tablefixプラグインを使っていると、他のtable系プラグインを使うのは難しいかもしれない

古いサイトの改修で、テーブルをソートする機能をつけようとしたときのこと。
適当なjqueryを見繕って、実装すればOKだなーと思ったら、やけにはまった。
よくよくソースを見ると、
tablefix
http://www.otchy.net/javascript/tablefix/
というプラグインでテーブルを整形していた。ソースを読むと、元のテーブルを分割処理している・・・。

tablefix1というテーブルが4つ作られている↓



これじゃ、ソートできないわけだ。
よし、あきらめた!
正式に依頼があったら、tablefixのほうを変えてなんとかしよう。

2016年4月4日月曜日

動的に作成したhtml部分にjquery/jquery mobileのスタイルが適用されない

#動的部分にinnerhtmlを代入するとして
$("#動的部分").html(innnerhtml)
の後ろに.trigger('create');を追加して
$("#動的部分").html(innnerhtml).trigger('create');
とする。

2016年3月19日土曜日

kindleに欲しい機能

著者にサインを貰う機会があったとき、紙のように気軽にサインできるスペースがない・・・

というわけで、サイン(簡単なお絵かき機能)スペースが欲しい!

2016年3月12日土曜日

chromeの500メッセージが変わった

ちょっと文言が変わったようです。
古いバージョンを残せないので検証できないけど、
http://bibabosi-rizumu.com/http500-internalservererror/
こちらのペーで使われているのが古いものなのだろう。

これが、20160312現在のもの

サーバーが応答していないか・・・の文言がなくなっている

2016年3月3日木曜日

【kindle】電子書籍のレイアウト崩れ例

kindle for PCで電子書籍を読んでいると、レイアウトが崩れている箇所が見受けられた。
この IN 述語 の 条件 は、 結局 の ところ、「 ビール または 紙 オムツ または 自転車 を 置い て いる 店舗」 を 指定 する に 過ぎ ませ ん から、 どれ か 1 つ でも 置い て いれ ば 結果 に 含ま れ て しまい ます。 では こういう とき、 複数 行 に またがっ た 条件 ̶̶ すなわち 集合 に対する 条件 ̶̶ を 設定 する には どう すれ ば よい の でしょ う? もう お 分かり です ね、 HAVING 句 を 使い ます。 次 の よう に 書き ます。
達人に学ぶSQL徹底指南書
1-4 HAVING句の力より引用
画面上ではこんな感じ(背景色は変えています)


怪しいのはこいつ「 ̶̶ 」か。音引きでもリーダーでもない。
調べてみると、unicode 336
COMBINING LONG STROKE OVERLAYさんらしい。
http://www.fileformat.info/info/unicode/char/0336/index.htm
へー。・・・で、こいつがあると何で崩れるのだろうか。
禁則処理?

2016年3月2日水曜日

ウレタンマスク・PITTAを使ってみた

PITTAを使ってみた
○耳ひもの痛さ
花粉のシーズン中はずっと使うものなので、個人的に一番重視しているのがココ。
太さがあり、負担がかかりにくい。一体型なので、耳ひももウレタン性で柔軟性に富む。
結論から言うと、全く痛くない。これだけでリピートはほぼ決定。

○通気性
紙のマスクより若干通気性がよく感じる。

○隙間
あまり気にならない。
ただ、他のマスクと同じく息で眼鏡が曇る。

○耐久性
センターで貼り付ける構造なのだが、この部分の糊付けが若干弱い気がする。
何度か使用しているうちに、はがれてきてしまった(僕の顔がでかいからか)

○洗濯
この製品の売りの一つか。
洗濯後も使用感は変わりない。洗剤の匂いがするので、普段から匂いの強い洗剤を使っていると厳しいかも。
白よりもグレーの方が汚れも目立たずにいいのだが、グレーはまだまだ数奇な目で見られる・・・

2016年2月25日木曜日

【.htaccess】no-cache no-storeの違い

キャッシュについて
キャッシュを保存されたくない!という仕組みを作る際、色々検索してみると、
.htaccessに
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
と書け!としてあるサイトが多かった。
前回の記事にも書いたけど、僕が欲しかったのは一度もファイルがキャッシュされない仕組みなんだけど、
上記のコードだとローカルに保存されてしまう。
というわけで、調べてみた



Header set Cache-Control "no-store"
Header set Pragma "no-store"
ローカルに保存しないよ。
オフラインだろうと、ないものはないよ。

Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
ローカルに保存するけど、次回アクセスするときは、ファイルが更新されていれば、またファイルを読みに行くよ。
オフラインでは保存したこれを使うよ。

LEVEL 0.1くらいあがった

2016年2月23日火曜日

【php】【ajax】【.htaccess】いまだに画像をローカルへダウンロードされたくない人がいるときは

色々と考えてみた。

使うもの
javascript php .htaccess
※スクリーンショットは防げません

main.html - メインとなるページ。DBと連動したりするならphpで書く。
clone.php - postで受け取ったアドレスの画像を画像フォルダから複製して、複製画像のURLを返す
delete.php - postで受け取ったアドレスの複製画像を消す
/image/ - 画像フォルダ。実際はもっと分かりづらい名前に。元の画像はここに入れる。
/image/.haccess - 設定ファイル
/tmp/ - 仮画像保存フォルダ
/tmp/.haccess - 設定ファイル

流れ

ページにアクセス。呼び出す画像のファイル名は暗号化されているとする。
1:javascriptで仮ファイル名を作成(Math.ceil(Math.random()*10000000) + ".jpg"など)
2:ajaxで画像名、仮ファイル名をpost
3:clone.phpが/tmp/フォルダに、仮ファイルを作成。
4:returnで仮ファイル名のURLを取得
5:canvasに画像を書き出し
6:ajaxで仮ファイル名をpost
7.delete.phpが/tmp/フォルダの仮ファイルを削除

設定(特徴的な箇所のみ記述)

main.html
http://www.stylish-style.com/csstec/basic/g-photo-guard.html
こちらを参考に、canvasには透明gifをのせておく。

/tmp/.haccess

Header set Cache-Control "no-store"
Header set Pragma "no-store"
(注意)no-cacheではないです。

/image/.haccess
-deny from all

clone.php、delete.php
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') (ajax以外のアクセスでは動かないように)

結果

○右クリック、ドラッグ保存→透過gifでガード
○ソースコードを読む→読み込んだ仮画像は削除済
○キャッシュから拾う→キャッシュ防止済

元画像フォルダへのアクセスは、phpのみ可能にしておきます。
スクリーンショットは防げませんが、かなり防げるような。
javascriptが切られていると、ajaxが発動されないので画像のコピーが行われません。
ajaxでファイルのクローンを作るという動作を行っているので、
悪意のあるユーザーにビシバシpostされまくると危険かも。
ここでは書いていませんが、連続post対策は必須。

2016年2月19日金曜日

【php】declare&&ticksと分かり合えるのには時間がかかる気がする

declareについて調べている途中。

<?php
function ticks_echo() {
   static $count_of_ticks = 1;
   echo 'ticks >> '.$count_of_ticks."<br />";
   $count_of_ticks++;
}
register_tick_function( 'ticks_echo' );
declare( ticks = 1 ) {
   for($n =1;$n<4;$n++)
   {
      echo "何かしらの処理:".$n."回目<br />";
   }
}

/*
僕の予想:
何かしらの処理:1回目
ticks >> 1
何かしらの処理:2回目
ticks >> 2
何かしらの処理:3回目
ticks >> 3


実際の結果:
何かしらの処理:1回目
ticks >> 1
ticks >> 2
何かしらの処理:2回目
ticks >> 3
ticks >> 4
何かしらの処理:3回目
ticks >> 5
ticks >> 6
ticks >> 7
ticks >> 8

*/
えっ、こいつら、ボディランゲージ通じない感じ。
どうやら、declareは{}ブロックの終わりでも一度評価されるよう。

つまり、
declare( ticks = 1 ) {
   for($n =1;$n<4;$n++)
   {
      echo "何かしらの処理:".$n."回目<br />";
   }
}
の挙動は

何かしらの処理:1回目
ticks >> 1//forの最初のecho
ticks >> 2//forの最初の{}閉じ
何かしらの処理:2回目
ticks >> 3//forの2回目のecho
ticks >> 4//forの2回目の{}閉じ
何かしらの処理:3回目
ticks >> 5//forの3回目のecho
ticks >> 6//forの3回目の{}閉じ
ticks >> 7//forの4回目の{}閉じ(forの条件式が$n===4でfalseなので、中の文は実行されず)
ticks >> 8//declare最後の{}閉じ

となっている(のでしょう)。
その辺を考えて使わないと、痛い目にあいそう。
というか、時間計測くらいしか使いどころが分からない・・・。

2016年2月18日木曜日

【php】配列に何種類の値が入っているか

array_count_valuesか、array_uniqueを使う。

$array = [1,2,3,4,5,6,7,8,9,10,"a","b","c","d","",1,2,3,4,5,6,7,8,9,10];

echo "array_count_values:".count(array_count_values($array));//15
echo "<br />";
echo "array_unique:".count(array_unique($array));//15

//var_dump(array_count_values($array));
//array(15) { [1]=> int(2) [2]=> int(2) [3]=> int(2) [4]=> int(2) [5]=> int(2) [6]=> int(2) [7]=> int(2) [8]=> int(2) [9]=> int(2) [10]=> int(2) ["a"]=> int(1) ["b"]=> int(1) ["c"]=> int(1) ["d"]=> int(1) [""]=> int(1) }
//var_dump(array_unique($array));
//array(15) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) [10]=> string(1) "a" [11]=> string(1) "b" [12]=> string(1) "c" [13]=> string(1) "d" [14]=> string(0) "" }

カウントする対象は、文字列か数値のみ

2016年2月17日水曜日

【mysql】各キーの最新ログ5件を取得したい

全IDの最新ログ5件を表示

logテーブルから、各IDごとの最新ログ5件を拾いたいとき。
IDを指定できるなら
SELECT `id` , group_concat(`status` separator ',') as "recent_log" from ( SELECT * FROM `log` WHERE `id` ="hoge" order by date limit 5 ) as Table1
これが手っ取り早い。ただし、受信した側で処理する必要がある。

行を別々にとりたいというとき
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id = Table1.id AND Table2.date > Table1.date) < 3 AND id ="hoge" ORDER BY id DESC, date DESC
ただし、処理がかなり重い。件数の多いlogテーブルとかで使うのは実用的ではないかも

これを、例えば役員(officer)の最近ログ5件を全て表示!安全にサボりたい!としたいときはこんな感じ
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id  = Table1.id AND Table2.date > Table1.date) < 5 AND id in ( select id from id_table where class ="officer" ) ORDER BY id DESC, date DESC
こちらも、もちろん処理が重い

2016年2月10日水曜日

【php】json_decodeで配列にならない

先日の続き。
phpexcelで作った配列をjavascriptにJSON形式で渡して、その後さらに$_postの内容をphpに渡すとき、
json_decode($_POST["array"]);
としたのだが、うまく配列にならない。
json_decode($_POST["array"],true);
配列としたいのなら、パラメータに属性を渡して上げなくてはいけなかった。
急いでると、簡単なところでつまずきます。

2016年2月8日月曜日

【phpexcel】【php】【ajax】phpexcelが重すぎたので、ajaxで分割post

phpexcelについて。
xlsxをpost→読み込み、配列に変換→フォーマットに沿ってxlsxを書き出し・・・という処理を作っていたのだが、
うわさに聞いていた通り、かなりメモリを食うようで、5000行を読み込んで分割して・・・といった処理が完走できない。
下手をすると300行くらいの処理も危うい。
google先生に泣きついて、unsetなりphpのメモリを上げるなりしたのだが、エラーメッセージを吐かないで固まってしまう。
しょうがないので、

xlsxをpost→読み込み、配列に変換→生成するファイルごとに配列を分割→ajaxで連続送信→フォーマットに沿ってxlsxをoutput

・・・とやったら、一瞬で処理が終わってしまった。
やはり、どこかでメモリが解放しきれていなかったのだろうか。
色々手を変え品を変えやっていたら、はまってしまったが、結果としてajaxで途中経過も出力できるようになったし、よかった。

2016年2月4日木曜日

【CSS】【javascript】ドラッグアンドドロップはhoverではない

タイトルどおりなのですが。

ブラウザにファイルをドラッグアンドドロップしてアップロード・・・というものを作っているとき、
指定のゾーンにドラッグしているマウスが移動したら、色を変えるなりしようと思っていたのですが、
実際には、うまく動かない。
ファイルをドロップした後に、hoverとして認識されてしまう。
どうやら、cssのhoverではドラッグ中のマウスは感知できない。
こんなときは、javascriptのdrag~イベントを使うしかないみたい。


マウスがホバーなんだからいいじゃん!とは思ったけど、全くの別物のようです。
ちょっと混乱したのでメモ。

2016年2月1日月曜日

【phpMyAdmin】【excel】csvをインポートすると先頭の文字が消える

東京都○○区・・・というデータをインポートするが、
都○○区となっていて仰天。

エクセルからcsvを書き出し、phpMyAdminにインポートしようとすると、ファイル先頭の2文字が消えることがある。
文字化けとかではなく、文字欠け。ぐぐっても文字化けの問題ばかりひっかかるので、一応メモ。

エクセル → ヘッダ削除 → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート → 文字欠けで死亡!

悪さが起きるのがファイル最初の文字なので、BOMがゴニョゴニョとしているのかもしれないが、
とりあえず、バッドノウハウだけ書いておこう。

エクセル → CSVにエクスポート → テキストエディタでエンコードをUTF-8に変更 → インポート →

インポート時、phpMyAdminの部分インポートというところで

Skip this number of queries (for SQL) or lines (for other formats), starting from the first one:

の値を「1」
とする。最初の一行をヘッダ扱いで無視するよ・・・ということ。これでたぶん問題なし!
根本的に解決してないので、モヤモヤしますが。

2016年1月27日水曜日

【php】配列をCSVに書き出し&文字コード変換

表題どおり。
配列内の要素を一つ一つshiftjisに変換してから書き込んでいます。
日本語文字コードを一つに統一して欲しいのだけど、血を血で洗う戦争が起きたりするのでしょうか。
    $csv = new SplFileObject( "csv.csv", "w" );
    foreach ($array_for_csv as $raw_array) {
        $encodedarray =array();
        foreach ($raw_array as $rawtext) {
            $encodedarray[] = mb_convert_encoding($rawtext,'SJIS');
        }
        $csv->fputcsv($encodedarray);
    }
    fclose($csv);

2016年1月26日火曜日

【php】【phpexcel】他のシートからデータをコピーする

テンプレートなどを読み込みたいときに。


<?php
    require_once './Classes/PHPExcel.php';
    require_once './Classes/PHPExcel/IOFactory.php';

    $book = new PHPExcel();

    $templateExcel = PHPExcel_IOFactory::load(dirname(__FILE__) .'/tmp/template.xlsx');
    $sheet = $templateExcel->getSheetByName('template')->copy();
    unset($templateExcel);
    $sheet->setTitle("hoge");
/*
$sheetの
編集があれば、ここで




*/
    $book->addSheet($sheet);
    $writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");
    $writer->save(dirname(__FILE__) .'/huga.xlsx');
    $book->disconnectWorksheets();
    unset($book);

2016年1月20日水曜日

【php】エクセルをコピペして配列に収納

csv経由で一括とかではなく、エクセルの内容をDBなどに入れたい場合、
エクセルの内容を入力フォームにペーストすると、
セルごとにtabで区切られたテキストが表示される。
これをそのままフォームへpostしたと仮定して、受け側のプログラム。
条件として、
○コピペする列の数は決まっている
○最後の列に改行記号が入っていない
とします。

$contents = $_POST["contents"];//これがフォームの内容
$celllength = 10;//一行あたりのセルの数を決めておく
$masterarray =[];//目標となる配列。ここに全て入れたい。
$count =0;

$array = explode("\t", $contents);//とりあえず全てtabで区切る

foreach ($array as $key => $value) {
   if($count % ($celllength-1) ==0 &&$count>0)//最後の列は次の行の最初の列とくっついているので、改行記号で分ける。
   {
      $masterarray[]=explode("\n",$value)[0];
      $masterarray[]=explode("\n",$value)[1];
   }
   else {
      $masterarray[]=$value;
   }
   $count++;
}
if(count($masterarray) > $celllength)
{
   array_pop($masterarray);//最後の行の最後の列を二つにしてしまったので、削除しておく
}

if(count($masterarray) % $celllength !=0 )//postされたセルの数が正しいか確認
{
   echo "error:セルの数が不正です。エクセルの選択範囲を見直してください。";
   die;
}

foreach ($masterarray as $key => $value) {
   echo $key.":".$value."\r";//debug
}

後はお好きに。$masterarrayは連想配列にしてあげたほうが使いやすいですね。

2016年1月18日月曜日

【jquery】複雑な形のテーブル要素の取得

不幸にしてこんなテーブルに遭遇したとする

     
   
     
     

テーブル内の要素を順番に取得する方法は

$(function() {
    $("table tr").each(function() {
        $(this).children().each(function () {
           alert( $(this).html());
        });
    });
});

こんなかんじ。では、どんな順番で取得するかというと

123456
789
1011121314
1516171819

このような順番で取得してくれる。
例えば二行目だけ取得しようとすると

   $('table tr:nth-child(2)').children().each(function () {
        alert( $(this).html());
     });
こんなコードになるが、結果は
7,8,9となる。

逆に7,4,8,9と取得したいときが面倒くさそう。

2016年1月13日水曜日

【mysql】最新状況を検索したいの続き

よく考えたら前回の記事では最新状況の一覧は出せたが、検索はできていなかった。

(前回)

FLOW: start -- aaa--bbb--ccc--end

select * from ( select * from log where status = "aaa" OR status = "bbb" OR status = "ccc" order by date desc) as t group by product order by date desc
//all id's recent log

ここからさらに塗装中の個別IDを拾いたいときは、こんな感じ

select * from (select * from ( select * from log order by date desc) as t group by product order by date desc) as t2 where status ="aaa"
//search where recent status is  "aaa"

2016年1月9日土曜日

【mysql】最新状況を検索したい

例えばある製品の製造工程をログにとっているとして、
テーブルは
id product status date
という項目、
開梱→組み立て→塗装→梱包→発送
というフローだとする。
このうち、組み立てから梱包までの作業上にある製品の、最新ステータスを検索したいとき

select * from ( select * from log where status = "組み立て" OR status = "塗装" OR status = "梱包" order by date desc) as t group by product order by date desc

group by で値を拾うときはテーブルの一番上の行を採用するらしいので、
ソートをかけて拾いたい最新のデータを、()内で一番上にもってきている。

2016年1月8日金曜日

【javascript】簡潔な配列の宣言

var array1 = ["contents1","contents2","contents3","contents4","contents5","contents6"];
var array2 ="contents1,contents2,contents3,contents4,contents5,contents6".split(",");

下のほうが書きやすく、要素が多くなるほど文字数を省ける