「MySQL」を含む日記 RSS

はてなキーワード: MySQLとは

2016-06-05

アダルトOKな無料レンタルサーバーってねえかなぁ

無料レンタルサーバーは腐るほどあるけど、アダルトOKってなると

一気に選択肢が狭くなるなぁ。

寝取られまとめサイトブログじゃないよ)作ろうと思って普段使ってる

Conohaってサーバにあげようかと思ったんだけどどうやらアダルトNGらしい。



PHP / MySQL辺りが使えて広告付きでいいか無料~月額250円くらいの良い感じのサーバねえかなぁ。

2016-05-10

企業が持っている開発タスクチケット化してこれをこなしたら数万円

企業が持っている開発タスクチケット化してこれをこなしたら数万円もらえる、みたいなプラットホームがあればいいのに。

フルリモートで出社日決まっていない、ほぼバイトに近い働き方でベンチャー企業と関わったが、すごく良かった。

やったのはサイトパフォーマンスチューニング。(基本MySQLインデックス貼っただけだけど…



・・とは言っても、スタートアップ時などは

作りながらいろいろ思うところや、気付きとかあったりすると思うので、

手触りの感覚でやらねばならぬところがあって(たぶん)

そういうところを重視するには内製化しないといけないのかなー。

ノウハウ自分組織にためる的な意味で。





すげー優秀なプロデューサーがいて、

何が売れるのか的なところは企画数字で導き出して

開発はCTO仕事チケット化してフリーエンジニアに依頼する、

みたいな感じになればいいのになー。

おれ、金欲しいかガツガツチケット消化するわー。

仕事を引き受けられる人はある程度会員制にして

与信があるエンジニアだけにするようにすれば、

品質も保ちつつ開発リソースも柔軟に担保できるみたいな感じにならないかなー。

フリーエンジニア複数案件を持っているので、

案件過剰にならないかぎりはリソースプール可能みたいな。





会員制のクラウドワークスか。





お、会員制のクラウドワークスって面白くね?

ある程度スーパーエンジニアだけを揃える。

会員エンジニア技術担保は弊社が保証します!的な。

エンジニアの単価はdayで2.5〜4万にしてほしす。





開発僕がやるのでCEO募集しま(笑)





ある程度やってきたエンジニアを上手いこと活用するプラットホーム的なの作ればいいと思うんすよね。

26歳〜39歳ぐらいのイケイケのエンジニアプールしているみたいな。

経験してきたハイスキル業務をこなす。一回やったから負荷は少ないだろうし。





慣れてきたらエンジニア個人ではなく、エンジニアチームで仕事をこなすようにするとか。

そしたらもうある会社システムレベル仕事ができそう。

なんかSIer再開発になりそう。





わしは、そういうのがほしい!!!

定職一個持ちつつday 2〜3万の案件をこなして正社員給与+月でフリー活動24万ぐらいの収入を安定してほしいなー。

社内の技術評価とかよくわからんものに振り回されず、実案件をこなす実力を求めるようになると思うので

いいと思うんだけどなー。





↓ここ!

ベーシックインカム >> 終身雇用 >> 正社員+兼業 >> フリーランス

↑ここ!





終身雇用はやめて正社員制度は生きるけど、稼ぎたい奴はフリー活動して稼げば、的な。

安定して働きたいやつは正社員としての受け皿があるし、

もっと金ほしいんだが?ってやつは自分で働いて稼げる。

まあ、もっと金ほしいんだが?ってやつは独立するのかな・・・






・・・金がほしいある程度経験を積んだ専門職最適化したく思っただけなので

技術ブレイクスルーを起こすようなそんな奴らに最適化された仕組みはまた別なのかな。

それは未踏エンジニア的な感じでIPAとかがやってんのかな。

マジで技術以外なにもやりたくないわーっていうやつとか、

ポスドク的な奴を救う感じの何かもあればいいのにね。

2016-04-07

自己満

フリーお仕事とあるRailsサイトチューニングした。

成果としては2倍以上のレスポンスタイム改善

やった内容は

MySQLインデックスチューニング

Viewチューニング

RailsViewって意外と遅いんだなーというのが所感。

2016-01-14

北朝鮮公式

かなりオープンサイトだ。

nmap www.korea-dpr.com

Starting Nmap 6.47 ( http://nmap.org ) at 2016-01-14 21:20 JST
Stats: 0:00:00 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan
Connect Scan Timing: About 0.55% done
Nmap scan report for www.korea-dpr.com (87.98.231.40)
Host is up (0.28s latency).
rDNS record for 87.98.231.40: cluster011.ovh.net
PORT      STATE    SERVICE
1/tcp     open     tcpmux
3/tcp     open     compressnet
4/tcp     open     unknown
6/tcp     open     unknown
7/tcp     open     echo
9/tcp     open     discard
13/tcp    open     daytime
17/tcp    open     qotd
19/tcp    open     chargen
20/tcp    open     ftp-data
21/tcp    open     ftp
22/tcp    open     ssh
23/tcp    open     telnet
24/tcp    open     priv-mail
25/tcp    closed   smtp
26/tcp    open     rsftp
30/tcp    open     unknown
32/tcp    open     unknown
33/tcp    open     dsp
37/tcp    open     time
42/tcp    open     nameserver
43/tcp    open     whois
49/tcp    open     tacacs
53/tcp    open     domain
70/tcp    open     gopher
79/tcp    open     finger
80/tcp    open     http
81/tcp    open     hosts2-ns
82/tcp    open     xfer
83/tcp    open     mit-ml-dev
84/tcp    open     ctf
85/tcp    open     mit-ml-dev
88/tcp    open     kerberos-sec
89/tcp    open     su-mit-tg
90/tcp    open     dnsix
99/tcp    open     metagram
100/tcp   open     newacct
106/tcp   open     pop3pw
109/tcp   open     pop2
110/tcp   open     pop3
111/tcp   open     rpcbind
113/tcp   open     ident
119/tcp   open     nntp
125/tcp   open     locus-map
135/tcp   open     msrpc
139/tcp   filtered netbios-ssn
143/tcp   open     imap
144/tcp   open     news
146/tcp   open     iso-tp0
161/tcp   open     snmp
163/tcp   open     cmip-man
179/tcp   open     bgp
199/tcp   open     smux
211/tcp   open     914c-g
212/tcp   open     anet
222/tcp   open     rsh-spx
254/tcp   open     unknown
255/tcp   open     unknown
256/tcp   open     fw1-secureremote
259/tcp   open     esro-gen
264/tcp   open     bgmp
280/tcp   open     http-mgmt
301/tcp   open     unknown
306/tcp   open     unknown
311/tcp   open     asip-webadmin
340/tcp   open     unknown
366/tcp   open     odmr
389/tcp   open     ldap
406/tcp   open     imsp
407/tcp   open     timbuktu
416/tcp   open     silverplatter
417/tcp   open     onmux
425/tcp   open     icad-el
427/tcp   open     svrloc
443/tcp   open     https
444/tcp   open     snpp
445/tcp   filtered microsoft-ds
458/tcp   open     appleqtc
464/tcp   open     kpasswd5
465/tcp   open     smtps
481/tcp   open     dvs
497/tcp   open     retrospect
500/tcp   open     isakmp
512/tcp   open     exec
513/tcp   open     login
514/tcp   open     shell
515/tcp   open     printer
524/tcp   open     ncp
541/tcp   open     uucp-rlogin
543/tcp   open     klogin
544/tcp   open     kshell
545/tcp   open     ekshell
548/tcp   open     afp
554/tcp   open     rtsp
555/tcp   open     dsf
563/tcp   open     snews
587/tcp   open     submission
593/tcp   open     http-rpc-epmap
616/tcp   open     sco-sysmgr
617/tcp   open     sco-dtmgr
625/tcp   open     apple-xsrvr-admin
631/tcp   open     ipp
636/tcp   open     ldapssl
646/tcp   open     ldp
648/tcp   open     rrp
666/tcp   open     doom
667/tcp   open     disclose
668/tcp   open     mecomm
683/tcp   open     corba-iiop
687/tcp   open     asipregistry
691/tcp   open     resvc
700/tcp   open     epp
705/tcp   open     agentx
711/tcp   open     cisco-tdp
714/tcp   open     iris-xpcs
720/tcp   open     unknown
722/tcp   open     unknown
726/tcp   open     unknown
749/tcp   open     kerberos-adm
765/tcp   open     webster
777/tcp   open     multiling-http
783/tcp   open     spamassassin
787/tcp   open     qsc
800/tcp   open     mdbs_daemon
801/tcp   open     device
808/tcp   open     ccproxy-http
843/tcp   open     unknown
873/tcp   open     rsync
880/tcp   open     unknown
888/tcp   open     accessbuilder
898/tcp   open     sun-manageconsole
900/tcp   open     omginitialrefs
901/tcp   open     samba-swat
902/tcp   open     iss-realsecure
903/tcp   open     iss-console-mgr
911/tcp   open     xact-backup
912/tcp   open     apex-mesh
981/tcp   open     unknown
987/tcp   open     unknown
990/tcp   open     ftps
992/tcp   open     telnets
993/tcp   open     imaps
995/tcp   open     pop3s
999/tcp   open     garcon
1000/tcp  open     cadlock
1001/tcp  open     unknown
1002/tcp  open     windows-icfw
1007/tcp  open     unknown
1009/tcp  open     unknown
1010/tcp  open     surf
1011/tcp  open     unknown
1021/tcp  open     exp1
1022/tcp  open     exp2
1023/tcp  open     netvenuechat
1024/tcp  open     kdm
1025/tcp  open     NFS-or-IIS
1026/tcp  open     LSA-or-nterm
1027/tcp  open     IIS
1028/tcp  open     unknown
1029/tcp  open     ms-lsa
1030/tcp  open     iad1
1031/tcp  open     iad2
1032/tcp  open     iad3
1033/tcp  open     netinfo
1034/tcp  open     zincite-a
1035/tcp  open     multidropper
1036/tcp  open     nsstp
1037/tcp  open     ams
1038/tcp  open     mtqp
1039/tcp  open     sbl
1040/tcp  open     netsaint
1041/tcp  open     danf-ak2
1042/tcp  open     afrog
1043/tcp  open     boinc
1044/tcp  open     dcutility
1045/tcp  open     fpitp
1046/tcp  open     wfremotertm
1047/tcp  open     neod1
1048/tcp  open     neod2
1049/tcp  open     td-postman
1050/tcp  open     java-or-OTGfileshare
1051/tcp  open     optima-vnet
1052/tcp  open     ddt
1053/tcp  open     remote-as
1054/tcp  open     brvread
1055/tcp  open     ansyslmd
1056/tcp  open     vfo
1057/tcp  open     startron
1058/tcp  open     nim
1059/tcp  open     nimreg
1060/tcp  open     polestar
1061/tcp  open     kiosk
1062/tcp  open     veracity
1063/tcp  open     kyoceranetdev
1064/tcp  open     jstel
1065/tcp  open     syscomlan
1066/tcp  open     fpo-fns
1067/tcp  open     instl_boots
1068/tcp  open     instl_bootc
1069/tcp  open     cognex-insight
1070/tcp  open     gmrupdateserv
1071/tcp  open     bsquare-voip
1072/tcp  open     cardax
1073/tcp  open     bridgecontrol
1074/tcp  open     warmspotMgmt
1075/tcp  open     rdrmshc
1076/tcp  open     sns_credit
1077/tcp  open     imgames
1078/tcp  open     avocent-proxy
1079/tcp  open     asprovatalk
1080/tcp  open     socks
1081/tcp  open     pvuniwien
1082/tcp  open     amt-esd-prot
1083/tcp  open     ansoft-lm-1
1084/tcp  open     ansoft-lm-2
1085/tcp  open     webobjects
1086/tcp  open     cplscrambler-lg
1087/tcp  open     cplscrambler-in
1088/tcp  open     cplscrambler-al
1089/tcp  open     ff-annunc
1090/tcp  open     ff-fms
1091/tcp  open     ff-sm
1092/tcp  open     obrpd
1093/tcp  open     proofd
1094/tcp  open     rootd
1095/tcp  open     nicelink
1096/tcp  open     cnrprotocol
1097/tcp  open     sunclustermgr
1098/tcp  open     rmiactivation
1099/tcp  open     rmiregistry
1100/tcp  open     mctp
1102/tcp  open     adobeserver-1
1104/tcp  open     xrl
1105/tcp  open     ftranhc
1106/tcp  open     isoipsigport-1
1107/tcp  open     isoipsigport-2
1108/tcp  open     ratio-adp
1110/tcp  open     nfsd-status
1111/tcp  open     lmsocialserver
1112/tcp  open     msql
1113/tcp  open     ltp-deepspace
1114/tcp  open     mini-sql
1117/tcp  open     ardus-mtrns
1119/tcp  open     bnetgame
1121/tcp  open     rmpp
1122/tcp  open     availant-mgr
1123/tcp  open     murray
1124/tcp  open     hpvmmcontrol
1126/tcp  open     hpvmmdata
1130/tcp  open     casp
1131/tcp  open     caspssl
1132/tcp  open     kvm-via-ip
1137/tcp  open     trim
1138/tcp  open     encrypted_admin
1141/tcp  open     mxomss
1145/tcp  open     x9-icue
1147/tcp  open     capioverlan
1148/tcp  open     elfiq-repl
1149/tcp  open     bvtsonar
1151/tcp  open     unizensus
1152/tcp  open     winpoplanmess
1154/tcp  open     resacommunity
1163/tcp  open     sddp
1164/tcp  open     qsm-proxy
1165/tcp  open     qsm-gui
1166/tcp  open     qsm-remote
1169/tcp  open     tripwire
1174/tcp  open     fnet-remote-ui
1175/tcp  open     dossier
1183/tcp  open     llsurfup-http
1185/tcp  open     catchpole
1186/tcp  open     mysql-cluster
1187/tcp  open     alias
1192/tcp  open     caids-sensor
1198/tcp  open     cajo-discovery
1199/tcp  open     dmidi
1201/tcp  open     nucleus-sand
1213/tcp  open     mpc-lifenet
1216/tcp  open     etebac5
1217/tcp  open     hpss-ndapi
1218/tcp  open     aeroflight-ads
1233/tcp  open     univ-appserver
1234/tcp  open     hotline
1236/tcp  open     bvcontrol
1244/tcp  open     isbconference1
1247/tcp  open     visionpyramid
1248/tcp  open     hermes
1259/tcp  open     opennl-voice
1271/tcp  open     excw
1272/tcp  open     cspmlockmgr
1277/tcp  open     miva-mqs
1287/tcp  open     routematch
1296/tcp  open     dproxy
1300/tcp  open     h323hostcallsc
1301/tcp  open     ci3-software-1
1309/tcp  open     jtag-server
1310/tcp  open     husky
1311/tcp  open     rxmon
1322/tcp  open     novation
1328/tcp  open     ewall
1334/tcp  open     writesrv
1352/tcp  open     lotusnotes
1417/tcp  open     timbuktu-srv1
1433/tcp  open     ms-sql-s
1434/tcp  open     ms-sql-m
1443/tcp  open     ies-lm
1455/tcp  open     esl-lm
1461/tcp  open     ibm_wrless_lan
1494/tcp  open     citrix-ica
1500/tcp  open     vlsi-lm
1501/tcp  open     sas-3
1503/tcp  open     imtc-mcs
1521/tcp  open     oracle
1524/tcp  open     ingreslock
1533/tcp  open     virtual-places
1556/tcp  open     veritas_pbx
1580/tcp  open     tn-tl-r1
1583/tcp  open     simbaexpress
1594/tcp  open     sixtrak
1600/tcp  open     issd
1641/tcp  open     invision
1658/tcp  open     sixnetudr
1666/tcp  open     netview-aix-6
1687/tcp  open     nsjtp-ctrl
1688/tcp  open     nsjtp-data
1700/tcp  open     mps-raft
1717/tcp  open     fj-hdnet
1718/tcp  open     h323gatedisc
1719/tcp  open     h323gatestat
1720/tcp  open     H.323/Q.931
1721/tcp  open     caicci
1723/tcp  open     pptp
1755/tcp  open     wms
1761/tcp  open     landesk-rc
1782/tcp  open     hp-hcip
1783/tcp  open     unknown
1801/tcp  open     msmq
1805/tcp  open     enl-name
1812/tcp  open     radius
1839/tcp  open     netopia-vo1
1840/tcp  open     netopia-vo2
1862/tcp  open     mysql-cm-agent
1863/tcp  open     msnp
1864/tcp  open     paradym-31
1875/tcp  open     westell-stats
1900/tcp  open     upnp
1914/tcp  open     elm-momentum
1935/tcp  open     rtmp
1947/tcp  open     sentinelsrm
1971/tcp  open     netop-school
1972/tcp  open     intersys-cache
1974/tcp  open     drp
1984/tcp  open     bigbrother
1998/tcp  open     x25-svc-port
1999/tcp  open     tcp-id-port
2000/tcp  open     cisco-sccp
2001/tcp  open     dc
2002/tcp  open     globe
2003/tcp  open     finger
2004/tcp  open     mailbox
2005/tcp  open     deslogin
2006/tcp  open     invokator
2007/tcp  open     dectalk
2008/tcp  open     conf
2009/tcp  open     news
2010/tcp  open     search
2013/tcp  open     raid-am
2020/tcp  open     xinupageserver
2021/tcp  open     servexec
2022/tcp  open     down
2030/tcp  open     device2
2033/tcp  open     glogger
2034/tcp  open     scoremgr
2035/tcp  open     imsldoc
2038/tcp  open     objectmanager
2040/tcp  open     lam
2041/tcp  open     interbase
2042/tcp  open     isis
2043/tcp  open     isis-bcast
2045/tcp  open     cdfunc
2046/tcp  open     sdfunc
2047/tcp  open     dls
2048/tcp  open     dls-monitor
2049/tcp  filtered nfs
2065/tcp  open     dlsrpn
2068/tcp  open     advocentkvm
2099/tcp  open     h2250-annex-g
2100/tcp  open     amiganetfs
2103/tcp  open     zephyr-clt
2105/tcp  open     eklogin
2106/tcp  open     ekshell
2107/tcp  open     msmq-mgmt
2111/tcp  open     kx
2119/tcp  open     gsigatekeeper
2121/tcp  open     ccproxy-ftp
2126/tcp  open     pktcable-cops
2135/tcp  open     gris
2144/tcp  open     lv-ffx
2160/tcp  open     apc-2160
2161/tcp  open     apc-agent
2170/tcp  open     eyetv
2179/tcp  open     vmrdp
2190/tcp  open     tivoconnect
2191/tcp  open     tvbus
2196/tcp  open     unknown
2200/tcp  open     ici
2222/tcp  open     EtherNet/IP-1
2251/tcp  open     dif-port
2260/tcp  open     apc-2260
2288/tcp  open     netml
2301/tcp  open     compaqdiag
2323/tcp  open     3d-nfsd
2366/tcp  open     qip-login
2381/tcp  open     compaq-https
2382/tcp  open     ms-olap3
2383/tcp  open     ms-olap4
2393/tcp  open     ms-olap1
2394/tcp  open     ms-olap2
2399/tcp  open     fmpro-fdal
2401/tcp  open     cvspserver
2492/tcp  open     groove
2500/tcp  open     rtsserv
2522/tcp  open     windb
2525/tcp  open     ms-v-worlds
2557/tcp  open     nicetec-mgmt
2601/tcp  open     zebra
2602/tcp  open     ripd
2604/tcp  open     ospfd
2605/tcp  open     bgpd
2607/tcp  open     connection
2608/tcp  open     wag-service
2638/tcp  open     sybase
2701/tcp  open     sms-rcinfo
2702/tcp  open     sms-xfer
2710/tcp  open     sso-service
2717/tcp  open     pn-requester
2718/tcp  open     pn-requester2
2725/tcp  open     msolap-ptp2
2800/tcp  



  
  

2015-11-24

http://anond.hatelabo.jp/20151124020950

javaを極めてもphpを極めてもmysqlを極めてもlinuxを極めてもどーせ、5年後にはもっと良いものが使われて主流になっているでしょう。

この辺はIT関連では固い技術で、例に挙げるには不適かな。もう10年以上使われてるし、この先10年も使われると思う。

あーでも、クラウドが主流になって、環境構築/運用ノウハウが要らなくなる可能性はあるか。

ブラックIT企業ガンバリマスは死亡フラグ

「手に職を付けたい」程度の薄っぺら理由IT系ブラック企業正社員を志望するのは絶対にやめた方がいい




理由1 絶対に「手に職が付く」事は無い

そんな程度の情熱しか持ち合わせないなら絶対に「手に職が付く」事は無い。

よっぽど優秀なら話は別ですが、ブラック企業しか就職できなかった貴方ですよ?無理ですね。

システム能力が低い人、脳みそそっち系用に構築されていない人にとって最初は相当つらいです。

耐え切れなくて100%逃げるでしょう。「手に職を付ける」だけなら他の仕事でもいいはずです。

理由2 体力的に耐えられない

IT系ブラック企業場合マニュアルなんて無いから投入時間に成果が比例しないです。その場合一定能力以下の方は、9時出社の25時帰宅になります

成果の方程式は「投入時間 × (能力ー最低限必要能力) ≒ 成果」ですから無能だと成果はマイナスになりますデスマーチの発生ですね。

そして、大抵の場合ブラックIT企業プロジェクトリーダーがこれに当てはまりますデスマーチ確定ですね。

理由3 常に学び続けることが要求されることに耐えられない

技術の変遷速度が速いため、常に学び続けないと時代遅れになってしまうからシステム屋さんなら常に付きまとう問題です。これは、ブラック企業だけの話ではないですね。

javaを極めてもphpを極めてもmysqlを極めてもlinuxを極めてもどーせ、5年後にはもっと良いものが使われて主流になっているでしょう。

でも、考えてみてください。システムの業務なんて理数系の勉強と似たようなものです。

新しい技術が来たとしても論理的に考える事が得意な人ならば文型理系関係なくこなせると思います問題は、貴方は、学生時代そういう人でしたか?無理ですね。

理由4 金銭面の見返りはほぼ皆無

頑張って成果をあげたところでブラック企業なんて金銭面の見返りはほぼ皆無です経営者搾取されるだけです。

適度に手を抜いてある程度の成果が出せる人にしかおススメしません。3でも書いたとおりである程度能力があって、手抜きできる人にとってはブラック企業ヘルプがない代わりに放任に近いので凄く楽だと思いますネット閲覧規制などもないですし。

理由5 あれこれ理不尽責任を背負わされる

福利厚生もちゃんとしてないくせに、正社員から引継ぎするのが義務とかなんとか言われます。辞める時にめんどくさいですよ。

まずはバイトで様子見を見ましょう。「あ~ブラックだな」って思ったら適当なところでフェイドアウトするのがおススメです。

理由6 人間的に終わってる人が多いしその一員になってしま

ブラック企業なので人間的にどうかと思う人がたくさんいます上司の失敗は部下の失敗です。

良心……社会常識…人を信頼する気持ち……プライベート時間……心と体の健康など、失うものはあまりに大きいです。

理由7 教育制度なんて無い

管理体制教育制度が整っている会社ブラック企業にはなりません。つまり自力で学ぶしかないんです。

貴方学校勉強は良く出来た方ですか? もしそうでないならこの業界は茨の道ですよ?

人材が不足しているだけで人手が不足している訳ではありません。

システム業界は、正直にいえば人材不足です。人材が不足しているだけで人手が不足している訳ではありません。あなたが求められているわけではないのです。

2015-11-23

プログラミング解説で、「"ユーザー名"」という表記をやめてほしい

例えば、MySQLで、

select {フィールド名} from "テーブル名" where id = "検索したいID";

と書いてあると{}や""も、僕のような初心者はその言語作法なのかと勘違いして、

select {sample} from "sample_list" where id = "12";

と書いてしまう。

別に

select フィールド名 from テーブル名 where id = 検索したいID;

と書いてくれて構わないのに。

これで随分プログラミングで躓いた。

勘弁してくれ。

下に簡単に例示してくれるだけでもいいからちょっとだけ気を配って欲しいよ。

2015-10-14

MYSQL で、ストアドプロシージャを使えるとは知らなんだ

DELIMITER //

CREATE PROCEDURE proc(IN s1 VARCHAR(32), IN s2 VARCHAR(32), OUT o INT)
BEGIN
  DECLARE a INT;

  SELECT COUNT(*) INTO a FROM TBL WHERE COL1=s1 AND COL2=s2;

  IF a = 0 THEN
    SET o = 0;
  ELSE
    SET o = 1;
  END IF;
END
//

DELIMITER ;
CALL proc('SUZUKI','ICHIRO',@a)

SELECT @a

余談だが、副問い合わせをするとものすごく遅いのは、過去ことなのか?未だにそうなのか?

2015-10-08

社畜が夜なべをしてエロキュレーションサイト作ってみた

こんにちは社畜です。

社畜はいってもいわゆるホワイト企業に勤めており、毎日19時には家にいてオナニーをしている生活を送っております

ですので、比較時間には余裕があり、周りからプログラミングでも学んでみれば?」と提言されたので、せっかくなので勉強がてら作ってみました。

ちなみに私は非技術職で、高校大学ともに文系人間です。まぁやればできるよね。

作成サイト

アダルト画像Sharing

http://share-ero.pics/

コンセプトはいかに簡単にエロ画像まとめサイトを作るか、ということに注力しました。

もちろん自分管理画面上からシコシコ作ってもいいのですが、せっかくなのでみんなで作れたほうがいいじゃん!ってのがことの発端です。



今回特に注力した点


大学の同期に何人か理系人間がいたのでいろいろと助けてもらえました。



動作環境

言語Ruby on RailsOSはubuntu14.04、RDBMySQL5.6を基本とし、後で述べますが他にRedisやVarnishなどのツールも使っております

いまのところ、サーバーは1台体制ですが、今後アクセスが急増した時に備えるため、NFSマウントロードバランサー、MasterSlaveによるレプリケーションには少なくとも対応予定です。

この辺は少し触れる予定です。


なおサーバー会社海外Linodeを使っています。なんでAWSじゃないの?と思われるかもしれませんが、単純に費用対効果の話になってきます

それこそ企業で行うのであれば、AWS機能面もすごいし、ターミナルでコツコツおこなっていたことがポチポチできちゃって、すごーいんですが、いかんせん高い。

LinodeはいわゆるクラウドというよりもよりVPSに近いと思います。ただ海外でのシェアも高いし、価格リーズナブルなので私はこれを使ってみることにしています

Sakuraはいいんですけど、エロには少し厳しいとのことなので。。。



デザイン

デザインというか、UIに関してはかなり気を使って作りました。いかに簡単に画像を選択して、まとめるかが鍵になってくるので.。

なので、

画像サイトをいくつか選択→タイトル説明カテゴリーをいれる→画像を選択→送信

の流れで簡単にアップできるようにしました。洗練するポイントはたくさんありそうですが、とりあえずはこれで行こうと思います。なおスマートフォンにも対応をしております


なお、こういうサービスを作る時のポイントってやはりjavascriptを使い過ぎない、ということだと思うんですよね。

しかたがないんですけど、イベント駆動型の言語ってどうしてもコード煩雑になる傾向があります。大きな会社できちんと管理できるようなコスト(というか時間)をかけられる会社ならいいんですけど、そうでないならまずjavascript無しでのプログラムを考えてみる、どうしても必要であればjavascriptを使う、みたいな。

私も今回はjavascriptは一部でのみ使用しております


ところで全体のイメージとしては、はてなさんを意識してみたのですが、デザインセンスの無さからか、全く別のものができてしまいましたwww



非同期におけるプログラミング

非同期プログラミングってご存知でしょうか?私はRubyから入った立場なのでピンと来るまでだいぶ時間がかかりました。

Rubyとかの同期プログラムってのは上から流れてきて、上の処理が終わるまで次の処理が進まない、というものになります

一方非同期プログラミングは上からの処理を待たずに、どんどこ次の処理を行いますちょっと乱暴な言い方ですが、だいたいのイメージはつくと思います

実はJavascriptも非同期プログラミング言語一種でして、たとえばなんかどっかのボタンを押して処理が進んでも、他の動作をしようと思えばできますよね?Gmailブラウザ上で受信をしていても、メールを書くとかの動作はできるわけです。つまりこれは処理を待たずに、別の処理が走っています。これが非同期プログラミングです。


そんで、なんでこんな話をしたかっていうと、今回の仕組みって画像ダウンロードしてきて、サムネイル化するわけですけど、実はダウンロードには時間がかかります。ヘタしたら2分くらい時間がかかるケースも有り、ボタンを押してからそんな時間待ってられません。

と、ここで上述の非同期プログラミングが効いてくるわけです。とりあえず処理は別のところに投げるからトップページを表示しておくね。こんなことができます

やり方は実はたくさんあるのですが、Rails4.2からActiveJobといって、それまでの様々なライブラリに枝分かれしてきた機能カプセル化したものになります。とはいってもバックエンドには一応ライブラリを置く必要があり、私はsidekiqというライブラリをそこに置きました。

他にもdelayed_jobとかなんかいろいろあるので、ぜひ見てみてください。


パフォーマンス周りで気を使っている点とこれから気をつける点

下に箇条書きしてみますね。


気を使っている点

今後気をつかう点

他にもMySQLクエリキャッシュとか、Apacheチューニングとかやることはありますが、この辺は正直Varnishで。。。というのが正直なところです。みんな使おうよ、Varnish。


SEO

つくっても人がこなければ仕方がありません。そこで大事になってくるのが、SEO(SearchEngineOptimization)です。


昔はとにかくリンクを張っていればそこそこ検索順位が上がったのですが、最近は賢くなってきたのでなかなかそうはいきません。


今はとにかく良質なコンテンツと、ソーシャルメディアでの拡散ですね。私は怠惰人間なので、みなさんに良質なコンテンツを作ってもらうと考えておりますwww


良質なコンテンツを書いてもらうにはやはりインセンティブ必要なので、Naverみたいに広告タグを貼ることができる機能でも作ろうかな、なんて思ってます



今後増やしたい機能としては




今はまだまだ機能が少ないんですが、今後どしどし増やしていく予定なので、応援よろしくお願いいたします!ご意見いただければ嬉しいです!


さて私は明日仕事なので、成瀬心美様でシコッて寝ます

2015-09-30

http://anond.hatelabo.jp/20150930173709

mysql> SELECT NOW() - INTERVAL 365*20 DAY;

+-----------------------------+

| NOW() - INTERVAL 365*20 DAY |

+-----------------------------+

| 1995-10-05 17:39:44 |

+-----------------------------+

1 row in set (0.11 sec)

意外と正確なのかもしれないぞ>20年前

2015-08-25

IT関係ないサラリーマンコミュニティサイト作っちゃいました。

私ごとですが、この度コミュニティサイト作成いたしました。

私の持てる知識を絞り出してなんとか完成しました。

**************************************************************************************

完成したサイトがこちらです。

LapyNetニュース

http://lapynetz.net/

**************************************************************************************

私は普段webとは関係ない仕事してます。なんとか休日を利用して、

webサービス作成しました。


メインのコードはこんな感じ

----------------------------------------------------------------------------------------------------------------------



App::uses('Sanitize', 'Utility');
class RssfeedsController extends AppController {

public $helpers = array('Html','Form','Session','Number','Cache');

public $uses = array(
'Rssfeed',
'Tweet',
'Wadai',
'Rank',
'Oracle'
);
 **************************************************************************************
public function index() {

$title_for_layout = "LapyNetニュース";
$content = "Hello World!!";

$this->set(compact('title_for_layout','content'));
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}

$params = array(
'conditions' = > array(
'and' = > array(
'Rssfeed.time' = > $today,
)),
'order' = > 'tweets desc',
'limit' = > '50'
);
$this- >set('posts',$this- >Rssfeed- >find('all',$params));

$paramz = array(
'order' = > 'Rssfeed.id desc',
'limit' = > '10'
);
$this->set('posts2',$this->Rssfeed->find('all',$paramz));

$paramz = $this- >Rssfeed- >query('SELECT id,title FROM rssfeeds order by id desc limit 10');

$this->set('posts2', $paramz);

$parapara = $this- >Oracle- >query('SELECT id,title FROM oracles order by id desc limit 10');

$this- >set('postx', $parapara);

$funking = $this- >Rank- >query('SELECT id,frank FROM ranks where creation=(select max(creation) from ranks)');

$this- >set('funking', $funking);


}

 **************************************************************************************
public function mizuno() {
$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '30'
);
$recent_posts = $this->Oracle->find('all',$parapara);
return $recent_posts;

}


 **************************************************************************************
public function wadai() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}

$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 4
)),
'order' => 'tweets desc',
'limit' => '100'
);
$this->set('posts',$this->Rssfeed->find('all',$params));





$this->set("title_for_layout","2CHニュース-LapyNetニュース");


$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postyy',$this->Rssfeed->find('all',$paramz));

$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '10'
);


$this->set('postyx',$this->Oracle->find('all',$parapara));

$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');

$this->set('funking', $funking);



}
 **************************************************************************************
public function hot() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}

$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 3
)),
'order' => 'tweets desc',
'limit' => '20'
);
$title_for_layout = "LapyNetニュース";
$this->set("title_for_layout","ニュース-LapyNetニュース");
$this->set('posts',$this->Rssfeed->find('all',$params));

$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '10'
);
$this->set('postxx',$this->Oracle->find('all',$parapara));

$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postsxxx',$this->Rssfeed->find('all',$paramz));

$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');

$this->set('funking', $funking);


}

 **************************************************************************************
public function newnew() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}

$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 2
)),
'order' => 'tweets desc',
'limit' => '20'
);
$this->set("title_for_layout","エンタメニュース-LapyNetニュース");
$this->set('posts',$this->Rssfeed->find('all',$params));

$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postszz',$this->Rssfeed->find('all',$paramz));

$paramz = $this->Oracle->query('SELECT id,title FROM rssfeeds order by id desc limit 10');

$this->set('postszz', $paramz);

$parapara = $this->Oracle->query('SELECT id,title FROM oracles order by id desc limit 10');

$this->set('postzy', $parapara);


$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');

$this->set('funking', $funking);



}
 **************************************************************************************
public function top() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 1
)),
'order' => 'tweets desc',
'limit' => '20'
);
$this->set('posts',$this->Rssfeed->find('all',$params));

$param = array(
'conditions' => array('times > current_timestamp + interval -600 minute and Kubetu = 4'),
'order' => 'tweets desc',
'limit' => '30'
);
$this->set('posts2',$this->Rssfeed->find('all',$param));
}


 **************************************************************************************
public function view($id = null ) {
$this->Rssfeed->id = $id; //驥崎ヲ√↑荳譁・i縺励>
$user = AuthComponent::user();

$TwimStatus = ClassRegistry::init('Twim.TwimStatus');


$TwimStatus->getDataSource()->setToken(AuthComponent::user());

$statuses = $TwimStatus->tweet();
$rairai = $this->Rssfeed->read(title,$id);
$alcol = $this->Rssfeed->read();
$this->set('post', $alcol);

$this->set('post2', $user);
$this->set('post3', $statuses);
$this->set("title_for_layout",$rairai[Rssfeed][title]."-LapyNetニュース");

$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '20'
);
$this->set('postszz',$this->Rssfeed->find('all',$paramz));

$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '30'
);
$this->set('postzy',$this->Oracle->find('all',$parapara));

}
 **************************************************************************************
public function add() {

if($this->request->isPost()){
if($this->Tweet->save($this->data)) {
$this->Session->setFlash('seikou');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));

}else{
$this->Session->setFlash('sipai');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
}
}
}
 **************************************************************************************
public function delete($id = null) {
$this->Rssfeed->id = $id; 
$this->set('set', $this->Rssfeed->read());
$this->redirect(array('controller'=>'tweets','action'=>'delete',$this->data['tweet']['rssfeed_id']));


}
 **************************************************************************************
public function oracle() {
if($this->request->is('post')) {

$user = AuthComponent::user();

$TwimStatus = ClassRegistry::init('Twim.TwimStatus');


$TwimStatus->getDataSource()->setToken(AuthComponent::user());

$contents1 = $this->request->data['Rssfeed']['contents'];
$contents2 = $this->request->data;
$statuses = $TwimStatus->tweet($contents1);


if($this->Rssfeed->save($contents2)) {
$this->Session->setFlash('成功です。');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
$this->redirect($this->referer());
}else{
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
$this->Session->setFlash('失敗です。');
}
}


}
 **************************************************************************************
public function makelist() {
$rssfeeds = $this->paginate();
if ($this->request->is('requested')) {
return $rssfeeds;
} else {
$this->set('rssfeeds', $rssfeeds);
}
}

}

----------------------------------------------------------------------------------------------------------------------

rssフィードはこんな感じです。
----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/php
<?php

header('Content-type: text/html; charset=UTF-8');


require_once ('/var/www/html/s/magpierss/rss_fetch.inc');


define('MAGPIE_CACHE_AGE', 60*5);

define('MAGPIE_CACHE_DIR', '/var/www/html/s/cache/');

define('MAGPIE_OUTPUT_ENCODING','UTF-8');


$urls = array(
'*********************************');

$items = getRssList($urls);

echo '<ul>';
foreach ($items as $item) {

$href = mb_convert_encoding($item['link'], "UTF-8", "auto");

$title = mb_convert_encoding($item['title'], "UTF-8", "auto");
$description = mb_convert_encoding($item['description'], "UTF-8", "auto");
$megami = mb_convert_encoding($description, "UTF-8", "auto");

 

 **************************************************************************************


$all = 'http://urls.api.twitter.com/1/urls/count.json?url='.$href;
$Rits = file_get_contents($all);
$Olfe = mb_convert_encoding($Rits, 'UTF-8', 'auto');
$data = json_decode($Olfe);
$tweets = $data->count;

 **************************************************************************************

$checkman = db_check_urls($href);
$checkman2 = db_check_pr($title);

$nowtimes = date('Ymd');

 


if($checkman == 0 && $checkman2 == 0){
#$hrefs = urlencode($href);
db_put_urls($nowtimes,$href,$title,$description,$tweets);
echo "<li><a href=$href>$title</a><br>$megami<p>$tweets</p><p>$checkman</p></li>";
}else{

}


}
echo '</ul>';

 

 

 **************************************************************************************
function getRssList($urls)
{
$rssitems = array();
foreach ($urls as $url) {
$obj = fetch_rss($url);
$rssitems = array_merge($rssitems, $obj->items);
}
return $rssitems;
}

 **************************************************************************************
function db_check_pr($japanese){

$moji = mb_substr($japanese,0,2);
if($moji == 'PR'){
return 1;
}else{
return 0;
}
}
 **************************************************************************************

function db_check_urls($href){

require '/var/www/html/s/database_conf.php';

try {

$db = new PDO($dsn, $dbUser, $dbPass);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$sql = 'SELECT count(*) AS count FROM rssfeeds WHERE urls = :language';
$prepare = $db->prepare($sql);


$languages = array($href);
foreach ($languages as $language) {

$prepare->bindValue(':language', $language, PDO::PARAM_STR);
$prepare->execute();

$result = $prepare->fetchColumn();
if ($result > 0) {
return true;
}else{
return false;
}
}

} catch (PDOException $e) {
echo 'エラーが発生しました。内容: ' . h($e->getMessage());
}

function h($var) 
{
return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
}
}

 **************************************************************************************
function db_put_urls($nowtimes,$href,$title,$description,$tweets){
require '/var/www/html/s/database_conf.php';
try {

$db = new PDO($dsn, $dbUser, $dbPass);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sikibetu = 5;
$moto = "アニゲー速報VIP";

$sql = 'insert into rssfeeds (id, time,urls,title,contents,tweets,times,kubetu,teikyo) values (?, ?, ?, ?, ?, ?, ?, ?, ?)';

$prepare = $db->prepare($sql);

$prepare->bindValue(1, 0, PDO::PARAM_STR);
$prepare->bindValue(2, $nowtimes, PDO::PARAM_STR);
$prepare->bindValue(3, $href, PDO::PARAM_STR);
$prepare->bindValue(4, $title, PDO::PARAM_STR);
$prepare->bindValue(5, $description, PDO::PARAM_STR);
$prepare->bindValue(6, $tweets, PDO::PARAM_STR);
$prepare->bindValue(7, 'cast( now() as datetime)', PDO::PARAM_STR);
$prepare->bindValue(8, $sikibetu, PDO::PARAM_STR);
$prepare->bindValue(9, $moto, PDO::PARAM_STR);
$prepare->execute();

} catch (PDOException $e) {
echo 'エラーが発生しました。内容: ' . h($e->getMessage());
}
}
?>

---------------------------------------------------------------------------------------------------------------------


**************************************************************************************



参考にした書籍

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus)

作者: 安藤祐介,岸田健一郎,新原雅司,市川快,渡辺一宏,鈴木則夫

出版社/メーカー: 技術評論社

発売日: 2012/09/29

メディア: 単行本ソフトカバー

購入: 5人 クリック: 165回

この商品を含むブログ (9件) を見る

Webアプリ開発を加速する CakePHP2定番レシピ119

Webアプリ開発を加速する CakePHP2定番レシピ119

作者: 長谷川智希,デジタルサーカス

出版社/メーカー: 秀和システム

発売日: 2013/09/28

メディア: 単行本

この商品を含むブログ (1件) を見る



**************************************************************************************


一番難しいところはtwitterログインwebサイト連結でした。

cakephp直感できに操作できていいです。

素人のわたしでも操作できましたので。

cakephpを使用しています

webからニュース収集してきます

ツイート数でランキングしてますネット話題を見つけられます


twitterアカウントログインできます

ニュースに対するコメントもできるし、

自分記事投稿できます。(画像も可)


デザインはよくわからないので、

ホームページビルダーを使用しています

今のホームページビルダーは昔と違って高機能ですね。

テンプレートも何種類もあって今はすごいです。

アマゾンawsを使用してます

サーバーWebサーバーデータベースサーバmysql)

に分かれています

今更cakephpを使っている人は少ないかもしれませんが、

データベースとの接続などは楽でした。

twitterアカウントあるといつでも参加できますので、

ニュースを通してコミュニケーション目的としたサイトを目指します。

2015-08-07

一体なんだよこの記事

http://webbingstudio.com/weblog/cms/entry-773.html

知ってか知らずかちょっとこの記事ひどいので、突っ込む。


共用SSL証明書が当たり前?

小規模の商用サイトでは、フォーム暗号化する際には、共有SSLを利用するのが当たり前となっています独自ドメインSSL証明書を取得すると、フォームを通して得られる収益よりも、維持費の方がはるかに高くなってしまうからです。

とこの記事では書かれていますが、一体どこで「当たり前」なんでしょうか?

SSL証明書の取得費用は、サーバーホスティングによって額がまちまちなのは確かですけれども、

安く独自SSL証明書を取得して利用できるサーバーホスティングは山ほどあります

WEB制作者として「自分が良く知っているだけ」のサーバーレンタルクライアント押し付けはいませんか?

また、小規模商用サイトにしても、仮に年額35,000円のSSL証明書をつけ、かつ、月額3,000円のサーバーを借りていたとすると

月額でいえば6,000円くらいの負担ですが、

いくら小規模とはいえ、広報活動の中核をなすWEBサイトであるならば、

月額6,000円をペイできないとすると、

ちょっと商用サイトとしては破綻しているように感じます

(というか、効果測定をしていないだけ?)

改ざん認識

共用SSLリスクに関して言えば、この記事引用している、高木浩光氏の書かれている通りではあります

cookieを取得できてしまうという点においては。ですね。

で、その部分の帰結が、完全におかしい。

cookieが取得できてしまう結果として、一番最初に狙われるのは、管理画面へのログイン

いわゆるセッションハイジャックです。

ログイン状態を乗っ取られた時点で、どんなCMSでも、WEBサイト改ざんは可能です。

なぜか。

CMSは「コンテンツマネージメント」する仕組みで、

そのコンテンツは多くの場合MySQL代表されるDBに保存してあります

したがって、ファイル改ざんなどを行わずとも、WEBサイトの内容は書き換えることが可能なのです。

WEBアプリケーションの仕組みに明るくない方が読むと

「なるほど」と思ってしまうかもしれないので、

早々に訂正していただきたい。

また、この記事にある a-blog cmsというCMSについてはよく知りませんが、

多くのモダンCMSでは、ほとんどの管理画面ログインにおいて、

セッションハイジャックに対する防衛は行われていますので、

cookieの取得が、即WEBページの改ざんに繋がるような書き方も、

CMS利用者に対して、誤解を広げる結果になりそうですので、

ここも早々に訂正していただきたい。


CMSを過信していないか?

この筆者さんは、a-blog cmsというCMSを利用されているようだ。

このCMSはどうやら、PHP製ながらPHPソース暗号化しているようだ。

なるほど、それならばファイル改ざんは確かに起きにくい。

が、それはあくまで起きにくいだけの問題

こう言ってはなんですが、攻撃者にしてみれば、a-blog cms攻略するくらいならMovable TypeWordPressを攻めた方が楽というものです。

この記述むちゃくちゃである攻撃者にしてみれば、誰でも手に入れられるCMSであれば、

ファイル構造の解析はそんなに難しい話ではない。

a-blog cms公式サイトを拝見すると、MySQLを利用しているようで、

ともすれば、インストールさえしてしまえば、

ファイル暗号化はなされていようとも、DBの中身の仕様は丸見えだ。

前提条件として「知っている」「知らない」の差はあれど、攻撃に関して「ラク」というのは

どう考えても楽観的に過ぎる考えだ。


安全」の認識

最後に突っ込んでおきたい。というか質問というか。

どうも「SSLで確保される安全領域」について、かなり認識が甘いようだ。

SSLあくまで、TCP/IPネットワークにおいて通信経路を暗号化するための技術だ。

通信する際に、通信先のサーバーが正しく認証されているかどうか?に必要なのはSSL証明書

で、ここに書いたとおり、SSLあくまサーバー利用者通信においての暗号化だ。

この記事に書かれていることは「メールフォームについて」のことのようだが、

サーバーに到達したあとのメールについては安全性をかんがえていますか?

メールは全く暗号化されず平文で送信されるとても脆弱通信手段だ。

いくらSSL通信暗号化しようとも、問い合わせフォームの送信がメールだったとすると…

外部から傍受される危険性が高くなります

とこの記事ではかかれていますが、そもそもHTTPHTTPS通信を傍受するより遥かに

メールを傍受したほうがラクとも考えられるはず。

CMSを使っている方を非難するわけではないが、

CMS機能に甘んじて、こういったベーシック問題に考えが及んでいないとすると、

WEB制作者としては、ちょっと配慮が足らなくはないですか?

とおもう。

P.S SSLということばはもうないよ。

記事に対するつっこみではないですが、

SSLということばは、とても古い言葉です。

便宜上みんな「SSL」といっているだけで、

正しくは「TLS」でっせ。

2015-07-28

ばかどもが

MySQLのことを話あってるけど突っ込みどころ満載でさっきからニヤニヤが止まらない。

2015-07-14

童貞プログラマーエロサイト作ってみた

作ったサイト

AV女優検索

http://pornstar.jp/

かつて好きだった人の写真好きな芸能人写真から顔が最も似ているAV女優検索するサービス

既に好きなAV女優から新たなAV女優を発掘するという利用もできます

動機

僕はAV女優を顔重視で選ぶのですが、いろんなエロ動画サイトを見ていると、有名ではないが、自分の好みな顔のAV女優を見付けることがよくあります

既存エロ動画サイトテキスト検索することは可能ですが、もしかしたら、まだ自分の知らない自分好みなAV女優がたくさん存在するかもしれないと

もし顔で検索できれば自分AVライフもっと楽しくなるだろうと一念発起して開発しました(開発期間は半年くらい)。

システム構成

レンタルサーバー GMOクラウド Public
WEB Apache
DB MySQL
プログラミング言語 PHP
フレームワーク Cakephp
UI Bootstrap
認識 Face++

簡単に仕組みを説明すると、

①DMMのサイトスクレイピングしてAV女優基本情報名前スリーサイズなど)を登録

②DMMのAPIを利用して、それぞれの女優作品を取得して、パッケージ写真中の顔面積を測り、最も面積が大きいパッケージ写真登録

ユーザーアップロードした画像からFace++のAPIを利用することで顔検索して、最も似ているAV女優を8人表示

終わりに

今はまだ、顔認識を他のサービスに頼っているので、いずれ内製化して全て自分で開発したいと考えています

また、今は静止画でとどまっているので、動画範囲を拡げて、画像アップロードすると、

自動的画像に似た女優が出演する動画を表示する仕組みも開発したい思います

2015-06-13

プログラミングしたいけど、作りたいものがない

ゲームを作りたいとか、Webサービスを作りたいって欲があるんだけど、「さて、じゃあ何を作ろうか」って考えるところでいつも躓く。

MySQLPerlあたり使って掲示板でも作ってみるか。でも作っても別にそれを活用するわけでもないしなー、みたいなデモデモダッテな感じ、

何作ろうかなあ。

2015-06-10

定期的なパスワード変更を根本対策昇華させるたった一つの方法

やあ、諸君

各種アカウントパスワードは定期的に変更しているかね。

していないって?

定期的にパスワードを変更せず、もし不正ログインされたらどうするつもりだね?

Twitter なり Facebookめがね宣伝をしている人をみて何を感じるかね?

「これからパスワードは定期的に変更しよう」

そう思えるようになったかね?

そういう人は SNS に「めうレイバン大好きだめう」とでも書き込んでおいてくれたまえ。

第三者不正ログイン不正認証)する方法

私はあるアカウント A1 を使っていて P1 というパスワードを設定している。

その前にそのアカウントがどんなサービスツール)のためのアカウントなのかも確認しておく必要があるな。

ノートパソコンアカウントオンラインサービスアカウントUNIXサーバアカウント銀行の口座(アカウント)?

おっと、暗証番号パスワード混同するのはよくないな。鍵空間が違いすぎる。ただ説明するには分かりやすいかもしれない。

よし、暗証番号を持ちだして説明を続けよう。

パスワードは最低でも8文字」だとか何年も前から言われているのに、銀行暗証番号数字4桁であることに疑問を持ったことはあるかい

銀行アカウント数字4桁程度で守られているのは ID入力自由にできず、かつ認証試行回数が限られている(大抵は3回)からである

理論的には認証試行回数が限られていなければどんなパスワードでもパスワード候補をいくつも試すことで必ず第三者でも認証突破できてしまう。

空間が小さい(狭い)場合は容易だろう。第三者不正認証を行う場合銀行口座であれば暗証番号として 0000 から 9999 までの1万通りを試すことができれば認証できてしまう。

もし銀行認証試行回数を制限していなかったらどうなると思う?監視カメラがあるから大丈夫だって

そう、「監視カメラ」は関係ない。関係あるのはオフライン認証であるということだ。オフライン認証場合コンピュータを用いてパスワード候補をいくつも試すという行為自体が容易ではないため全てのパスワード候補を試す「総当たり攻撃ブルートフォース攻撃)」はやりにくい。

ここでいうオフライン認証というのは、その認証ID/Password入力)がインターネット経由ではなく、かつユーザ第三者)のコンピュータ外(手動)で行われることを指す。暗号ファイルオフラインパスワード解析という話があるが、そのオフラインとは混同しないようにしてほしい。

やりにくいとはいっても実際に1万通りくらいならやれてしまう。オフライン認証であれば鍵空間が小さくても問題ないだなんて話はない。だから試行回数の制限重要なのだ

試行回数さえ制限すれば第三者不正認証現実的に防げるんじゃないかって?

そう思った?

残念!逆総当たり攻撃リバースブルートフォース攻撃)ができました!」

前述の通り、認証試行回数の制限によってある回数以降の認証操作をできないようにアカウントロックすることがある。

これでロックされるのは「そのアカウントIDである

「めうちゃん、ここに100万枚のキャッシュカードがある」

『すごいめう』

「それを1枚入れて、暗証番号 4649 と入れる」

『4649 と入れる』

「それを100万回繰り返す」

『繰り返す』

「そのうち認証が通る」

『できためうっ!これならアカウントロックされないめう!』

参考までに書いておくが、100万件の銀行口座暗証番号が一様分布であれば鍵空間は1万通りなので「100アカウント」の認証突破できる。仮に1万件しかさなかったとしても、適当に選んだ1つの暗証番号で逆総当たり攻撃が1件でも成功する確率は6割強である確率 p = 1 - (9999/10000)^10000 ≈ 0.6321 より)。ここでは 1111 などの単純とされる実際には設定できない暗証番号があることは考慮していない。

しかし、この逆総当たり攻撃が実際に成功する(1件でも不正ログインできる)のは、あるアカウントに推測可能な弱いパスワード暗証番号)が設定されている場合に限る。いま、暗証番号に対する逆総当たりを説明したがこのシチュエーションは実際には起こりにくい。なぜなら暗証番号で守られるアカウントは大抵オフライン認証であり、そのようなサービスID入力自由にできないためである。可能性がないとは言えないが、オンライン認証とは全く性質が異なるということに注意されたい。

オンライン認証ID入力自由にできるにもかかわらず、鍵空間暗証番号並に小さいパスワードしか設定できないサービスセキュリティ界隈の怖いおじさん(本当はいい人)に叩き潰されたことを思い出す人もいるのではないかな。

要するに、自分アカウント不正ログインされないかを心配する際に、自分第三者に推測困難なパスワードを設定している(設定できている)のであれば逆総当たり攻撃は脅威ではないということである

特定アカウントに対して不正ログインする方法

パスワードを知らない第三者が、「不特定アカウント」に対して不正ログイン成功させる方法が「逆総当たり攻撃」であった。

不特定ではなく「特定アカウント」に対して不正ログイン成功させる方法は何だと思う?

ちょっと表にしてみよう。ここで、暗証番号数字4桁あるいは6桁など鍵空間が小さく総当たりが可能なパスワードと考えてもらいたい。一方でパスワードは鍵空間が大きい推測困難な文字列を設定できるものだと考えてほしい。(ちなみに鍵空間の大きさ、あるいはパスワードの強度について、英数字8桁や数字10桁というのは微妙である。その鍵空間の総当たり攻撃が可能かどうかで鍵空間が大きいか、強度が十分かを判断してほしい。)

オフライン認証場合
# ID自由入力可能か 空間の大きさ 認証回数の制限があるか 不正ログインの可能性
OFF-1 キャッシュカード等が必要 暗証番号 制限あり 現実的には不可能
OFF-2 キャッシュカード等が必要 暗証番号 制限 総当たり攻撃が成立する
OFF-3 自由入力できる 暗証番号 制限あり 逆総当たり攻撃が成立する
OFF-4 自由入力できる 暗証番号 制限 OFF-2 と OFF-3 に加え、逆総当たり攻撃がしやす
OFF-5 キャッシュカード等が必要 パスワード 制限あり 現実的には不可能
OFF-6 キャッシュカード等が必要 パスワード 制限 パスワード強度が一定以上なら現実的には不可能
OFF-7 自由入力できる パスワード 制限あり パスワード強度が低いアカウントに対してのみ逆総当たり攻撃が成立する
OFF-8 自由入力できる パスワード 制限 OFF-7 と同じ
オンライン認証場合
# ID自由入力可能か 空間の大きさ 認証回数の制限があるか 不正ログインの可能性
ON-1 自由入力できる 暗証番号 制限あり 逆総当たり攻撃が成立する
ON-2 自由入力できる 暗証番号 制限 ON-1 に加え、逆総当たり攻撃がしやす
ON-3 自由入力できる パスワード 制限あり パスワード強度が低いアカウントに対してのみ逆総当たり攻撃が成立する
ON-4 自由入力できる パスワード 制限 ON-3 と同じ

一般に安全とされているのは暗証番号を用いる場合は OFF-1 を前提とするもので、OFF-1 以外の場合には不正ログインを防ぐために、サービス側はアカウントに対して鍵空間が大きなパスワードを設定できるようにすることが要求される(パスワード認証場合)。

逆に言えば、強度の高いパスワードを設定できるようなサービスであれば、設定した強度の高いパスワード漏洩しない限り安全であるということが言えるはずである無意味タイミングパスワードを変更する必要はない。パスワード漏洩していなければ変更しても変更しなくても第三者にとっては何も変わらない。知らない情報が知らない情報に変わるだけである

じゃあ一体、パスワードを定期的に変更するのって何だったの?

『わかっためう!パスワードを変更する必要があるのに不定期に変更するのが面倒な場合だめう!』

パスワードを変える必要性がある場合とは

ここまで、個人アカウント第三者による不正ログインの話をしていた。

ここからは別のシチュエーションについて話をする。ついてきてくれたまえ。

ある組織に属する人間が1つのアカウントを共用することがある。個人アカウントを共用する話ではない。そもそも共用アカウントである場合のことである

「共用アカウントを使わず個人アカウントを発行するべきだろ常考」などと考える人いるかもしれないが、世の中には法人アカウントというものもある。そうでなくても共用アカウントを使うことが運用上都合が良いケースはある。

そのような場合パスワードを共有している人間組織を離れた場合にどうすべきだろうか。

当然パスワードを変更すべきである

パスワードを共有する権利を失った人間パスワードが共有されている状態を解消しなければならない。

パスワードの変更をその都度行うのは面倒じゃないか。自動化できないのか」

『人の異動のタイミングを考えずに定期的にパスワードを変更し続ければいいめう!』

パスワード漏洩を気にする必要はないのか

「もしパスワード漏洩してしまっていたとしても、パスワードを定期的に変更することで漏洩していない状態を保てるではないか」と言う人がいた。

それは正しい。

それは正しいが、だからどうした。

パスワード漏洩していなければ変更する必要はないではないか。

なぜパスワード漏洩していることを心配するのだ。そう言う人は自分の家の合鍵が作られているかもしれないと心配しているのか。

定期的がどのくらいの期間か知らないが、家の鍵を定期的に変更しているというのか。

なに?変更している?そうか勝手にやってくれ。

私は家の鍵を変える必要があるとは思っていない。

ただそれだけのことである

パスワードの定期的変更が蔓延った理由

パスワードは、第三者悪用されないためにも、定期的に変更することをお願いしております

こんなことを書くサービス事業者は多い。

この実態は、無能組織パスワードの定期的変更を呼びかけて「セキュリティ意識出してるぜ」アピールをしているだけである

そういう組織は「定期的とはどのくらいの期間なのか」という質問にすら答えられない。アピールしているだけなのでその内容を考えたことなどない。

質問に答えられない内容の施策ユーザに任せてお願いしているのである

この文章を読んでいる「ユーザ」は怒ったほうがいいのではないか。

定期的なパスワード変更とは何だったのか

そろそろ結論を出そう。さて、バーボンを頼む。

この答えは、「あるタイミングを過ぎたらもともとのパスワードを使えなくする」という行為である

ここで思い出してほしい。うpろだ存在を。

ファイルアップローダーというサービスを使ったことはあるだろうか。いや、聞くまでもない。

そこではファイルダウンロードできる期限を定めることができるものがある。これは一体何のためだろうか。

無論、一時的に使うために一定期間後はファイルが消えてもいいという意味もあるが、意図的に短い期間を設定することもある。

これは「有効期間」である。「lifetime」である

有効期間が切れると、もとのファイルダウンロードすることができなくなる。

UNIXシステムユーザパスワードにも同様の機能がある。有効期間である有効期間を過ぎたユーザアカウントロックされ、新しいパスワードを設定しなければログインできない。

2014年3月31日リリースされた MySQL 5.7.4 では --default_password_lifetime という設定値が追加されている。有効期間である

『めうもバーボン頼むめう!』

定期的なパスワード変更を根本対策昇華させるたった一つの方法

実は必要だったのは「定期的なパスワードの変更」ではない。

必要なのは一定期間でのパスワード無効化」だったのだ。

しかし常に必要なわけではない。無効化必要から無効化しているのだ。

そして定期的である必要はないが、無効化自動化するには定期化するという考えにたとり着くのは難しくない。

定期的なパスワード変更と言うから話がややこしくなるのだ。共用アカウントのケースを思い出してみるがよい。

必要なのはパスワードを共有する権利を失った人間パスワードが共有されている状態を解消」することだったではないか。

根本対策は「一定期間でパスワード無効にすること」である。そして無効化する必要性を説明することである必要もないのに無効化してしまっては反感を買うことになるぞ。もちろん利用規約に書いておくのがよいだろう。そして UNIXMySQL と同様にユーザから有効期限の延長(あるいは期限設定なし)を要望されることを想定して、要望があれば一定期間でのパスワード無効化をしないようにすることが好ましいだろう。

ただしパスワード無効化が何に対する根本対策なのか私はしらない。それはサービス事業者が考えることである。おそらくそれは UNIXMySQLパスワード有効期限を設定する理由に似ているのだろう。

アピールのために「定期的なパスワードの変更」を求めているサービスではパスワード無効化する必要性が説明できない。その期間すら真面目に考えたこともないのだから。万一パスワード漏洩した際の対策?そう言うのであれば期間(日数)を決めて一律でパスワード無効にすべきである。それもやらずにユーザに定期変更をお願いするなど無能もいいところである

それでもパスワードの定期的変更が必要だという人がいるのであれば、私のあるアカウント A1 に対するパスワード P1 の具体値を書き込んでくれ。書き込めないのであればなぜ変更する必要があるのか説明してもらおうか。

そして、もう「定期的変更」にこだわることは止めてくれ。対策必要だとしたらそれはパスワード無効化である

2015-06-04

http://anond.hatelabo.jp/20150604143935

クライアントが2回クエリを投げる」って文脈やと、やはり結構引っかかるところはあるんやな。

アプリケーションサーバのことをクライアントって呼んでるなら別にそれはそれでええんやけど、mysqlクライアントpsqlクライアントは別物やから2回連続では投げられん。

そもそもアプリケーションサーバクライアントと呼ぶ文化は弊社には無い。

ワイが老害なのはそうやけど、その表現やとやっぱり結構語弊あるわ。

http://anond.hatelabo.jp/20150604143455

プログラム同士が関連する時、関係の仕方によって

サービスを依頼する側=クライアント

サービス提供する側=サーバ

と呼ぶんだよ。

WebシステムでいうとMySQLから見ればRailsクライアントなんだよ。


mysqlとかftpとかのコマンドツールだってクライアントって呼ぶだろ?

http://dev.mysql.com/doc/refman/5.6/en/programs-client.html



このレベル言葉が通じない老害実在すると思うとぞっとするな

http://anond.hatelabo.jp/20150604135322

mysql場合はマスタとスレーブストレージエンジン自体が異なることも結構あるから

(blackholeエンジン使ってマスタの負荷下げたりとか)そういう需要がありそうってのも分からないでもない。

postgresを安定した待機系として利用したかったりするんだろ。

実際できるのかどうかは知らんけど。

http://anond.hatelabo.jp/20150604134922

mysqlバイナリログをpostgresのバイナリログに変換してくれるようなスクリプトかませば可能じゃないか? 存在するのかどうか知らんが。